Fórum MeuForm.OnClose := MeuMetodo(Parametros); #256836

01/11/2004

0

Olá. Estou de volta e com mais uma pequenina dúvida.

Tenho um Array de Forms do qual terei que alimentar o evento OnClose de cada form em tempo de execução. [color=blue:7b38c964c2][b:7b38c964c2]Criei o exemplo abaixo e Funcionou perfeitamente[/b:7b38c964c2][/color:7b38c964c2].

...
Interface

Procedure MeuMetodo(Sender : TObject; Var Action : TCloseAction);
Begin
   ShowMessage(´Fechando o formulário´);
End;

Implementation
Var
   vetForm : Array of TForm;
Begin
   SetLength(vetForms,5);
   VetForms[0] := TForm.Create(Application);
   VetForms[0].Caption := ´Caption legal´;
   VetForms[0].OnClose := MeuMetodo;
End;



Até aí em cima, tudo bem. Mas, vamos ao que interessa:

Preciso seguir os mesmos passo anteriores, entretanto, preciso passar uma String como parâmetro para MeuMetodo. Queria que ficasse assim:


...
Interface

Procedure MeuMetodo(AMensagem : String; Sender : TObject; Var Action : TCloseAction);
Begin
   ShowMessage(AMensagem);
End;

Implementation
Var
   vetForm : Array of TForm;
Begin
   SetLength(vetForms,5);
   VetForms[0] := TForm.Create(Application);
   VetForms[0].Caption := ´Caption legal´;
   VetForms[0].OnClose := MeuMetodo(´Teste de Mensagem´); // Erro aqui nesta linha
End;


:oops: [color=red:7b38c964c2][b:7b38c964c2]Será que pode ou não passar uma string como parâmetro?[/b:7b38c964c2][/color:7b38c964c2] :cry:


Rômulo Barros

Rômulo Barros

Responder

Posts

01/11/2004

Gilvanj

Para o evento OnClose vc tem que informar um método que seja do tipo TNotifyEvent.

O método MeuMetodo não é do tipo TNotifyEvent, não sendo possível utilizar com OnClose.

Minha sugestão é a seguinte:
Criei uma nova classe herdada de TForm com uma propriedade adicional. Utilize esta propriedade para definir o conteúdo que você quer utilizar em cada form.

Exemplo:

TFormNova = class(TForm)
AMensagem:String;
end;


Procedure TFormNova.MeuMetodo(Sender : TObject; Var Action : TCloseAction);
Begin
ShowMessage(AMensagem);
End;

Implementation
Var
vetForm : Array of TFormNova;
Begin
SetLength(vetForms,5);
VetForms[0] := TFormNova.Create(Application);
VetForms[0].Caption := ´Caption legal´;
VetForms[0].AMensagem := ´Teste de Mensagem´;
VetForms[0].OnClose := MeuMetodo;
End;


Responder

Gostei + 0

02/11/2004

Fórum Vini

Só uma pequena correção:
Para o evento OnClose vc tem que informar um método que seja do tipo TNotifyEvent. O método MeuMetodo não é do tipo TNotifyEvent, não sendo possível utilizar com OnClose.

O tipo TNotifyEvent é somente para eventos que não possuem nenhum parâmetro adicional(somente o Sender):
TNotifyEvent = procedure(Sender: TObject) of object;

O tipo usado no evento OnClose é TCloseEvent:
TCloseEvent = procedure(Sender: TObject; var Action: TCloseAction) of object;

Também acho que criar um campo na classe com o valor a ser passado é a forma mais fácil.. Só não será necessário *criar* uma classe descendente de TForm, pois todo formulário da aplicação já faz isso :wink:


Responder

Gostei + 0

02/11/2004

Gilvanj

> O tipo usado no evento OnClose é TCloseEvent:

Vc tem razão, obrigado.

> Só não será necessário *criar* uma classe descendente de TForm,
> pois todo formulário da aplicação já faz isso

A diferença é que vc precisa criar esta propriedade uma única vez nesta nova classe, ao invés de criá-lo em cada nova form. Além disso, a propriedade precisa estar visível para o evento MeuMetodo (que é um procedure of object e precisa estar em alguma classe, então qual delas seria ?)


Responder

Gostei + 0

03/11/2004

Fórum Vini

A diferença é que vc precisa criar esta propriedade uma única vez nesta nova classe, ao invés de criá-lo em cada nova form.

Ah sim, se for usar em mais de um form, com certeza é mais fácil..
Além disso, a propriedade precisa estar visível para o evento MeuMetodo (que é um procedure of object e precisa estar em alguma classe, então qual delas seria ?)

Não sei se entendi o que você disse, mas é só fazer o método MeuMetodo pertencer à classe onde vai ser usada a propriedade...
TMeuForm = class(TForm)
  FMensagem: String;
  procedure MeuMetodo(Sender: TObject; var Action: TCloseAction);
end;

Como você pensou em usar isso em mais de um tipo de form, concordo que usar uma classe base para todas é com certeza bem mais interessante..


Responder

Gostei + 0

03/11/2004

Paulo_amorim

Olá

Já que você está criando métodos globais, por que não criar 2 metodos? Um do tipo TCloseEvent - que seria atribuído aos eventos OnClose dos Forms - e outro com tua função.
Ficaria, por exemplo, assim:
procedure FechaForm(Sender: TObject; Action: var Action: TCloseAction);
begin
  MinhaFuncao;
end;

procedure MinhaFuncao;
begin
 {...}
end;



Responder

Gostei + 0

03/11/2004

Rômulo Barros

[b:31e6de2dd1]Obrigado a todos !!!![/b:31e6de2dd1]


Responder

Gostei + 0

03/11/2004

Fórum Vini

Já que você está criando métodos globais, por que não criar 2 metodos? Um do tipo TCloseEvent - que seria atribuído aos eventos OnClose dos Forms - e outro com tua função.

Não entendi a sua intenção(de criar um método a mais), mas o método que vai ser usado no evento tem que pertencer a um objeto.. veja:
TCloseEvent = procedure (Sender: TObject; var Action: TCloseAction) [b:a3501a70e9]of object[/b:a3501a70e9];


:wink:


Responder

Gostei + 0

03/11/2004

Paulo_amorim

Olá

O que eu fiz foi a mesma coisa que vc faz quando manda um botão chamar uma procedure...

No caso, vc colocaria a procedure FechaForm no evento OnClose dos formulários... e ela seria responsável por chamar o método que ele está implementando...

Até+


Responder

Gostei + 0

03/11/2004

Fórum Vini

Agora entendi :D


Responder

Gostei + 0

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

Aceitar