Sign in Join
Wiki copytemporary

VirtualTreeview Example for Lazarus/pl: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: VirtualTreeview Example for Lazarus/pl

OldNewLine
1+Oto kilka przykładów użycia [[VirtualTreeview]] dla Lazarusa (testowane na win32). Są one w większości zebrane z sieci, napisane dla Delphi oraz z samouczka/dokumentacji autorstwa Philippa Frenzela i Mike'a Lischke.
2+
3+Samouczek/dokumenty dostępne kiedyś były na stronie <http://www.soft-gems.net>. Obecnie dokumentację w pliku pdf można pobrać ze strony [documentation.help](https://documentation.help/VirtualTreeview/documentation.pdf). Tutaj znajdziesz tylko szybki sposób korzystania z VirtualTreeview na Lazarus, a nie wyjaśnienia. Aby uzyskać wyjaśnienia i wiele innych funkcji/metod, pobierz oficjalne dokumenty i samouczek.
4+
5+# Podstawowe Drzewo Listview z 3 Kolumnami
6+
7+1\. Zainstaluj komponent. Uruchom Lazarusa.
8+
9+2\. Upuść komponent TVirtualStringTree na formę (znajdziesz go w zakładce Virtual Controls).
10+
11+3\. Przejdź do edytora źródeł (naciśnij klawisz F12). W sekcji Uses dodaj moduł o nazwie VirtualTrees (jeśli jeszcze go nie ma i nie jest to VirtualStringTree). Może to wyglądać następująco:
12+
13+``` pascal
14+uses
15+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
16+ VirtualStringTree, VirtualTrees;
17+```
18+
19+4\. Przejdź do projektanta formularzy (naciśnij klawisz F12). Wybierz Virtual Tree Component. Na Inspektorze obiektów kliknij Nazwa, wpisz VST i naciśnij enter. Kliknij Nagłówek (rozwiń go) -\> Kolumny, kliknij mały przycisk obok „0 items”. Kliknij 3 razy przycisk Dodaj, aby dodać 3 kolumny. Nie zamykaj tego okna.
20+
21+5\. W oknie Edycja kolumny jest teraz wybrana trzecia kolumna. Dostań się do Inspektora obiektów. Kliknij Options (rozwiń) -\> ustaw coAllowClick na False.
22+
23+6\. Kliknij tekst. Wpisz Kolumna2.
24+
25+7\. Kliknij opcję Width, wpisz 100 i naciśnij klawisz Enter.
26+
27+8\. Przejdź do okna Edycja kolumny, wybierz pierwszą i drugą kolumnę i ustaw ich właściwość jak powyżej (w polu tekstowym użyj różnych nazw, np. Kolumna0, Kolumna1).
28+
29+9\. Zamknij okno edycji kolumn. Wybierz komponent Virtual Tree na formie. W Inspektorze obiektów przejdź do Header -\> Options (rozwiń). Ustaw hoVisible na True.
30+
31+10\. Przewiń w dół, aby ustawić Header -\> Style na hsFlatButtons.
32+
33+![](/wiki-images/7/70/ExempleVirtualtreeView1.jpg)
34+
35+11\. Przewiń w dół do TreeOptions (rozwiń) -\> MiscOptions (rozwiń) i ustaw toEditable na True. Ustaw toGridExtensions na True.
36+
37+12\. Przewiń w dół do SelectionOptions (rozwiń) -\> ustaw toExtendedFocus na True. Ustaw toMultiSelect na True. W formularzu Form Designer zmień rozmiar VST (Virtual Tree Component), aby w razie potrzeby wyświetlić wszystkie kolumny.
38+
39+13\. Teraz dodaj 3 przyciski do formularza. Pobierz je z palety komponentów - Zakładka Standard (ikona z etykietą „Ok”).
40+
41+14\. Kliknij Button1, w Inspectorze obiektów zmień Caption na AddRoot. Kliknij Button2, zmień podpis na AddChild. Zmień podpis przycisku Button3 na Delete.
42+
43+![](/wiki-images/7/76/ExempleVirtualtreeView2.jpg)
44+
45+15\. Zachowaj to tutaj i przejdź do edytora źródeł (naciśnij F12). W edytorze źródeł zamień wiersz:
46+
47+{\$mode objfpc}{\$H+}
48+
49+na
50+
51+{\$MODE DELPHI}
52+
53+16\. Pod słowem kluczowym "implementation" wklej następujące wiersze:
54+
55+``` pascal
56+type
57+ PTreeData = ^TTreeData;
58+ TTreeData = record
59+ Column0: String;
60+ Column1: String;
61+ Column2: String;
62+ end;
63+```
64+
65+17\. Przejdź do projektanta formularzy (naciśnij klawisz F12). Wybierz VST. Przejdź do Inspektora obiektów, wybierz kartę Zdarzenia, przewiń w dół do zdarzenia onChange. Kliknij dwukrotnie combobox. Wklej następujący kod:
66+
67+``` pascal
68+procedure TForm1.VSTChange(Sender: TBaseVirtualTree; Node: PVirtualNode);
69+begin
70+ VST.Refresh;
71+end;
72+```
73+
74+18\. Przewiń do opcji onFocusChanged. Kliknij dwukrotnie i wklej następujący kod:
75+
76+``` pascal
77+procedure TForm1.VSTFocusChanged(Sender: TBaseVirtualTree; Node: PVirtualNode;
78+ Column: TColumnIndex);
79+begin
80+ VST.Refresh;
81+end;
82+```
83+
84+19\. Przewiń do onFreeNode. Kliknij dwukrotnie i wklej następujący kod:
85+
86+``` pascal
87+procedure TForm1.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
88+var
89+ Data: PTreeData;
90+begin
91+ Data := VST.GetNodeData(Node);
92+ if Assigned(Data) then begin
93+ Data^.Column0 := '';
94+ Data^.Column1 := '';
95+ Data^.Column2 := '';
96+ end;
97+end;
98+```
99+
100+20\. Przewiń w dół do onGetNodeDataSize. Kliknij dwukrotnie i wklej następujący kod:
101+
102+``` pascal
103+procedure TForm1.VSTGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer);
104+begin
105+ NodeDataSize := SizeOf(TTreeData);
106+end;
107+```
108+
109+21\. Przewiń do onGetText. Kliknij dwukrotnie i wklej następujący kod:
110+
111+``` pascal
112+procedure TForm1.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
113+ Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
114+var
115+ Data: PTreeData;
116+begin
117+ Data := VST.GetNodeData(Node);
118+ case Column of
119+ 0: CellText := Data^.Column0;
120+ 1: CellText := Data^.Column1;
121+ 2: CellText := Data^.Column2;
122+ end;
123+end;
124+```
125+
126+22\. Naciśnij klawisz F12, aby przejść do projektanta formularzy. Kliknij dwukrotnie przycisk AddRoot. Wklej następujący kod:
127+
128+``` pascal
129+procedure TForm1.Button1Click(Sender: TObject);
130+var
131+ Data: PTreeData;
132+ XNode: PVirtualNode;
133+ Rand: Integer;
134+begin
135+ Randomize;
136+ Rand := Random(99);
137+ XNode := VST.AddChild(nil);
138+
139+ if VST.AbsoluteIndex(XNode) > -1 then
140+ begin
141+ Data := VST.GetNodeData(Xnode);
142+ Data^.Column0 := 'One ' + IntToStr(Rand);
143+ Data^.Column1 := 'Two ' + IntToStr(Rand + 10);
144+ Data^.Column2 := 'Three ' + IntToStr(Rand - 10);
145+ end;
146+end;
147+```
148+
149+23\. Naciśnij klawisz F9, aby uruchomić projekt w celu sprawdzenia. Kliknij AddRoot, aby dodać węzeł. Jeśli jest w porządku, węzeł zostanie dodany na VST.
150+
151+![](/wiki-images/8/86/ExempleVirtualtreeView3.jpg)
152+
153+24\. Zatrzymaj wykonywanie. W formularzu kliknij dwukrotnie przycisk podpisany jako AddChild. Wklej następujący kod:
154+
155+``` pascal
156+procedure TForm1.Button2Click(Sender: TObject);
157+var
158+ XNode: PVirtualNode;
159+ Data: PTreeData;
160+begin
161+ if not Assigned(VST.FocusedNode) then
162+ Exit;
163+
164+ XNode := VST.AddChild(VST.FocusedNode);
165+ Data := VST.GetNodeData(Xnode);
166+
167+ Data^.Column0 := 'Ch 1';
168+ Data^.Column1 := 'Ch 2';
169+ Data^.Column2 := 'Ch 3';
170+
171+ VST.Expanded[VST.FocusedNode] := True;
172+end;
173+```
174+
175+25\. W formularzu kliknij dwukrotnie przycisk podpisany jako Delete. Wklej następujący kod:
176+
177+``` pascal
178+procedure TForm1.Button3Click(Sender: TObject);
179+begin
180+ VST.DeleteSelectedNodes;
181+end;
182+```
183+
184+26\. Uruchom projekt, naciskając klawisz F9, aby sprawdzić program. Dodaj węzeł, dziecko i usuń je.
185+
186+![](/wiki-images/3/3d/ExempleVirtualtreeView4.jpg)
187+
188+27\. Spróbuj edytować węzeł. Wybierz węzeł i naciśnij F2, wpisz nową wartość. Jeśli widzisz, co piszesz, to jest OK. W przeciwnym razie przeczytaj poniżej „Nie można zobaczyć edycji komórki”.
189+
190+28\. Aby VST pokazywał nową wartość wprowadzoną po edycji, przejdź do Projektanta formularzy, wybierz VST. W Inspektorze obiektów -\> Zdarzenia -\> zdarzenie OnNewText kliknij dwukrotnie. Wklej następujący kod:
191+
192+``` pascal
193+procedure TForm1.VSTNewText(Sender: TBaseVirtualTree; Node: PVirtualNode;
194+ Column: TColumnIndex; NewText: WideString);
195+var
196+ Data: PTreeData;
197+begin
198+ Data := VST.GetNodeData(Node);
199+ case Column of
200+ 0: Data^.Column0 := NewText;
201+ 1: Data^.Column1 := NewText;
202+ 2: Data^.Column2 := NewText;
203+ end;
204+end;
205+```
206+
207+Na tym przykład podstawowego zastosowania kończy się. Możesz upuścić kilka dodatkowych przycisków na formularz, aby przetestować kilka innych poleceń podanych poniżej. Następnymi krokami byłoby pokazanie pola wyboru, obrazu, koloru czcionki i dodanie combobox w węźle.
208+
209+- Inny sposób na dodanie węzła głównego
210+
211+``` pascal
212+procedure TForm1.Button8Click(Sender: TObject);
213+begin
214+ with VST do
215+ RootNodeCount := RootNodeCount + 1;
216+end;
217+```
218+
219+- Inny sposób na dodanie dziecka
220+
221+``` pascal
222+procedure TForm1.Button9Click(Sender: TObject);
223+begin
224+ if Assigned(VST.FocusedNode) then
225+ VST.ChildCount[VST.FocusedNode] := VST.ChildCount[VST.FocusedNode] + 1;
226+end;
227+```
228+
229+- Wybierz i usuń dzieci węzła
230+
231+``` pascal
232+procedure TForm1.Button4Click(Sender: TObject);
233+var
234+ c: Integer;
235+begin
236+ if not Assigned(VST.FocusedNode) then
237+ Exit;
238+ if VST.HasChildren[VST.FocusedNode] then
239+ begin
240+ c := VST.ChildCount[VST.FocusedNode];
241+ VST.DeleteChildren(VST.FocusedNode);
242+ ShowMessage('Number of deleted child:' + #13#10 + IntToStr(c));
243+ end;
244+end;
245+```
246+
247+- Usunięcie węzeł
248+
249+``` pascal
250+procedure TForm1.Button5Click(Sender: TObject);
251+begin
252+{VST.Clear; //Delete All Nodes}
253+ if not Assigned(VST.FocusedNode) then
254+ Exit;
255+ VST.DeleteNode(VST.FocusedNode);
256+end;
257+```
258+
259+- Wyszukaj i wybierz węzeł
260+
261+``` pascal
262+procedure TForm1.Button6Click(Sender: TObject);
263+bar
264+ XNode: PVirtualNode;
265+ Data: PTreeData;
266+begin
267+ XNode := VST.GetFirst;
268+
269+ while XNode <> nil do
270+ begin
271+ Data := VST.GetNodeData(XNode);
272+ if Data^.Column0 = '1' then
273+ begin
274+ VST.ClearSelection;
275+ VST.Selected[XNode] := True;
276+ VST.SetFocus;
277+ break;
278+ end else
279+ XNode := VST.GetNextSibling(XNode);
280+ end;
281+end;
282+```
283+
284+- Wybierz rodzica
285+
286+``` pascal
287+procedure TForm1.Button13Click(Sender: TObject);
288+var
289+ XNode: PVirtualNode;
290+begin
291+ if not Assigned(VST.FocusedNode) then
292+ Exit;
293+ XNode := VST.FocusedNode;
294+ while VST.GetNodeLevel(XNode) > 0 do
295+ begin
296+ XNode := XNode.Parent;
297+ VST.Selected[XNode] := True;
298+ end;
299+ VST.Refresh;
300+ VST.SetFocus;
301+end;
302+```
303+
304+- Wyszukaj wszystko
305+
306+``` pascal
307+procedure TForm1.Button7Click(Sender: TObject);
308+var
309+ XNode: PVirtualNode;
310+ Data: PTreeData;
311+begin
312+ if VST.GetFirst = nil then Exit;
313+ XNode := nil;
314+ repeat
315+ if XNode = nil then
316+ XNode := VST.GetFirst
317+ else
318+ XNode := VST.GetNext(XNode);
319+ Data := VST.GetNodeData(XNode);
320+ if (Data^.Column0 = '1') or (Data^.Column1 = '1') or (Data^.Column2 = '1') then
321+ begin
322+ ShowMessage('Found at Node Level : ' + IntToStr(VST.GetNodeLevel(XNode)));
323+ break;
324+ end;
325+ until XNode = VST.GetLast();
326+end;
327+```
328+
329+- Wyszukaj następny
330+
331+``` pascal
332+procedure TForm1.Button8Click(Sender: TObject);
333+var
334+ XNode: PVirtualNode;
335+ Data: PTreeData;
336+begin
337+ if not Assigned(VST.GetFirst) then
338+ Exit
339+ else
340+ XNode := VST.GetFirst;
341+ repeat
342+ XNode := VST.GetNext(XNode);
343+ Data := VST.GetNodeData(XNode);
344+ if Pos(LowerCase(SearchEdit.Text), LowerCase(Data^.Column0)) > 0 then
345+ begin
346+ VST.FocusedNode := XNode;
347+ VST.Selected[XNode] := True;
348+ if MessageDlg('Item found?', mtConfirmation, mbYesNo, 0) = mrYes then
349+ begin
350+ VST.Expanded[XNode] := True;
351+ VST.Refresh;
352+ VST.SetFocus;
353+ Break;
354+ end;
355+ end;
356+ until XNode = VST.GetLast;
357+end;
358+```
359+
360+- Wstaw węzeł
361+
362+``` pascal
363+procedure TForm1.Button12Click(Sender: TObject);
364+var
365+ XNode: PVirtualNode;
366+begin
367+ if Assigned(VST.FocusedNode) then
368+ begin
369+ XNode := VST.InsertNode(VST.FocusedNode,amInsertBefore);
370+ // To Insert After Selected Node.
371+ {XNode := VST.InsertNode(VST.FocusedNode,amInsertAfter);}
372+ VST.Refresh;
373+ end;
374+end;
375+```
376+
377+- Ustaw wysokość węzła
378+
379+``` pascal
380+procedure TForm1.Button14Click(Sender: TObject);
381+begin
382+ if Assigned(VST.FocusedNode) then
383+ VST.NodeHeight[VST.FocusedNode] := 32;
384+end;
385+```
386+
387+- Zapisz i załaduj
388+
389+Proste drzewo (bez kolumn) można zapisać i załadować jako:
390+
391+``` pascal
392+VST.SaveToFile('filename.dat');
393+VST.LoadFromFile('filename.dat');
394+```
395+
396+Aby zapisać i załadować powyższy przykład, umieść 2 przyciski w formularzu, zmień nazwę Caption na „Save” i „Load”. Wybierz VST, w Inspektorze obiektów -\> TreeOptions -\> StringOptions upewnij się, że parametr toSaveCaptions ma wartość True. Przejdź do zakładki Zdarzenia Inspektora obiektów. Przewiń w dół do OnLoadNode, kliknij dwukrotnie, a następnie wklej kod:
397+
398+``` pascal
399+procedure TForm1.VSTLoadNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
400+ Stream: TStream);
401+var
402+ Data: PTreeData;
403+ Len: Integer;
404+begin
405+ Data := VST.GetNodeData(Node);
406+ Stream.read(Len, SizeOf(Len));
407+ SetLength(Data^.Column0, Len);
408+ Stream.read(PChar(Data^.Column0)^, Len);
409+
410+ Stream.read(Len, SizeOf(Len));
411+ SetLength(Data^.Column1, Len);
412+ Stream.read(PChar(Data^.Column1)^, Len);
413+
414+ Stream.read(Len, SizeOf(Len));
415+ SetLength(Data^.Column2, Len);
416+ Stream.read(PChar(Data^.Column2)^, Len);
417+end;
418+```
419+
420+Ponownie na karcie Zdarzenia Inspektora obiektów - przewiń w dół do OnSaveNode, kliknij dwukrotnie, i wklej kod:
421+
422+``` pascal
423+procedure TForm1.VSTSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
424+ Stream: TStream);
425+var
426+ Data: PTreeData;
427+ Len: Integer;
428+begin
429+ Data := VST.GetNodeData(Node);
430+ Len := Length(Data^.Column0);
431+ Stream.write(Len, SizeOf(Len));
432+ Stream.write(PChar(Data^.Column0)^, Len);
433+
434+ Len := Length(Data^.Column1);
435+ Stream.write(Len, SizeOf(Len));
436+ Stream.write(PChar(Data^.Column1)^, Len);
437+
438+ Len := Length(Data^.Column2);
439+ Stream.write(Len, SizeOf(Len));
440+ Stream.write(PChar(Data^.Column2)^, Len);
441+end;
442+```
443+
444+W formularzu kliknij dwukrotnie przycisk "Save" i wklej kod:
445+
446+``` pascal
447+procedure TForm1.Button10Click(Sender: TObject);
448+begin
449+ VST.SaveToFile('C:\vst.dat');
450+end;
451+```
452+
453+W formularzu kliknij dwukrotnie przycisk "Load" i wklej kod:
454+
455+``` pascal
456+procedure TForm1.Button11Click(Sender: TObject);
457+begin
458+ VST.LoadFromFile('C:\vst.dat');
459+end;
460+```
461+
462+Teraz przetestuj zapisywanie i ładowanie drzewa.
463+
464+- Problem z przewijaniem
465+
466+Nagłówek widoku drzewa znika całkowicie lub częściowo podczas przewijania. Nie mogłem znaleźć na to dobrego rozwiązania. Jednym ze sposobów rozwiązania tego problemu jest ustawienie wysokości nagłówka na 0, a następnie użycie ogólnej etykiety dla kolumn. Jest to dobre, gdy jest kilka kolumn i wszystkie są widoczne bez przewijania w poziomie. Lub wysokość nagłówka można ustawić na wyższą wartość, np. 25 lub 30. VST.Refresh można dodać do zdarzenia OnScroll.\
467+W wersji 5.5.3.1 nie zaobserowałem tego efektu, więc prawdopodobnie został on naprawiony.
468+
469+- Zmiana rozmiaru kolumny
470+
471+Nie można zmienić rozmiaru kolumny, przeciągając myszą nagłówek VST. Może to być błąd nagłówka lub coś przeoczyłem. Jeśli dotyczy nagłówka, prawdopodobnie zostanie naprawiony w następnej wersji Lazarus. Zobacz ten link: <http://bugs.freepascal.org/view.php?id=11209>\
472+W wersji 5.5.3.1 nie zaobserowałem tego efektu, więc prawdopodobnie został on naprawiony.
473+
474+**Poniższy kod może być przydatny dla tych, którzy chcieliby go sprawdzić lub wykorzystać w jakimś innym celu.**
475+
476+W każdym razie można zmienić rozmiar kolumny z kodu. Po naciśnięciu prawego przycisku myszy i przesunięciu kółka myszy w górę szerokość wybranej kolumny zwiększa się, a następnie naciśnięcie prawego przycisku myszy i przesunięcie kółka myszy w dół, aby zmniejszyć szerokość wybranej kolumny. Aby to zrobić:
477+
478+1\. Dodaj zmienną w edytorze źródłowym o nazwie CurCol: Integer; Wygląda to tak:
479+
480+``` pascal
481+var
482+ Form1: TForm1;
483+ CurCol: Integer; // <- Add this line only.
484+
485+implementation
486+
487+{ TForm1 }
488+```
489+
490+2\. W Projektancie formularzy kliknij dwukrotnie formularz, aby wygenerować zdarzenie OnCreate. Wewnątrz procedury OnCreate wpisz Form1.OnMouseWheelUp:= i naciśnij Ctrl+Shift+C, spowoduje to uzupełnienie kodu i utworzenie szkieletu zdarzenia MouseWheelUp. Wróć teraz do procedury TForm1.FormCreate(Sender: TObject); i dodaj kolejne wydarzenie dla MouseWheelDown. Wpisz Form1.OnMouseWheelDown:= i naciśnij Ctrl+Shift+C, aby wygenerować zdarzenie MouseWheelDown. Procedura FormCreate wygląda teraz następująco:
491+
492+``` pascal
493+procedure TForm1.FormCreate(Sender: TObject);
494+begin
495+ Form1.OnMouseWheelUp := @Form1MouseWheelUp;
496+ Form1.OnMouseWheelDown := @Form1MouseWheelDown;
497+end;
498+```
499+
500+3\. Wypełnij procedurę TForm1.Form1MouseWheelUp w ten sposób:
501+
502+``` pascal
503+procedure TForm1.Form1MouseWheelUp(Sender: TObject; Shift: TShiftState;
504+ MousePos: TPoint; var Handled: Boolean);
505+begin
506+ if VST.Focused and (ssRight in Shift) then
507+ VST.Header.Columns[CurCol].Width := VST.Header.Columns[CurCol].Width + 10;
508+end;
509+```
510+
511+4\. Wypełnij procedurę TForm1.Form1MouseWheelDown jak poniżej:
512+
513+``` pascal
514+procedure TForm1.Form1MouseWheelDown(Sender: TObject; Shift: TShiftState;
515+ MousePos: TPoint; var Handled: Boolean);
516+begin
517+ if VST.Focused and (ssRight in Shift) then
518+ VST.Header.Columns[CurCol].Width := VST.Header.Columns[CurCol].Width - 10;
519+end;
520+```
521+
522+5\. Przejdź do Projektanta formularzy (naciśnij F12), wybierz VST, na karcie Zdarzenia Inspektora obiektów przewiń do OnFocusChanged, kliknij dwukrotnie i wklej:
523+
524+``` pascal
525+procedure TForm1.VSTFocusChanged(Sender: TBaseVirtualTree;
526+ Node: PVirtualNode; Column: TColumnIndex);
527+begin
528+ CurCol := Column;
529+end;
530+```
531+
532+Po uruchomieniu programu kliknij kolumnę, a następnie przytrzymaj prawy przycisk myszy i przesuń kółko w górę, aby zwiększyć szerokość, lub kółko w dół, aby ją zmniejszyć. W razie potrzeby możesz dostosować powyższe procedury. Możesz też dodać zdarzenie klawiatury z czymś takim jak "if (key=187) i (ssShift in Shift) then", aby reagować na naciśnięcie klawiszy Shift + "+".
533+
534+# Pole wyboru (CheckBox)
535+
536+On Form Designer select VST. Go to: W formularzu wybierz VST i wykonaj:
537+
538+1. Inspektor obiektów -\> Właściwości -\> CheckImageKind i wybierz ckDarkCheck.
539+2. Inspektor obiektów -\> Właściwości -\> TreeOptions -\> MiscOptions -\> toCheckSupport i ustaw na True.
540+
541+Teraz przejdź do zakładki Zdarzenia.
542+
543+- Przewiń do OnInitNode. Kliknij dwukrotnie i wklej następujący kod:
544+
545+``` pascal
546+procedure TForm1.VSTInitNode(Sender: TBaseVirtualTree; ParentNode,
547+ Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
548+var
549+ Level: Integer;
550+begin
551+ Level := VST.GetNodeLevel(Node);
552+ if Level = 0 then
553+ Node^.CheckType := ctCheckBox;
554+
555+ if Level = 2 then
556+ Node^.CheckType := ctRadioButton;
557+
558+ if Level = 1 then
559+ begin
560+ Node^.CheckType := ctTriStateCheckBox;
561+ Node^.CheckState := csCheckedNormal;
562+ end;
563+
564+ if Level = 3 then
565+ Node^.CheckType := ctButton;
566+end;
567+```
568+
569+Uruchom program, dodaj węzeł i dziecko, a następnie dodaj dziecko do dziecka, i sprawdź, czy możesz poprawnie zaznaczyć i odznaczyć pola wyboru. Jeśli nie, zamknij program. Przejdź do zakładki Zdarzenia Inspektora obiektów.
570+
571+- Przewiń do OnChecked, kliknij dwukrotnie i wklej:
572+
573+``` pascal
574+procedure TForm1.VSTChecked(Sender: TBaseVirtualTree; Node: PVirtualNode);
575+begin
576+ VST.Refresh;
577+end;
578+```
579+
580+- Przewiń do opcji OnChecking, kliknij dwukrotnie i wklej:
581+
582+``` pascal
583+procedure TForm1.VSTChecking(Sender: TBaseVirtualTree; Node: PVirtualNode;
584+ var NewState: TCheckState; var Allowed: Boolean);
585+begin
586+ VST.Refresh;
587+end;
588+```
589+
590+Mam nadzieję, że teraz jest ok. Aby określić stan pola wyboru, użyj:
591+
592+``` pascal
593+if XNode.CheckState = csCheckedNormal then
594+ShowMessage('Checked.');
595+```
596+
597+Inne stany to:
598+
599+``` pascal
600+csUncheckedNormal = niezaznaczone i nie wciśnięte
601+csUncheckedPressed = niezaznaczone i wciśnięte
602+csCheckedNormal = zaznaczone i nie wciśnięte
603+csCheckedPressed = zaznaczone i wciśnięte
604+csMixedNormal = 3-stanowe pole wyboru i nie wciśnięte
605+csMixedPressed = 3-stanowe pole wyboru i wciśnięte
606+```
607+
608+Inne typy to:
609+
610+``` pascal
611+ctNone
612+ctTriStateCheckBox
613+ctCheckBox
614+ctRadioButton
615+ctButton
616+```
617+
618+- Aby przechwycić przycisk pola wyboru (ctButton) Click
619+
620+Przejdź do zakładki Zdarzenia Inspektora obiektów. Przewiń do OnChecked, kliknij dwukrotnie i wklej kod:
621+
622+``` pascal
623+procedure TForm1.VSTChecked(Sender: TBaseVirtualTree; Node: PVirtualNode);
624+begin
625+ if Node^.CheckType = ctButton then
626+ ShowMessage('Ok.');
627+ VST.Refresh;
628+end;
629+```
630+
631+Koniec pola wyboru.\
632+
633+# Obrazy
634+
635+Aby wyświetlić obrazy w węzłach VST, należy utworzyć listę obrazów.
636+
637+- Przejdź do palety komponentów -\> Common Controls. Wybierz i upuść składnik TImageList na formularzu. Kliknij prawym przyciskiem myszy ikonę komponentu i wybierz ImageList Editor. Kliknij przycisk Dodaj i wybierz kilka zdjęć (na razie co najmniej 3), a następnie kliknij przycisk wyboru, aby zaakceptować i zamknąć Edytor ImageList. Nawiasem mówiąc, istnieje kilka fajnych zdjęć, które można pobrać ze strony <http://www.famfamfam.com/lab/icons/silk/>
638+
639+- Teraz w Projektancie formularzy wybierz VST, a na karcie Właściwości Inspektora obiektów przewiń do Images i wybierz ImageList1
640+
641+- Na karcie Zdarzenia Inspektora obiektów przewiń do OnGetImageIndex, kliknij dwukrotnie i wklej kod:
642+
643+``` pascal
644+procedure TForm1.VSTGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode;
645+ Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean;
646+ var ImageIndex: Integer);
647+begin
648+ if Kind in [ikNormal , ikSelected] then // Zarówno wybrane jak i nie
649+ begin
650+ if Column = 0 then // jeśli to pierwsza kolumna
651+ ImageIndex := 0; // pierwszy obraz z listy ImageList1
652+
653+ if Column = 1 then // jeśli to druga kolumna
654+ ImageIndex := 1; // drugi obraz z listy ImageList1
655+
656+ if Sender.FocusedNode = Node then // Pokaż tylko, jeśli wybrany
657+ if Column = 2 then // jeśli to trzecia kolumna
658+ ImageIndex := 2; // trzeci obraz z listy ImageList1
659+ end;
660+ {Sender.NodeHeight[node] := 40; //Jeśli obraz jest duży}
661+end;
662+```
663+
664+# Kolor czcionki
665+
666+W Projektancie formularzy wybierz VST, a na karcie Zdarzenia Inspektora obiektów przewiń do OnPaintText, kliknij dwukrotnie i wklej kod:
667+
668+``` pascal
669+procedure TForm1.VSTPaintText(Sender: TBaseVirtualTree;
670+ const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
671+ TextType: TVSTTextType);
672+var
673+ Data: PTreeData;
674+begin
675+ Data := VST.GetNodeData(Node);
676+
677+ if Data^.Column0 = 'niebo' then
678+ TargetCanvas.Font.Color := clBlue;
679+
680+ if Column = 1 then
681+ begin
682+ TargetCanvas.Font.Color := clRed;
683+ TargetCanvas.Font.Style := Font.Style + [fsItalic];
684+ end;
685+
686+ if Column = 2 then
687+ begin
688+// ImageList1.Draw(Form1.Canvas, -1, -1, 2); {draw top left of form, 3rd image of ImageList1??}
689+ TargetCanvas.Font.Size := 9;
690+ TargetCanvas.Font.Color := clHighlightText;
691+ end;
692+end;
693+```
694+
695+Teraz uruchom program. Dodaj jakieś węzły. Zobaczysz, że tekst w drugiej kolumnie jest czerwony. Spróbuj teraz zmienić tekst jakiegoś węzła w pierwszej kolumnie (klawisz F2) wpisując słowo "niebo". Po zatwierdzeniu zmiany tekst powinien stać się niebieski.
696+
697+# Dodanie ComboBox
698+
699+- Myślę, że masz otwarty projekt w Lazarus IDE z VST i możesz edytować węzły. Jeśli nie, zobacz „Podstawowy widok drzewa z 3 kolumnami” powyżej i przynajmniej wykonaj kroki od 1 do 21.
700+
701+- Poniżej znajduje się treść pliku modułu o nazwie combo. Skopiuj ten moduł i zapisz jako combo.pas w katalogu projektu. Pod klauzulą **uses** programu dodaj nazwę mocułu combo. Może to wyglądać następująco:
702+
703+``` pascal
704+uses
705+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
706+ VirtualStringTree, VirtualTrees, combo;
707+```
708+
709+- Moduł combo.pas
710+
711+``` pascal
712+unit combo;
713+
714+{$mode delphi}
715+
716+interface
717+
718+uses
719+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
720+ VirtualStringTree, VirtualTrees, messages, windows, StdCtrls;
721+
722+type
723+ TStringEditLink = class(TInterfacedObject, IVTEditLink)
724+ private
725+ FEdit: TWinControl;
726+ FTree: TVirtualStringTree;
727+ FNode: PVirtualNode;
728+ FColumn: Integer;
729+ protected
730+ procedure EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
731+ public
732+ destructor Destroy; override;
733+ function BeginEdit: Boolean; stdcall;
734+ function CancelEdit: Boolean; stdcall;
735+ function EndEdit: Boolean; stdcall;
736+ function GetBounds: TRect; stdcall;
737+ function PrepareEdit(Tree: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex): Boolean; stdcall;
738+ procedure ProcessMessage(var Message: TMessage); stdcall;
739+ procedure SetBounds(R: TRect); stdcall;
740+ end;
741+
742+implementation
743+
744+destructor TStringEditLink.Destroy;
745+begin
746+ FEdit.Free;
747+ inherited;
748+end;
749+
750+procedure TStringEditLink.EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
751+begin
752+ case Key of
753+ VK_ESCAPE:
754+ begin
755+ FTree.CancelEditNode;
756+ Key := 0;
757+ FTree.setfocus;
758+ end;
759+ VK_RETURN:
760+ begin
761+ PostMessage(FTree.Handle, WM_KEYDOWN, VK_DOWN, 0);
762+ Key := 0;
763+ FTree.EndEditNode;
764+ FTree.setfocus;
765+ end;
766+ end; //case
767+end;
768+
769+function TStringEditLink.BeginEdit: Boolean;
770+begin
771+ Result := True;
772+ //FEdit.Height := (FTree.DefaultNodeHeight - 1); //Needed for editbox. Not combo
773+ FEdit.Show;
774+ TComboBox(FEdit).DroppedDown := True;
775+ FEdit.SetFocus;
776+end;
777+
778+function TStringEditLink.CancelEdit: Boolean;
779+begin
780+ Result := True;
781+ FEdit.Hide;
782+end;
783+
784+function TStringEditLink.EndEdit: Boolean;
785+var
786+ s: String;
787+begin
788+ Result := True;
789+ s := TComboBox(FEdit).Text;
790+ FTree.Text[FNode, FColumn] := s;
791+
792+ FTree.InvalidateNode(FNode);
793+ FEdit.Hide;
794+ FTree.SetFocus;
795+end;
796+
797+function TStringEditLink.GetBounds: TRect;
798+begin
799+ Result := FEdit.BoundsRect;
800+end;
801+
802+function TStringEditLink.PrepareEdit(Tree: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex): Boolean;
803+begin
804+ Result := True;
805+ FTree := Tree as TVirtualStringTree;
806+ FNode := Node;
807+ FColumn := Column;
808+
809+ FEdit.Free;
810+ FEdit := nil;
811+
812+ FEdit := TComboBox.Create(nil);
813+ with FEdit as TComboBox do
814+ begin
815+ Visible := False;
816+ Parent := Tree;
817+ Items.Add('Google');
818+ Items.Add('Yahoo');
819+ Items.Add('Altavista');
820+ OnKeyDown := EditKeyDown;
821+ end;
822+end;
823+
824+procedure TStringEditLink.ProcessMessage(var Message: TMessage);
825+begin
826+ FEdit.WindowProc(Message);
827+end;
828+
829+procedure TStringEditLink.SetBounds(R: TRect);
830+var
831+ Dummy: Integer;
832+begin
833+ FTree.Header.Columns.GetColumnBounds(FColumn, Dummy, R.Right);
834+ FEdit.BoundsRect := R;
835+end;
836+
837+end.
838+```
839+
840+- Po zapisaniu pliku, w Projektancie formularzy wybierz VST, a we właściwościach Inspektora obiektów przewiń do TreeOptions -\> MiscOptions, ustaw wartość na toEditable na True. Następnie przejdź do TreeOptions -\> SelectionOptions, ustaw toExtendedFocus na True.
841+
842+- Przejdź do zakładki Zdarzenia Inspektora obiektów. Przewiń do OnCreateEditor, kliknij dwukrotnie i wklej kod:
843+
844+``` pascal
845+procedure TForm1.VSTCreateEditor(Sender: TBaseVirtualTree;
846+ Node: PVirtualNode; Column: TColumnIndex; out EditLink: IVTEditLink);
847+begin
848+ EditLink := TStringEditLink.Create;
849+end;
850+```
851+
852+- W zakładce Zdarzenia Inspektora obiektów przewiń do OnNewText, kliknij dwukrotnie i wklej kod:
853+
854+``` pascal
855+procedure TForm1.VSTNewText(Sender: TBaseVirtualTree; Node: PVirtualNode;
856+ Column: TColumnIndex; NewText: WideString);
857+var
858+ Data: PTreeData;
859+begin
860+ Data := VST.GetNodeData(Node);
861+ case Column of
862+ 0: Data^.Column0 := NewText;
863+ 1: Data^.Column1 := NewText;
864+ 2: Data^.Column2 := NewText;
865+ end;
866+end;
867+```
868+
869+Uruchom program, wybierz węzeł i naciśnij F2, aby uzyskać ComboBox. Po naciśnięciu wprowadź nową wartość, a powinna ona pojawić się w węźle.
870+
871+# Jeśli nie można zobaczyć edycji komórki
872+
873+Otwórz plik modułu VirtualStringTree.pas (jeśli nadal pracujesz nad powyższym przykładowym projektem, kliknij prawym przyciskiem myszy VirtualStringTree w obszarze słowa kluczowego **uses** i wybierz Znajdź deklarację. Spowoduje to otwarcie pliku na następnej karcie. Przejdź do zakładki tego pliku). Przejdź do „funkcji TStringEditLink.BeginEdit: Boolean; stdcall;”. To wygląda jak:
874+
875+``` pascal
876+function TStringEditLink.BeginEdit: Boolean; stdcall;
877+
878+// Notifies the edit link that editing can start now. Descentants may cancel node edit
879+// by returning False.
880+
881+begin
882+ Result := not FStopping;
883+ if Result then
884+ begin
885+ FEdit.Show;
886+ FEdit.SelectAll;
887+ FEdit.SetFocus;
888+ end;
889+end;
890+```
891+
892+Teraz dodaj "FEdit.Height:=18;". Powinno to wyglądać następująco:
893+
894+``` pascal
895+function TStringEditLink.BeginEdit: Boolean; stdcall;
896+
897+// Notifies the edit link that editing can start now. Descentants may cancel node edit
898+// by returning False.
899+
900+begin
901+ Result := not FStopping;
902+ if Result then
903+ begin
904+ FEdit.Show;
905+ FEdit.SelectAll;
906+ FEdit.SetFocus;
907+ FEdit.Height := 18; // <--- Added this line.
908+ end;
909+end;
910+```
911+
912+Zapisz plik (naciśnij Ctrl + S). Jeśli korzystasz z przykładowego projektu, zamknij go (Projekt -\> Zamknij projekt). Kliknij Narzędzia -\> Konfiguruj "Build Lazarusa" ... W Profilu budowania wybierz Czyść + Buduj wszystko, a następnie kliknij przycisk Buduj. Po kompilacji należy ponownie uruchomić Lazarusa. Teraz otwórz przykładowy projekt i spróbuj edytować węzeł na VST. Tym razem powinno być dobrze.
913+
914+# Linki zewnętrzne
915+
916+- [www.soft-gems.net](http://www.soft-gems.net) (obecnie nie mogę znaleźć tutaj tej dokumentacji)
917+- [Virtual Treeview instruktaże/dokumenty](https://documentation.help/VirtualTreeview/) aktualna lokalizacja ww. dokumentacji
918+- [Virtual Treeview dokumentacja w pliku pdf](https://documentation.help/VirtualTreeview/documentation.pdf)
919+- [Programando en Pascal](http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_Pascal) - Hiszpański samouczek poświęcony FPC/Lazarus, prowadzony w Wikibooks.
920+- [Kurs Object Pascal](https://pl.wikibooks.org/wiki/Object_Pascal) - Polski samouczek poświęcony FPC, prowadzony w Wikibooks.
921+
922+---
923+*From the Free Pascal wiki, page "VirtualTreeview Example for Lazarus/pl", as it stood on 2020-06-07 after a change by Slawek, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history