Fórum Como obter dados de um objeto #335652

04/01/2007

0

Olá!

Gostaria de atribuir um evento em a formulário, e que esse evento seja herdado automaticamente por todos os objetos contidos nele, ou seja, digamos que esse evento exiba uma mensagem na tela [b:34f8fd208f]´Olá!´[/b:34f8fd208f] ao clicar em um determinado objeto. Quero que esse evento seja exibido toda vez que algum objeto for clicado. Tudo isso, sem códigos adicionais!

Bem, talvez o problema acima não seja tao dificil de resolver, não é mesmo? Para isso, basta criar o evento em um [b:34f8fd208f]PopupMenu[/b:34f8fd208f] e indicá-lo nas propriedades dos demais objetos do formulário, certo? Certo!!! (Caso tenha uma solução mais viavel, favor indica-la)

Agora vamos para o real problema! Na verdade, o que realmente preciso é saber qual objeto foi clicado pelo usuário, para que no evento apareça [b:34f8fd208f]´Olá <nomeDoObjeto>!´[/b:34f8fd208f]. Alguem pode me ajudar, como passar como parametro em tempo de execução o [b:34f8fd208f]Sender [/b:34f8fd208f]do objeto clicado pelo usuario?


Marcelo

Marcelo

Responder

Posts

04/01/2007

Adrbrusc

Bom como sugestão da sua dúvida eu criaria um evento assim>>

procedure TForm1. AllEventsClick(Sender : TObject );
begin

end;


E em cada botão da sua aplicação eu atribuiria no evento OnClick a procedure AllEventsClick; Mas veja que você deveria programar dentro da procedure AllEventsClcik o procedimento do clique de cada botão. Assim >>

procedure TForm1. AllEventsClick(Sender : TObject );
begin

  if TComponent(Sender).Name = ´Button1´ then
   //colocar os procedimentos do button1
   showmessage( TComponent(Sender).Name )

  else if TComponent(Sender).Name = ´Button2´ then
   //colocar os procedimentos do button2
   showmessage( TComponent(Sender).Name );

end;


Ai nos eventos Click dos seus botões vc atribui o seguinte código>>

procedure TForm1.Button2Click(Sender: TObject);
begin
    AllEventsClick(Sender);
end;

//Há duas maneiras de atribuir o evento AllEventsClicks aos seus botões:

//Só colocar no evento (object Inspector) OnClick do Button3, Button4....
//Button2Click;

//ou atribuir no código mesmo como feito no  Button2
procedure TForm1.Button3Click(Sender: TObject);
begin
    AllEventsClick(Sender);
end;



Espero que o código acima resolva o que você está querendo, pois coloquei de uma forma com que você saiba na sua procedure AllEventsClick quem foi o componente que a chamou.

Abraços

Olá! Gostaria de atribuir um evento em a formulário, e que esse evento seja herdado automaticamente por todos os objetos contidos nele, ou seja, digamos que esse evento exiba uma mensagem na tela [b:8b9f85b929]´Olá!´[/b:8b9f85b929] ao clicar em um determinado objeto. Quero que esse evento seja exibido toda vez que algum objeto for clicado. Tudo isso, sem códigos adicionais! Bem, talvez o problema acima não seja tao dificil de resolver, não é mesmo? Para isso, basta criar o evento em um [b:8b9f85b929]PopupMenu[/b:8b9f85b929] e indicá-lo nas propriedades dos demais objetos do formulário, certo? Certo!!! (Caso tenha uma solução mais viavel, favor indica-la) Agora vamos para o real problema! Na verdade, o que realmente preciso é saber qual objeto foi clicado pelo usuário, para que no evento apareça [b:8b9f85b929]´Olá <nomeDoObjeto>!´[/b:8b9f85b929]. Alguem pode me ajudar, como passar como parametro em tempo de execução o [b:8b9f85b929]Sender [/b:8b9f85b929]do objeto clicado pelo usuario?



Responder

Gostei + 0

04/01/2007

Marcelo

Prezado [b:86f286bbf6]adrbrusc[/b:86f286bbf6].

Primeiramente gostaria de agradecer pela atenção.

Olha, é justamente isso que não quero fazer... colocar vários eventos no formulário. Gostaria que tudo funcionasse de forma dinâmica e genérica (independente de componentes). Já havia criado um evento que segue:
{*** Modo de utilizar o método ***}
// mostraNomeObj( Sender );
procedure TformTeste.mostraNomeObj(comp: TObject );
begin
  ShowMessage( TComponent( comp ).Owner.Name + ´.´ + TComponent( comp ).Name );
end;
O evento acima, funciona perfeitamente do jeito que quero. No entanto, não consigo fazê-lo de forma genérica, isto é, caso eu atribua outros componentes no formulário, gostaria que eles já recebessem esse evento sem que eu tenha que fazer nada!

Alguém pode me ajudar?


Responder

Gostei + 0

04/01/2007

Adrbrusc

Entendi... mas então acho que fica a dúvida para algum de nosso colegas aqui do forum tentar responder, pois não conheço uma maneira de otimizar desta forma seu código, como sugestão, talvez uma outra solução poderia ser você criar seu próprio componente e já atribuir a ele este evento automaticamente.

Abraços


Prezado [b:76134ac59d]adrbrusc[/b:76134ac59d]. Primeiramente gostaria de agradecer pela atenção. Olha, é justamente isso que não quero fazer... colocar vários eventos no formulário. Gostaria que tudo funcionasse de forma dinâmica e genérica (independente de componentes). Já havia criado um evento que segue:
{*** Modo de utilizar o método ***}
// mostraNomeObj( Sender );
procedure TformTeste.mostraNomeObj(comp: TObject );
begin
  ShowMessage( TComponent( comp ).Owner.Name + ´.´ + TComponent( comp ).Name );
end;
O evento acima, funciona perfeitamente do jeito que quero. No entanto, não consigo fazê-lo de forma genérica, isto é, caso eu atribua outros componentes no formulário, gostaria que eles já recebessem esse evento sem que eu tenha que fazer nada! Alguém pode me ajudar?



Responder

Gostei + 0

04/01/2007

Marcelo

Bom... acho que ainda não entendeu! O que quero fazer é criar um evento, digamos em um popMenu, e atribuir esse popMenu a todos os objetos do formulário. Quando o usuário clicar em algum objeto com o botão direito, abra o popMenu (até ai tudo bem) e quando ele clicar no evento disponível para ele, envie as informações do próprio objeto para o vento do popMenu.

Certamente há como fazer isso, da mesma forma que disponibilizamos o ShowHint em toda a aplicação, por que não disponibilizar também um evento, como o de um click com o botão direito que ao ser acionado, recebe as informações do objeto!

Alguém pode me ajudar?


Responder

Gostei + 0

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

Aceitar