Über Nodes bei treeview parents ansprechen



  • 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