![]() |
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
Zitat:
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; |
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
Heureka :twisted:
Delphi-Quellcode:
funktioniert bei mir. Zusammen mit den Tips das es published sein muss und ein Object.
procedure 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 SetStrProp(LBotOptions,LPropList[I].Name,sValue); Break; end; end; finally FreeMem(LPropList); end; end; das
Delphi-Quellcode:
müsste ich doch weglassen können wenn ich weiß das Property von LBotOptions identisch ist mit dem sValue(string) .... oder übersehe ich da was?
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))); Ansonsten schon mal Vielen lieben dank!! Das ist/war enorm hilfreich !!!! |
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
Wenn Du weißt, dass der zu setzende Typ mit dem zu setzenden Wert immer übereinstimmt, dann musst Du natürlich den Typen nicht mehr abfragen.
Sprich: Wenn SetProperty2 nur zum Setzen von String genutzt wird, kann das Case entfallen. War halt davon ausgegangen, dass Du eine Routine suchst, bei der es egal ist, was da an Werten und Typen "reinkommt". Bekannt seien nur Eigenschaftsname und der zu setzende Wert. Dazu wollte ich dann eine Routine haben, der es quasi egal ist, was da rein kommt. Sie sucht die entsprechende Eigenschaft und setzt dann typkonform deren Wert. Trotzdem müsste meiner Meinung nach dashier reichen:
Delphi-Quellcode:
Die von Dir implementierte Schleife passiert im Inneren von SetStrProp noch einmal, da dort auch zuerst die Eigenschaft des Objektes gesucht wird, um dieser dann den Wert zuzuweisen.
SetStrProp(LBotOptions,sProperty,sValue);
Deine Schleife dient also nur zur Absicherung, dass vor dem Setzen geprüft wird, ob es die Eigenschaft gibt. Das müsste auch in etwa so funktionieren:
Delphi-Quellcode:
if IsPublishedProp(LBotOptions,sProperty) then begin
SetStrProp(LBotOptions,sProperty,sValue); end; |
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
Gibt es eigentlich einen Grund dafür warum du nicht einfach eine Klasse mit den passenden Eigenschaften deklarierst und dann mit
![]() Die GroupOptions würden z.B. in diese Klasse passen
Delphi-Quellcode:
und dann einfach
uses
REST.Json.Types; TGroupOptionsData = class private [JSONName( 'ChatID' )] FChatId: string; [JSONName( 'DeleteSpam' )] FDeleteSpam: Boolean; [JSONName( 'RestrictNewUser' )] FRestrictNewUser: Boolean; [JSONName( 'AntiSpamMessage' )] FAntiSpamMessage: string; [JSONName( 'can_send_messages' )] FCanSendMessages: Boolean; [JSONName( 'can_send_media_messages' )] FCanSendMediaMessages: Boolean; [JSONName( 'can_send_other_messages' )] FCanSendOtherMessages: Boolean; [JSONName( 'can_add_web_page_previews' )] FCanAddWebPagePreviews: Boolean; [JSONName( 'Creator' )] FCreator: string; [JSONName( 'blacklist' )] FBlacklist: string; [JSONName( 'whitelist' )] FWhitelist: string; [JSONName( 'restrict_time' )] FRestrictTime: Integer; [JSONName( 'welcomemessage' )] FWelcomeMessage: string; [JSONName( 'start' )] FStart: Boolean; public property ChatId: string read FChatId write FChatId; property DeleteSpam: Boolean read FDeleteSpam write FDeleteSpam; property RestrictNewUser: Boolean read FRestrictNewUser write FRestrictNewUser; property AntiSpamMessage: string read FAntiSpamMessage write FAntiSpamMessage; property CanSendMessages: Boolean read FCanSendMessages write FCanSendMessages; property CanSendMediaMessages: Boolean read FCanSendMediaMessages write FCanSendMediaMessages; property CanSendOtherMessages: Boolean read FCanSendOtherMessages write FCanSendOtherMessages; property CanAddWebPagePreviews: Boolean read FCanAddWebPagePreviews write FCanAddWebPagePreviews; property Creator: string read FCreator write FCreator; property Blacklist: string read FBlacklist write FBlacklist; property Whitelist: string read FWhitelist write FWhitelist; property RestrictTime: Integer read FRestrictTime write FRestrictTime; property WelcomeMessage: string read FWelcomeMessage write FWelcomeMessage; property Start: Boolean read FStart write FStart; end;
Delphi-Quellcode:
uses
REST.Json; const jsonstr = // ' {' + sLineBreak + // ' "ChatID": "-xxxxxx",' + sLineBreak + // ' "DeleteSpam": true,' + sLineBreak + // ' "RestrictNewUser": true,' + sLineBreak + // ' "AntiSpamMessage": "SpamPost",' + sLineBreak + // ' "can_send_messages": true,' + sLineBreak + // ' "can_send_media_messages": false,' + sLineBreak + // ' "can_send_other_messages": false,' + sLineBreak + // ' "can_add_web_page_previews": false,' + sLineBreak + // ' "Creator": "blablub",' + sLineBreak + // ' "blacklist": "blablub",' + sLineBreak + // ' "whitelist": "",' + sLineBreak + // ' "restrict_time": 15,' + sLineBreak + // ' "welcomemessage": "",' + sLineBreak + // ' "start": true' + sLineBreak + // ' }'; var options: TGroupOptionsData; begin options := TJson.JsonToObject<TGroupOptionsData>(jsonstr); try // ... finally options.Free; end; end; |
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
hpffffffffff Die Antwort ist simpel. Ich wusste nicht das es auch so geht ..:shock::-D
Vielen Dank! Werde ich bei Tageslicht ausprobieren ... das ist natürlich extrem wenig code und damit sehr sympatisch. wenn es um json geht... Extrem lehrreich der Tag für mich! Danke :) Frage: Ist das case sensitive? Ich habe ein weiteres Problem, das in meinem JsonString nicht nur 1 Objekt von dem Typ TBotOptions ist sondern beliebig viele... im Reader erstellt er mir immer am Anfang eines neuen Objektes LBotoptions und speichert es am ende in eine generische Liste. Ich wüsste nicht wie ich das mit deiner Methode umsetze.... |
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie
Schau dir mal
![]() Ein Nachteil ist allerdings, dass dort nicht mit dem
Delphi-Quellcode:
Attribut gearbeitet wird (siehe mein Code).
JSONName
Bei JSON sind die Eigenschaftsnamen case-sensitive bei Delphi nicht. Und dann passiert z.B. so etwas wie
Code:
{
"foo": 1, "Foo": 2 }
Delphi-Quellcode:
unit RootUnit;
{******************************************************************************* Generated By : JsonToDelphiClass - 0.65 Project link : https://github.com/PKGeorgiev/Delphi-JsonToDelphiClass Generated On : 2018-10-08 01:16:30 Created By : Petar Georgiev - (http://pgeorgiev.com) Adapted Web By : Marlon Nardi - (http://jsontodelphi.com) *******************************************************************************} interface uses Generics.Collections, Rest.Json; type TRootClass = class private FFoo: Extended; FFoo: Extended; public property Foo: Extended read FFoo write FFoo; property foo: Extended read FFoo write FFoo; function ToJsonString: string; class function FromJsonString(AJsonString: string): TRootClass; end; implementation {TRootClass} function TRootClass.ToJsonString: string; begin result := TJson.ObjectToJsonString(self); end; class function TRootClass.FromJsonString(AJsonString: string): TRootClass; begin result := TJson.JsonToObject<TRootClass>(AJsonString) end; end. |
AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
Ja super vielen Dank :)
Gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:13 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