Živě.cz o počítačích a internetu

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

Jan Šindelář 17.11.2004

Po minulých grafických orgiích zde máme dva jednoduché začátečnické tipy. Ukážeme si, jak vyhledávat položky v TreeView a jak detekovat stisk pomocných kláves při výběru položky v menu.

Začneme od konce a povíme si o detekci stisku kláves při výběru položky v menu. Za normálních okolností si uživatel vybere v menu položku a my máme za úkol pouze napsat pro tuto položku obsluhu události. Tento základ si rozšíříme o možnost stisku klávesy CTRL, ALT nebo SHIFT během výběru položky z menu. Uživatel pak má možnost aktivovat buď jednoduchým kliknutím standardní funkci pro danou položku a nebo při současném podržení příslušné klávesy může spustit funkci odlišnou od té základní. Jaké konkrétní funkce to budou, resp. jak se bude lišit ta hlavní od té "skryté", to už samozřejmě záleží na okolnostech a vašem vlastním uvážením.

A jak tedy na to? Je to velmi snadné. Prostě a jednoduše v obsluze události příslušné položky vložíme jednoduchou podmínku a s využitím funkce GetKeyState testujeme stisk příslušné klávesy. Obsluha události položky menu pak může vypadat nějak takto:

procedure TForm1.MenuItem1Click(Sender: TObject);
begin
  if HiWord(GetKeyState(VK_SHIFT)) <> 0 then ShowMessage(`Shift`)
  else
    if HiWord(GetKeyState(VK_CONTROL)) <> 0 then ShowMessage(`Ctrl`)
    else
      if HiWord(GetKeyState(VK_MENU)) <> 0 then ShowMessage(`Alt`);
end;

Která klávesa byla stisknuta vypíše ShowMessage a pokud nebyla stisknuta žádná, nic se nestane. V příkladu vidíte všechny tři hlavní možnosti, tedy Shift, Ctrl a Alt. S klávesou Alt je trochu problém, určitě vás napadne proč a sami si to pak můžete ověřit v přiloženém příkladu.

Druhý dnešní tip se týká komponenty TreeView. Tato velmi často používaná komponenta umožňuje velmi snadno a přehledně zobrazit stromově strukturovaná data, ale pokud je "strom" příliš rozsáhlý a komplikovaný, nemusí se uživatel hned na první pokus dobře zorientovat a vyhledání požadované větve mu pak může zabrat dost času. Proto se naučíme v TreeView vyhledávat textové položky. Vyhledávací funkce bude velmi jednoduchá a vypadat bude takto:

function TForm1.TreeViewSearch(TV: TTreeView; SItem: string): TTreeNode;
var
  i: Integer;
  iItem: string;
begin
  Result := nil;
  if (TV = nil) or (SItem = ``) then Exit;
  for i := 0 to TV.Items.Count - 1 do
  begin
    iItem := TV.Items[i].Text;
    if SItem = iItem then
      begin
        Result := TV.Items[i];
        Exit;
      end;
  end;
end;

Parametrem funkce je prohledávaný Treeview a hledaný text. Na výstupu dostaneme příslušnou větev. Funkci pak použijeme následujícím způsobem:

procedure TForm1.Button1Click(Sender: TObject);
begin
  TreeView1.Selected := TreeViewSearch(TreeView1, `test`);
  Treeview1.SetFocus;
end;

Stisknutím příslušného tlačítka se spustí vyhledávání a nalezený prvek bude označen, přičemž TreeView ještě dostane focus. Funkci si můžete pochopitelně značným způsobem rozšířit a upravit, protože v této verzi funkce vyhledávání skončí po nalezení prvního vyhovujícího prvku. To už ale nechám na vaší úvaze a potřebách.

I tentokrát si můžete ukázkový projekt stáhnout zde..