Erro de procedure
Ola, pessoal.
To criando uma tela mdichild com a função abaixo:
procedure TfrmPrincipal.criatela(TFormulario: TFormClass;
Formulario: TForm);
var
found, i: Integer;
begin
found:= -1;
for i:=0 to Screen.FormCount -1 do
if Screen.Forms[i] is TFormulario then
found:= i;
if found >= 0 then
begin
Screen.Forms[found].BringToFront;
Screen.Forms[found].WindowState:= wsNormal;
end
else
begin
Formulario:= TFormulario.Create(Self);
Formulario.Show;
end;
end;
crio um formulario Vendas:
criatela(frmVendas, TfrmVendas);
Só que o formulário criado não fica visivel para os outros formularios, tipo os datamodules que são crados na abertura do sistema. Neste formulario de venda, tenho um currencyedit que deve ser zerado na inserção de um novo registro. Então, no evento onnewrecord do clientedataset no datamodule tá assim:
frmVenda.CurrencyEdit1.value:= 0;
Quando executo e tento inserir um novo registro, da erro de acces violation.
Passando o mause en cima de frmVenda aparece: frmVenda=nil. Então é como se o datamodule não tivesse enxergando o frmvenda.
Se uso desta maneira, funciona sem problemas:
procedure TfrmPrincipal.Venda1Click(Sender: TObject);
var
found, i: Integer;
begin
found:= -1;
for i:=0 to Screen.FormCount -1 do
if Screen.Forms[i] is TfrmVenda then
found:= i;
if found >= 0 then
Screen.Forms[found].Show
else
begin
frmVenda:= TfrmVenda.Create(Self);
frmVenda.Show;
end;
end;
To criando uma tela mdichild com a função abaixo:
procedure TfrmPrincipal.criatela(TFormulario: TFormClass;
Formulario: TForm);
var
found, i: Integer;
begin
found:= -1;
for i:=0 to Screen.FormCount -1 do
if Screen.Forms[i] is TFormulario then
found:= i;
if found >= 0 then
begin
Screen.Forms[found].BringToFront;
Screen.Forms[found].WindowState:= wsNormal;
end
else
begin
Formulario:= TFormulario.Create(Self);
Formulario.Show;
end;
end;
crio um formulario Vendas:
criatela(frmVendas, TfrmVendas);
Só que o formulário criado não fica visivel para os outros formularios, tipo os datamodules que são crados na abertura do sistema. Neste formulario de venda, tenho um currencyedit que deve ser zerado na inserção de um novo registro. Então, no evento onnewrecord do clientedataset no datamodule tá assim:
frmVenda.CurrencyEdit1.value:= 0;
Quando executo e tento inserir um novo registro, da erro de acces violation.
Passando o mause en cima de frmVenda aparece: frmVenda=nil. Então é como se o datamodule não tivesse enxergando o frmvenda.
Se uso desta maneira, funciona sem problemas:
procedure TfrmPrincipal.Venda1Click(Sender: TObject);
var
found, i: Integer;
begin
found:= -1;
for i:=0 to Screen.FormCount -1 do
if Screen.Forms[i] is TfrmVenda then
found:= i;
if found >= 0 then
Screen.Forms[found].Show
else
begin
frmVenda:= TfrmVenda.Create(Self);
frmVenda.Show;
end;
end;
Stclara3107
Curtidas 0
Respostas
Massuda
27/12/2004
Mude
procedure TfrmPrincipal.criatela(TFormulario: TFormClass; Formulario: TForm);
para
procedure TfrmPrincipal.criatela(TFormulario: TFormClass; [b:80823e06d1]var[/b:80823e06d1] Formulario: TForm);
procedure TfrmPrincipal.criatela(TFormulario: TFormClass; Formulario: TForm);
para
procedure TfrmPrincipal.criatela(TFormulario: TFormClass; [b:80823e06d1]var[/b:80823e06d1] Formulario: TForm);
GOSTEI 0
Peterks
27/12/2004
Massuda qual a diferenca de utilizar
Formulario: TForm);
e
var Formulario: TForm);
Ou em qualquer outra function ou procedure, passar o parametro como var .. etc
Formulario: TForm);
e
var Formulario: TForm);
Ou em qualquer outra function ou procedure, passar o parametro como var .. etc
GOSTEI 0
Euclides
27/12/2004
[quote=´Peterks´]Massuda qual a diferenca de utilizar
Formulario: TForm);
e
var Formulario: TForm);
Ou em qualquer outra function ou procedure, passar o parametro como var .. etc
Formulario: TForm);
e
var Formulario: TForm);
Ou em qualquer outra function ou procedure, passar o parametro como var .. etc
Olá Peterks,
Acho que posso te ajudar !!!!!
Bom o parâmetro var passado antes de uma variavel indica que não será criada uma variavel na rotina e sim será passado o endereço de uma variavel ou seja quando voce chama uma função que utiliza o var essa variavel poderá ser alterada dentro da rotina e quando a rotina terminar ela estará com o valor que foi obtido dentro da rotina chamada sem o var o valor da sua rotina será o mesmo que foi passado para a rotina .....
Um pouco confuso mas acho que poderá ser bem interpretado melhor com testes ............
Espero que tenha ajudado...
Abraços
GOSTEI 0
Massuda
27/12/2004
Quando você declara um parâmetro de uma function (ou procedure) desta forma:você está dizendo ao compilador que o parâmetro deve ser passado à function [b:7da5454b91]por valor[/b:7da5454b91]. Nesse caso, o compilador irá criar uma variável temporária contendo uma cópia do valor do parâmetro que você fornecer. Por ser uma cópia armazenada em uma variável temporária, qualquer alteração que a function faça no parâmetro não é visível fora da function.
Por outro lado, desta forma:você está dizendo ao compilador que o parâmetro deve ser passado à function [b:7da5454b91]por referência[/b:7da5454b91]. Nesse caso, o compilador irá passar à function um ponteiro para o parâmetro que você fornecer. Por ser um ponteiro, qualquer alteração a function fizer no parâmetro será visível fora da function.
... Formulario: TForm);
Por outro lado, desta forma:
... var Formulario: TForm);
GOSTEI 0