Criar form por uma Var

03/03/2006

Oi

em em um form tenho as seguintes var:

   var frm: TForm;
   tfrm: TcomponentClass;


no oncreate do form faço o seguinte:

frm:= frmBrownseProduto;
Tfrm:= TfrmBrownseProduto;

Application.createForm(Tfrm,frm);


com ele criado, tento acessa-lo de outro form e não consigo.
por ex.:

showmessage(frmBrownseProduto.caption)


da o seguinte erro:

[list:94b5570a5b]First chance exception at @($5,$600052C,$11). Exception class System.NullReferenceException with message ´Object reference not set to an instance of an object.´. Process Marmore.exe (3016)[/list:u:94b5570a5b]

pelo que entendi o frmBrownseProduto não foi instanciado e sim o ´frm´ como posso resolver este problema?

ja tentei colocar
  var frm: TForm;
   tfrm: TcomponentClass;
mas não deu certo


Sistemald

Respostas

03/03/2006

Thiago Vidal

Veja se isto resolve o seu problema:

procedure TForm1.Button1Click(Sender: TObject);
var
  Frm: ^TForm;
  FrmClass: TComponentClass;
begin
  Frm := @Form2;
  FrmClass := TForm2;
  Application.CreateForm(FrmClass, Frm^);
  Form2.ShowModal;
end;


na verdade, foi utilizada uma variavel Frm, que é um Ponteiro para um Form, e a ela foi associado o endereço de memória da variável Form2. (Frm := @Form2;)

no Application.CreateForm, voce passa a variavel que o ponteiro aponta, e nao o ponteiro em si, para isso, o ^ após o Frm.


Responder Citar

03/03/2006

Marco Salles

seria muito fácil eu lhe passar assim:

var
frm: TfrmBrownseProduto;
tfrm: TcomponentClass;

e no oncrete do form

Tfrm:=TfrmBrownseProduto;
Frm:=frmBrownseProduto;
Application.CreateForm(TFrm,Frm);
Frm.ShowModal;
etc...

que ira funcionar e não dara erro quando voce fizer:

showmessage(frmBrownseProduto.caption)

So que pouco talvez , va lhe ajudar , isto é , trocar seis por meia duzia..

Então se o amigo passar o que te fato ele gostaria ( Se é criar um método geral de criação de forms , se é criar forms Apenas passando o nome sem ter que ao menos declarar na unit do formulario o Nome do formulario, etc...)

Eu confesso fiquei meio sem entender o que o colega deseja e numa coisa eu concordo com voce:

pelo que entendi o frmBrownseProduto não foi instanciado e sim o ´frm´


É vero.. Pode ate testar assingned (frmBrownseProduto) Mo ´novo frm´
que dara nill....


Responder Citar

04/03/2006

Sistemald

vamos a explicação

eu crei um form frmpesquisa de onde é herdado todos os outros de pesquisa. e um frmdados de onde é herdados todos os outros para inclusão e edição.

no form de pesquisa precisa chamar o de edição.

então no form pai de pesquisa, coloquei as seguintes var:

frm: TForm; 
   tfrm: TcomponentClass;


e no oncreate do forms derivados

dou valor a elas

frm:= frmBrownseProduto; 
Tfrm:= TfrmBrownseProduto; 


e no botão incluir e alterar eu crio o form

Application.createForm(Tfrm,frm);


porém fui acessar um compenente do form deu o problema.

acredito os ponteiros que nosos colega falou deva resolver, mas estou usando vcl.net, a unica form que consegui usar pointer foi colocando
procedure qualquer; unsafe;


sendo que para usar o UNSAFE é necessário colocar uma diretiva de compilação.


Responder Citar

04/03/2006

Marco Salles

como opção voce pode criar uma procedure generica assim

procedure CriarFomr(FrmClass:TComponentClass; var Frm);
begin
Application.CreateForm(FrmClass,Frm);
TForm(Frm).ShowModal;
TForm(Frm).Release;
end;


e para chama-la simplesmenmte assim

procedure TForm1.Button2Click(Sender: TObject);
begin
 CriarFomr(Tform2,form2);
end;



Responder Citar

04/03/2006

Sistemald

oi

não vejo como posso adptar a procedure ao meu caso, lembre-se que o poderá ser criado por 3 ou mais botões (procedimentos),

como posso fazer algo assim, eu estou instaciado na verdade é a var ´frm´ ( ex.: form1.frm) , ou seja posso usar form1.frm.caption, que funciona, como passo o endereço deste frm para o que eu quero form2.
algo assim form2:= frm;


Responder Citar

04/03/2006

Marco Salles

não vejo como posso adptar a procedure ao meu caso, lembre-se que o poderá ser criado por 3 ou mais botões (procedimentos),


:?: :?: :?: não lhe entendi :cry: :cry: :cry:

como posso fazer algo assim, eu estou instaciado na verdade é a var ´frm´ ( ex.: form1.frm) ,


Da maneira que lhe passei , assim com a maneira que o thiago_vidal , lhe passou , voce esta instanciado de fato o formulario frmBrownseProduto;..

[b:3e27ce94e1]Claro que este mesmo frmBrownseProduto; ja deve ter sido previamente criado e estando em avalaible forms.. Isto é uma condição , e acredito que voce deva estar fazendo previamente assim[/b:3e27ce94e1]

:arrow:
Apos ter feito isso:


CriarFomr(TfrmBrownseProduto,frmBrownseProduto); 


o form criado sera de[b:3e27ce94e1] fato o frmBrownseProduto[/b:3e27ce94e1]..

Bata testar apos aparecer o formulario que 
if Assigned(frmBrownseProduto) é <> nil



Em diversos botoes voce poderia fazer :


CriarForm(TMeuForm, MeuForm) que o form criado serao MeuForm


[b:3e27ce94e1]Não é isso que voce quer ???? Senão , não entendi [/b:3e27ce94e1]nada :cry: :cry: :cry:


ou seja posso usar form1.frm.caption, que funciona, como passo o endereço deste frm para o que eu quero form2. algo assim form2:= frm;

Veja , da maneira que eu te sugeri como o parâmetro Frm é[color=darkred:3e27ce94e1][b:3e27ce94e1] passado por valor, [/b:3e27ce94e1][/color:3e27ce94e1]o form criado dentro da procedure é de fato o formulario [b:3e27ce94e1]frmBrownseProduto..[/b:3e27ce94e1]

Não é isso que voce quer :?: :?: :?:


Responder Citar

08/03/2006

Sistemald

Amigos,

valeu pelas dicas

t+


Responder Citar