Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TObjectList Suchen nach String (https://www.delphipraxis.net/58032-tobjectlist-suchen-nach-string.html)

Scorpion 30. Nov 2005 12:42


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

sakura 30. Nov 2005 12:45

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:...

arbu man 30. Nov 2005 12:47

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;

sh17 30. Nov 2005 13:28

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;

Muetze1 30. Nov 2005 13:38

Re: TObjectList Suchen nach String
 
Zitat:

Zitat von arbu man
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;

Schick, und was ist, wenn der Name nicht vorhanden ist? Undefinierter Rückgabewert? Klasse - so baut man stabile Programme...
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;

Jelly 25. Jan 2007 21:52

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])) ;

Muetze1 25. Jan 2007 22:41

Re: TObjectList Suchen nach String
 
Zitat:

Zitat von Jelly
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])) ;

1. Entspricht -1 dem Verhalten von IndexOf() der TList und deren Ableitungen
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.

Jelly 25. Jan 2007 23:01

Re: TObjectList Suchen nach String
 
Zitat:

Zitat von Muetze1
1. Entspricht -1 dem Verhalten von IndexOf() der TList und deren Ableitungen

Geschmackssache, würd ich meinen.

Zitat:

Zitat von Muetze1
2. Müsste ich dann jedes suchen nach einem Namen explizit mit einem Try/Except umfassen.

Ja. Find ich persönlich übersichtlicher.
Zitat:

Zitat von Muetze1
3. Add() muss nicht neu implementiert werden.

Hat doch mit Add nix zu tun, oder überseh ich da was.

Muetze1 25. Jan 2007 23:32

Re: TObjectList Suchen nach String
 
Zitat:

Zitat von Jelly
Zitat:

Zitat von Muetze1
1. Entspricht -1 dem Verhalten von IndexOf() der TList und deren Ableitungen

Geschmackssache, würd ich meinen.

Zitat:

Zitat von Muetze1
2. Müsste ich dann jedes suchen nach einem Namen explizit mit einem Try/Except umfassen.

Ja. Find ich persönlich übersichtlicher.

Try/Except vergrössert den Code grundlegend um 4 Zeilen und das eigentlich unnötigerweise (aus meiner Sicht), da hier ein einfaches If reicht.

Aber du hast schon Recht, es ist reine Ansichtssache.

Zitat:

Zitat von Jelly
Zitat:

Zitat von Muetze1
3. Add() muss nicht neu implementiert werden.

Hat doch mit Add nix zu tun, oder überseh ich da was.

Das hatte nichts mit deinem Code zu tun, sondern mit dem Code von sh17. Das bezog sich nicht auf deinen Beitrag. Hätte ich noch drauf hinweisen sollen.

marabu 26. Jan 2007 06:39

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:
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;
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.

Ist das wirklich nur eine Geschmacksfrage?

Freundliche Grüße

IngoD7 26. Jan 2007 07:55

Re: TObjectList Suchen nach String
 
Zitat:

Zitat von Muetze1
1. Entspricht -1 dem Verhalten von IndexOf() der TList und deren Ableitungen

Eben. Und gaaaanz viele Gründe, bei nicht gefunden etwas anderes zurückzugeben, gibt es m.E. auch nicht.

Zitat:

Zitat von Muetze1
4. ist der Thread über 2 Monate alt.

A. Ist doch egal.
B. Der ist sogar über 1 Jahr und 2 Monate alt. Willkommen in 2007. :zwinker:

sh17 26. Jan 2007 08:26

Re: TObjectList Suchen nach String
 
Zitat:

Zitat von Muetze1
Das hatte nichts mit deinem Code zu tun, sondern mit dem Code von sh17. Das bezog sich nicht auf deinen Beitrag. Hätte ich noch drauf hinweisen sollen.

Das Thema mit der Methode Add hatten wir beide ja schon in einem anderen Thread. Und ich hab es na nun eingesehen, das Add überflüssig ist. :wink: Ich verspreche, mein Codegerüst wird in dieser "falschen" Form in keinem anderen Thread mehr zu finden sein.

Muetze1 26. Jan 2007 08:29

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.

Elvis 26. Jan 2007 22:46

Re: TObjectList Suchen nach String
 
Zitat:

Zitat von marabu
Ich greife den Verbesserungsvorschlag von Thomas in Beitrag #5 auf:

Sehr schön. So mache ich es auch. Zumindest von der Signatur der Funktion her.
ich mag Konstrukte wie:
Delphi-Quellcode:
if not list.TryGetValue(key, out result) then
  result := nil;
Um es beim kleinsten gemeinsamen Nenner zu lassen wäre es auch möglich TComponent anstatt TImage zu nehmen.
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:

Ist das wirklich nur eine Geschmacksfrage?
Denke ich nicht.
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