MeuForm.OnClose := MeuMetodo(Parametros);
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].
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:
:oops: [color=red:7b38c964c2][b:7b38c964c2]Será que pode ou não passar uma string como parâmetro?[/b:7b38c964c2][/color:7b38c964c2] :cry:
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
Curtidas 0
Respostas
Gilvanj
01/11/2004
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;
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
Fórum Vini
01/11/2004
Só uma pequena correção:
O tipo TNotifyEvent é somente para eventos que não possuem nenhum parâmetro adicional(somente o Sender):
O tipo usado no evento OnClose é TCloseEvent:
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:
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:
GOSTEI 0
Gilvanj
01/11/2004
> 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 ?)
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
Fórum Vini
01/11/2004
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..
GOSTEI 0
Paulo_amorim
01/11/2004
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:
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
Rômulo Barros
01/11/2004
[b:31e6de2dd1]Obrigado a todos !!!![/b:31e6de2dd1]
GOSTEI 0
Fórum Vini
01/11/2004
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:
GOSTEI 0
Paulo_amorim
01/11/2004
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é+
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
Fórum Vini
01/11/2004
Agora entendi :D
GOSTEI 0