Fórum MeuForm.OnClose := MeuMetodo(Parametros); #256836
01/11/2004
0
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
Curtir tópico
+ 0Posts
01/11/2004
Gilvanj
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;
Gostei + 0
02/11/2004
Fórum Vini
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:
Gostei + 0
02/11/2004
Gilvanj
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 ?)
Gostei + 0
03/11/2004
Fórum Vini
Ah sim, se for usar em mais de um form, com certeza é mais fácil..
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..
Gostei + 0
03/11/2004
Paulo_amorim
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;Gostei + 0
03/11/2004
Rômulo Barros
Gostei + 0
03/11/2004
Fórum Vini
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:
:wink:
Gostei + 0
03/11/2004
Paulo_amorim
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é+
Gostei + 0
03/11/2004
Fórum Vini
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)