Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #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.025
Poder: 28
Ñ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
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿Qué son los métodos virtuales y los métodos de clase? David OOP 4 27-07-2019 23:04:30
Virtual Replay - Repetición Virtual de los Goles del Mundial delphi.com.ar La Taberna 0 26-06-2006 17:15:07
Llamar a un método sin tener instacia. piccolo2101 Varios 5 15-12-2005 10:14:35
Como hacer un teclado virtual Andres_Franco DelphiPACK 2 07-01-2004 09:23:12
¿Cómo puedo llamar al método heredado de una clase que no es el ancestro directo? sarackganda OOP 4 15-12-2003 22:19:49


La franja horaria es GMT +2. Ahora son las 09:48:32.


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