@Phoenix: Da steht aber nur der Zeiger. Das wird recht kompliziert.
Erweiterte Möglichkeit zu Phoenix:
Variable ist "String", also dynamisch. Damit muss sie definitv in der
RTTI auftauchen.
Die
RTTI zum Datenrecord einer Klasse findest du so
Delphi-Quellcode:
var inittable:^pointer;
begin
inittable:=pointer(integer(self.classparent)+vmtinittable); //oder noch mehr classparent's; je nachdem wo man hinwill
//oder nicht im Parent, dann pointer(integer(ppointer(self)^)+vmtinittable);
//bzw. pointer(integer(mytest.classInfo)+vmtinittable);
if inittable<> nil then
inittable:=inittable^
else
//diese Klasse hat (in der Generation) keine dynamischen Komponenten
Dort (bei inittable) dürftest du erstmal ein $0E für Record finden, dann einen Shortstring der nur aus dem Längenbyte besteht (indem 0 drinn steht), und dann kommt folgender Datenkonstrukt
Delphi-Quellcode:
//RTTI eines Records
type PPropContent=^TPropContent;
TPropContent=record
RecordData:pointer;
//RTTI einer dynamischen Variablen innerhalb des Records
Position:LongInt;
//Position der Variablen im Record
end;
type PRecordData=^TRecordData;
TRecordData=record
ParamCount:cardinal;
//Größe des Records insgesamt
PropCount:cardinal;
//Anzahl der dynamischen Komponenten
Content:
array[0..16737]
of TPropContent;
end;
Dich interessiert davon das Array Content[0..Propcount-1]. Und in jedem Element des Arrays hlst du dir RecordData. Das ist ein Zeiger auf einen Zeiger auf die
RTTI der dynamischen Komponente aus deiner Klasse. Und wenn dort das erste Byte $0A ist, dann ist die dynamische Komponente ein String (Du kannst auch mit den Konstanten aus der TypeInfo arbeiten tkString=10).
Jetzt weist du dass diese dynamische Komponente ein String ist und du nimmst dir Position, addierst den Wert zu self und hast deinen String.
Und jetzt musst du den Inhalt überprüfen, wie Phoenix sagte.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.