Ver Mensaje Individual
  #16  
Antiguo 04-10-2008
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Reputación: 22
gatosoft Va camino a la fama
bueno amigo enecumene, independintemente de si lo haces con Frames o Paneles, creo que debes aclarar un poco mas el tema de donde y por que se crea este evento y como funciona...

Si buscas en la ayuda, verás que el evento OnClick está definido como una propiedad (Property) dentro de la mayoria de objetos visuales (¿o todos?)

Código Delphi [-]
  Property OnClick:TNotifyEvent;

entonces Onclick es una variable (puntero) que referencia a un procedimiento... Pero atención no es cualquier procedimiento..!!! es uno especial definido como un tipo asi:

Código Delphi [-]
type TNotifyEvent = procedure (Sender: TObject) of object;

Esto quiere decir que el tipo TNotifyevent es un tipo de procedimiento que debe estar definido dentro de una clase (De ahi el of Object)


Entonces... tu puedes definir tu procedimiento dentro de cualquier clase que tengas en esta u otra unidad... lo mas comun es hacerlo dentro del Tform

Código Delphi [-]
TForm1 =class(Tform)
public
  procedure MyOnClick (Sender: TObject);
end; //de la clase formulario

//Pero tambien puedes hacerlo en cualquier otro objeto, asi

TMyPanelPersonalizado = class(Tpanel)
Public
  procedure MyOnClick (Sender: TObject);
end; //de la clase panel

TunaOtraClaseDePanel=class(TPanel)
public
  //un panel normalito...
end; //

La implementación, la debes hacer (Obviamente en la seccion implementation)

De la siguiente Manera:

Código Delphi [-]
Procedure TForm1.MyOnClick(Sender:TObject);
Begin
  //
end;

Procedure TMyPanelPersonalizado.MyOnClick(Sender:TObject);
Begin
  //
end;


ahora, puedes comenzar a asignarle tus eventos Onclick al objeto que quiereas..!!!

Aunque aqui tengo una duda y por favor me corrigen....creo que no puedes asignarselo a la misma clase donde fue definida... es decir, en el caso de

Código Delphi [-]
TMyPanelPersonalizado = class(Tpanel)
Public
  procedure MyOnClick (Sender: TObject);
end; //de la clase panel

No podrias hacer esto

Código Delphi [-]
Constructor TMyPanelPersonalizado.Create;
Begin
   ...
  {Self.}OnClick:={Self.}MyOnClick;
end;


Pero si puedes hacer esto:

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
Begin
   //Objetos creados en tiempo de diseño:
   Label1.OnClick:=MyOnclick; //Asigan el onclik definido en TForm1
   Panel1.OnClick:=MyOnClick; //Asigan el onclik definido en TForm1

//Objeto Creado dinamicamente:

  with TMiPanelpersonalizado.Create(...) do
  begin
     Parent := Self; //Self aqui es el TForm
     Align := alClient;
     Onclick := MyClick; //¿Cual Onclick ?... pues el de Tform... 
                               //por que estamos dentro del procedimiento
                              //OnCreate del tForm
  end;//
end;


En tu caso definiste el evento en el Tpanel1 y se lo asignaste a tu imagen en el evento OnCreate del Panel....

como todos los objetos referncian al mismo evento onclick, entonces los puedes diferenciar mmediante el sender...

El sender, en este y todos los objetos es la instancia que dispara el evento... y puedes difernciar tus objetos asi:

Código Delphi [-]
Procedure TForm1.MyOnClick(Sender:TObject);
Begin
   if Sender is tLabel then
      (Sender as Tlabel).Captio:='Hola';

   if Sender is TMyPanelPersonalizado then
     (sender as TPanelPersonalizado).Caption:='Otra cosa....'

// o si implementaste una diferenciación por tags, u otra propiedad puedes manejarla tambien...

 if Sender.Name='TLabel1' then
   showMessage('Pinchaste el Label1');

end;


Saludos....
Responder Con Cita