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
Seite 3 von 3     123   
Delphi.Narium

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

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 18: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
ScharfeMietze

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

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 19:08
Heureka
Delphi-Quellcode:
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;
funktioniert bei mir. Zusammen mit den Tips das es published sein muss und ein Object.


das
Delphi-Quellcode:
       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)));
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?

Ansonsten schon mal Vielen lieben dank!! Das ist/war enorm hilfreich !!!!

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

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

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 19:34
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: SetStrProp(LBotOptions,sProperty,sValue); 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.

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;

Geändert von Delphi.Narium ( 7. Okt 2018 um 23:00 Uhr) Grund: Schreibfehler behoben
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#24

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 7. Okt 2018, 23:24
Gibt es eigentlich einen Grund dafür warum du nicht einfach eine Klasse mit den passenden Eigenschaften deklarierst und dann mit Delphi-Referenz durchsuchenREST.Json.TJson.JsonToObject arbeitest?

Die GroupOptions würden z.B. in diese Klasse passen
Delphi-Quellcode:
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;
und dann einfach
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;
  Mit Zitat antworten Zitat
ScharfeMietze

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

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 8. Okt 2018, 00:53
hpffffffffff Die Antwort ist simpel. Ich wusste nicht das es auch so geht ..


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....

Geändert von ScharfeMietze ( 8. Okt 2018 um 01:50 Uhr)
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#26

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie

  Alt 8. Okt 2018, 06:15
Schau dir mal https://jsontodelphi.com an.

Ein Nachteil ist allerdings, dass dort nicht mit dem JSONName Attribut gearbeitet wird (siehe mein Code).

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.

Geändert von Schokohase ( 8. Okt 2018 um 06:21 Uhr)
  Mit Zitat antworten Zitat
ScharfeMietze

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

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?

  Alt 8. Okt 2018, 09:28
Ja super vielen Dank
Gruß
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 15:01 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