Nome do Componente Clicado

09/03/2004

0

Caro Amigos, tenho um Componente tipo ´QRDBtext´ não tem Evento On-Click, etc, precisava muito saber quando eu clicar nele qual o nome do componente. Já ví uma Procedure que confirma se eu clickei no componente ´x´, o que eu não tenho é o nome desse ´x´.

Muito Obrigado.
MSN: talisjonatas@hotmail.com


Talisjonatas

Talisjonatas

Responder

Posts

09/03/2004

Nildo

No OnClick você obtem o nome assim:

TComponent( Sender ).Name


Responder

09/03/2004

Talisjonatas

Caro Amigo, Sou muito grato por me responder!
Deu certo para componentes com ´OnClick´ mas estou na verdade ´no meio´ de um gerador de relatório ´tipo o QRDesign´ estou usando as técnicas dos componentes do quickrep como o ´QRDBtext´, como ele não tem onclick eu coloquei um hook (dll) para verificar todos os clicks do mouse, bem, quando clica ele chama a procedure que coloquei para o QRDBText aí ele vem com o sender da dll.
Gostaria muito se possivel de conseguir resolver esta questão.

Desde já
Meus Agradecimentos.
ICQ 209735908


Responder

09/03/2004

Nildo

Olhe sua MP, se minha solucao funcionou você responde este topico com a solucao do problema, afinal o seu pode ser o de muitas pessoas.


Responder

09/03/2004

Talisjonatas

Caro Amigo Funcionou quase perfeito, mas como uso HOOK para pegar o click do mouse não deu certo porque quando cola um QRDBText em um QRGroup o ´Left e TOP´ são zerados! Talvez seja porcausa que o hook pega todo movimento do mouse dentro e fora do form!

A Procedure Atualmente está assim:

FOR a:= 0 to ComponentCount-1 do
begin
if components[a] is TWinControl then
if (x >= TWinControl( Components[a] ).Left) and
((TWinControl( Components[a] ).Left + TWinControl( Components[a] ).width) < x) and
(y >= TWinControl( Components[a] ).top) and
((TWinControl( Components[a] ).top + TWinControl( Components[a] ).height) < y) then
showmessage(Components[a].Name);
end;

Muito Grato deste já!


Responder

10/03/2004

Nildo

Na verdade os Lefts e Tops deles estão de acordo com seu Parent. Se eles têm somente um parent, você pode utilizar assim:

TWinControl( Components[a] ).Parent.Left + TWinControl( Components[a] ).Left

E se tiver Dois parents você utiliza assim:

TWinControl( Components[a] ).Parent.Parent.Left + TWinControl( Components[a] ).Parent.Left + TWinControl( Components[a] ).Left

E assim por diante. Essa não é a melhor forma, mas é a que veio mais rapido na minha cabeça, pois estou um pouco sem tempo para fazer o procedimento completo


Responder

24/12/2021

Valdeir Frizzera

Recentemente deparei com o mesmo problema e com um pouco de ajuda aqui do tópico e de outro que encontrei, o resultado ficou como esperado.
Pra quem quiser verificar se ira servi-lo, vou postar o código inteiro.


unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, Vcl.ExtCtrls, Vcl.Buttons;

type

TForm1 = class(TForm)
edtItem: TEdit;
lvItem: TListView;
pnlBotoes: TPanel;
btnDinamico: TSpeedButton;
procedure btnDinamicoClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
i, tp, qtdP: integer;

procedure EventoCliqueDinamico(Sender: TObject); == Procedure que será o clique dinâmico ==

end;

var
Form1: TForm1;
btn : TButton; === Botão que será criado dinamicamente ===

implementation

{$R *.dfm}

=== Esse é um botão estático, o clique dele gera os botões dinâmicos ===
procedure TForm1.btnDinamicoClick(Sender: TObject);
begin
== Verificação pra criar no máximo 3 botões ==
if i < 4 then
begin
if i < 0 then
i := 0
else
i := i +1;

btn := TButton.Create(nil); == Cria o botão ==
btn.Name := nome + IntToStr(i); == Botão
btn.Parent := pnlBotoes; == Adiciona o botão dentro de um panel ==
btn.Align := alTop;
tp := tp + btn.Height;
pnlBotoes.Height := tp; == Aumenta o tamanho do panel de acordo com a quantidade de botões que for criado ==
btn.OnClick := EventoCliqueDinamico; == Atribui a procedure ao clique do botão criado ==
end;
end;

procedure TForm1.EventoCliqueDinamico(Sender: TObject);
var
nome: string;
begin

nome := TComponent(Sender).Name; == Obtém o nome do componente que foi acionado ==

if nome = 'B1' then
begin
ShowMessage('Clicou no botão 1');
end;
if nome = 'B2' then
begin
ShowMessage('Clicou no botão 2');
end;
if nome = 'B3' then
ShowMessage('Clicou no botão 3');
end;

end.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar