TreeView, to je téma dnešního dílu. Ukážeme si dva jednoduché příklady. V prvním si předvedeme, jak blikat ikonkou u libovolného prvku stromu, druhá funkce bude testovat, zda je celý strom kompletně rozbalen.
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.