angenommen ich habe folgende Klasse:
Code: Alles auswählen
type
TMyClass = class(TObject)
private
FData: TBytes;
published
property Data: TBytes read FData write FData;
end;
Code: Alles auswählen
type
TMyClass = class(TObject)
private
FData: TBytes;
published
property Data: TBytes read FData write FData;
end;
Code: Alles auswählen
procedure TForm1.BitBtn1Click(Sender: TObject);
var
Count, Loop: Integer;
List: TPropList;
PropInfo:PPropInfo;
ArrayTypeData:TArrayTypeData;
TestArray:Pointer;
i:integer;
begin
MyClass:=TMyClass.Create;
MyClass.Data:=[10,10,15,10];
Count := GetPropList(TypeInfo(MyClass), tkAny, @List);
Listbox1.Items.BeginUpdate;
for Loop := 0 to Pred(Count) do begin
PropInfo:=List[Loop];
if PropIsType(MyClass,PropInfo^.Name,tkDynArray) then begin
TestArray:=GetDynArrayProp(MyClass,PropInfo);
for i := 0 to high(TBytes(TestArray)) do begin
ListBox1.Items.Add(intToStr(TBytes(TestArray)[i]));
end;
end;
// Listbox1.Items.Add(PropInfo^.Name);
end;
Listbox1.Items.EndUpdate;
end;
Du musst als erstes die Property Data auf published setzen - für public werden keine RTTI-Daten erzeugt.m.fuchs hat geschrieben:Wie kann ich per RTTI auf Data zugreifen und den Inhalt lesen und/oder schreiben?
Ich meine schon, für Klassen, weil nicht alles geht in "published" z.b. Klassen und ich meine auch Record gehen nicht.Du musst als erstes die Property Data auf published setzen - für public werden keine RTTI-Daten erzeugt.
Ach, dass geht auch ohne das die Klasse von "TPersistent" abgeleitet ist....Für TObject musst du dies noch per Compiler-Schalter aktivieren: {$M+}
{ Note: since the Lazarus IDE is not yet capable of correctly handling generic
functions it is best to define a InLazIDE define inside the IDE that disables
the generic code for CodeTools. To do this do this:
- go to Tools -> Codetools Defines Editor
- go to Edit -> Insert Node Below -> Define Recurse
- enter the following values:
Name: InLazIDE
Description: Define InLazIDE everywhere
Variable: InLazIDE
Value from text: 1
}
Jepp, das hatte ich im Beispiel leider falsch geschrieben. Die Property ist published und auch der Compilerschalter passt. Für Strings, Integer, etc. bekomme ich auch alles schon hin. Ich weiß bloss nicht wie ich bei einem dynamischen Array die Übergabe mache.Socke hat geschrieben:Du musst als erstes die Property Data auf published setzen - für public werden keine RTTI-Daten erzeugt.m.fuchs hat geschrieben:Wie kann ich per RTTI auf Data zugreifen und den Inhalt lesen und/oder schreiben?
Für TObject musst du dies noch per Compiler-Schalter aktivieren: {$M+}
Dein Beispiel funktioniert bei mir ganz gut.pluto hat geschrieben:Hilft mein Beispiel nicht? oder habe ich was Falsch verstanden?
Code: Alles auswählen
if PropInfo^.PropType^.Name <> PTypeInfo(TypeInfo(TBytes))^.Name then continue;
Ich habe in der RTTI Unit auch das Record TValue gefunden, hast du damit mal gearbeitet? Ich habe dazu kein echtes Beispiel finden können....Man kann das ganze Array-Handling auch generisch per RTTI aufbauen, das ist dann ein wenig komplizierter ...
Ich habe noch mal was getestet: Die Unit RTTI wird nicht gebraucht.Na ok, dann nützt mir das erstmal nix. Aber ich behalte es im Auge, wenn irgendwann man 3.2. released wird.