1 pièce(s) jointe(s)
Erreur invocation d'un constructeur RTTI
Bonjour, :D:D
J'ai repris le code basique comme initiation aux RTTI de Robert Love dans son blog et je l'ai adapté à mes connaissance, mais j'ai une erreur de violation d'accès au niveau de la création de la StringList,
Le code est très simple, il illustre la création dynamique d'une StringList, l'alimenter de quelques lignes et d'afficher son contenu, tout ceci dans une application console, alors je voici le code
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
Vcl.StdCtrls,
System.Classes,
System.TypInfo,
System.Rtti;
Var
Contexte: TRttiContext;
MonType: TRttiType;
TypeInstance: TRttiInstanceType;
ClasseDeReference: TClass;
StringList: TValue;
Lignes: TValue;
begin
// Création du contexte
Contexte := TRttiContext.Create;
Try
// Identification du type
MonType := Contexte.FindType('Classes.TStringList');
TypeInstance := MonType as TRttiInstanceType;
ClasseDeReference := TypeInstance.MetaclassType;
// Invocation des méthodes
// 1. Création de la StringList
StringList := TypeInstance.GetMethod('Create').Invoke(ClasseDeReference, []).AsType<TStringList>;
// 2. Ajout d'une ligne à notre StringList
TypeInstance.GetMethod('Add').Invoke(StringList, ['Bonjour, comment vas tu?']);
// 3. Ajout d'une seconde ligne à la StringList
TypeInstance.GetMethod('Add').Invoke(StringList, ['Bon, je dois te laisser maintenant']);
Lignes := TypeInstance.GetProperty('Text').GetValue(StringList.AsObject);
WriteLn(Lignes.ToString);
Finally
Contexte.Free;
End;
Readln;
end. |
Le compilateur s'arrête à l'invocation de la méthode Create de la StringList, dans le code de Robert, il fait l'appel de Invoke sans le cast AsType<TStringList>, je l'ai ajouté, mais j'ai toujours cette erreur mémoire.
J'ai essayé pas mal de façons pour invoquer le constructeur mais toujours cette erreur mémoire
Code:
1 2 3 4 5
|
// 1.2 Option #2 j'essaie encore avec le constructeur du contexte RTTI ... ça marche pas !
StringList := (Contexte.FindType('Classes.TStringList') as TRttiInstanceType).MetaclassType.Create;
// 1.3 Option #3 une autre façon pour le faire mais ...
StringList := TClass((Contexte.FindType('Classes.TStringList') as TRttiInstanceType).MetaclassType).Create; |
Au début du code, je me suis dit que peut être if faut inculre les directives pour les RTTI et donc j'ai ajouté les directives suivantes
Code:
{$M+} {$TYPEINFO ON} {$METHODINFO ON}
Comment alors peut-on corriger l'invocation du constructeur de notre StringList,
Merci d'avance..:D:D