vložil Radek Červinka
22. ledna 2010 22:27
Minule jsem nastínil základy práce s Virtual TreeView, ale uvědomil jsem si, že jsem pořádně nezdůraznil virtuální aspekt práce této komponenty. Zkusím to dnes ještě napravit.

Do minulého příkladu přidám dvě tlačítka pro práci s cenou zakázky (první přičte 50, druhý 50 odečte). Navíc pokud bude cena pod hodnotou 0 bude vykreslena červeně.
Na rozdíl od klasického stromu se nemusíme vůbec starat o aktualizaci popisek ve stromě, jen změníme data v pozadí a necháme strom překreslit - o zbytek se postará kód napsaný minule.
Takže přihodíme na formulář dvě tlačítka (btnPlus, btnMinus) a napíšeme metodu, která bude dělat špinavou práci:
1procedure TfrmVTtest.mAddSubSelected(iDiff: Integer);
2var
3 pNode: PVirtualNode;
4 MyData:PMyNodeData;
5begin
6 pNode := vt.GetFirstSelected;
7 while assigned(pNode) do
8 begin
9 MyData := vt.GetNodeData(pNode);
10 MyData^.crPrice := MyData^.crPrice + iDiff;
11 pNode := vt.GetNextSelected(pNode);
12 end;
13 vt.Invalidate;
14end;
A nyní jen obsluha našich tlačidel.
1procedure TfrmVTtest.btnMinusClick(Sender: TObject);
2begin
3 mAddSubSelected(-50);
4end;
5
6procedure TfrmVTtest.btnPlusClick(Sender: TObject);
7begin
8 mAddSubSelected(+50);
9end;
Tak nyní nám funguje práce s cenou - tak už jen tu barvičku. Obsloužíme OnPaintText - zde se dá dělat hodně věcí, ale nám pro dnešek bude
stačit jen změna barvy.
1procedure TfrmVTtest.vtPaintText(Sender: TBaseVirtualTree;
2 const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
3 TextType: TVSTTextType);
4var
5 MyData:PMyNodeData;
6begin
7 if Column <> 1 then
8 Exit;
9 MyData := vt.GetNodeData(Node);
10 if not assigned(MyData) then
11 Exit;
12 if (MyData^.crPrice < 0) then
13 TargetCanvas.Font.Color := clRed;
14end;
A to je vše. Podle mne je hlavní výhodou právě ta virtualizace. Člověk si hraje na svém písečku (své data) a vůbec se nemusí starat o nějaké aktualizace textu, vše jde pak přes jednu metodu až budeme chtít.
Snažím se psát ukázkové kódy na jednoduchých příkladech, ale pokud jsou nějaké nejasnosti nebo nápady, popř. máte nějaký nápad, neváhejte a napište do komentářů nebo přes kontaktní formulář.