Über Nodes bei treeview parents ansprechen



  • Hallo,

    ich versuche mich gerade an einem TreeView.
    Ich habe im Objekt selbst nun 5 Parents erstellt:

    -eins
    -zwei
    -drei
    -vier
    -fünf
    

    Jetzt habe ich eine list in der meine childs stehen.
    je nach art( eins, zwei, drei, vier oder fünf) sollen diese dann in den tree eingefügt werden.

    Jetzt meine Frage, kann ich den parents direkt nodes zuweisen und diese dann über AddChild(*node,String) direkt einfügen?

    Danke im voraus.
    MfG
    Gustl



  • Hallo

    Falls ich dich richtig verstanden habe : Es gibt kein TTreeNode::AddChild(). Aber über TTreeNode::TreeView kannst du ja TTreeView::Items::Add() aufrufen.

    bis bald
    akari



  • Hallo,

    ich möchte die structs aus der List in den tree einfügen.
    ich bin imo soweit:

    for(it_key; it_key!=key_list.end(); ++it_key)
        {
            if((*it_key).art == "BETRIEBSSYSTEME")
            {   TKeys->Items->AddChild(TKeys->Items->Item[0], (*it_key).bezeichnung.c_str());
    
            }
            if((*it_key).art == "EMAIL")
            {    TKeys->Items->AddChild(TKeys->Items->Item[1], (*it_key).bezeichnung.c_str());
            }
            if((*it_key).art == "FOREN")
            {   TKeys->Items->AddChild(TKeys->Items->Item[2], (*it_key).bezeichnung.c_str());
            }
            if((*it_key).art == "INTERNETPORTALE")
            {   TKeys->Items->AddChild(TKeys->Items->Item[3], (*it_key).bezeichnung.c_str());
            }
            if((*it_key).art == "SPIELE")
            {   TKeys->Items->AddChild(TKeys->Items->Item[4], (*it_key).bezeichnung.c_str());
            }
            if((*it_key).art == "WEBSERVER")
            {   TKeys->Items->AddChild(TKeys->Items->Item[5], (*it_key).bezeichnung.c_str());
            }
        }
    

    Wobei dann TKeys->Items->AddChild(TKeys->Items->Item[1] IMMER die jeweiligen parents ansprechen sollte... wenn ich aber welche einfüge stimmen diese Items ja nciht mehr.

    Nun denke ich das diese Nodes dann pointer sind die auf diese zeigen, nur wie richte ich diese ein?



  • Merke dir die TreeNodes vor dem Hinzufügen (ist sogar ein kleines bißchen schneller):

    TTreeNode *OS = treeview->Items->Add("Betriebssysteme");
    ... // für alle anderen Parents
    
    // nun die Schleife
    for(it_key; it_key!=key_list.end(); ++it_key)
    {
        if((*it_key).art == "BETRIEBSSYSTEME")
           TKeys->Items->AddChild(OS, (*it_key).bezeichnung.c_str());
    
        // ...
    }
    

    Edit: TTreeNode statt TTreeItem -)



  • Funktioniert leider nicht...

    weder

    TTreeItem
    

    noch

    TTreeNode
    

    😞

    Fehler:
    E2034 Cannot convert 'char *' to 'TTreeNode *'

    Habe es nun so gemacht:

    TTreeNode *P1 = TKeys->Items->AddChild(NULL,"Betriebssysteme");
        TTreeNode *P2 = TKeys->Items->AddChild(NULL,"E- Mail`s");
        TTreeNode *P3 = TKeys->Items->AddChild(NULL,"Foren");
        TTreeNode *P4 = TKeys->Items->AddChild(NULL,"Internetportale");
        TTreeNode *P5 = TKeys->Items->AddChild(NULL,"Spiele");
        TTreeNode *P6 = TKeys->Items->AddChild(NULL,"Webserver");
    
      //  for_each(key_list.begin(), key_list.end(), add_tree);
        for(it_key; it_key!=key_list.end(); --it_key)
        {
            if((*it_key).art == "BETRIEBSSYSTEME")
            {    TKeys->Items->AddChild(P1, (*it_key).bezeichnung.c_str());
            }
            if((*it_key).art == "EMAIL")
            {
                 TKeys->Items->AddChild(P2, (*it_key).bezeichnung.c_str());
            }
            if((*it_key).art == "FOREN")
            {
                TKeys->Items->AddChild(P3, (*it_key).bezeichnung.c_str());
    
            }
            if((*it_key).art == "INTERNETPORTALE")
            {
                TKeys->Items->AddChild(P4, (*it_key).bezeichnung.c_str());
    
            }
            if((*it_key).art == "SPIELE")
            {
                TKeys->Items->AddChild(P5, (*it_key).bezeichnung.c_str());
    
            }
            if((*it_key).art == "WEBSERVER")
            {
                TKeys->Items->AddChild(P6, (*it_key).bezeichnung.c_str());
            }
    
        }
    

    Aber jetzt trägt er nur den ersten child von Betriebssysteme ein... warum?



  • OkOk, wieder ein doofer fehler... in der forschleife habe ich --it, anstatt ++it.. funktioniert. Dankeschön.

    Gruß
    Gustl



  • Noch eine kurze andere Frage, ich habe ja nun 5 reiter(Foren,Emails,etc.) und wenn ich auf einen doppelklicke kommen die childs zum vorschein. Ich möchte jetzt aber das diese sich wieder schließen wenn ich auf einen anderen reiter klicke.

    Gibt es da eine Eigenschaft dafür oder muss ich den tree dann immer wieder laden mit dem entsprechenden focus bei OnClick?



  • Hallo

    Mit dem OnChange-Event kannst du reagieren, wenn ein Node neu ausgewählt wird, und den alten schließen.

    bis bald
    akari



  • Sorry, daß ich bei Add den ersten Paramameter NULL (bzw. 0) vergessen hatte, aber du hast es ja auch so gelöst, gut so.

    Und die entsprechenden Events beim TreeView heißen OnCollapsed und OnExpanded, d.h. merk dir in OnExpanded einfach den aktuellen Node (in einer Membervariablen) und schließe ihn beim erneuten Aufruf mittels treenode->Collapse().



  • Habs hinbekommen das es funktioniert...danke.
    Aber bestimmt nicht elegant:
    .h

    TTreeNode *merker_node;
    bool reiter;
    

    .cpp

    __fastcall TKeySafeForm::TKeySafeForm(TComponent* Owner)
            : TForm(Owner)
    {   reiter = true;
    }
    void __fastcall TKeySafeForm::TKeysExpanded(TObject *Sender,
          TTreeNode *Node)
    {   if(!reiter)merker_node->Collapse(true);
        reiter = false;
        merker_node = Node;
    }
    

    Wie kann man das ohne der bool variable lösen?
    Kenne mich mit den Nodes noch nicht aus...



  • Du könntest einfach 'merker_node' auf 0 setzen und diesen Wert direkt abfragen:

    __fastcall TKeySafeForm::TKeySafeForm(TComponent* Owner)
            : TForm(Owner)
    {
       merker_node = 0;
    }
    
    void __fastcall TKeySafeForm::TKeysExpanded(TObject *Sender, TTreeNode *Node)
    {
        if(!merker_node)
            merker_node->Collapse(true);
        merker_node = Node;
    }
    


  • Das habe ich schon probiert, aber er bringt mir da in der Laufzeit einen Fehler...

    Efal, mit der bool variable funktioniert es.

    Danke nochmal.

    Gruß
    Gustl



  • Dann hast du wahrscheinlich vergessen (oder an der falschen Stelle) den(/die/das) 'merker_node' auf null (0) zu setzen.
    Einfach debuggen, ansonsten ist mein Code die gängigste Art (ähnlich wie bei Speicherallokationen- und freigaben, d.h. Nullzeiger werden beim 'delete' ignoriert).


Anmelden zum Antworten