Bonjour,
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
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.
J'ai essayé pas mal de façons pour invoquer le constructeur mais toujours cette erreur mémoire
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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;Comment alors peut-on corriger l'invocation du constructeur de notre StringList,
Code : Sélectionner tout - Visualiser dans une fenêtre à part {$M+} {$TYPEINFO ON} {$METHODINFO ON}
Merci d'avance..
Partager