System.ObjAuto.ObjectInvoke

De RAD Studio API Documentation
Aller à : navigation, rechercher

Delphi

function ObjectInvoke(Instance: TObject; MethodHeader: PMethodInfoHeader; const ParamIndexes: array of Integer; const Params: array of Variant): Variant;

C++

extern DELPHI_PACKAGE System::Variant __fastcall ObjectInvoke(System::TObject* Instance, PMethodInfoHeader MethodHeader, const int *ParamIndexes, const int ParamIndexes_High, const System::Variant *Params, const int Params_High);

Propriétés

Type Visibilité  Source Unité  Parent
function public
System.ObjAuto.pas
System.ObjAuto.hpp
System.ObjAuto System.ObjAuto

Description

Invoque dynamiquement une méthode d'un objet.

Utilisez ObjectInvoke pour appeler dynamiquement une méthode d'un objet. Cette méthode doit disposer d'informations suffisantes sur le type.

Paramètre Description
Instance Instance de la classe à laquelle appartient la méthode.
MethodHeader Représente les informations de type de la méthode. Elles peuvent s'obtenir via GetMethodInfo.
ParamIndexes Tableau d'index des paramètres. Le principe est que les index sont décalés de 1. Le nombre d'index ne doit pas correspondre au nombre de paramètres. Les paramètres restants sont censés compléter les trous laissés par les index. Les index ParamIndexes sont censés suivre l'ordre lexical, et non l'ordre lexical inversé, comme les paramètres Params.
Params Tableau de type Variant contenant les paramètres d'appel de la fonction. L'ordre des paramètres est censé suivre l'ordre lexical inversé, avec le dernier paramètre en première position.


ObjectInvoke peut appeler :

  • une méthode à 31 paramètres sans type de retour
  • une méthode à 30 ou 31 paramètres avec un type de retour

Un type de retour complexe inclut String ou le type d'enregistrement requiert un paramètre caché. Dans ce cas, ObjectInvoke peut appeler la méthode à 30 paramètres.

ObjectInvoke ne résout pas les méthodes surchargées. GetMethodInfo renvoie la première entrée de méthode surchargée de la liste des méthodes. Pour sélectionner la méthode correcte, vous pouvez utiliser la fonction System.Rtti.TRttiType.GetMethods ou d'autres fonctions RTTI. En outre, ObjectInvoke ne supporte pas de paramètre par défaut.


ObjectInvoke a besoin d'informations System.Rtti pour décider du nombre de paramètres, du type de paramètres et du type de retour. Si la méthode d'appel manque d'informations System.Rtti, ObjectInvoke déclenche une classe Exception avec le message SNoRTTIInfoType. Les méthodes suivantes ne disposent pas d'informations System.Rtti :

  • Méthode Safecall
  • Paramètres avec tableau ouvert (par exemple : procedure foo( ary: array of integer ) )
  • Paramètres avec un type énuméré à valeur assignée (par exemple : TFoo = (a, b, c = 100) )


Pour Windows 32 et OSX 32 uniquement :

Comme Variant OLE (Windows) ne supporte pas le type Extended 80 bits, le type Variant ne peut pas conserver une valeur à virgule flottante Extended 80 bits / 10 octets. Si une méthode a un paramètre de type Extended ou renvoie une valeur de type Extended, ObjectInvoke déclenche une classe EObjectInvokeExtendedTypeException.

Si le type de retour de la méthode est Extended, ObjectInvoke appelle la méthode, capture la valeur Extended et déclenche l'exception EObjectInvokeExtendedTypeException avec la valeur Extended d'origine. L'application peut accéder à la propriété Ext pour obtenir la valeur de retour d'origine.

Le nouvel indicateur RaiseExceptionForExtendedType est introduit dans l'unité System.ObjAuto. Cet indicateur a la valeur TRUE par défaut.

  • Si cet indicateur a la valeur True, ObjectInvoke suit le même comportement que la version précédente. Si un paramètre a le type Extended ou si le type de retour est Extended, ObjectInvoke déclenche l'exception.
  • Si cet indicateur a la valeur False, ObjectInvoke convertit tout paramètre de type Extended en type Double 64 bits avant d'appeler une méthode, puis convertit la valeur de retour Extended en Double.
Remarque : La méthode Invoke et le type TValue peuvent gérer le type Extended.

Voir aussi

Exemples de code