![]() |
Gehen strings als Eigenschaftsnamen? Wenn ja wie?
Delphi-Quellcode:
das ist typisches konstructif (LowerCase(Ljtr.Path) = 'groupoptions.can_send_other_messages') and (Ljtr.TokenType = TJsonToken.Boolean) then begin LBotOptions.cs:= Ljtr.Value.ToString.ToBoolean; end ich hätte aber gerne sowas wie
Delphi-Quellcode:
gibt es sowas?
try
if (Ljtr.TokenType = TJsonToken.Boolean) then LBotOptions.'can_send_other_messages' := Ljtr.Value.ToString.ToBoolean; ..... Freu mich auf antworten .... Gruß die Mietze |
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
Was hast Du vor?
Eigentlich sind Eigenschaftsnamen ja Strings. Willst Du die Eigenschaft abhand eines Inhalts eines Strings auswählen? |
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
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ß |
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
Suchst Du sinngemäß sowas?
Delphi-Quellcode:
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.
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; |
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
Das muss ich mal sacken lassen und werde es gleich mal probieren! Wenn das geht wäre das natürlich absolut Hammer!!
|
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
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.
Delphi-Quellcode:
bedeutet doch
procedure SetProperty(AComponent: TComponent; sProperty, sValue: string);
aComponent = Bauplan sProperty = poperty des Bauplans sValue = Wert der an das property des Bauplans gesendet wird... ist das soweit richtig?
Delphi-Quellcode:
Wenn der Bauplan vorhanden ist, schreibe in PropInfo den "string" aus sproperty.
if Assigned(AComponent) then begin
PropInfo := GetPropInfo(AComponent.ClassInfo, sProperty);
Delphi-Quellcode:
Wenn das Property vorhanden ist, schreibe den (string) Wert aus sValue in das Property.
if Assigned(PropInfo) then begin
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:
was diese procedure tut ist mir bisher nicht klar?!?:shock:
procedure SetStringsProperty(AComponent: TComponent;
PropInfo: PPropInfo; sValues: string); Gruß Mietze (momentan noch gar nicht scharf :lol:) |
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
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:
Delphi-Quellcode:
Siehe u. a.:
Welches Objekt, welche Eigenschaft, welcher Wert
![]() 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:
Oder, damit es kürzer und (eventuell) lesbarer wird:
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.
Delphi-Quellcode:
oder eventuell:
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;
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; |
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
Delphi-Quellcode:
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)
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 ........
Delphi-Quellcode:
if (Ljtr.TokenType = TJsonToken.String) then
begin SetStrProp(LBotOptions,LowerCase(Ljtr.Path),Ljtr.Value.ToString) end; |
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
Ja, sollte meiner Meinung nach passen.
|
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
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 :-D:-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:17 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