Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Gehen strings als Eigenschaftsnamen? Wenn ja wie? (https://www.delphipraxis.net/198143-gehen-strings-als-eigenschaftsnamen-wenn-ja-wie.html)

Delphi.Narium 7. Okt 2018 14:29

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:
  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;

ScharfeMietze 7. Okt 2018 14:39

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 ?!?

Delphi.Narium 7. Okt 2018 14:50

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?

ScharfeMietze 7. Okt 2018 15:00

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
 
Delphi-Quellcode:
  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;
Ist die aktuelle class ...

und das Json
Code:
  "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
  },
Wegen dem Case insensitive LowerCase ich es ja vorher runter ......

Ps: http://docwiki.embarcadero.com/CodeE...RTL.JSONReader ist die komponente die mir das Json ließt....

Delphi.Narium 7. Okt 2018 15:30

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
 
Zitat:

Zitat von ScharfeMietze (Beitrag 1415145)
Wegen dem Case insensitive LowerCase ich es ja vorher runter ......

Dachte halt, wenn Delphi casesensitive sucht, könnte das ein Problem sein, wenn die Eigenschaften in 'ner Kombination aus Groß-/Kleinschreibung vorliegen. Da dem nicht so ist, können wir den Fehler schonmal ausschließen.

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)

ScharfeMietze 7. Okt 2018 15:36

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
 
Delphi-Quellcode:
  TBotOptions = class (TObject)
wurde geändert ... gleicher Fehler *sniff*

Delphi.Narium 7. Okt 2018 15:49

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:
published
stehen,
Delphi-Quellcode:
public
reicht nicht aus.

Also Vorfahre mindestens TObject und Eigenschaften müssen published sein.

Wer was anderes weiß: Bitte immer her damit ;-)

ScharfeMietze 7. Okt 2018 16:16

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'

Delphi.Narium 7. Okt 2018 16:33

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:
AComponent: TComponent
bitte
Delphi-Quellcode:
AObject: TObject
und im weiteren der Routine aus AComponent jeweils AObject machen.

Wenn das nicht die Fehlerstelle ist, bitte den kompletten, aktuellen Quelltext posten, so ist das doch sehr abstrakt und kaum zu handhaben.

ScharfeMietze 7. Okt 2018 16:53

AW: Gehen strings als Eigenschaftsnamen? Wenn ja wie?
 
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!


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:34 Uhr.
Seite 2 von 3     12 3      

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