Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Thiago Delalibera

Acessar variável de Form criado dinamicamente via código

Recommended Posts

Galera, criei uma procedure para chamar meus forms para não ter que ficar repetindo o código sempre que for criar um form

 

A procedure:

procedure CriaForm(FormName: String);
var FormClass: TFormClass;
Form: TForm;
begin
  FormClass := TFormClass(FindClass(FormName));
  Form := FormClass.Create(Application);
  //Form.Inserir := True;
  Form.ShowModal;
  Form.Free;
end;

Até ai tudo blz, como podem ver tem um código comentado ali:

Tenho o form de classe TfrmCadItens que estou chamando assim:

CriaForm('TfrmCadItens');

Nesse form tem a variável pública Inserir

 

Como comentei na procedure eu não consigo acessar essa variável, claro pois não tem como o delphi saber qual form estou chamando e agora como faço pra acessar isso dessa forma?

 

Obrigado!

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O único jeito foi fazer o seguinte, caso ajude alguém fica a dica, eu queria uma coisa mais dinâmica, mas assim funciona e ja abstrai muito código:

procedure CriaForm(FormName: String);
var FormClass: TFormClass;
Form: TForm;
begin
  FormClass := TFormClass(FindClass(FormName));
  Form := FormClass.Create(Application);
  //Form.Inserir := True;
  if (Form is TfrmCadItens) then
    TfrmCadItens(Form).Inserir := True;
  Form.ShowModal;
  Form.Free;
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Thiago.

 

Então, como esta variável não é comum a todos os formulários, não há outra forma além da segunda solução que postou para criar uma única procedure de criação de formulários que insira valor na variável global do form em questão, pois isso é uma particularidade daquele formulário, não de todos.. a menos que você criasse sempre em todos os forms a variável com o mesmo nome (ai não seria pública, mas no private do form por exemplo) e passasse uma flag na chamada de criação do form pra definir quando atribuir valor a ela ou não.... mas ai teria que ver se realmente valeria a pena isso, pois se esta variável vai existir somente em um único formulário o melhor é deixar como particularidade e tratar como já fez no seu if.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Chrnos,

realmente é o jeito.

 

Agora me deparei com outro problema, geralmente eu usava o seguinte para chamar forms:

Form1 chamando o Form2

Form2 := TForm2.Create(Self);
Form2.ShowModal;
Form2.Free;

No Form2 ele passava algumas variáveis pro Form1, por exemplo no caso deu preencher um Edit

No Form2 eu executava

Form1.MeuEdit.Text := 'MEU TEXTO';

Beleza funcionava perfeitamente.. porém com essa técnica de criar o form dinamicamente esse mesmo procedimento ele da erro de access violation, ou seja não reconhece o Form1 criado em memória, será que tem algum jeito de fazer isso ou vou ter que voltar ao modo tradicional?

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ai você tem que considerar uma questão: no momento da atribuição do valor ao formulário, o mesmo já está criado? Se sim, não deveria dar erro... note que da forma como está criando seus formulários (pelo código que postou), após sair do form criado você o liberada da memória (free), de modo que qualquer tentativa de acessar o mesmo em outro momento do programa sem o recriá-lo resultará num erro de access violation... na sua situação atual, o form para onde está tentando jogar o valor já está criado antes da atribuição do valor?

 

Uma alternativa para não voltar ao modo tradicional é, em situações assim, fazer uma chamada com create dentro da tela como uma função local deste formulário... ou terá que criar um método global que receba os possíveis valores para cada form e tratar isso como particularidade saca?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deu certo, no caso tive que passar uma variável do Form pai ao Form filho.

Passei a variável Form que eu criei dinamicamente pro Form filho e ai consegui realizar as alterações, usando o esquema de criar dinamicamente, valeu pelas dicas e ajuda!

 

Se alguém se interessar posto o código mais detalhdamente. Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.