![]() |
TCollectionItem ansprechen über Schlüsselwert anstatt Index?
Hallo,
ich habe mit TCollection und TCollectionItem herumgespielt funktioniert soweit auch ganz gut. :-D Ich habe eine TCollection "Pictures" und die TCollectionItems "Picture". Als property von Picture habe ich z.B. "Filename" und "Date". Nun möchte ich ein Picture über den eindeutigen Schlüssel "Filename" ansprechen in etwas so: :coder: Pictures['C:\Test.tif'].date := ... Dementsprechend möchte ich ein Picture-Object erzeugen mit :coder: Picture.Add('C:\Test.tif') Hat jemand eine Idee ob und wenn wie so etwas funktioniert? :gruebel: |
Re: TCollectionItem ansprechen über Schlüsselwert anstatt In
Hallo,
nichts einfacher als das. Hier eine abgespecktes Beispiel aus meinem aktuellen Projekt.
Delphi-Quellcode:
In
TValue = class(TObject)
private FValuename : String; // Dies ist der Monatsname !!! FValue : Currency; public property Valuename : String read FValuename write FValuename; property Value : Currency read FValue write FValue ; end; // TValue = class(TObject) TValues = class(TListbase) private function GetValue(aValueName: String): TValue; function GetItems(X: Integer): TValue; public function Add : TValue; overload; function Add(aValueName : String) : TValue; overload; property Items[X : Integer] : TValue read GetItems; default; property Value[aValueName : String] : TValue read GetValue; end; // TValues = class(TListbase) implementation uses JsList; { TValues } function TValues.Add: TValue; begin Result:=TValue.Create; Result.Parent:=Self; List.Add(Result); end; function TValues.Add(aValueName: String): TValue; begin Result:=Value[aValueName]; // Prüfen ob es schon ein TValue in der Collection // mit dem Namen aValueName gibt. If Result=Nil then begin Result:=Add; Result.Valuename:=AnsiUppercase(Trim(aValueName)); end; end; function TValues.GetItems(X: Integer): TValue; begin Result:=TValue(List[X]); end; function TValues.GetValue(aValueName: String): TValue; var iCnt : Integer; _Valuename : String; begin Result:=Nil; _Valuename:=AnsiUppercase(Trim(aValueName)); For iCnt:=0 to Count-1 do begin If Items[iCnt].Valuename=_Valuename then begin Result:=Items[iCnt]; Exit; end; // If Items[iCnt].Name=_Name then end; // For iCnt:=0 to Count-1 do end; end.
Delphi-Quellcode:
und
property Value[aValueName : String] : TValue read GetValue;
Delphi-Quellcode:
steckt die Magie
function TValues.GetValue(aValueName: String): TValue;
|
Re: TCollectionItem ansprechen über Schlüsselwert anstatt In
@Jens
Ich glaube es ist effizienter, die Referenzen 2-mal im Speicher zu halten, aber dafür fast keine Zeit zum Suchen nach dem Namen zu verbrauchen. Schaue dir mal alzaimars StringDictionary an. Dein tring-Indexer it sicherlich ziemlich lahm, wenn du immer alle Elemente abklappern musst. ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:52 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