Announcement

Collapse
No announcement yet.

TTreeView Drag&Drop

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TTreeView Drag&Drop

    moin moin,

    ich benutze ein TTreeView um Benutzergruppen zu verwalten. Benutzer kann man mit Drag&Drop in eine andere Gruppe zu verschieben. Das funktioniert auch bestens, aber ...

    wenn ich das Ereignis OnAdvancedCustomDrawItem benutze, funktionert das mit dem automatischen anzeigen welcher Knoten gerade unter der Maus ist nicht mehr. Beim Draggen wird das obige Ereignis nicht mehr ausgelöst.

    Gibt es eine Möglichkeit, auch beim Draggen die Schrift eines Knotens zu ändern, wenn die Maus darüber steht ???

  • #2
    OnDragOver nutzen
    Christian

    Comment


    • #3
      OnDragOver benutze ich, um Accept zu setzen. Aber ich weis nicht, wie ich den Knoten an dieser Stelle neu zeichnen kann. Die Nodes haben keine Methode, sie zum neuzeichnen zu veranlassen

      Comment


      • #4
        M.E. doch die Eigenschaft



        CustomDrawItem

        CustomDrawItem wird automatisch zu verschiedenen Zeitpunkten des Zeichnens von Baumknoten aufgerufen. Die Methode stellt fest, welche Ereignisbehandlungsroutinen für den aktuellen Zeichnenstatus geeignet sind und generiert die entsprechenden Ereignisse. Node ist das Element, das gezeichnet werden soll.
        Christian

        Comment


        • #5
          OnDragOver habe ich so implementiert :

          Code:
          void __fastcall TfBenutzer::BenutzerbaumDragOver(TObject *Sender,
                TObject *Source, int X, int Y, TDragState State, bool &Accept)
          {
          TTreeNode *n       =  Benutzerbaum->GetNodeAt (X,Y);
          TTreeNode *n2      =  Benutzerbaum->Selected;
          BenutzerData *Empf;
          BenutzerData *Send;
          
             n =  Benutzerbaum->GetNodeAt (X,Y);
             n2 = Benutzerbaum->Selected;
             if (!n || !n2)
             {
                Accept = false;
                return;
             }
          
             Empf =   (BenutzerData *) n->Data;
             Send =   (BenutzerData *) n2->Data;
          
             if ((Empf->typ == 1 && Send->typ == 2)   // Gruppe an Abteilung
             ||  (Empf->typ == 2 && Send->typ == 3)   // Benutzer an Gruppe
             ||  (Empf->typ == 2 && Send->typ == 2))  // Gruppe an Gruppe
             {
                Accept = true;
                return;
             }
          
             Accept = false;
          }
          die Klasse TTreeNode hat aber keine Eigenschaft oder Methode um sich selbst neu zu zeichnen. (OnBenutzerDrawItem gehört zur Klasse TTreeView)

          Comment


          • #6
            (OnBenutzerDrawItem gehört zur Klasse TTreeView)
            Ja und??

            Das war die Frage:

            Gibt es eine Möglichkeit, auch beim Draggen die Schrift eines Knotens zu ändern, wenn die Maus darüber steht ???
            Was Spricht nun dagegen, im OnDragOver den Knoten neu zu zeichenen über CustomDrawItem???

            Du ermittelst doch hier den Node

            n = Benutzerbaum->GetNodeAt (X,Y);

            Und warum nicht dann

            Benutzerbaum->CustomDrawItem(n,....)

            ?????
            Christian

            Comment


            • #7
              Code:
              void __fastcall TfBenutzer::BenutzerbaumCustomDrawItem(
                    TCustomTreeView *Sender, TTreeNode *Node, TCustomDrawState State,
                    bool &DefaultDraw)
              {
                 switch (((BenutzerData*)Node->Data)->typ)
                 {
                    case 1 :
                       Sender->Canvas->Font->Color = clBlack;
                       Sender->Canvas->Font->Size  = 10;
                       if (State.Contains(cdsHot)) // Die Maus befindet sich über dem Eintrag
                          Sender->Canvas->Font->Style = TFontStyles()<< fsBold << fsItalic;
                       else
                          Sender->Canvas->Font->Style = TFontStyles()<< fsBold;
                       break;
                    case 2 :
                       Sender->Canvas->Font->Color = clBlue;
                       Sender->Canvas->Font->Size  = 9;
                       if (State.Contains(cdsHot)) // Die Maus befindet sich über dem Eintrag
                          Sender->Canvas->Font->Style = TFontStyles()<< fsBold << fsItalic;
                       else
                          Sender->Canvas->Font->Style = TFontStyles()<< fsBold;
                       break;
                    case 3 :
                       if (((BenutzerData*)Node->Data)->isonline)
                          Sender->Canvas->Font->Color = clGreen;
                       else
                          Sender->Canvas->Font->Color = clBlack;
                       Sender->Canvas->Font->Size  = 8;
                       Sender->Canvas->Font->Style = TFontStyles();
                       break;
                    default :
                       Sender->Canvas->Font->Color = clBlack;
                       Sender->Canvas->Font->Size  = 8;
                       Sender->Canvas->Font->Style = TFontStyles();
                       break;
              
                 }
              
              }
              Code:
              void __fastcall TfBenutzer::BenutzerbaumDragOver(TObject *Sender,
                    TObject *Source, int X, int Y, TDragState State, bool &Accept)
              {
              TTreeNode *n       =  Benutzerbaum->GetNodeAt (X,Y);
              TTreeNode *n2      =  Benutzerbaum->Selected;
              BenutzerData *Empf;
              BenutzerData *Send;
              bool x = true;
              TCustomDrawState ds;
                 ds << cdsHot;
              
                 n =  Benutzerbaum->GetNodeAt (X,Y);
                 n2 = Benutzerbaum->Selected;
                 if (!n || !n2)
                 {
                    Accept = false;
                    return;
                 }
              
                 Empf =   (BenutzerData *) n->Data;
                 Send =   (BenutzerData *) n2->Data;
              
                 if ((Empf->typ == 1 && Send->typ == 2)   // Gruppe an Abteilung
                 ||  (Empf->typ == 2 && Send->typ == 3)   // Benutzer an Gruppe
                 ||  (Empf->typ == 2 && Send->typ == 2))  // Gruppe an Gruppe
                 {
                    Accept = true;
                    BenutzerbaumCustomDrawItem(Benutzerbaum, n, ds,x);      return;
                 }
                 Accept = false;
              }
              Hab ich gemacht, es gibt aber ein kleines Problem :

              ich rufe CustomDrawItem mit DrawState cdsHot auf aber CustomDrawItem wird dann nochmal automatisch aufgerufen aber ohne cdsHot.
              Wenn ich normal mit der Maus über einen Knoten fahre ist alles ok wenn ich Dragge dann nicht.

              Comment


              • #8
                BenutzerbaumCustomDrawItem(Benutzerbaum, n, ds,x);

                Das ist so ok??

                Nochmal der Tree da drin, Habe jetzt hier keinen C++builder kann nicht nachschauen
                Christian

                Comment


                • #9
                  Originally posted by Christian Marquardt View Post
                  BenutzerbaumCustomDrawItem(Benutzerbaum, n, ds,x);

                  Das ist so ok??

                  Nochmal der Tree da drin, Habe jetzt hier keinen C++builder kann nicht nachschauen
                  Jawoll das ist so OK, das Problem ist (durch debuggen festgestellt), das die Funktion automatisch nochmal aufgerufen wird nur das dann TCustomDrawState nicht mehr auf cdsHot steht.

                  Comment


                  • #10
                    Nur eine Nothilfe, wenn nix anderes geht:

                    Definiere einen globalen bool, der anzeigt, ob Hot ist oder nicht.

                    In OnDragOver setzt du diesen auf true
                    InCustomDraw nach dem zeichnen auf false. Du fragst dann hat nciht mehr auf State.contains... ab, sondern auf den bool
                    Christian

                    Comment


                    • #11
                      Du solltest

                      BenutzerbaumCustomDrawItem(this,n,ds,x)

                      probieren
                      Zuletzt editiert von Christian Marquardt; 13.07.2007, 16:07.
                      Christian

                      Comment


                      • #12
                        Originally posted by Christian Marquardt View Post
                        Du solltest

                        BenutzerbaumCustomDrawItem(this,n,ds,x)

                        probieren
                        CustomDrawItem erwartet als ersten Parameter einen Zeiger auf ein TTreeView. this wird nicht acceptiert

                        Comment

                        Working...
                        X