Wie bei TreeNode ein OnClick Ergeigniss



  • Hallo,

    ich erzeuge TreeNodes

    TTreeNode* myNote;
    myNote = TreeView1->Items[0].Item[0];
    
    TreeView1->Items->Clear();
    TreeView1->Items->Add(myNote,"Stammknoten");
    
    myNote = TreeView1->Items->Item[0];
    TreeView1->Items->AddChild(myNote,"Unterknoten in StammKnoten");
    
    TreeView1->Items->Add(myNote,"Stammknoten2");
    myNote = TreeView1->Items->Item[2];
    
    TreeView1->Items->AddChild(myNote,"Unterknoten von S2");
    
    myNote = TreeView1->Items->Item[3];
    TreeView1->Items->AddChild(myNote,"Unterknotena");
    

    nun hätte ich es aber gern, das auch etwas passiert wenn man auf ein bestimmtes klickt, wie kann ich das erstellen?

    es gibt ja kein OnClick oder ähnliches!



  • Hallo

    OnClick ist dafür ungünstig. Nimm TView::OnChange, dieser Event gibt dir gleich den neuen ausgewählten Node mit.

    bis bald
    akari



  • akari schrieb:

    Nimm TView::OnChange, dieser Event gibt dir gleich den neuen ausgewählten Node mit.

    hmm...das versteh ich nicht ganz, so:

    myNode->OnChange;
    
    //oder
    TreeView1->OnChange;
    
    //???
    

    finde nirgends dieses ereignis 😕 😮



  • Hallo

    BCB_Hilfe schrieb:

    TCustomTreeView::OnChange

    Das Ereignis OnChange wird beim Auswählen eines anderen Knotens ausgelöst.

    typedef void __fastcall (__closure *TTVChangedEvent)(System::TObject* Sender, TTreeNode* Node);
    __property TTVChangedEvent OnChange = {read=FOnChange, write=FOnChange};

    Beschreibung

    In einer Ereignisbehandlungsroutine für OnChange können Sie bestimmte Aktionen durchführen, sobald sich die Knotenauswahl ändert. Der Parameter Sender gibt das zugehörige Baumdiagramm und Node den neu ausgewählten Knoten an.

    Bei Node wirst du den Event auch nicht finden.
    Und du must auch bei TTreeView das anders einsetzen. Wähl zur Entwurfszeit dein TreeView aus, und erstell mit dem Objektinspektor eine passende Event-Methode für den OnChange-Event des TreeView.
    Innerhalb der neuen Mehtode kannst du nun mit dem übergebenen neu ausgewählten Node machen was du willst.

    bis bald
    akari



  • ok, das habe ich verstanden, aber eine frage bleibt noch:

    gibt es eine möglichkeit, ein node eindeutig zu identifizieren?
    Bei MenuItems oder ähnlichen gibt es ja Tag, bei TreeNode nicht!

    Möchte eben in dem OnChange eine Möglichkeit haben, zu überprüfen welches node ausgewählt wurde!



  • Hallo

    Bei TTreeNode gibt es die Eigenschaft Data, die genau so verwendet werden kann.
    Der einzige Unterschied ist, das du integrale Typen in void* casten must.

    int Index = 10;
    Node->Data = reinterpret_cast<void*>(Index);
    Index = reinterpret_cast<int>(Node->Data);
    

    bis bald
    akari



  • ok, hab das mal so probiert!

    TTreeNode* myNote;
    TreeView1->Items->Clear();
    TreeView1->Items->Add(NULL,"Stamm");
    
    myNote = TreeView1->Items->Item[0];
    myNote->Data = reinterpret_cast<void*>(1);
    TreeView1->Items->Add(myNote,"Stammknoten");
    
    myNote = TreeView1->Items->Item[1];
    TreeView1->Items->AddChild(myNote,"Unterknoten in StammKnoten");
    myNote->Data = reinterpret_cast<void*>(2);
    
    TreeView1->Items->Add(myNote,"Stammknoten2");
    myNote->Data = reinterpret_cast<void*>(3);
    
    myNote = TreeView1->Items->Item[3];
    TreeView1->Items->AddChild(myNote,"Unterknoten von S2");
    myNote->Data = reinterpret_cast<void*>(4);
    
    myNote = TreeView1->Items->Item[3];
    TreeView1->Items->AddChild(myNote,"Unterknotena");
    myNote->Data = reinterpret_cast<void*>(5);
    
    //-----------------------------------------------
    void __fastcall TForm1::TreeView1Change(TObject *Sender, TTreeNode *Node)
    {
    int index = reinterpret_cast<int>(Node->Data);
    ShowMessage(index);
    
    }
    

    allerdings stimmen die zahlen die raus kommen nicht!
    ist durcheinander, bei stamm kommt 1
    bei alles unterknoten kommt 0, wieso?



  • Hallo

    Du hast nicht verstanden, das die Funktion AddChild einen Rückgabewert hat. Und zwar nämlich genau den neu erzeugten Node. Also muß das so aussehen

    TTreeNode parentNode;
    TTreeNode newNode;
    parentNote = TreeView1->Items->Item[1];
    newNote = TreeView1->Items->AddChild(parentNote,"Unterknoten in StammKnoten");
    newNote->Data = reinterpret_cast<void*>(2);
    

    bis bald
    akari



  • hmm...irgendwie verwirrt mich das schon sehr!

    void __fastcall TMainForm::FileNew1Execute(TObject *Sender)
    {
    	CreateMDIChild("NONAME" + IntToStr(MDIChildCount + 1));
            TTreeNode* myNode;
            TTreeNode* childNode;
    
            myNode = TreeView1->Items->Item[0];
    
            childNode = TreeView1->Items->AddChild(myNode,"CHILD" + IntToStr(MDIChildCount));
            childNode->Data = reinterpret_cast<void*>(MDIChildCount);
            //ShowMessage(reinterpret_cast<int>(myNode->Data));
    }
    

    da möchte ich eben für jedes neue ChildFenster einen Eintrag machen, und Data mit der NUmmer füttern, um dann, beim Klick auf den Eintrag im View das Fenster zu öffnen

    void __fastcall TMainForm::TreeView1Change(TObject *Sender,
          TTreeNode *Node)
    {
    int index = reinterpret_cast<int>(Node->Data);
    ShowMessage(index);
    
    MDIChildren[index]->Show();
    
    }
    

    allerdings geht das nicht!
    es werden beim klick immer willkürlich fenster geöffnet, beium klick auf das letzte eine Exception, wenn ich index um 1 verringere, kommt keine excpetion, aber er öffnet dann nicht alle fenster wenn ich klicke!

    was mache ich denn falsch??



  • hm...keine eine idee??



  • Hallo

    ich seh in den geposteten Code keinen Fehler, das Prinzip ist korrekt. Benutzt den Debugger, um den Verlauf des Programmes zu verfolgen und entscheidende Variablen zu überprüfen.

    bis bald
    akari


Anmelden zum Antworten