Fórum Pegar o componente ativo no formulário? #487523

31/07/2014

0

Amigos
Estou querendo pegar o componente ativo, no momento consigo pegar a resposta em uma variável, mais que gostaria de passar este resultado para uma nova instrução, veja um exemplo. Agradeço a ajuda


procedure TfrmPrincipal.MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 const
   SC_DragMove = $F012;
 var
    sValor : string;  //receber o nome do componente
begin
   sValor := (Sender as TComponent).Name;
   ShowMessage('Este é o componente ativo /clicado : ' + sValor);
   ReleaseCapture;
   //como eu posso passar o componente deste forma
   //sValor + '.' +Perform (WM_SYSCOMMAND, SC_DragMove, 0);
   Panel3.Perform (WM_SYSCOMMAND, SC_DragMove, 0);
end;

Itamar Souza

Itamar Souza

Responder

Post mais votado

31/07/2014

Ignore todo o detalhamento anterior (Atende ao que você precisa, mas totalmente desnecessário).

Como você já está no componente que deseja, é só utilizá-lo, assim como já utiliza pra pegar o nome.

Espero que seja isso.

Abraççç

procedure TfrmPrincipal.MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 const
   SC_DragMove = $F012;
 var
    sValor : string;  //receber o nome do componente
begin
   //aqui eu pego o nome do componente que foi clicado
   sValor := (Sender as TComponent).Name;
   //este é o nome do componente clicado
   ShowMessage('Este é o componente ativo /clicado : ' + sValor);
 
   ReleaseCapture;
    //aqui eu quero passar o nome do componente desta forma
   //tem alum tipo variável que consiga receber os componentes para que eu possa fazer isso
  // Opção 1 se o Perform funcionar com TComponent    obs: tanto faz usar  (Sender as TComponent)  ou TComponent(Sender)
  (Sender as TComponent).Perform (WM_SYSCOMMAND, SC_DragMove, 0);
  
  // Opção 2 se o Perform funcionar apenas identificando a classe
  if Sender is TPanel then
    TPanel(Sender).Perform (WM_SYSCOMMAND, SC_DragMove, 0)
  else if Sender is TButton then
    TButton(Sender).Perform (WM_SYSCOMMAND, SC_DragMove, 0)
  else if Sender is TEdit then
    TEdit(Sender).Perform (WM_SYSCOMMAND, SC_DragMove, 0)
  else if...
  .
  .   // outros
  .
end;



Eu já tinha entendido na anterior e respondi:
TPanel(Self.FindComponent(Screen.ActiveControl.Name)).Perform (WM_SYSCOMMAND, SC_DragMove, 0);


Se é pra qualquer componente, altere o comando que mandei substituindo o TPanel pela classe dos demais componentes:

Qual o intuito do "Perform(WM_SYSCOMMAND, SC_DragMove, 0);" ? Se "Perform" funcionar para TComponent, é só chamar como TComponent:

TComponent(Self.FindComponent(Screen.ActiveControl.Name)).Perform (WM_SYSCOMMAND, SC_DragMove, 0);


Vou explicar melhor o comando anterior:

// Componente Focado - Tanto faz deste jeito ou como você já fazia
sValor := Screen.ActiveControl.Name;

// Localiza o componente através do nome que você salvou na sValor  e aponta para a variável compComponent --- 
// Declarar variável "compComponent : TComponent;" na sua procedure
compComponent  :=  Self.FindComponent( sValor );    

// Para cada tipo de componente que você utilizar, caso venham de hierarquias diferentes, você deverá fazer um tratamento a mais na sua procedure
if compComponent is TPanel then
  TPanel(compComponent).Perform (WM_SYSCOMMAND, SC_DragMove, 0)
else if compComponent is TButton then
  TButton(compComponent).Perform (WM_SYSCOMMAND, SC_DragMove, 0)
else if compComponent is TEdit then
  TEdit(compComponent).Perform (WM_SYSCOMMAND, SC_DragMove, 0)
else
.
. // outros
.


Abraççç,
Renato

Renato Rubinho

Renato Rubinho
Responder

Gostei + 1

Mais Posts

31/07/2014

Renato Rubinho

Buenas,

Segue:

Screen.ActiveControl.Name;

Abraççç,
Renato
Responder

Gostei + 0

31/07/2014

Itamar Souza

Valeu rrubinho

Você chegou a ler o que eu descrevi na minha dúvida?

O que você me passou:
Screen.ActiveControl.Name;

Não seria a mesma coisa que :
sValor := (Sender as TComponent).Name;

O problema é como eu faria isso:

//como eu posso passar o componente deste forma
//sValor + '.' +Perform (WM_SYSCOMMAND, SC_DragMove, 0);

Agradeço!
Responder

Gostei + 0

31/07/2014

Renato Rubinho

Foi mal...
Quando li, entendi que você queria capturar o componente ativo sem utilizar o sender.

Segue:
TPanel(Self.FindComponent(Screen.ActiveControl.Name)).Perform (WM_SYSCOMMAND, SC_DragMove, 0);

Abraççç,
Renato
Responder

Gostei + 0

31/07/2014

Itamar Souza

Agradeço!

Vou explicar melhor:


Tenho uma procedure :
MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

Ela estará ligada a vários componentes no evento OnMouseDow,
no click eu preciso pegar o nome do componente que foi clicado

ex:

procedure TfrmPrincipal.MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 const
   SC_DragMove = $F012;
 var
    sValor : string;  //receber o nome do componente
begin
   //aqui eu pego o nome do componente que foi clicado
   sValor := (Sender as TComponent).Name;
   //este é o nome do componente clicado
   ShowMessage('Este é o componente ativo /clicado : ' + sValor);

   ReleaseCapture;
    //aqui eu quero passar o nome do componente desta forma
   //tem alum tipo variável que consiga receber os componentes para que eu possa fazer isso
   sValor + '.' +Perform (WM_SYSCOMMAND, SC_DragMove, 0);

end;

Responder

Gostei + 0

31/07/2014

Renato Rubinho

Eu já tinha entendido na anterior e respondi:
TPanel(Self.FindComponent(Screen.ActiveControl.Name)).Perform (WM_SYSCOMMAND, SC_DragMove, 0);


Se é pra qualquer componente, altere o comando que mandei substituindo o TPanel pela classe dos demais componentes:

Qual o intuito do "Perform(WM_SYSCOMMAND, SC_DragMove, 0);" ? Se "Perform" funcionar para TComponent, é só chamar como TComponent:

TComponent(Self.FindComponent(Screen.ActiveControl.Name)).Perform (WM_SYSCOMMAND, SC_DragMove, 0);


Vou explicar melhor o comando anterior:

// Componente Focado - Tanto faz deste jeito ou como você já fazia
sValor := Screen.ActiveControl.Name;

// Localiza o componente através do nome que você salvou na sValor  e aponta para a variável compComponent --- 
// Declarar variável "compComponent : TComponent;" na sua procedure
compComponent  :=  Self.FindComponent( sValor );    

// Para cada tipo de componente que você utilizar, caso venham de hierarquias diferentes, você deverá fazer um tratamento a mais na sua procedure
if compComponent is TPanel then
  TPanel(compComponent).Perform (WM_SYSCOMMAND, SC_DragMove, 0)
else if compComponent is TButton then
  TButton(compComponent).Perform (WM_SYSCOMMAND, SC_DragMove, 0)
else if compComponent is TEdit then
  TEdit(compComponent).Perform (WM_SYSCOMMAND, SC_DragMove, 0)
else
.
. // outros
.


Abraççç,
Renato
Responder

Gostei + 0

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

Aceitar