Criar form por uma Var

03/03/2006

0

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

Sistemald

Responder

Posts

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

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

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

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

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

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

08/03/2006

Sistemald

Amigos,

valeu pelas dicas

t+


Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

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

Aceitar