Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Componente que ejecute un evento de un componente asociado (https://www.clubdelphi.com/foros/showthread.php?t=74551)

r_e_g_2007 24-06-2011 22:20:05

Componente que ejecute un evento de un componente asociado
 
Hola,
Un saludo a todos
Tengo un componente no visual que tiene una propiedad Control: WinControl. Entonces quisiera que cada vez que se haga clic (OnClick) en el componente que se selecciona en la propiedad Control se ejecute un codigo que tengo en mi componente. Ademas de este código que está en mi componente debe ejecutarse el codigo del evento OnClick del componente asociado si es que el programador le pone algo en ese evento. Es decir debe ejecutarse cuando se da clic en ese componente puesto en Control el codigo hecho en mi documento y además el codigo que el programador ponga en el evento OnClic
Aqui pongo un pedazo del programa

Código Delphi [-]
 
TMyComponente = class
private
 FControl: TWinControl;
 procedure ControlClick(Sender: TObject);
published
 property  Control: TWinControl read FControl write FControl; //Para asociar un componente 
visual
end;

TForm1= class(TForm)
 Panel1: TPanel;
 procedure Panel1Click(Sender: TObject);
end;

Quisiera que se ejecutara para el control asociado el codigo controlclick cuando se de click en el componente visual y además el evento ONClick de Panel1 Panel1Click.
Bueno cualquier idea que puedan darme se lo agradeceré.
Una vez mas muchas gracias por todo.

maeyanes 27-06-2011 18:18:18

Hola...

Ya se ha hablado en alguna ocasión sobre esto en los foros. Básicamente lo que tienes que hacer es declarar una variable del tipo TNotifyEvent en tu componente. En esta variable guardas lo que tenga asociado el evento OnClick del control.

Algo así:

Código Delphi [-]
TMyComponent = class
private
  FOldOnClick: TNotifyEvent;

  procedure ControlClick(Sender: TObject);
protected
  procedure Loaded; override;
end;

implementation

procedure TMyComponent.ControlClick(Sender: TObject);
begin
  // Codigo a ejectuar
  if Assigned(FOldOnClick) then
    FOldOnClick(Sender)
end;

procedure TMyComponent.Loaded;
begin
  inherited;
  if not (csDesigning in ComponentState) and Assigned(FControl) then
  begin
    FOldOnClick := FControl.OnClick;
    FControl.OnClick := ControlClick
  end
end;


Saludos...

roman 27-06-2011 18:26:31

Aún así, es una práctica insegura. Si el programador, por la razón que sea, hace la asignación del evento en tiempo de ejecución, se da al traste con el comportamiento deseado de TMyComponent.

// Saludos

maeyanes 27-06-2011 19:06:53

Hola...

Eso si, lo dicho por roman puede afectar al comportamiento del componente. Otra situación que no contempla el código que puse es si se cambia la propiedad Control (se asigna otro control) en tiempo de ejecución, pero eso se puede solucionar usando un "setter" para la propiedad.


Saludos...

roman 27-06-2011 19:15:48

Cita:

Empezado por maeyanes (Mensaje 404965)
pero eso se puede solucionar usando un "setter" para la propiedad.

¿Como éste?



:D

// Saludos


La franja horaria es GMT +2. Ahora son las 01:15:27.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi