Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.419 Beiträge
 
Delphi 7 Professional
 
#7

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 13:09
Prinzipell hast Du das richtig verstanden, Du musst quasi "nur" die Case-Abfrage im Beispiel an Deine Bedürfnisse anpassen.

SetStringsProperty befüllt eine Eigenschaft vom Typ TStrings.

Schau Dir bitte die Unit TypInfo (bzw. das Gegenstück Deiner Delphiversion) an.

Bei allen Methoden zum Lesen / Schreiben gilt eigentlich folgender Aufbau:

Welches Objekt, welche Eigenschaft, welcher Wert Siehe u. a.: http://docwiki.embarcadero.com/Libra...System.TypInfo

Für die unterschiedlichen Eigenschaften gibt es jeweils entsprechende Getter und Setter. Die musst Du "nur" entsprechend Deiner Datentypen aufrufen.

Jetzt rate ich mal, da mir das Ganze irgendwie zu abstrakt ist und ich nicht über eine passende Delphiversion verfüge (sinngmäß sowas):
Delphi-Quellcode:
if (Ljtr.TokenType = TJsonToken.String) then begin
  if (LowerCase(Ljtr.Path) = 'irgendwas_was_ein_String_Ist') then begin
    SetStrProp(LBotOptions,'ZuSetzendeStringEigenschaft',Ljtr.Value.ToString);
  end else
  if (LowerCase(Ljtr.Path) = 'anderer_String') then begin
    SetStrProp(LBotOptions,'AndereStringEigenschaft',Ljtr.Value.ToString);
  end;
end else
if (Ljtr.TokenType = TJsonToken.Integer) then begin
  if (LowerCase(Ljtr.Path) = 'irgendwas_was_ein_Integer_Ist') then begin
    SetInt64Prop(LBotOptions,'ZuSetzendeIntegerEigenschaft',Ljtr.Value.ToInteger);
  end else
  if (LowerCase(Ljtr.Path) = 'anderer_String') then begin
    SetInt64Prop(LBotOptions,'AndereIntegerEigenschaft',Ljtr.Value.ToInteger);
  end;
end else
// alle weiteren Typen abarbeiten und die jeweilige SetGewünschterTypProp nutzen.
Oder, damit es kürzer und (eventuell) lesbarer wird:
Delphi-Quellcode:
var
  sLowerPath : String;
  sEigenschaft : String;
begin
  sLowerPath : LowerCase(Ljtr.Path);
  if (Ljtr.TokenType = TJsonToken.String) then begin
    if (sLowerPath = 'irgendwas_was_ein_String_Ist') then sEigenschaft := 'ZuSetzendeStringEigenschaft'
    else if (sLowerPath = 'anderer_String') then sEigenschaft'AndereStringEigenschaft';
    SetStrProp(LBotOptions,sEigenschaft,Ljtr.Value.ToString);
  end else
  if (Ljtr.TokenType = TJsonToken.Integer) then begin
    if (sLowerPath = 'irgendwas_was_ein_Integer_Ist') then sEigenschaft := 'ZuSetzendeIntegerEigenschaft'
    else if (sLowerPath = 'anderer_Integer') then sEigenschaft := 'AndereIntegerEigenschaft';
    SetInt64Prop(LBotOptions,sEigenschaft,Ljtr.Value.ToInteger);
  end else
  // alle weiteren Typen abarbeiten und die jeweilige SetGewünschterTypProp nutzen.
end;
oder eventuell:
Delphi-Quellcode:
var
  sLowerPath : String;
  sEigenschaft : String;
begin
  sLowerPath : LowerCase(Ljtr.Path);
  if (sLowerPath = 'irgendwas_was') then sEigenschaft := 'WirdZuEigenschaft'
  else if (sLowerPath = 'was_anderes') then sEigenschaft := 'AndereEigenschaft'
  else if ...;
  case Ljtr.TokenType of
    TJsonToken.String : SetStrProp(LBotOptions,sEigenschaft,Ljtr.Value.ToString);
    TJsonToken.Integer : SetInt64Prop(LBotOptions,sEigenschaft,Ljtr.Value.ToInteger);
    // alle weiteren Typen abarbeiten und die jeweilige SetGewünschterTypProp nutzen.
  else
    // Fehlermeldung, weil ein Typ vergessen wurde?
  end;
end;

Geändert von Delphi.Narium ( 7. Okt 2018 um 13:10 Uhr) Grund: Copy&Paste-Fehler behoben
  Mit Zitat antworten Zitat