Zitat von
Muetze1:
TPersistent muss nicht sein, man kann auch eigene Klasse ab TObject dazu bringen, wenn der Compilerschalter {$M+} vor dem Block der Properties und {$M-} dahinter angegeben wird. Dies schaltet die Generierung der
RTTI für den Bereich ein. Mehr macht TPersistent grundlegend auch nicht. Aber private & protected - ich bin mir nicht sicher, aber diese sollten trotzdem nicht funktionieren - aber ab public sollte es klappen.
Public properties kann man mit
RTTI leider nicht setzen. Kleines Beispielprgroamm:
Delphi-Quellcode:
program ExRTTI;
{$APPTYPE CONSOLE}
uses
SysUtils, TypInfo, Classes;
type
{$M+} {$TYPEINFO ON} {$METHODINFO ON}
TFoo = class(TObject)
private
FBar: string;
public
property Bar: string read FBar write FBar;
end;
var
Foo: TFoo;
PropInfo: PPropInfo;
TypeKind: TTypeKind;
begin
Foo := TFoo.Create;
Foo.Bar := 'boo';
{ Get info record for Bar property }
PropInfo := GetPropInfo(Foo, 'Bar');
{ If property exists, set value to test }
if Assigned(PropInfo) then
begin
SetStrProp(Foo, PropInfo, 'test');
end;
WriteLn('Foo.Bar=' + Foo.Bar);
ReadLn;
end.
Sobald man public in published ändert, kann die Property Bar gesetzt werden. {$TYPEINFO ON} {$METHODINFO ON} braucht man dazu auch nicht anzugeben. (Delphi 2009)