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

Tipy a triky v Delphi, díl 49. - Blikání ikony u prvků v TreeView; Test rozbaleni Treeview

Jan Šindelář - 17.7.2002

Blikání ikony u prvků v TreeView

TreeView je velmi oblíbeným prvkem aplikací, protože celkem přehledně dokáže zobrazit v podstatě libovolnou hierarchickou strukturu dat. Jednotlivé prvky mohou mít vlastní ikonku a právě této ikonky využijeme v našem příkladu. Často se totiž vyskytne případ, kdy je nutné na určitou položku stromu uživatele nějakým způsobem upozornit, upoutat jeho pozornost a vynutit si tak jeho odezvu. A toho docílíme například tím, že necháme ikonku u příslušného prvku blikat.

Pro někoho to bude možná neohrabané řešení, nicméně pro tuto jednoduchou "animaci" použijeme Timer. Pochopitelně musíte mít rovněž na formuláři TreeView naplněný daty a definované příslušné ikonky pro jednotlivé prvky. Pak již stačí jen doplnit událost OnTimer:

procedure TForm1.Timer1Timer(Sender: TObject);
var
r: TRect;
bNode: TTreeNode;
ImageWidth: Integer;
begin
with Form1.TreeView1 do bNode := Items[Items.count - 1 ];
with bNode do
begin
  ImageIndex := ImageIndex xor MaxInt;
  SelectedIndex := SelectedIndex xor MaxInt;
  if IsVisible then
  begin
    ImageWidth := TTreeView(Treeview).Images.Width;
    r := DisplayRect(True);
    r.Right := r.Left + ImageWidth;
    OffsetRect(r, -ImageWidth - 4 , 0);
    InvalidateRect(GetHandle, @r, True);
  end;
  end;
end;

Blikající prvek, označený jako bNode, je v našem případě ten úplně poslední z celého stromu. Rychlost blikání je pochopitelně ovlivněna nastavením Timeru, takže zvolte vhodný interval.

Test rozbaleni Treeview

I druhý dnešní tip se bude týkat Treeview, konkrétně stavu jeho rozbalení. Občas se totiž může hodit informace, zda je či není celý strom kompletně rozbalen, a podle toho příslušně reagovat. Postup je tedy poměrně logický. Projdeme postupně celý strom a testujeme rozbalenost jednotlivých podvětví. K tomu nám poslouží následující jednoduchá funkce, jejímž jediným parametrem je Treeview, jehož stav nás zajímá:

function IsExpanded(TView: TTreeview) : boolean;
var
Node: TTreenode;
begin
Assert(Assigned(TView));
if TView.Items.Count > 0 then
  begin
  Node := TView.Items[0];
  Result := True;
  while Result and Assigned(Node) do
    begin
    Result := Node.Expanded or not Node.HasChildren;
    Node := Node.GetNext;
    end;
  end
  else
    Result := False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if IsExpanded(TreeView1) then ShowMessage(`Strom je rozbalen`)
else ShowMessage(`Strom není rozbalen`);
end;

Zajímavá může být též funkce, která testuje, zda je celý strom kompletně zabalen. Funkce pak vypadá naprosto totožně, liší se pouze v podmínce testování, která může vypadat například takto:

Result := not (Node.Expanded and Node.HasChildren);

O metodách FullExpand a FullCollapse, které slouží k rozbalení a opětovnému zabalení celého stromu (a souvisejí tak s našim příkladem), snad mluvit nemusím, protože je jistě dobře znáte a běžně používáte.