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?
Thema durchsuchen
Ansicht
Themen-Optionen

Gehen strings als Eigenschaftsnamen? Wenn ja wie?

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

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

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 12: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.559 Beiträge
 
Delphi 7 Professional
 
#2

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
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, 13: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 13:52 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 13: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
 
#5

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 14: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
Delphi.Narium

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

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 14:29
Wenn die Eigenschaften von LBotOptions genauso heißen, wie der Path in Ljtr, dann geht das:
Delphi-Quellcode:
  if (Ljtr.TokenType = TJsonToken.String) then begin
    SetStrProp(LBotOptions,Ljtr.Path,Ljtr.Value.ToString)
  end;
Beim letzten Beispiel von Dir haben wir aber (u. a.)
Delphi-Quellcode:

if (LowerCase(Ljtr.Path) = 'groupoptions.chatid') then LBotOptions.chatid:= Ljtr.Value.ToString;
Damit passen dann Path und Eigenschaftsname nicht mehr zueiander. Da müsste die Routine zur Zuweisung etwas "überarbeitet" werden:
Delphi-Quellcode:
if (Ljtr.TokenType = TJsonToken.String) then begin
  SetStrProp(LBotOptions,AnsiReplaceText(Ljtr.Path,'groupoptions.',''),Ljtr.Value.ToString);
end;
  Mit Zitat antworten Zitat
ScharfeMietze

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

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 14:39
Er behauptet die Eigenschaft würde nicht existieren, obwohl sie das definitiv tut ?!?
Was übersehe ich ?!?
Angehängte Grafiken
Dateityp: jpg Unbenannt.JPG (52,0 KB, 19x aufgerufen)
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 14:50
Zeig' bitte mal die vollständige Definition von TLBotOptions und ein Beispiel dessen, was in Ljtr vorzufinden ist.

Was ich nicht weiß: Ist die Suche nach Eigenschaften eventuell casesensitiv?
  Mit Zitat antworten Zitat
ScharfeMietze

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

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 16:53
Ich bin einen Kleinen schritt weiter !!
Delphi-Quellcode:
rocedure SetProperty2(sProperty, sValue: string);
var
  LPropList: PPropList;
  LPropCount, I: Integer;
begin
  LPropCount := GetPropList(LBotOptions, LPropList);
  try
  for I := 0 to LPropCount-1 do
    begin
    if LPropList[I].Name = sProperty then
      begin
       ShowMessage(LPropList[I].Name);
       Break
      end;
    end;
  finally
    FreeMem(LPropList);
  end;
end;
Damit finde ich nun die richtige eigenschaft. Nun brauche ich noch den Weg wie ich die Eigenschaft schreibe???? Ich hangel mich hier von ast zu ast ... Wenn jemand dafür noch ein Weg hat wäre das super!
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 17:32
Ich bin einen Kleinen schritt weiter !!
Delphi-Quellcode:
rocedure SetProperty2(sProperty, sValue: string);
var
  LPropList: PPropList;
  LPropCount, I: Integer;
begin
  LPropCount := GetPropList(LBotOptions, LPropList);
  try
  for I := 0 to LPropCount-1 do
    begin
    if LPropList[I].Name = sProperty then
      begin
       ShowMessage(LPropList[I].Name);
       Break
      end;
    end;
  finally
    FreeMem(LPropList);
  end;
end;
Damit finde ich nun die richtige eigenschaft. Nun brauche ich noch den Weg wie ich die Eigenschaft schreibe???? Ich hangel mich hier von ast zu ast ... Wenn jemand dafür noch ein Weg hat wäre das super!
Eigentlich müsste das von oben funktionieren.

Noch ein Versuch:
Delphi-Quellcode:
procedure SetProperty3(ABotOptions : TBotOptions; sProperty, sValue: string);
var
  LPropList: PPropList;
  LPropCount, I: Integer;
begin
  LPropCount := GetPropList(ABotOptions, LPropList);
  try
  for I := 0 to LPropCount-1 do
    begin
    if LPropList[I].Name = sProperty then
      begin
       // Abhängig von Typ in LPropList[I].Kind
       case LPropList[I].Kind of
         tkString : SetStrProp(ABotOptions,LPropList[I].Name,sValue);
         tkInteger : SetInt64Prop(ABotOptions,LPropList[I].Name,StrToInt(sValue));
         tkEnumeration : SetOrdProp(ABotOptions,LPropList[I].Name,Ord(IfThen(LowerCase(sValue) = 'true',true,false)));
       end;
       Break;
      end;
    end;
  finally
    FreeMem(LPropList);
  end;
end;
  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 20:41 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