Fórum Erro de procedure #263537

27/12/2004

0

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

Responder

Posts

28/12/2004

Massuda

Mude

procedure TfrmPrincipal.criatela(TFormulario: TFormClass; Formulario: TForm);

para

procedure TfrmPrincipal.criatela(TFormulario: TFormClass; [b:80823e06d1]var[/b:80823e06d1] Formulario: TForm);


Responder

Gostei + 0

29/12/2004

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


Responder

Gostei + 0

29/12/2004

Euclides

[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


Responder

Gostei + 0

29/12/2004

Massuda

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar