Fórum É possível definir evento OnCreate em tempo de exec.? #243796

20/07/2004

0

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

Responder

Posts

20/07/2004

Inutaishou

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,


Responder

Gostei + 0

20/07/2004

Paulo_amorim

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é+


Responder

Gostei + 0

20/07/2004

Inutaishou

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,


Responder

Gostei + 0

20/07/2004

Paulo_amorim

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é+


Responder

Gostei + 0

20/07/2004

Marcelo Saviski

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


Responder

Gostei + 0

20/07/2004

Persist

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


Responder

Gostei + 0

20/07/2004

Marcelo Saviski

sim existe, ele vem do TCustomForm


Responder

Gostei + 0

20/07/2004

Persist

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


TForm2 é de TObject e não possui DoCreate


Responder

Gostei + 0

21/07/2004

Paulo_amorim

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é+


Responder

Gostei + 0

21/07/2004

Persist

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.


Responder

Gostei + 0

21/07/2004

Paulo_amorim

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é+


Responder

Gostei + 0

21/07/2004

Marcelo Saviski

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


Responder

Gostei + 0

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

Aceitar