[Lazarus] Rozważania o TreeView
: sobota 11 maja 2019, 02:53
Potyczki z TreeView
Ostatnio gwałtownie tworzyłem nowe oprogramowanie, gdzie
komponent TTreeView był bardzo istotnym elementem tego programu.
Reminiscencje z terenu walki z relaksacyjną muzą w tlehttps://www.youtube.com/watch?v=QCPbMnwGhbU
Lazarus - zintegrowane środowisko programistyczne (IDE) oparte na kompilatorze Free Pascal. Jest to wzorowane na Delphi wizualne środowisko programistyczne oraz biblioteka Lazarus Component Library (LCL), która jest odpowiednikiem VCL. Program napisany w środowisku Lazarus można bez żadnych zmian skompilować dla dowolnego obsługiwanego procesora, systemu operacyjnego i interfejsu okienek. Lazarus (w większości przypadków) jest zgodny z Delphi. Jest brakującą częścią układanki, która pozwala na rozwijanie programów, podobnie jak w Delphi, na wszystkich platformach obsługiwanych przez FPC. W odróżnieniu od Javy, która stara się, aby raz napisana aplikacja działała wszędzie (write once run anywhere), Lazarus i Free Pascal starają się, aby raz napisana aplikacja kompilowała się wszędzie (write once compile anywhere). Ponieważ dostępny jest dokładnie taki sam kompilator, w większości przypadków nie trzeba wprowadzać żadnych zmian, aby otrzymać taki sam produkt dla różnych platform.
Lazarus zawiera wiele komponentów przydatnych do szybkiego tworzenia aplikacji. Jednym z takich komponentów jest TTreeView → komponent do „obróbki na ekranie” wszelkich zagadnień o strukturze drzewiastej. Sam komponent wygląda jak okienko do przeglądania tekstów.
Budowanie drzewa
Typowym problemem w posługiwaniu się komponentem TreeView jest zasilenie go w dane. Poniższy przykład pokazuje sposób zainicjowania „płaskiej” (jednowarstwowej) struktury danych. W programie, jest utworzona operacja związana z utworzeniem formy programu, w której jest wypełniona wstępnie jakaś struktura drzewa.
W powyższym programie, instrukcja TreeView.Items.Clear; ma za zadanie uwalić dotychczasową istniejącą strukturę (w tym programie to wywołanie nic nie wnosi, gdyż na dzień dobry struktura nie zawiera żadnych danych, jednak w znakomitej większości przypadków istnieje potrzeba „uwalenia” dotychczasowej struktury danych). Kolejne wywołanie RootNode:=TreeView.Items.AddFirst(nil, '<root>'); powoduje utworzenie pierwszego elementu będącego „korzeniem” struktury drzewiastej. Funkcja ta zwraca wskaźnik do utworzonego elementu. W każdym kolejnym wywołaniu TreeView.Items.AddChild(RootNode,'Element 1'); dodawane jest „dziecko” do utworzonego „rodzica” (identyfikowanego zachowanym wskaźnikiem RootNode). Powyższy program daje następujący efekt:jak się kliknie na „+”, to się rozwinie struktura.Efekt rozwiniętej struktury daje się uzyskać programowo na „dzień dobry”. W tym celu należy powyższy ciąg instrukcji uzupełnić instrukcją RootNode.Expanded:=True ;, co oznacza, że wszystkie elementy „dzieci” przynależne do określonego poziomu drzewa będą na dzień dobry rozwinięte.
Kod istotnego fragmentu programu wygląda następująco:Często zachodzi potrzeba utworzenia wstępnej struktury drzewiastej jako bardziej złożonej. Rozpatrzmy taki przykład:Uruchomienie powyższego programu daje następujący efekt na ekranie:Rozwijając wszystkie powyższe elementy powstaje:Łatwo skojarzyć powyższą wyświetloną strukturę z zapisem instrukcji w procedurze inicjującej. Tworzenie struktur drzewiastych może być różnie zagłębione. Kolejny przykład inicjacji:Powyższy program w wyniku uruchomienia daje następujące wyniki:Rozwijając kliknięciem myszki określony element powstaje w kolejnych fazach:Jak widać, zasilanie odpowiednimi danymi struktury TTreeView nie jest sprawą skomplikowaną, jak już się wie jak to zrobić. Do tej pory nie miałem takiej potrzeby, więc nie wgryzałem się w problematykę, jednak ostatnio gwałtownie zaistniała taka potrzeba, więc musiałem pokonać mnóstwo problemów, by uzyskać oczekiwany efekt. Zajęło mi to mnóstwo czasu, więc gdyby jakaś dusza potrzebowała, to może już skorzystać... z przetartych ścieżek.
Ostatnio gwałtownie tworzyłem nowe oprogramowanie, gdzie
komponent TTreeView był bardzo istotnym elementem tego programu.
Reminiscencje z terenu walki z relaksacyjną muzą w tlehttps://www.youtube.com/watch?v=QCPbMnwGhbU
Lazarus - zintegrowane środowisko programistyczne (IDE) oparte na kompilatorze Free Pascal. Jest to wzorowane na Delphi wizualne środowisko programistyczne oraz biblioteka Lazarus Component Library (LCL), która jest odpowiednikiem VCL. Program napisany w środowisku Lazarus można bez żadnych zmian skompilować dla dowolnego obsługiwanego procesora, systemu operacyjnego i interfejsu okienek. Lazarus (w większości przypadków) jest zgodny z Delphi. Jest brakującą częścią układanki, która pozwala na rozwijanie programów, podobnie jak w Delphi, na wszystkich platformach obsługiwanych przez FPC. W odróżnieniu od Javy, która stara się, aby raz napisana aplikacja działała wszędzie (write once run anywhere), Lazarus i Free Pascal starają się, aby raz napisana aplikacja kompilowała się wszędzie (write once compile anywhere). Ponieważ dostępny jest dokładnie taki sam kompilator, w większości przypadków nie trzeba wprowadzać żadnych zmian, aby otrzymać taki sam produkt dla różnych platform.
Lazarus zawiera wiele komponentów przydatnych do szybkiego tworzenia aplikacji. Jednym z takich komponentów jest TTreeView → komponent do „obróbki na ekranie” wszelkich zagadnień o strukturze drzewiastej. Sam komponent wygląda jak okienko do przeglądania tekstów.
Budowanie drzewa
Typowym problemem w posługiwaniu się komponentem TreeView jest zasilenie go w dane. Poniższy przykład pokazuje sposób zainicjowania „płaskiej” (jednowarstwowej) struktury danych. W programie, jest utworzona operacja związana z utworzeniem formy programu, w której jest wypełniona wstępnie jakaś struktura drzewa.
Kod: Zaznacz cały
unit treev1unit ;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls;
type
{ TTreeViewExample1Form }
TTreeViewExample1Form = class(TForm)
TreeView: TTreeView;
procedure FormCreate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
TreeViewExample1Form: TTreeViewExample1Form ;
implementation
{$R *.lfm}
{ TTreeViewExample1Form }
procedure TTreeViewExample1Form.FormCreate(Sender: TObject);
var
RootNode : TTreeNode ;
begin
TreeView . Items . Clear ;
RootNode := TreeView . Items . AddFirst ( nil , '<root>' ) ;
TreeView . Items . AddChild ( RootNode , 'Element 1' );
TreeView . Items . AddChild ( RootNode , 'Element 2' );
TreeView . Items . AddChild ( RootNode , 'Element 3' );
TreeView . Items . AddChild ( RootNode , 'Element 4' );
end;
end.Kod istotnego fragmentu programu wygląda następująco:
Kod: Zaznacz cały
procedure TTreeViewExample1Form.FormCreate(Sender: TObject);
var
RootNode : TTreeNode ;
begin
TreeView . Items . Clear ;
RootNode := TreeView . Items . AddFirst ( nil , '<root>' ) ;
TreeView . Items . AddChild ( RootNode , 'Element 1' );
TreeView . Items . AddChild ( RootNode , 'Element 2' );
TreeView . Items . AddChild ( RootNode , 'Element 3' );
TreeView . Items . AddChild ( RootNode , 'Element 4' );
RootNode . Expanded := True ;
end; Kod: Zaznacz cały
procedure TTreeViewExample1Form.FormCreate(Sender: TObject);
var
RootNode : TTreeNode ;
ElementNode : TTreeNode ;
begin
TreeView . Items . Clear ;
RootNode := TreeView . Items . AddFirst ( nil , '<root>' ) ;
ElementNode := TreeView . Items . AddChild ( RootNode , 'Element 1' );
TreeView . Items . AddChild ( ElementNode , 'Element 1 ---> 1' );
TreeView . Items . AddChild ( ElementNode , 'Element 1 ---> 2' );
TreeView . Items . AddChild ( ElementNode , 'Element 1 ---> 3' );
TreeView . Items . AddChild ( ElementNode , 'Element 1 ---> 4' );
ElementNode . Expanded := True ;
ElementNode := TreeView . Items . AddChild ( RootNode , 'Element 2' );
TreeView . Items . AddChild ( ElementNode , 'Element 2 ---> 1' );
TreeView . Items . AddChild ( ElementNode , 'Element 2 ---> 2' );
TreeView . Items . AddChild ( ElementNode , 'Element 2 ---> 3' );
TreeView . Items . AddChild ( ElementNode , 'Element 2 ---> 4' );
ElementNode := TreeView . Items . AddChild ( RootNode , 'Element 3' );
TreeView . Items . AddChild ( ElementNode , 'Element 3 ---> 1' );
TreeView . Items . AddChild ( ElementNode , 'Element 3 ---> 2' );
TreeView . Items . AddChild ( ElementNode , 'Element 3 ---> 3' );
TreeView . Items . AddChild ( ElementNode , 'Element 3 ---> 4' );
ElementNode := TreeView . Items . AddChild ( RootNode , 'Element 4' );
RootNode . Expanded := True ;
end;Kod: Zaznacz cały
procedure TTreeViewExample1Form.FormCreate(Sender: TObject);
var
RootNode : TTreeNode ;
ElementNode : TTreeNode ;
ElementNode1 : TTreeNode ;
ElementNode2 : TTreeNode ;
begin
TreeView . Items . Clear ;
RootNode := TreeView . Items . AddFirst ( nil , '<root>' ) ;
ElementNode := TreeView . Items . AddChild ( RootNode , 'Element 1' );
ElementNode1 := TreeView . Items . AddChild ( ElementNode , 'El 1 -> 1' );
ElementNode2 := TreeView . Items . AddChild ( ElementNode1 , 'El 1 -> 1 -> 1' );
TreeView . Items . AddChild ( ElementNode2 , 'El 1 -> 1 -> -> 1' );
TreeView . Items . AddChild ( ElementNode2 , 'El 1 -> 1 -> -> 2' );
TreeView . Items . AddChild ( ElementNode2 , 'El 1 -> 1 -> -> 3' );
TreeView . Items . AddChild ( ElementNode2 , 'El 1 -> 1 -> -> 4' );
TreeView . Items . AddChild ( ElementNode1 , 'El 1 -> 1 -> 2' );
TreeView . Items . AddChild ( ElementNode1 , 'El 1 -> 1 -> 3' );
TreeView . Items . AddChild ( ElementNode1 , 'El 1 -> 1 -> 4' );
TreeView . Items . AddChild ( ElementNode , 'El 1 -> 2' );
TreeView . Items . AddChild ( ElementNode , 'El 1 -> 3' );
TreeView . Items . AddChild ( ElementNode , 'El 1 -> 4' );
ElementNode := TreeView . Items . AddChild ( RootNode , 'Element 2' );
TreeView . Items . AddChild ( ElementNode , 'El 2 ---> 1' );
TreeView . Items . AddChild ( ElementNode , 'El 2 ---> 2' );
TreeView . Items . AddChild ( ElementNode , 'El 2 ---> 3' );
TreeView . Items . AddChild ( ElementNode , 'El 2 ---> 4' );
ElementNode := TreeView . Items . AddChild ( RootNode , 'Element 3' );
TreeView . Items . AddChild ( ElementNode , 'El 3 ---> 1' );
TreeView . Items . AddChild ( ElementNode , 'El 3 ---> 2' );
TreeView . Items . AddChild ( ElementNode , 'El 3 ---> 3' );
TreeView . Items . AddChild ( ElementNode , 'El 3 ---> 4' );
ElementNode := TreeView . Items . AddChild ( RootNode , 'Element 4' );
RootNode . Expanded := True ;
end;