Erro de procedure

Delphi

27/12/2004

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;


Stclara3107

Stclara3107

Curtidas 0

Respostas

Massuda

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);


GOSTEI 0
Peterks

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


GOSTEI 0
Euclides

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



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

Massuda

27/12/2004

Quando você declara um parâmetro de uma function (ou procedure) desta forma:
... Formulario: TForm);
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:
... var Formulario: TForm);
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.


GOSTEI 0
POSTAR