AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Wie *schnell* auf Properties anhand eines String-Bezeichners zugreifen?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie *schnell* auf Properties anhand eines String-Bezeichners zugreifen?

Ein Thema von BlueStarHH · begonnen am 8. Jul 2019 · letzter Beitrag vom 9. Jul 2019
Antwort Antwort
Seite 1 von 2  1 2      
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
849 Beiträge
 
Delphi 11 Alexandria
 
#1

Wie *schnell* auf Properties anhand eines String-Bezeichners zugreifen?

  Alt 8. Jul 2019, 13:49
Hallo,

ich habe ein Liste die mehrere simple Objekt enthält. Diese Objekt besitzen sehr viele Properties, um Daten zu speichern:

Delphi-Quellcode:
 TMyDataObj = class(TObject)
  private
    ...
  public
    property ValueA: string read ValueA write ValueA;
    property ValueB: string read ValueB write ValueB;
    property ValueC: string read ValueC write ValueC;
    ...
  end;
Ich benötige nun eine Funktion, der ich einen Feldnamen übergebe, anhand dessen dann der Wert einer bestimmten Property zurückgegeben werden soll. Beispielsweise GetFieldValue(ADataObj, 'MeinFeldX')

Mein Code dazu:

Delphi-Quellcode:
procedure GetFieldValue(ADataObj: TMyDataObj; const FieldName: string): string;
begin
  if AnsiSameText(FieldName, 'Wert1') then
    result := ADataObj.ValueA
  else if AnsiSameText(FieldName, 'MeinFeldX') then
    result := ADataObj.ValueB
  if AnsiSameText(FieldName, 'Feld7') then
    result := ADataObj.ValueC
end;
Wie man sieht brauche ich pro Property einen String-Vergleich. Der FieldName stimmt nie mit dem Namen der Propery überein. Wenn das ganze nun für viele Felder und sehr viele Objekte in einer verschachtelten Schleife aufgrufen wird, dauert die Ausführung zu lange. Da die String-Vergleiche für jedes Objekt wieder und wieder ausgeführt werden. Wie kann ich das schneller hinbekommen? Kann man die Verknüpfung vom String-Feldname zur Property nicht irgendwie speichern, nach dem sie das erste mal ermittelt wurde? Wenn ich so Objekte identifizieren wollte, würde ich diese in einem TDictionary<AObjectName,AObject> speichern. Das geht aber nicht mit properties oder doch?

Geändert von BlueStarHH ( 8. Jul 2019 um 13:51 Uhr)
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.446 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Wie *schnell* auf Properties anhand eines String-Bezeichners zugreifen?

  Alt 8. Jul 2019, 13:52
Mit properties geht das nicht, aber mit den Gettern sollte das gehen.
  Mit Zitat antworten Zitat
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

AW: Wie *schnell* auf Properties anhand eines String-Bezeichners zugreifen?

  Alt 8. Jul 2019, 13:53
Ich würde die ganzen Properties zu einer Liste zusammen fassen. Vielleicht würde sich ein TDictionary<String,String> anbieten. Da kannst Du dann sehr schnell auf die Werte Anhand des Bezeichners zugreifen.
Jens
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
849 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Wie *schnell* auf Properties anhand eines String-Bezeichners zugreifen?

  Alt 8. Jul 2019, 13:56
Ich würde die ganzen Properties zu einer Liste zusammen fassen. Vielleicht würde sich ein TDictionary<String,String> anbieten. Da kannst Du dann sehr schnell auf die Werte Anhand des Bezeichners zugreifen.
Das geht nicht, da es nicht nur Strings sind und es auch Getter und Setter mit benötigter Funktion dahinter gibt... Außerdem gibt es viele Codestellen, wo ich direkt auf die Properties ohne den Umweg über den String-Feldnamen zugreifen möchte. Denn das ist die schnellste Möglichkeit (wenn sie möglich ist).

Geändert von BlueStarHH ( 8. Jul 2019 um 13:59 Uhr)
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
849 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Wie *schnell* auf Properties anhand eines String-Bezeichners zugreifen?

  Alt 8. Jul 2019, 13:56
Mit properties geht das nicht, aber mit den Gettern sollte das gehen.
Wie? *Kopfkratz*
  Mit Zitat antworten Zitat
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

AW: Wie *schnell* auf Properties anhand eines String-Bezeichners zugreifen?

  Alt 8. Jul 2019, 13:59
Vielleicht dann ein TDictionary mit dem String als Schlüssel machen und als Wert einen Pointer auf den Getter bzw. Setter speichern?
Jens
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
849 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Wie *schnell* auf Properties anhand eines String-Bezeichners zugreifen?

  Alt 8. Jul 2019, 14:02
Vielleicht dann ein TDictionary mit dem String als Schlüssel machen und als Wert einen Pointer auf den Getter bzw. Setter speichern?
Wenn es ein Pointer ist, ist es dann der selbe Pointer für alle Instanzen von meinem Daten-Objekt oder muss ich für jedes Daten-Objekt die Pointer speichern? Dann müsste ich wieder pro Instanz von meinem Daten-Objekt die Namensvergleiche ausführen um die Verbindung von Namen zum Pointer zu finden. Das würde keinen Vorteil bringen, da ich die Felder nur ein mal pro Objekt abfrage...
  Mit Zitat antworten Zitat
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

AW: Wie *schnell* auf Properties anhand eines String-Bezeichners zugreifen?

  Alt 8. Jul 2019, 14:04
In dem Fall bringt es in der Tat nichts.
Würdest Du für jede Instanz x-mal die Sachen abfragen, würde es sich ggf. lohnen, die Liste zu füllen. Aber bei den Voraussetzungen nicht, das stimmt.
Jens
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: Wie *schnell* auf Properties anhand eines String-Bezeichners zugreifen?

  Alt 8. Jul 2019, 14:16
Delphi-Quellcode:
uses
    ..., TypInfo, ...

function HasProperty(AClass : TObject; APropertyName : String) : Boolean;
begin
  Result := Assigned(GetPropInfo(AClass.ClassInfo, APropertyName));
end;

...
  if HasProperty(ADataObj, 'ValueA') then begin
    try
      if GetStrProp(ADataObj, 'ValueA') = sName then begin
        SetStrProp(ADataObj, 'ValueA', '');
      end else
      // Analog zu Get- / SetStrProp gibt es weitere Routinen, die Du typabhängig nutzen kannst.
      ...
    except
      on e : Exception do MessageDlg(e.Message,mtErrr,[mbOk],0);
    end;
  end;
...
Daraus könnte sowas (nur hingedaddelt) werden:
Delphi-Quellcode:
function HasProperty(AClass : TObject; APropertyName : String) : Boolean;
begin
  Result := Assigned(GetPropInfo(AClass.ClassInfo, APropertyName));
end;

procedure GetFieldValue(ADataObj: TMyDataObj; const FieldName: string): string;
begin
  if HasProperty(ADataObj, Fieldname) then result := GetStrProp(ADataObj, FieldName) else result := '?';
end;

... oder ...

procedure GetFieldValue(ADataObj: TMyDataObj; const FieldName: string): string;
begin
  Result := ifThen(HasProperty(ADataObj, Fieldname),GetStrProp(ADataObj, FieldName),'');
end;

... oder ...

procedure GetFieldValue(ADataObj: TMyDataObj; const FieldName: string): string;
begin
  Result := ifThen(Assigned(GetPropInfo(ADataObj.ClassInfo, Fieldname)),GetStrProp(ADataObj, FieldName),'');
end;
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Wie *schnell* auf Properties anhand eines String-Bezeichners zugreifen?

  Alt 8. Jul 2019, 15:27
Ich benötige nun eine Funktion, der ich einen Feldnamen übergebe, anhand dessen dann der Wert einer bestimmten Property zurückgegeben werden soll. Beispielsweise GetFieldValue(ADataObj, 'MeinFeldX')
MVVM?

Ich würde mir über die RTTI von alles properties die Getter holen, diese dann in einem Dictionary speichern.

oder ggf. direct auf die Felder zugreifen, wenn Du keinen getter hast (wie in Deinem Beispiel).

Mavarik

Geändert von Mavarik ( 8. Jul 2019 um 16:15 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:36 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