![]() |
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01: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