![]() |
TObjectList Suchen nach String
Hallo,
ich habe eine TObjectlist erstellt. In ihr befinden sich TImages. Wie kann ich denn den Index eines Images mit bestimmtem Namen in dieser Liste suchen ? Thx |
Re: TObjectList Suchen nach String
Du musst die Objectlist Item für Item durchlaufen, die Items auf den entsprechenden Typ (TImage) casten und dann den Namen vergleichen. Also einfach von Hand ;)
...:cat:... |
Re: TObjectList Suchen nach String
Delphi-Quellcode:
function findimage(fname:string):integer;
var i:integer; begin for i:=0 to olist.count-1 do begin if (olist[i]as TImage).name=fname then result:=i; end; end; |
Re: TObjectList Suchen nach String
kleiner Tipp, wenn Du Dir das Casten sparen willst:
eine TImage-Objectliste
Delphi-Quellcode:
interface
type TImageObjectList = class(TObjectList) protected function GetItem(Index: Integer): TImage; procedure SetItem(Index: Integer; AItem: TImage); public function Add(AItem: TImage): Integer; function Extract(Item: TImage): TImage; function Remove(AItem: TImage): Integer; function IndexOf(AItem: TImage): Integer; procedure Insert(Index: Integer; AItem: TImage); function First: TImage; function Last: TImage; property Items[Index: Integer]: TImage read GetItem write SetItem; default; end; implementation { TImageObjectList } function TImageObjectList.Add(AItem: TImage): Integer; begin Result := inherited Add(AItem); end; function TImageObjectList.Extract(Item: TImage): TImage; begin Result := TImage(inherited Extract(Item)); end; function TImageObjectList.First: TImage; begin Result := TImage(inherited First); end; function TImageObjectList.GetItem(Index: Integer): TImage; begin Result := TImage(inherited Items[Index]); end; function TImageObjectList.IndexOf(AItem: TImage): Integer; begin Result := inherited IndexOf(AItem); end; procedure TImageObjectList.Insert(Index: Integer; AItem: TImage); begin inherited Insert(Index, AItem); end; function TImageObjectList.Last: TImage; begin Result := TImage(inherited Last); end; procedure TImageObjectList.SetItem(Index: Integer; AItem: TImage); begin inherited Items[Index] := AItem; end; function TImageObjectList.Remove(AItem: TImage): Integer; begin Result := inherited Remove(AItem);end; |
Re: TObjectList Suchen nach String
Zitat:
Der Compiler meckert nicht umsonst. Und warum bis zum Ende der Liste durchlaufen, wenn man das gesuchte schon gefunden hat? Wir sind ja nicht in C(++) wo return die Funkion auch gleich verlässt...
Delphi-Quellcode:
function findimage(fname:string):integer;
var i: integer; begin Result := -1; for i:=0 to Pred(olist.count) do if ( olist[i] as TImage ).name = fname Then Begin result := i; Break; End; end; |
Re: TObjectList Suchen nach String
Statt den Rückgabewert -1 zurückzugeben, wenn der Name nicht gefunden wird, würd ich ein selbst ausgelöste Exception bevorzugen. Ohne Dokumentation, was der Wert -1 bedeutet, kann man damit nix anfangen. Mit einer Fehlermeldung, die einem um die Ohren fliegt schon.
Delphi-Quellcode:
raise exception.Create (format('%s in TImageObjectList not found',[fName])) ;
|
Re: TObjectList Suchen nach String
Zitat:
2. Müsste ich dann jedes suchen nach einem Namen explizit mit einem Try/Except umfassen. 3. Add() muss nicht neu implementiert werden. 4. ist der Thread über 2 Monate alt. |
Re: TObjectList Suchen nach String
Zitat:
Zitat:
Zitat:
|
Re: TObjectList Suchen nach String
Zitat:
Aber du hast schon Recht, es ist reine Ansichtssache. Zitat:
|
Re: TObjectList Suchen nach String
Hallo,
zu den Best-Practices gehört: Niemals eine Exception werfen, wenn die beabsichtigte Funktionalität auch mit anderen Mitteln erreicht werden kann. Ich greife den Verbesserungsvorschlag von Thomas in Beitrag #5 auf:
Delphi-Quellcode:
Die Signatur stimmt jetzt fast mit der allgemeinen VCL Signatur für Find() überein. Der Container wird zum ersten Parameter, wenn durch die Funktion eine Methode simuliert wird. Eine Exception wird jetzt nur geworfen, wenn die Liste ein Object enthält, welches dort nicht erwartet wird.
function FindImage(ol: TObjectList; const imgName: string; var index: Integer): Boolean;
begin index := ol.Count; repeat Dec(index); Result := (index >= 0) and (ol[index] as TImage).Name = imgName); until Result or (index < 0); end; Ist das wirklich nur eine Geschmacksfrage? Freundliche Grüße |
Re: TObjectList Suchen nach String
Zitat:
Zitat:
B. Der ist sogar über 1 Jahr und 2 Monate alt. Willkommen in 2007. :zwinker: |
Re: TObjectList Suchen nach String
Zitat:
|
Re: TObjectList Suchen nach String
Es ist ja in dem Sinne nichts falsch dran. Ausserdem habe ich nun nicht alle Nutzer im Kopf und wusste daher nicht, dass es wieder den selben trifft. Das hatte ich nur aufgrund von Jellys Beitrag g'rad' mal wieder gesehen.
|
Re: TObjectList Suchen nach String
Zitat:
ich mag Konstrukte wie:
Delphi-Quellcode:
Um es beim kleinsten gemeinsamen Nenner zu lassen wäre es auch möglich TComponent anstatt TImage zu nehmen.
if not list.TryGetValue(key, out result) then
result := nil; Wobei man sich natürlich fragen muss warum muss ich überhaupt über den Namen des Elementes darauf zugreifen. Und wenn man es muss (warum auch immer), wie oft und wie zeitnah muss das passieren. Wenn ersteres mit "ständig" und das andere mit "sackschnell" beantwortet wird, könnte man sich überlegen, ob nicht eine Suche innerhalb der Liste (als Methode) sinnvoller wäre. Mit Hilfe einer Hashliste, die von der eigentlichen Liste verwaltet wird. Ich kann aber nur nochmal wiederholen, dass der Zugriff über einen Namen meist einen fundamentalen Fehler im Design anzeigt. Zitat:
Aber wenn der Code eine ähnliche Herangehensweise wie die vorherrschenden Containerklassen verfolgt, ist das ja auch nicht falsch. @Thomas' Index als Rückgabewert |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:22 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