CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - TTreeView - jak to ogarnąć

TTreeView - jak to ogarnąć

dział ogólny

TTreeView - jak to ogarnąć

Nowy postprzez Corvis » czwartek, 27 stycznia 2011, 15:34

Witam,

Mam problem, że muszę tworzyć drzewo zestawu produktów w komponencie TTreeView,

Cały mój problem polega na tym, że drzewa są różne i mają różne rozgałęzienia raz może być takie:

Z1
->G1
->G2
->G3

Innym razem tak:

Z1
->G1
-------> G1.1
-------> G1.2
->G2
-------> G2.1
--------------> G2.1.1
->G3

Ma ktoś może jakiś pomysł na uniwersalny kod ????

Dodane:

http://www.ww.functionx.com/bcb/controls/treeview.htm

Znalazłem jakiś kod jak to robić pojdyńczo ale na tą chwile czarna dziura jak to zrobić uniwersalnie.


Dodane2:

Uzupełniam informacje:

Dane do drzewa biorę z bazy danych, mogę je odczytywać gdzie chce np do TStringListy, vectora itp.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: TTreeView - jak to ogarnąć

Nowy postprzez mckri » piątek, 28 stycznia 2011, 08:31

Nie wiadomo jaki jest Twój stan wiedzy na temat 'drzewka'. Nie wiem o co Ci chodzi z tym robieniem 'uniwersalnym'.
Podany link nie działa!

Pomoc builder'a nie gryzie:
The following example demonstrates how to add nodes and child nodes to a TTreeView control.
KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)

{
  TTreeNode *Node1;
  TreeView1->Items->Clear(); // remove any existing nodes
  // Add a root node
  TreeView1->Items->Add(NULL, "RootNode1");

  /* Set MyTreeNode to first node in tree view and add a child node to it */
  Node1 = TreeView1->Items->Item[0];
  TreeView1->Items->AddChild(Node1,"ChildNode1");

  // Add another root node
  TreeView1->Items->Add(Node1, "RootNode2");

  /* Reset Node1 to RootNode2 and add a child node to it */
  Node1 = TreeView1->Items->Item[2];

  TreeView1->Items->AddChild(Node1,"ChildNode2");

  /* Reset Node1 to ChildNode2 and add a child node to it */
  Node1 = TreeView1->Items->Item[3];
  TreeView1->Items->AddChild(Node1,"ChildNode2a");

   /* Add another child to ChildNode2 following ChildNode2a */
  TreeView1->Items->AddChild(Node1,"ChildNode2b");

  // add another root node
  TreeView1->Items->Add(TreeView1->Items->Item[0], "RootTreeNode3");
}
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaOpera

Re: TTreeView - jak to ogarnąć

Nowy postprzez Corvis » piątek, 28 stycznia 2011, 09:50

Link działa - przynajmniej teraz i u mnie :-) Tam jest podobny przykład do twojego z helpa - który przeglądałem.

KOD cpp:     UKRYJ  
    TTreeNode *Glowny;
    treeviewListaIndexow->Items->Clear();
    treeviewListaIndexow->Items->Add(NULL,DtmIms->cdsTechMatIndeksy->FieldByName("indeks")->AsString);
    Glowny = treeviewListaIndexow->Items->Item[0];

    if(DtmIms->cdsTechMatPozycje->Active) {
        DtmIms->cdsTechMatPozycje->First();
        while(!DtmIms->cdsTechMatPozycje->Eof) {
            treeviewListaIndexow->Items->AddChild(Glowny,DtmIms->cdsTechMatPozycje->FieldByName("test")->AsString);        
            DtmIms->cdsTechMatPozycje->Next();
        }
        DtmIms->cdsTechMatPozycje->First();
    }

    treeviewListaIndexow->Items->GetFirstNode()->Expand(true);
 


Tutaj mam kod który dodaje główną gałąź i pod gałęzie do niej. Teraz mam problem jak doczytać kolejne poziomy. Nie wiedzy ile jest tych poziomów. Bo odczytuje dane na bieżąco czyli.

Dodałem Główną gałąź, sprawdzam listę do głównej gałęzi, dodaje odczytane gałęzie, teraz od tych nowych gałęzi musze odczytać kolejne wrócić, wziąść następną itd. Problem polega na tym, że wychodzi mi tu jakaś rekurencja hehe.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: TTreeView - jak to ogarnąć

Nowy postprzez Cyfrowy Baron » piątek, 28 stycznia 2011, 10:01

Link nie działa, pojawia się komunikat:


Bandwidth Limit Exceeded

The server is temporarily unable to service your request due to the site owner reaching his/her bandwidth limit. Please try again later.


Apache/1.3.33 Server at http://www.functionx.com Port 80


Przekroczono limit transferu.



Skoro można zamieszczać załączniki na forum, to dlaczego używasz zewnętrznego serwera, który na domiar wszystkiego częściej nie działa niż działa?! :o



Corvis napisał(a):Dodałem Główną gałąź, sprawdzam listę do głównej gałęzi, dodaje odczytane gałęzie, teraz od tych nowych gałęzi musze odczytać kolejne wrócić, wziąść następną itd. Problem polega na tym, że wychodzi mi tu jakaś rekurencja hehe.


Nie ma rady, gałęzie zagnieżdżają się w gałęziach, jedyne rozsądne rozwiązanie, to przechowywanie informacji o dodawanych gałęziach na jakiejś liście, w ten sposób będziesz wiedział na bieżąco, co gdzie jest, gdyż sam TreeView to kilka list. Każda gałąź nadrzędna zawiera własną listę, więc by pobrać informację o wszystkich rozgałęzieniach, trzeba wyliczyć gałęzie nadrzędne, a potem dla każdej takiej listy sprawdzić jej listy.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: TTreeView - jak to ogarnąć

Nowy postprzez Corvis » piątek, 28 stycznia 2011, 11:20

Ja tam nic nie dodawałem - to strona z przykładem o to kod ze stronki:

KOD cpp:     UKRYJ  
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    TTreeNode *World, *Continent;

    // The root node
    TreeView1->Items->Add(NULL, "World");
    World = TreeView1->Items->Item[0];

    // First child of the root
    TreeView1->Items->AddChild(World, "Africa");
    Continent = TreeView1->Items->Item[1];

    // Children of first node
    TreeView1->Items->AddChild(Continent, "Botswana");
    TreeView1->Items->AddChild(Continent, "Benin");

    // Second child of the root
    TreeView1->Items->AddChild(World, "Europe");
    Continent = TreeView1->Items->Item[4];

    // Children of second node
    TreeView1->Items->AddChild(Continent, "Belgium");
    TreeView1->Items->AddChild(Continent, "Denmark");
    TreeView1->Items->AddChild(Continent, "Poland");

    // Third child of the root
    TreeView1->Items->AddChild(World, "America");
    Continent = TreeView1->Items->Item[8];

    // Children of the third node
    TreeView1->Items->AddChild(Continent, "Panama");
    TreeView1->Items->AddChild(Continent, "Colombia");

    // Fourth child of the root
    TreeView1->Items->AddChild(World, "Asia");
    Continent = TreeView1->Items->Item[11];

    TreeView1->Items->AddChild(Continent, "Asia");
    TreeView1->Items->AddChild(Continent, "Bangladesh");
}
 


No tak właśnie myślałem, że będzie trzeba się nieźle nagimnastykować, żeby to zrobić ...
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: TTreeView - jak to ogarnąć

Nowy postprzez polymorphism » piątek, 28 stycznia 2011, 11:43

Dodałem Główną gałąź, sprawdzam listę do głównej gałęzi, dodaje odczytane gałęzie, teraz od tych nowych gałęzi musze odczytać kolejne wrócić, wziąść następną itd. Problem polega na tym, że wychodzi mi tu jakaś rekurencja hehe.

Z tego opisu wynika, że tu nie ma rekurencji. Czytasz pierwszy poziom, drugi itd. Chyba że mowa o takim ciągu danych:

G1; G1.1; G1.2; G2; G2.1; G2.1.1; G3


wtedy rekurencja jest jak najbardziej na miejscu. Oczywiście jeśli jest ryzyko, że głębokość rekurencji będzie za duża, wtedy trzeba użyć metody iteracyjnej z pomocniczym stosem.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: TTreeView - jak to ogarnąć

Nowy postprzez Corvis » poniedziałek, 31 stycznia 2011, 16:06

http://theroadtodelphi.wordpress.com/20 ... r-classes/

Znalazłem ciekawy art na z przykładem który wrzuca klasy VCL do TTreeView :-) szkoda, że w Delphi. Ale już można coś kombinować
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: TTreeView - jak to ogarnąć

Nowy postprzez Cyfrowy Baron » poniedziałek, 31 stycznia 2011, 16:20

Łatwiej byłoby chyba opracować własny kod. W zasadzie jakbyś opracował funkcję lub klasę dla jednego drzewa to mógłbyś to stosować dla całego TTreeView.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości