AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamisch Klassenfelder mit Superobjects füllen

Ein Thema von Blackpit · begonnen am 18. Aug 2019 · letzter Beitrag vom 19. Aug 2019
Antwort Antwort
Blackpit

Registriert seit: 27. Feb 2019
77 Beiträge
 
#1

Dynamisch Klassenfelder mit Superobjects füllen

  Alt 18. Aug 2019, 23:40
Hallo,
ich komm nicht weiter mit einer KlassenProzedur, welche mittels Superobject
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:
  TProjectComponents = class
  public
    component1 : Boolean;
    component1 : Boolean;
    component1 : Boolean;
    component1 : Boolean;
    component1 : Boolean;
    function writeToJson():String;
    procedure readFromJson(aJsonString: String);
  end;
Prozedur:

Delphi-Quellcode:
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;
Kann mir jemand helfen?
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Dynamisch Klassenfelder mit Superobjects füllen

  Alt 19. Aug 2019, 08:53
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)
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Dynamisch Klassenfelder mit Superobjects füllen

  Alt 19. Aug 2019, 09:50
Die "neue" RTTI liest auch public und soweit ich weiß sogar protected und private Properties/Felder/Methoden aus.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#4

AW: Dynamisch Klassenfelder mit Superobjects füllen

  Alt 19. Aug 2019, 09:58
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;
  Mit Zitat antworten Zitat
Blackpit

Registriert seit: 27. Feb 2019
77 Beiträge
 
#5

AW: Dynamisch Klassenfelder mit Superobjects füllen

  Alt 19. Aug 2019, 11:19
Ups, die Klassendefinition sollte natürlich so aussehen:

Delphi-Quellcode:
  TProjectComponents = class
  public
    component1 : Boolean;
    component2 : Boolean;
    component3 : Boolean;
    component4 : Boolean;
    component5 : Boolean;
    function writeToJson():String;
    procedure readFromJson(aJsonString: String);
  end;
Danke schon mal für die Hinweise, den Dictionary-Vorschlag versuch ich mal umzusetzten. Mit RTTI muss ich mich erst mal auseinandersetzen.
  Mit Zitat antworten Zitat
Blackpit

Registriert seit: 27. Feb 2019
77 Beiträge
 
#6

AW: Dynamisch Klassenfelder mit Superobjects füllen

  Alt 19. Aug 2019, 16:18
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:
   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;
Beim Add kommt eine AV die ich mir nicht erklären kann, im Debugger stehen die richtigen Werte als String und Bool.
Was mach ich falsch?
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#7

AW: Dynamisch Klassenfelder mit Superobjects füllen

  Alt 19. Aug 2019, 16:26
TDictionary<TKey,TValue> ist eine Klasse und du erzeugst nirgends eine Instanz.
  Mit Zitat antworten Zitat
Blackpit

Registriert seit: 27. Feb 2019
77 Beiträge
 
#8

AW: Dynamisch Klassenfelder mit Superobjects füllen

  Alt 19. Aug 2019, 16:36
Ist mir auch gerade aufgefallen, so funktionierts:
Delphi-Quellcode:
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;
Danke für's helfen!

Geändert von Blackpit (19. Aug 2019 um 17:49 Uhr) Grund: val und iterate.first entfernt
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz