![]() |
Dynamisch Klassenfelder mit Superobjects füllen
Hallo,
ich komm nicht weiter mit einer KlassenProzedur, welche mittels ![]() Daten von einem WS zieht. Ich würde die IndexfromString-Lösung gerne dynamisch gestalten, um nur noch die Klassenfelder bei Bedarf zu ergänzen. Meine verzweifelten Bemühungen als Kommentar ;) Class:
Delphi-Quellcode:
Prozedur:
TProjectComponents = class
public component1 : Boolean; component1 : Boolean; component1 : Boolean; component1 : Boolean; component1 : Boolean; function writeToJson():String; procedure readFromJson(aJsonString: String); end;
Delphi-Quellcode:
Kann mir jemand helfen?
procedure TProjectComponents.readFromJson(aJsonString: String);
var json: ISuperObject; iterate: TSuperAvlIterator; components: ISuperObject; begin try json := SO(aJsonString); iterate := json.AsObject.GetEnumerator; iterate.First; while iterate.MoveNext do begin // ClassField(iterate.Current.Name) := iterate.Current.Value.b['active']; // Format('s%',[iterate.Current.Name]) := iterate.Current.Value.b['active']; //components := json; //components.N[Format('s%',[iterate.Current.Name])] := iterate.Current.Value.b['active']; case IndexStr(iterate.Current.Name,['component1','component2','component3','component4','component5'])of 0: component1 := iterate.Current.Value.b['active']; 1: component2 := iterate.Current.Value.b['active']; 2: component3 := iterate.Current.Value.b['active']; 3: component4 := iterate.Current.Value.b['active']; 4: component5 := iterate.Current.Value.b['active']; end; end; iterate.Free; finally json := nil; end; end; |
AW: Dynamisch Klassenfelder mit Superobjects füllen
Hallo,
du willst den Code 0: component1 := iterate.Current.Value.b['active']; 1: component2 := iterate.Current.Value.b['active']; allgemeiner halten? Was du wahrscheinlich suchst, ist RTTI. Dazu müssten die betreffenden Variablen published statt public sein. (Soweit ich weiss) |
AW: Dynamisch Klassenfelder mit Superobjects füllen
Die "neue" RTTI liest auch public und soweit ich weiß sogar protected und private Properties/Felder/Methoden aus.
|
AW: Dynamisch Klassenfelder mit Superobjects füllen
Man könnte auch mit einem Dictionary arbeiten und dieses direkt verwenden oder auch indirekt
Delphi-Quellcode:
TProjectComponents = class
private FComponents: TDictionary<string,boolean>; function GetComponent1:Boolean; public property Component1: Boolean read GetComponent1; end; function TProjectComponents.GetComponent1: Booelan; var val: Boolean; begin Result := FComponents.TryGetValue('component1', val ) and val; end; |
AW: Dynamisch Klassenfelder mit Superobjects füllen
Ups, die Klassendefinition sollte natürlich so aussehen:
Delphi-Quellcode:
Danke schon mal für die Hinweise, den Dictionary-Vorschlag versuch ich mal umzusetzten. Mit RTTI muss ich mich erst mal auseinandersetzen.
TProjectComponents = class
public component1 : Boolean; component2 : Boolean; component3 : Boolean; component4 : Boolean; component5 : Boolean; function writeToJson():String; procedure readFromJson(aJsonString: String); end; |
AW: Dynamisch Klassenfelder mit Superobjects füllen
Die Idee mit dem Dictionary fand ich gut, bekomme es aber nicht hin.
Der Gedanke war das Dictionary flexibel zu füllen, so sieht mein Versuch aus:
Delphi-Quellcode:
Beim Add kommt eine AV die ich mir nicht erklären kann, im Debugger stehen die richtigen Werte als String und Bool.
TProjectComponents = class
public Components: TDictionary<string,boolean>;// function getComponents(aJsonString: String) : TDictionary<string,boolean>; // function writeToJson():String; procedure readFromJson(aJsonString: String); end; procedure TProjectComponents.readFromJson(aJsonString: String); var json: ISuperObject; begin json := SO(aJsonString); bookableFeature := getComponents(aJsonString); end; function getComponents(aJsonString: String) : TDictionary<string,boolean>; var val: Boolean; json: ISuperObject; iterate: TSuperAvlIterator; Components :TDictionary<string,boolean>; begin try json := SO(aJsonString); iterate := json.AsObject.GetEnumerator; iterate.First; while iterate.MoveNext do begin Components.Add(iterate.Current.Name, iterate.Current.Value.b['active']); //Components.TryGetValue(iterate.Current.Name, val ) and val; end; iterate.Free; finally json := nil; end; Result := Components; end; Was mach ich falsch? |
AW: Dynamisch Klassenfelder mit Superobjects füllen
Delphi-Quellcode:
ist eine Klasse und du erzeugst nirgends eine Instanz.
TDictionary<TKey,TValue>
|
AW: Dynamisch Klassenfelder mit Superobjects füllen
Ist mir auch gerade aufgefallen, so funktionierts:
Delphi-Quellcode:
Danke für's helfen!
function getComponents(aJsonString: String) : TDictionary<string,boolean>;
var json: ISuperObject; iterate: TSuperAvlIterator; Components :TDictionary<string,boolean>; begin try json := SO(aJsonString); Components:=TDictionary<string,boolean>.create; iterate := json.AsObject.GetEnumerator; while iterate.MoveNext do begin Components.Add(iterate.Current.Name, iterate.Current.Value.b['active']); end; iterate.Free; finally json := nil; end; Result := Components; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:15 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