Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz