É possível definir evento OnCreate em tempo de exec.?

Delphi

20/07/2004

Olá

É possível definir um evento OnCreate em tempo de execução a partir de outra Unit?

Por exemplo:
Se eu tiver, no meu Form1, um botão que cria outro Form2
Form2 := TForm2.Create(Self);
Form2.ShowModal;
Form2.Free;


Daí se eu tiver uma procedure do tipo TNotifyEvent, que deve ser colocada no OnCreate do Form2, mas como fazer durante esse procedimento? Se eu colocar antes, ele deve dar AccessViolation, pois não existe Form2. Se eu colocar depois, olé! ele já foi criado!

É, de fato, impossível?

Obrigado
Até+


Paulo_amorim

Paulo_amorim

Curtidas 0

Respostas

Inutaishou

Inutaishou

20/07/2004

Não entendi o que você quer, mas atribuir um evento em tempo de execução é possível sim... Crie uma procedure com os parâmetros que o evento usa...

Aí, só faça assim:
Form.OnCreate := Sua_Procedure;


Depois, para desatribuir, troque o Sua_Procedure por Nil e pronto...

[]´s,


GOSTEI 0
Paulo_amorim

Paulo_amorim

20/07/2004

Não entendi o que você quer, mas atribuir um evento em tempo de execução é possível sim... Crie uma procedure com os parâmetros que o evento usa... Aí, só faça assim:
Form.OnCreate := Sua_Procedure;
Depois, para desatribuir, troque o Sua_Procedure por Nil e pronto...


Olá
eu tiver uma procedure do tipo TNotifyEvent

Eu ja tenho a procedure, e já atribuo... o problema não eh como atribuir, mas sim [b:498cfad496]onde[/b:498cfad496] atribuir

pois eu tenho, por exemplo:
procedure Form1.Button1Click(Sender:TObject);
begin
  Form2 := TForm2.Create(Self);
  Form2.ShowModal;
  Form2.Free;
end;

Essa eh minha chamada ao Form2.
No Create do Form2 eu quero colocar a procedure FazAlgo (qe jah eh do tipo TNotifyEvent). Mas, no código acima, onde devo incluir essa linha?
Form2.OnCreate := FazAlgo;


Se eu fizer
Form2.OnCreate := FazAlgo;
Form2 := TForm2.Create(Self);

então irá gerar Access Violation, pois acessei Form2 antes dele exisitr

Por outro lado, se eu fizer
Form2 := TForm2.Create(Self);
Form2.OnCreate := FazAlgo;

então a procedure eh inútil, já que o Form2 eh criado antes da procedure ser atribuída (ou seja, ela não será executada).

Pensando assim, eh [i:498cfad496]inviável [/i:498cfad496](e não impossível, como disse no post anterior) atribuir um OnCreate a um outro Form ?

Obrigado
Até+


GOSTEI 0
Inutaishou

Inutaishou

20/07/2004

Hmmm... Agora entendi...

Tenta fazer assim:
    Form2 := TForm2.Create( Self );
    FazAlgo;
    Form2.ShowModal;
    FreeAndNil( Form2 );


Não encontrei nenhum outro jeito aqui...

Mas se eu conseguir, te aviso... Se conseguir não esqueça de postar também...

[]´s,


GOSTEI 0
Paulo_amorim

Paulo_amorim

20/07/2004

Tenta fazer assim:
    Form2 := TForm2.Create( Self );
    FazAlgo;
    Form2.ShowModal;
    FreeAndNil( Form2 );
Não encontrei nenhum outro jeito aqui... Mas se eu conseguir, te aviso... Se conseguir não esqueça de postar também...


Olá

Isso que eu pensei também...
Só queria saber se dava pra setar o evento em si... mas acho que vc ta certo

Claro, se houver jeito, ele vai aparecer :wink:
Até+


GOSTEI 0
Marcelo Saviski

Marcelo Saviski

20/07/2004

va podia fazer assim tb:

TForm2 = class
   .............
private
  {private declaration}
public
  procedure DoCreate; override;
end;



.....

procedure TForm2.DoCreate;
begin
  inherited;
  //faz alguma coisa
end;


tem o mesmo efeito do OnCreate


GOSTEI 0
Persist

Persist

20/07/2004

Exceto pelo fato que não existe a procedure DoCreate em TForm2.


GOSTEI 0
Marcelo Saviski

Marcelo Saviski

20/07/2004

sim existe, ele vem do TCustomForm


GOSTEI 0
Persist

Persist

20/07/2004

TForm2 = class ............. private {private declaration} public procedure DoCreate; override; end


TForm2 é de TObject e não possui DoCreate


GOSTEI 0
Paulo_amorim

Paulo_amorim

20/07/2004

TForm2 é de TObject e não possui DoCreate


Olá

Pra começar, [b:5778379895]todos[/b:5778379895] os objetos descendem de TObject...

A hierarquia de um form que vc cria eh
TForm2 - TForm - TCustomForm

Procure no Help por DoCreate, vc vai achar que ele eh evento de TCustomForm, que eh de onde vem seu Form2...

Até+


GOSTEI 0
Persist

Persist

20/07/2004

Olá, acho que vc não viu o código direito.
O código exposto pelo Marcelo Saviski foi:
TForm2 = class 
   ............. 
private 
  {private declaration} 
public 
  procedure DoCreate; override; 
end;


Com isto caro colega, TForm2 é descendente direto de TObject e não de TForm ou TCustomForm; portanto volto a dizer que neste caso, TForm2 não possui o método DoCreate.


GOSTEI 0
Paulo_amorim

Paulo_amorim

20/07/2004

Olá, acho que vc não viu o código direito. O código exposto pelo Marcelo Saviski foi:
TForm2 = class 
   ............. 
private 
  {private declaration} 
public 
  procedure DoCreate; override; 
end;
Com isto caro colega, TForm2 é descendente direto de TObject e não de TForm ou TCustomForm; portanto volto a dizer que neste caso, TForm2 não possui o método DoCreate.


Olá

Sim, se vc levar ao pe da letra
Acho que ele soh quis mostrar em que parte da Unit estava a declaração... não tem porque declarar como descendente de TOBject já que assim ele nem seria um form...

Até+


GOSTEI 0
Marcelo Saviski

Marcelo Saviski

20/07/2004

vc pode redefinir o método [color=green:f524044146]AfterConstruction[/color:f524044146] quando a classe não for de um form


GOSTEI 0
POSTAR