Ver Mensaje Individual
  #4  
Antiguo 11-07-2006
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Reputación: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
No, porque quien hace la llamada es un procedimiento que nada tiene que ver con las clases (recibe el objeto como parámetro).

Creo que, después de pensarlo, he encontrado un punto de partida. El siguiente método es el de la clase "base":
Código Delphi [-]
(* TGTK_OBJECT::signal_connect:
 *   Conecta la señal con el procedimiento o función de respuesta
 *   correspondiente. *)
PROCEDURE TGTK_OBJECT.signal_connect (aName: Pgchar; aFunc: TGtkSignalFunc);
BEGIN
  gtk_signal_connect (SELF.GtkObject, aName, aFunc, SELF);
END;

Lo que hace es registrar un procedimiento (pasado en el parámetro aFunc) para que sea utilizado como respuesta al evento 'aName'.

El procedimiento 'gtk_signal_connect' recibe, primero, el puntero al objeto GTK (algo así como el handle de un control Windows), el nombre del evento, el puntero de la función o procedimiento de respuesta del evento (no puede estar dentro de una clase) y un valor que será pasado a la función de respuestas al evento. Yo le paso la referencia al objeto para recuperarlo más tarde. Así, para el evento "destroy" utilizo la siguiente llamada:

Código Delphi [-]
(*** Señales "signals" ***)

(* _signal_destroy_:
 *   Respuesta a la señal "destroy". *)
PROCEDURE _signal_destroy_ (ObjetoGTK: pGtkObject; aData: TGTK_OBJECT); CDECL;
BEGIN
  aData.sDestroy;
END;



(* TGTK_OBJECT::Create:
 *   Crea el objeto, asignando su puntero. *)
CONSTRUCTOR TGTK_OBJECT.Create (aGtkObject: PGtkObject);
BEGIN
  fGtkObject := aGtkObject;
{ Respuesta a las señales. }
WriteLn ('Señales TGTK_OBJECT');
  signal_connect ('destroy', GTK_SIGNAL_FUNC (@_signal_destroy_));
END;

El método 'sDestroy' es un método virtual. El problema está en que, aunque sobrecargue (OVERRIDE) dicho método en una clase hija, el procedimiento '_signal_destroy_' sigue llamando al método de la clase base (en este caso TGTK_OBJECT). Creo que el problema está en utilizar 'SELF' al llamar a 'gtk_signal_connect' pero, ¿de qué otra forma podría hacerlo sino?
Responder Con Cita