Pregunta

Estoy escribiendo un control que debe ser capaz de mostrar cualquier lista de datos. Lo que quería hacer era imitar la for-in construir en que puedo comprobar si hay una función GetEnumerator pública que contiene una propiedad actual y un método MoveNext.

he determinado lo siguiente:

  1. puedo comprobar la existencia de un método, simplemente llamando a MethodAddress en mi objeto. Si consigo la dirección, existe el método.
  2. puedo usar RTTI para comprobar el tipo de retorno del método.
  3. Puedo utilizar RTTI para comprobar la propiedad y leerlo.

En los intervalos entre sin embargo, me faltan pequeños trozos de información:

  1. Como llamar en el método, dado su dirección? No acabo de escribir una definición (como si se tratara de las importaciones), la dirección de fundido y lo llaman?
  2. Comprobación del tipo de retorno del método requiere llamar GetTypeData con su PTypeInfo. Me da la PTypeInfo llamando TypeInfo en un tipo. Entonces, ¿cómo puedo obtener un PTypeInfo para un método determinado, dado sólo su dirección?
¿Fue útil?

Solución

  1. Para llamar al método, se toma la dirección devuelta y ponerlo en el puntero del Código de un TMethod. Poner el objeto en el puntero de datos, y luego convertirlo a un puntero método con la firma derecha.
  2. Para analizar la firma de una función, necesita algunos bastante complicada RTTI. Ver http://hallvards.blogspot.com/2006 /05/hack-10-getting-parameters-of.html para los detalles. Pero tenga en cuenta la advertencia hacia la parte inferior:
  

Tenga en cuenta que esto sólo funciona si el   instancia (o uno de sus componentes)   También tiene una propiedad publicada que   apunta al método publicado. los   buena noticia es que este es el caso de   la mayoría de los métodos publicados existentes - tales   como los controladores de eventos en un TForm   ejemplo. La mala noticia es que este   No sería el caso para cualquier   métodos publicados que nos gustaría   llamar dinámicamente en tiempo de ejecución (y por tanto   No sería asignado a ningún evento).

Así que lo que estamos tratando de hacer no puede ser posible bajo el modelo actual de RTTI. Pero Delphi 2010 se supone que tiene un sistema ampliado de RTTI que le permitirá hacer cosas por el estilo mucho más fácilmente, y es debido a cabo RSN. (No solía ser una cuenta atrás de liberación en el sitio de Embarcadero que se cuenta atrás hacia la medianoche de hoy. Se han llevado hacia abajo, sin embargo, así que no estoy seguro si eso es todavía la fecha de lanzamiento oficial o no).

Otros consejos

Al principio, tenga en cuenta que RTTI sólo está disponible para propiedades y métodos publicados.

Para llamar al método recuperado por MethodAdress, acaba de hacer:

TMyMethod = procedure (Self : TObject; const Param : String);
...
var
  MyMethod : TMyMethod;
...
MyMethod := Obj.MethodAdress ('MethodName');
if Assigned (MyMethod) then
  MyMethod (Obj, 'Hallo');

En cuanto a su segunda pregunta, esto podría ayudar:

Enlace

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top