AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Gehen strings als Eigenschaftsnamen? Wenn ja wie?

Gehen strings als Eigenschaftsnamen? Wenn ja wie?

Ein Thema von ScharfeMietze · begonnen am 7. Okt 2018 · letzter Beitrag vom 8. Okt 2018
Antwort Antwort
Seite 1 von 3  1 23   
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#1

Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 11:25
Delphi-Quellcode:
            
if (LowerCase(Ljtr.Path) = 'groupoptions.can_send_other_messages') and (Ljtr.TokenType = TJsonToken.Boolean) then
              begin
                LBotOptions.cs:= Ljtr.Value.ToString.ToBoolean;
              end
das ist typisches konstruct
ich hätte aber gerne sowas wie
Delphi-Quellcode:
try
if (Ljtr.TokenType = TJsonToken.Boolean) then LBotOptions.'can_send_other_messages' := Ljtr.Value.ToString.ToBoolean;
.....
gibt es sowas?

Freu mich auf antworten ....
Gruß die Mietze

Geändert von ScharfeMietze ( 7. Okt 2018 um 11:55 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 11:29
Was hast Du vor?

Eigentlich sind Eigenschaftsnamen ja Strings. Willst Du die Eigenschaft abhand eines Inhalts eines Strings auswählen?
Markus Kinzler
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#3

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 11:48
Ja das ist der Plan. Ich bekomme via jsonstring Eigenschaftswerte die ich (je nach bedarf) im "Bauplan" der Botoptions verankere.

Ich möchte mir ersparen dann jede Eigenschaft im Code beim einlesen nochmal verankern zu müssen.

Gruß

Geändert von ScharfeMietze ( 7. Okt 2018 um 12:06 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 12:14
Suchst Du sinngemäß sowas?
Delphi-Quellcode:
uses TypInfo;

procedure SetProperty(AComponent: TComponent; sProperty, sValue: string);
var
  PropInfo: PPropInfo;
begin
  if Assigned(AComponent) then begin
    PropInfo := GetPropInfo(AComponent.ClassInfo, sProperty);
    if Assigned(PropInfo) then begin
      case PropInfo^.PropType^^.Kind of
        tkString,
        tkLString,
        tkWString: SetStrProp(AComponent, PropInfo, sValue);
        tkInteger: SetOrdProp(AComponent, PropInfo, StrToInt(sValue))
      else
        SetStringsProperty(AComponent, PropInfo, sValue);
      end;
    end;
  end;
end;

procedure SetStringsProperty(AComponent: TComponent;
                             PropInfo: PPropInfo;
                             sValues: string);
var
  AStrings: TStringList;
  sBuffer: string;
  i: Integer;
begin
  AStrings := TStringList.Create;
  i := Pos(FSeparator, sValues);
  while (i > 0) do begin
    sBuffer := Copy(sValues, 1, i-1);
    Delete(sValues, 1, i - 1 + Length(FSeparator));
    i := Pos(FSeparator, sValues);
    AStrings.Add(Trim(sBuffer));
  end;
  if (Length(Trim(sValues)) > 0) then AStrings.Add(Trim(sValues));
  SetOrdProp(AComponent, PropInfo, LongInt(Pointer(AStrings)));
  AStrings.Free;
end;
Im Zweifelsfalle mal die Unit TypInfos (so hieß sie zu Dlephi 7-Zeiten) durchforsten. Da müsste so etliches zum Abfragen uns Setzen von Eigenschaften (über den Namen) drinne sein.

Geändert von Delphi.Narium ( 7. Okt 2018 um 12:33 Uhr) Grund: Text ergänzt
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#5

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 12:27
Das muss ich mal sacken lassen und werde es gleich mal probieren! Wenn das geht wäre das natürlich absolut Hammer!!
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#6

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 13:22
Da ich mit PPropInfo; und co noch nicht viel zu tun hatte muss ich nochmal nachfragen ob ich es richtig verstehe, da ich z.B beim else der procedure hänge.

procedure SetProperty(AComponent: TComponent; sProperty, sValue: string); bedeutet doch
aComponent = Bauplan
sProperty = poperty des Bauplans
sValue = Wert der an das property des Bauplans gesendet wird...
ist das soweit richtig?


Delphi-Quellcode:
  if Assigned(AComponent) then begin
    PropInfo := GetPropInfo(AComponent.ClassInfo, sProperty);
Wenn der Bauplan vorhanden ist, schreibe in PropInfo den "string" aus sproperty.


if Assigned(PropInfo) then begin Wenn das Property vorhanden ist, schreibe den (string) Wert aus sValue in das Property.

hab ich das soweit richtig verstanden oder bin ich da schon falsch??

Weil weiterführende Frage ist natürlich (falls ich oben richtig liege)

Delphi-Quellcode:
        tkWString: SetStrProp(AComponent, PropInfo, sValue);
        tkInteger: SetOrdProp(AComponent, PropInfo, StrToInt(sValue))

Wenn ein Boolean/Integer als Wert sValue habe, reicht es die beiden Zeilen anzupassen? Wenn ja wie muss das aussehen?

und
Delphi-Quellcode:
procedure SetStringsProperty(AComponent: TComponent;
                             PropInfo: PPropInfo;
                             sValues: string);
was diese procedure tut ist mir bisher nicht klar?!?

Gruß Mietze (momentan noch gar nicht scharf )
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 14: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 14:10 Uhr) Grund: Copy&Paste-Fehler behoben
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#8

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 14:49
Delphi-Quellcode:
            if (Ljtr.TokenType = TJsonToken.String) then
              begin
              if (LowerCase(Ljtr.Path) = 'groupoptions.chatid') then LBotOptions.chatid:= Ljtr.Value.ToString
              else
              if (LowerCase(Ljtr.Path) = 'groupoptions.antispammessage') then LBotOptions.AntiSpamMessage:= Ljtr.Value.ToString
              else
              if (LowerCase(Ljtr.Path) = 'groupoptions.creator') then LBotOptions.Creator:= Ljtr.Value.ToString
              else
              if (LowerCase(Ljtr.Path) = 'groupoptions.blacklist') then LBotOptions.blacklist:= Ljtr.Value.ToString
              else
              if (LowerCase(Ljtr.Path) = 'groupoptions.whitelist') then LBotOptions.whitelist:= Ljtr.Value.ToString
              else
              if (LowerCase(Ljtr.Path) = 'groupoptions.welcomemessage') then LBotOptions.welcomemessage:= Ljtr.Value.ToString
              end
........
Wir sind ja fast da wo ich hin will! Also müsste doch der Part oben durch diesen ersetzbar sein oder? ( ja ich habe den Code seit dem Erstellpost aufgrund der Antwort schon begonnen umzustellen)
Delphi-Quellcode:
            if (Ljtr.TokenType = TJsonToken.String) then
              begin
                SetStrProp(LBotOptions,LowerCase(Ljtr.Path),Ljtr.Value.ToString)
              end;

Geändert von ScharfeMietze ( 7. Okt 2018 um 14:52 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 14:52
Ja, sollte meiner Meinung nach passen.
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#10

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 15:02
Ich bin ja mal gespannt... ich werde heute zwar nicht mehr dazu kommen es einzubauen, berichte aber wenn es so weit ist,
Weil mal ganz ehrlich das erspart viel Arbeit ....
Wenn das wirklich funzt weiß ich gar nicht wie dankbar ich sein werde, die geschenkte Lebenszeit ist ja kaum aufzuwiegen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 09:11 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