Club Delphi  
    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


Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-03-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.535
Poder: 23
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
La directiva $MethodInfo

¡Hola!

Cita:
Empezado por Al González
MethodAddress sólo[*] funciona con métodos publicados.
* Esto que he comentado en algunas ocasiones dejó de ser completamente cierto, al menos desde Delphi 7. Si bien es verdad en la gran mayoría de los casos, y la misma ayuda de Delphi 7 lo señala sin insinuar otra cosa:
Cita:
If Name does not specify a published method for the object, MethodAddress returns nil.
Lo cierto es que al menos desde esa versión existe una directiva de compilación poco conocida y escasamente documentada, de nombre $MethodInfo. Con ella puede generarse RTTI también para métodos públicos. Pero va más allá: esta directiva además agrega información sobre los parámetros, la convención de llamada y el tipo de dato que los métodos devuelven, es decir, una descripción detallada de cada método que la clase compilada con esa directiva (o cualquiera de sus descendientes) tenga en las secciones Public y Published.

Esto lo descubrí la mañana de ayer, durante una breve investigación relacionada con un trabajo que estoy realizando, gracias a este par de referencias:

http://hallvards.blogspot.com/2006/0...lass-rtti.html

http://davidglassborow.blogspot.com/...lass-rtti.html

Por cierto, el noruego Hallvard tiene publicados en su bitácora una buena cantidad de artículos altamente reveladores para quienes sentimos más que curiosidad por la RTTI.

Esta es una pequeña prueba que hice para verificar que aun con métodos públicos es posible usar MethodAddress:
Código Delphi [-]
type
  {$MethodInfo On}
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    Procedure Proc1; Virtual; Abstract;
  Protected
    Procedure Proc2; Virtual; Abstract;
  public
    { Public declarations }
//  Published
    Procedure ProcA; Virtual; Abstract;
  end;
  {$MethodInfo Off}

  TF2 = Class (TForm1)
    Public
      Procedure ProcB; Virtual; Abstract;
  End;

  { NOTA: Los métodos han sido declarados como abstractos para obviar su
    implementación. }

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage (IntToStr (Integer (MethodAddress ('Proc1'))));
  ShowMessage (IntToStr (Integer (MethodAddress ('Proc2'))));
  ShowMessage (IntToStr (Integer (MethodAddress ('ProcA'))));
  ShowMessage (IntToStr (Integer (TF2.MethodAddress ('ProcB'))));
  Close;
end;

Copio esta información del artículo de Glassborow, para tener muy en cuenta:
Cita:
Empezado por online documentation
The $METHODINFO switch directive is only effective when runtime type information (RTTI) has been turned on with the {$TYPEINFO ON} switch. In the {$TYPEINFO ON} state, the $METHODINFO directive controls the generation of more detailed method descriptors in the RTTI for methods in an interface. Though {$TYPEINFO ON} will cause some RTTI to be generated for published methods, the level of information is limited. The $METHODINFO directive generates much more detailed (and much larger) RTTI for methods, which describes how the parameters of the method should be passed on the stack and/or in registers. There is seldom, if ever, any need for an application to directly use the $METHODINFO compiler switch. The method information adds considerable size to the executable file, and is not recommended for general use.
Un abrazo público.

Al González.
__________________
@algonzalez74

Última edición por Al González fecha: 05-03-2009 a las 09:00:43.
Responder Con Cita
  #2  
Antiguo 05-03-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 15.816
Poder: 10
Neftali [Germán.Estévez] Tiene un aura espectacularNeftali [Germán.Estévez] Tiene un aura espectacular
Gracias por el aporte y las referencias. Muy interesantes.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 26-01-2010
Avatar de yapt
yapt yapt is offline
Miembro
NULL
 
Registrado: sep 2006
Ubicación: España
Posts: 258
Poder: 13
yapt Va por buen camino
Es que NI TE IMAGINAS lo bien que me ha venido este hilo....

Responder Con Cita
Respuesta


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
local-infile es una directiva o es un comando? Alexis De la Cr MySQL 4 05-07-2008 21:44:18
Directiva del compilador {$VARPROPSETTER ON} gslcene Varios 0 22-06-2008 13:54:10
La Eurocámara rechaza la directiva sobre la patentabilidad del 'software' Investment Noticias 1 06-07-2005 15:53:14


La franja horaria es GMT +2. Ahora son las 13:41:20.


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