Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Rekursives Problem (https://www.delphipraxis.net/104274-rekursives-problem.html)

Neutral General 30. Nov 2007 14:41


Rekursives Problem
 
Hi,

Habe hier eine rekursive Funktion die mir Probleme macht. Sie funktioniert eigentlich soweit aber das Problem ist, dass wenn sie vorzeitig das Item findet und noch andere Instanzen (kann man das so sagen?) der Funktion laufen, dann überschreiben die das richtige Ergebnis. Hatte eigentlich noch nie ein Problem. Vielleicht ists auch ein ganz blöder Fehler...

Delphi-Quellcode:
function Find(Items: TObjectList; Item: HMENU): TMenuItem;
var i: Integer;
begin
  for i := 0 to Items.Count-1 do
  begin
    if TMenuItem(Items[i]).Handle = Item then
    begin
      Result := TMenuItem(Items[i]);
      exit;
    end
    else
      Result := Find(TMenuItem(Items[i]).FItems,Item);
  end;
end;
Gruß
Neutral General

sirius 30. Nov 2007 14:58

Re: Rekursives Problem
 
Meinst du so:
Delphi-Quellcode:
function Find(Items: TObjectList; Item: HMENU): TMenuItem;
var i: Integer;
begin
  for i := 0 to Items.Count-1 do
  begin
    if TMenuItem(Items[i]).Handle = Item then
    begin
      Result := TMenuItem(Items[i]);
      exit;
    end
    else
    begin
      Result := Find(TMenuItem(Items[i]).FItems,Item);
      if result<>nil then exit;
    end;
  end;
  result:=nil;
end;
Edit: "end;" vergessen

xaromz 30. Nov 2007 14:59

Re: Rekursives Problem
 
Hallo,

Du benötigst eine weitere Abbruchbedingung:
Delphi-Quellcode:
function Find(Items: TObjectList; Item: HMENU): TMenuItem;
var
  i: Integer;
begin
  for i := 0 to Items.Count - 1 do
  begin
    if TMenuItem(Items[i]).Handle = Item then
    begin
      Result := TMenuItem(Items[i]);
      exit;
    end
    else
    begin
      Result := Find(TMenuItem(Items[i]).FItems, Item);
      if Assigned(Result) then
        Exit;
    end;
  end;
end;
Gruß
xaromz

Neutral General 30. Nov 2007 15:01

Re: Rekursives Problem
 
Hi,

Ah danke. Eigentlich logisch :wall: :)

Gruß
Neutral General

MacGuyver 30. Nov 2007 15:08

Re: Rekursives Problem
 
Moin,

warum? Der Abbruch ist doch klar.

Stefan

shmia 30. Nov 2007 15:42

Re: Rekursives Problem
 
Ich weiss nicht, der gezeigte Code scheint mir ziemlich unsauber zu sein.
Wozu TObjectList ins Spiel bringen, wenn doch TMenuItem ausreicht ?
Die Klasse TMenuItem bildet eine hierarchische Struktur ab.
Man muss das System aber erst mal verstanden haben. siehe: Tiefensuche
Delphi-Quellcode:
function Find(Item: TMenuItem; mhandle: HMENU): TMenuItem;
var
  i: Integer;
begin
  if item.Handle = mhandle then  
  begin
     Result := Item;
  end
  else
  begin
    for i := 0 to Items.Count - 1 do
    begin
       Result := Find(Item.Items[i], mhandle)
       if Assigned(Result) then
         Exit;
    end;
    Result := nil;
  end;
end;

Neutral General 30. Nov 2007 16:27

Re: Rekursives Problem
 
Hi,

Danke :)
Habs jetzt verbessert. Aber Du musst bedenken das TMenuItem nicht das TMenuItem ist, das du kennst ;)

Gruß
Neutral General


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:50 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