Also erst mal ein Beispiel, wie man eine Bitmap z.B. per
RTTI lädt:
Delphi-Quellcode:
...
// nur bei Delphi < D5
function GetObjectProp(Instance: TObject; const PropName: string): TObject;
function IsPublishedProp(Instance: TObject; const PropName: string): Boolean;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
LoadBitmapPerRTTI(Image1);
end;
procedure TForm1.LoadBitmapPerRTTI(AObject: TObject);
Var
ATmpObj: TObject;
ABitMap: TBitMap;
begin
ATmpObj := nil;
ABitMap := nil;
if IsPublishedProp(AObject, 'Picture') then
ATmpObj := GetObjectProp(AObject, 'Picture');
if Assigned(ATmpObj) and (ATmpObj is TPicture) then
ABitMap := TPicture(ATmpObj).Bitmap;
ABitMap.LoadFromFile('d:\buffer\uts1.bmp');
end;
function IsPublishedProp(Instance: TObject; const PropName: string): Boolean;
begin
Result := GetPropInfo(Instance.ClassInfo, PropName) <> nil;
end;
function GetObjectProp(Instance: TObject; const PropName: string): TObject;
var
PropInfo: PPropInfo;
begin
Result := nil;
PropInfo := TypInfo.GetPropInfo(Instance.ClassInfo, PropName);
if (PropInfo <> nil) and (PropInfo^.PropType^.Kind = tkClass) then
Result := TObject(GetOrdProp(Instance, PropInfo));
end;
Das Setzen von Eigenschaften wie z.B. ein Propertie vom Typ TStrings
auf eine selbsterstellte Stringliste halte ich für gefährlich.
Man sollte so etwas wirklich am konkreten Beispiel diskutieren. Da gerade die Methode Assign sehr unterschiedlich bis gar nicht implementiert ist, muss m an dann entscheiden, ob man diese benutzt oder in einer abgeleiteten Kalsse neu implementiert.
Frank