Tipy a triky v Delphi, díl 163. – hledání v TreeView

Diskuze čtenářů k článku

aaa  |  18. 11. 2004 07:35

Projet cely strom timle zpusobem pri poctu 3000 polozek a vic je zalezitost 3 minut i vic (zalezi na rychlosti procesoru), protoze pristup pres index Delphi resi samo timhle zpusobem:
function TTreeNode.GetItem(Index: Integer): TTreeNode;
begin
  Result := GetFirstChild;
  while (Result <> nil) and (Index > 0) do
  begin
    Result := GetNextChild(Result);
    Dec(Index);
  end;
  if Result = nil then TreeViewError(SListIndexError);
end;

Takze pro kazdy index se cely strom prohledava od zacatku !!! Pro projeti celeho stromu je mnohem rychlejsi vytahnout prvni item ve stromu (napr. GetFirstChild nebo i primo pres 0. index) a pak jenom pouzivat GetNext... funkci...
 
Zkouseno na Delphi3, nevim, jestli novejsi verze to nemaji osetreno lepe, ale pochybuju ...

Souhlasím  |  Nesouhlasím  |  Odpovědět
net-ray  |  11. 04. 2005 10:45

Jj, presne. Toto je daleko rychlejsi:
function TreeSearch(where: TTreeNode; what:string): TTreeNode;
var
  node : TTreeNode;
begin
  Result := nil;
  node := where.GetLastChild;
  while ( node <> nil ) do
  begin
    if ( node.Text = obj ) then
    begin
      Result := node;
      Break;
    end;
    node := node.GetPrev;
  end;
end;

a nebo:
function TreeSearch(where: TTreeNode; what: string ): TTreeNode;
var
  node : TTreeNode;
begin
  Result := nil;
  node := where.GetFirstChild;
  while ( node <> nil ) do
  begin
    if ( node.Text = obj ) then
    begin
      Result := node;
      Break;
    end;
    node := node.GetNext;
  end;
end;

Souhlasím  |  Nesouhlasím  |  Odpovědět
net-ray  |  08. 07. 2005 11:32

Nebo lepe rekurzivne:
function TreeSearch(where: TTreeNode; what: string): TTreeNode;
begin
  if ( where <> nil ) then
    if ( where.Text = what ) then
      Result := where
    else
      Result := TreeSearch( where.GetPrev, what )

  else
    Result := nil;
end;
...
TreeSearch( TTreeNode.GetLastChild, 'hledany retezec' );

Souhlasím  |  Nesouhlasím  |  Odpovědět
Jan Fiala  |  17. 11. 2004 17:46

K cemu je tam pred porovnavanim prirazeni do promenne ?
Proc se z cykly vyskakuje pomoci Exit ? Nebylo by cistejsi cyklus prerusit pomoci Break ?

Souhlasím  |  Nesouhlasím  |  Odpovědět
bohous  |  17. 11. 2004 08:52

Pokud tvrdite, ze si ctenari muzou stahnout projekt, uvedte v clanku odkaz odkud!

Souhlasím  |  Nesouhlasím  |  Odpovědět
autor  |  17. 11. 2004 11:28

Koukám, že máte pravdu. Odkaz měl být na konci, v poslední větě, ale zřejmě se vytratil při procesu publikace. Omlouvám se, zkusím zkontaktovat pana Holčíka, aby to opravil.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Zasílat názory e-mailem: Zasílat názory Můj názor