2010-12-20 13 views
5

Me pregunto si esto es posible o no, en caso afirmativo, ¿cómo? Ejemplo de código por favor.Convertir el puntero del método a entero, y luego llamarlo

  • cómo almacenar un puntero a un método de un objeto como un valor entero ?
  • ¿Cómo convertir ese valor entero a un 'puntero de método' y llamarlo?

Lo que quiero hacer es almacenar un 'puntero de método' en el valor de Tag entero de un objeto derivado de TComponent, y en algún momento más tarde llamar al método almacenado. Puede suponer que todos los métodos met tienen la misma definición.

Gracias!

+3

puntero del método de ajuste costumbre en la etiqueta de 32 bits –

Respuesta

5

Usted puede hacer solución, pero no šī diseño agradable ...

var 
    Method: ^TNotifyEvent; 
begin 
//Create New method 
    GetMem(Method, SizeOf(TNotifyEvent)); 
//Init target Tag 
    Tag := Integer(Method); 

//Store some method 
    Method^ := Button1Click; 

//call stored method 
    Method := (Pointer(Tag)); 
    Method^(self); 

//And don't forget to call in to object destructor... 
    if Tag <> 0 then 
    FreeMem(pointer(Tag)); 
+0

gracias. ¿Parece que su código es un ejemplo de la descripción de Craig Peterson? –

+0

@Edwin, sí, eso es lo que habría publicado si hubiera tenido más tiempo. –

+0

Sí, la idea es la misma. Lo estoy usando en uno de mis programas ... –

9

No, no es posible. Un método de objeto es equivalente a TMethod:

TMethod = record 
    Code, Data: Pointer; 
end; 

El campo Code es la dirección del método, y el campo Data es el oculto Self parámetro que se pasa en cada método de objeto. El registro es del mismo tamaño que un Int64, por lo que si lo lanzas como un Entero simple, perderás la mitad.

Puede asignar un registro de TMethod en el montón usando GetMem y luego almacenar la dirección de eso en la propiedad Tag, siempre que recuerde liberarlo cuando haya terminado con él.

+0

Gracias por la explicación. No entiendo por qué el código de Darian Miller funcionó ... –

+0

No lo hizo. El caso simple publicado no se encontró con él, pero hubo fallas fatales que hubieran bloqueado un programa real. –

Cuestiones relacionadas