![]() |
Wie *schnell* auf Properties anhand eines String-Bezeichners zugreifen?
Hallo,
ich habe ein Liste die mehrere simple Objekt enthält. Diese Objekt besitzen sehr viele Properties, um Daten zu speichern:
Delphi-Quellcode:
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')
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; Mein Code dazu:
Delphi-Quellcode:
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?
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; |
AW: Wie *schnell* auf Properties anhand eines String-Bezeichners zugreifen?
Mit properties geht das nicht, aber mit den Gettern sollte das gehen.
|
AW: Wie *schnell* auf Properties anhand eines String-Bezeichners zugreifen?
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.
|
AW: Wie *schnell* auf Properties anhand eines String-Bezeichners zugreifen?
Zitat:
|
AW: Wie *schnell* auf Properties anhand eines String-Bezeichners zugreifen?
Zitat:
|
AW: Wie *schnell* auf Properties anhand eines String-Bezeichners zugreifen?
Vielleicht dann ein TDictionary mit dem String als Schlüssel machen und als Wert einen Pointer auf den Getter bzw. Setter speichern?
|
AW: Wie *schnell* auf Properties anhand eines String-Bezeichners zugreifen?
Zitat:
|
AW: Wie *schnell* auf Properties anhand eines String-Bezeichners zugreifen?
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. |
AW: Wie *schnell* auf Properties anhand eines String-Bezeichners zugreifen?
Delphi-Quellcode:
Daraus könnte sowas (nur hingedaddelt) werden:
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; ...
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; |
AW: Wie *schnell* auf Properties anhand eines String-Bezeichners zugreifen?
Zitat:
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:06 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 by Thomas Breitkreuz