![]() |
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
Wenn die Eigenschaften von LBotOptions genauso heißen, wie der Path in Ljtr, dann geht das:
Delphi-Quellcode:
Beim letzten Beispiel von Dir haben wir aber (u. a.)
if (Ljtr.TokenType = TJsonToken.String) then begin
SetStrProp(LBotOptions,Ljtr.Path,Ljtr.Value.ToString) end;
Delphi-Quellcode:
Damit passen dann Path und Eigenschaftsname nicht mehr zueiander. Da müsste die Routine zur Zuweisung etwas "überarbeitet" werden:if (LowerCase(Ljtr.Path) = 'groupoptions.chatid') then LBotOptions.chatid:= Ljtr.Value.ToString;
Delphi-Quellcode:
if (Ljtr.TokenType = TJsonToken.String) then begin
SetStrProp(LBotOptions,AnsiReplaceText(Ljtr.Path,'groupoptions.',''),Ljtr.Value.ToString); end; |
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
Liste der Anhänge anzeigen (Anzahl: 1)
Er behauptet die Eigenschaft würde nicht existieren, obwohl sie das definitiv tut ?!?
Was übersehe ich ?!? |
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
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? |
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
Delphi-Quellcode:
Ist die aktuelle class ...
TBotOptions = class
private FChatID: string; FRestrictNewUser: Boolean; Fcan_send_other_messages: Boolean; Fcan_send_messages: Boolean; Fcan_add_web_page_previews: Boolean; Fcan_send_media_messages: Boolean; FAntiSpamMessage: string; FDeleteSpam: Boolean; FCreator: string; Fwhitelist: string; Fblacklist: string; Frestrict_time: Integer; Fwelcomemessage: string; FStart: Boolean; procedure Set_ChatID(const Value: string); procedure Set_AntiSpamMessage(const Value: string); procedure Set_can_add_web_page_previews(const Value: Boolean); procedure Set_can_send_media_messages(const Value: Boolean); procedure Set_can_send_messages(const Value: Boolean); procedure Set_can_send_other_messages(const Value: Boolean); procedure Set_DeleteSpam(const Value: Boolean); procedure Set_RestrictNewUser(const Value: Boolean); procedure Set_Creator(const Value: string); procedure Set_blacklist(const Value: string); procedure Set_whitelist(const Value: string); procedure Set_restrict_time(const Value: Integer); procedure Set_welcomemessage(const Value: string); procedure Set_Fstart(const Value: Boolean); { private declarations } protected { protected declarations } public property chatid:string read FChatID write Set_ChatID; property deletespam:Boolean read FDeleteSpam write Set_DeleteSpam; property restrictnewuser:Boolean read FRestrictNewUser write Set_RestrictNewUser; property antispammessage:string read FAntiSpamMessage write Set_AntiSpamMessage; property can_send_messages:Boolean read Fcan_send_messages write Set_can_send_messages; property can_send_media_messages:Boolean read Fcan_send_media_messages write Set_can_send_media_messages; property can_send_other_messages:Boolean read Fcan_send_other_messages write Set_can_send_other_messages; property can_add_web_page_previews:Boolean read Fcan_add_web_page_previews write Set_can_add_web_page_previews; property creator:string read FCreator write Set_Creator; property blacklist:string read Fblacklist write Set_blacklist; property whitelist:string read Fwhitelist write Set_whitelist; property restrict_time:Integer read Frestrict_time write Set_restrict_time; property welcomemessage: string read Fwelcomemessage write Set_welcomemessage; property start :Boolean read FStart write Set_Fstart; { public declarations } end; und das Json
Code:
Wegen dem Case insensitive LowerCase ich es ja vorher runter ......
"groupoptions": {
"ChatID": "-xxxxxx", "DeleteSpam": true, "RestrictNewUser": true, "AntiSpamMessage": "SpamPost", "can_send_messages": true, "can_send_media_messages": false, "can_send_other_messages": false, "can_add_web_page_previews": false, "Creator": "blablub", "blacklist": "blablub", "whitelist": "", "restrict_time": 15, "welcomemessage": "", "start": true }, Ps: ![]() |
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
Zitat:
Momentan hab' ich keine Idee, was da jetzt die Fehlerursache sein könnte. Oder liegt es eventuell dadran:
Delphi-Quellcode:
?
TBotOptions = class
Damit man die TypInfo nutzen kann, muss als Vorfahre mindestens TObject gegeben sein:
Delphi-Quellcode:
TBotOptions = class(TObject)
|
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
Delphi-Quellcode:
wurde geändert ... gleicher Fehler *sniff*
TBotOptions = class (TObject)
|
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
Sorry, keine Ahnung:
Debugger marsch: BreakPoint vor SetStrProp und dann in Einzelschritten bis in die tiefsten Tiefen und jeweils merken, aufschreiben, sagen (wie auch immer) bis wo Du gekommen bist bzw. an welcher Stelle die Fehlermeldung produziert wird. Aber: Beim manuellen durchgehen der TypInfo habe ich versucht, einzeln mal die Methoden zu verstehen und dann daraus zu kombinieren: Mir scheint, damit das Ganze funktioniert, müssen die "zu verarbeitenden" Eigenschaften unter
Delphi-Quellcode:
stehen,
published
Delphi-Quellcode:
reicht nicht aus.
public
Also Vorfahre mindestens TObject und Eigenschaften müssen published sein. Wer was anderes weiß: Bitte immer her damit ;-) |
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
Also nachdem ich nun einen Schreibfehler ausgemerzt habe , bekomme ich als ausgabe
Von Public habe ich alles in published verschoben .... Inkompatible Typen: 'TComponent' und 'TBotOptions' |
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
An welcher Stelle?
Da
Delphi-Quellcode:
?
procedure SetProperty(AComponent: TComponent; sProperty, sValue: string);
Dann in der Routine aus
Delphi-Quellcode:
bitte
AComponent: TComponent
Delphi-Quellcode:
und im weiteren der Routine aus AComponent jeweils AObject machen.
AObject: TObject
Wenn das nicht die Fehlerstelle ist, bitte den kompletten, aktuellen Quelltext posten, so ist das doch sehr abstrakt und kaum zu handhaben. |
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
Ich bin einen Kleinen schritt weiter !!
Delphi-Quellcode:
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!
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:34 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