![]() |
Properties per Name (String) referenzieren
Hallo zusammen,
wie kann ich eine Property über den Property-Namen (als String) referenzieren, um eine Eigenschaft auszulesen bzw. zu setzen? Beispiel: Gegeben ist der Objektname "Button1" (also Button1.Name = "Button1") und die Property "Caption". Nun soll es möglich sein, nur mit diesen beiden Strings zum gleichen Ergebnis zu kommen, als schriebe man "Button1.Caption := 'Test'". Frage ist nun: Wie mache ich das? :?: |
Re: Properties per Name (String) referenzieren
Hi, schau Dir mal
![]() Gruß Stephan PS: Ich hoffe, ich habe Deine Frage richtig verstanden :stupid: |
Re: Properties per Name (String) referenzieren
die componenten kannst du ja über die forms ermitteln.
die properties ist etwas schwieriger. du musst dann die Laufzeit-Typinformationen auswerten. vieleicht kannst du mit dem code unten was anfangen. der bekommt ein geöffnetes dataset und eine objekt übergeben. dieses wird dann in die db kopiert. wichtig ist das du mit {$M+} kompilierst.
Delphi-Quellcode:
Procedure CopyToDataSet(ds: TDataset; obj: TObject);
var Props: PPropList; TypeData: PTypeData; i: Integer; begin TypeData := GetTypeData(obj.ClassInfo); if (TypeData = nil) or (TypeData^.PropCount = 0) then Exit; GetMem(Props, TypeData^.PropCount * sizeof(Pointer)); try GetPropInfos(obj.ClassInfo, Props); for i := 0 to TypeData^.PropCount-1 do begin with Props^[i]^ do begin case PropType^.Kind of tkInteger, tkFloat: begin if GetPropValue(obj, Name, true)<0 then ds.FieldByName(Name).Clear else ds.FieldByName(Name).Value:=GetPropValue(obj, Name, true); end; tkEnumeration: begin if GetTypeData(PropType^)^.BaseType^ = TypeInfo(Boolean) then begin if Boolean(GetOrdProp(Obj, Props^[i])) then ds.FieldByName(Name).Value:=1 else ds.FieldByName(Name).Value:=0; end else raise exception.create('speichern fuer diesen enum nicht implementiert'); end; else ds.FieldByName(Name).Value:=GetPropValue(obj, Name, true); end; end; end; finally FreeMem(Props); end; end; |
Re: Properties per Name (String) referenzieren
Hmmm..."GetPropInfos" finde ich in meiner Hilfe nicht. In welcher Unit finde ich die Funktion denn? (ich entwickle übrigens mit Delphi 7)
|
Re: Properties per Name (String) referenzieren
Zitat:
das sollte die Unit TypInfo sein. mfG mirage228 |
Re: Properties per Name (String) referenzieren
Vielen Dank für die Hinweise. Tatsächlich ist die ganze Geschichte recht einfach. In der Unit TypInfo gibt es unter anderem zwei Funktionen, die genau das tun, was ich brauche:
Code:
GetPropValue liest eine Property aus und SetPropValue setzt eine Property auf einen bestimmten Wert, z.B.:
uses TypInfo;
function GetPropValue(Instance: TObject; const PropName: string; PreferStrings: Boolean = True): Variant; procedure SetPropValue(Instance: TObject; const PropName: string; const Value: Variant); SetPropValue(Button1, "Caption", "Suchen"); Per Funktion GetPropInfos() kann man auch alle Properties eines TObjects in eine Liste auslesen und durchlaufen. Grüße Bulvaye |
Re: Properties per Name (String) referenzieren
Wichtig zu beachten ist nur, dass das ganze nur bei Properties funktioniert, die als published deklariert sind!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz