PDA

Ver la Versión Completa : Conocer el componente que lanza un popup


sitrico
11-04-2007, 01:43:30
Tengo creado un tScrollBox que contiene varios objetos tjvStaticText, a esos objetos (los tjvStaticText) les asigno un popupmenu que a su vez contiene los menus asociados a Taction, cuando ejecuto el método taction.execute como puedo saber cual de los objetos tjvStaticText lanzó el popup.

OJO: todo esos componentes los creo en tiempo de ejecución.

Pensé que debia usar el (sender) así:


procedure Tform.AccionExecute(Sender: TObject);
begin
If Sender is tjvStaticText Then
EjecutarProcedimiento(tjvStaticText(sender).tag);
end;


Pero al probar resulta que "sender" no es tjvStaticText (es un tAction :confused: ), como puedo saber dentro el execute de la acción que objeto desplegó el popup

Acepto ideas y sujerencias ya que no tengo la menor idea de como resolver esto, muchas gracias. :o

sitrico
11-04-2007, 04:47:02
Sigo sufriendo...

La clase TAction tiene la propiedad: ActionComponent que segun dice la ayuda de Delphi:

Description

Use ActionComponent to discern which client component caused this action to execute. For example, examine ActionComponent from an OnExecute event handler if you need to know what user action triggered this action.

When the user clicks a client control, that client sets ActionComponent before calling the action’s Execute method. After the action executes, the action resets ActionComponent to nil (Delphi) or NULL (C++).

Deberia apuntar al componente que llamó la acción: el TMenuItem !!!!!

Un componente que no puede tener el foco podrá lanzar eventos???

sitrico
11-04-2007, 05:04:58
La desesperaciónera tal que buscando en un foro EN RUSO :

http://www.sql.ru/forum/actualthread.aspx?tid=395220

encontré esto:

TPopupMenu(TMenuItem(TAction(Sender).ActionComponent).GetParentComponent).PopupComponent

Que parece ser el componente que realmente inicio la acción.

Despues de las pruebas de rigor FUNCIONA :D :D :D

Quedó así:


procedure TfCitas.acEnviarAListaEsperaExecute(Sender: TObject);
begin
If TPopupMenu(TMenuItem(TAction(Sender).ActionComponent).GetParentComponent).PopupComponent is TSNMCCita Then
Begin
With TSNMCCita(TPopupMenu(TMenuItem(TAction(Sender).ActionComponent).GetParentComponent).PopupComponent) do
Lista.EnviarAListadeEspera(IdArea,IdPaciente,IdCita);
JvClock1Alarm(Sender);
End;
end;