Announcement

Collapse
No announcement yet.

Drag&Dock

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

  • Drag&Dock

    Hallo,

    ich möchte mit der Dock Funktionalität ein RichEdit an ein Panel andocken oder frei im Raum floaten lassen. So weit so gut.
    Wie bekomme ich aber nun mit, wenn der Anwender die Richedit-Komponente mittels des kleinen x in der Ecke zerstört? Wird irgendeine Nachricht gesendet die ich dann abfangen kann?

    Gruß Thorsten

  • #2
    Hallo Thorsten,

    wenn Du das Fenster, in dem sich das RichEdit befindet, selber erstellst, solltest Du das Ereignis OnDestroy() abfangen können. Das Fenster erstellst Du beim OnStartDrag Ereignis des RichEdits.
    (BorderStyle bsToolWindow, dann schaut es genau so aus, wie die Floating Windows beim Drag&Drop.)

    Anschließend übergibst Du das RichEdit an das neue Fenster. Wenn der User dann auf das "x" drückt wird das OnDestroy Ereignis ausgelöst, dann übergibst Du das RichEdit wieder der MainForm. Ich hoffe ich konnte Dir damit weiterhelfen.

    Gruß Roma

    Comment


    • #3
      Hallo Roman,

      danke für Deine schnelle Antwort.<br>
      Ich glaube ich verstehe Dich noch nicht so ganz. Wenn mein RichEdit wieder an z.B. ein Panel angedockt ist und dann jemand das "x" drückt erfahre ich doch trotzdem nichts davon.<br>
      Wenn ich Dich richtig verstanden habe soll ich das RichEdit im 'floatenden' Zustand an ein TForm binden. Dann würde ich schonmal mitbekommen wenn die Komponenten im freien Zustand zerstört würde. Aber wenn jetzt jemand das RichEdit wieder an ein Panel andockt, wäre das TForm ja nicht mehr mit dem RichEdit verbunden, oder?<br>
      Oder meinst Du die Eigenschaft FloatingDockSiteClass ? Da habe ich nämlich noch nicht verstanden wie man die anwendet.

      Ich möchte ein ähnliches Verhalten wie im Builder mit dem Meldungsfenster erreichen. Wenn das RichEdit da ist, ist es ein Teil des Fensters mit Größenänderung und so, und wenn es jemand mittels "x" zerstört, nimmt das Fenster wieder den kompletten Client ein.<br>
      Mein Fenster ist aufgeteilt in ein DrawGrid (oben) und einer Anzeige(Richedit, unten) geteilt von einem Splitter(zwecks Verschiebung der Größenverhältnisse). Die Anzeige ist auf einem Panel plaziert damit ich einen Host für mein Docking habe. Wenn nun meine Anzeige zerstört wird, muß das Panel auch verschwinden und dafür brauche ich die Meldung der Zerstörung.

      Ich hoffe die funktionalität die ich erreichen möchte ist klar, nur wie schaffe ich das??

      Thorste

      Comment


      • #4
        Hallo Thorsten,

        welches Meldungsfenster vom Builder meinst Du? Das, wo die Compile- und Linkerfehler angezeigt werden? Du mußt entschuldigen, ich habe nämlich die englische Version. Nichts desto trotz werde ich übers Wochenende mal versuchen hinzukriegen, was Dir so vorschwebt.

        Gruß Roma

        Comment


        • #5
          Hallo Thorsten,

          jetzt habe ich kapiert, wie das mit der FloatingDockSiteClass funktioniert. Ich habe das ganze anhand einer TToolBar ausprobiert.

          In TForm1:

          <code>
          <font color=#008000><i>//---------------------------------------------------------------------------</i></font><br>
          <font color=#000000><b>__fastcall</b></font>&nbsp;TForm1::TForm1(TComponent*&nbsp;Owner)< br>
          &nbsp;&nbsp;&nbsp;:&nbsp;TForm(Owner)<br>
          {<br>
          &nbsp;&nbsp;&nbsp;ToolBar1->FloatingDockSiteClass&nbsp;=&nbsp;__classid(TForm 2);<br>
          }<br>
          <font color=#008000><i>//---------------------------------------------------------------------------</i></font><br>
          </code>

          In TForm2:

          <code>
          <font color=#008000><i>//---------------------------------------------------------------------------</i></font><br>
          <font color=#000000><b>void</b></font>&nbsp;<font color=#000000><b>__fastcall</b></font>&nbsp;TForm2::FormDockDrop(TObject&nbsp;*Send er,<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TDragDockObjec t&nbsp;*Source,&nbsp;<font color=#000000><b>int</b></font>&nbsp;X,&nbsp;<font color=#000000><b>int</b></font>&nbsp;Y)<br>
          {<br>
          &nbsp;&nbsp;&nbsp;ClientWidth&nbsp;=&nbsp;Sourc e->Control->Width;<br>
          &nbsp;&nbsp;&nbsp;ClientHeight&nbsp;=&nbsp;Sour ce->Control->Height;<br>
          &nbsp;&nbsp;&nbsp;Show();&nbsp;&nbsp;&nbsp;<br>
          }<br>
          <font color=#008000><i>//---------------------------------------------------------------------------</i></font><br>
          <font color=#000000><b>void</b></font>&nbsp;<font color=#000000><b>__fastcall</b></font>&nbsp;TForm2::FormDeactivate(TObject&nbsp;*Se nder)<br>
          {<br>
          &nbsp;&nbsp;&nbsp;<font color=#000000><b>if</b></font>&nbsp;(!ControlCount)&nbsp;Close();<br>
          }<br>
          <font color=#008000><i>//---------------------------------------------------------------------------</i></font><br>
          </code>

          Damit erreichst Du, daß die ToolBar sich an TForm2 klemmt, wenn der Drag-Vorgang beginnt. Ich habe selber schon einige Mühe mit dockable Fenstern gehabt, die von der VCL erstellt wurden. Bei mir hüpfte das Fenster immer, wenn ich auf die CaptionBar geklickt habe. Nun habe auch ich etwas hinzugelernt.

          Ich habe es auch mal statt mit einer TToolBar mit einem TRichEdit versucht, habe aber nocht nicht ganz hingekriegt, wie ich diese in den Drag-Modus bringen kann. Da muß man ja die Enabled Eigenschaft auf false setzen, damit der Cursor überhaupt greift. Aber ich glaube da bist Du um einiges fitter :-)

          Ich hoffe, Dir mit dieser Antwort geholfen zu haben.

          Gruß Roma

          Comment


          • #6
            wenn ich den code in ein leeres project einbinde passiert garnichts. woran kann das liegen

            Comment


            • #7
              Hallo Roman,

              danke das Du Dir soviel Gedanken gemacht hast. Mit der Eigenschaft FloatingOnDockSiteClass klappt es :-).(Ich finde da hätte Borland mit seiner sonst recht guten Hilfe ein bißchen spendabler sien können;-) )<br>
              Ich habe meine Dockkomponente zur Laufzeit erstellt und dann gleich manuell auf ein Panel angedockt. Dann hat man nämlich auch gleich die Komponente an ein Form gebunden und kann mit dem TForm::OnClose Ereignis immer auf eine Zerstörung reagieren. Der Trick ist dann dabei, das man mit dem verbundenen Form das Drag&Dock auslöst und behandelt.

              Gruß Thorste

              Comment


              • #8
                Was genau! funkitoniert nicht

                Comment


                • #9
                  [Falls Romans Kommentar für mich war:]
                  Nööö, es geht alles, (ich hätte wohl nur danke schreiben sollen;-) ) ich wollte nur eine Kurzbeschreibung meines Lösungswegs abgeben.

                  So, also keine Fragen mehr meinerseits hierzu.

                  Gruß Thorste

                  Comment


                  • #10
                    es macht siche keine dock funktion bemerkba

                    Comment


                    • #11
                      Hallo Thorsten,

                      ich meinte eigentlich den Maik. Als ich die Antwort geschrieben habe, war Dein Posting noch nicht sichtbar. Aber es freut mich, daß es Dir nun gelungen ist. Ich hoffe ich konnte Dir dabei ein wenig behilflich sein.

                      Gruß Roma

                      Comment


                      • #12
                        Hallo Maik,

                        das Andocken habe ich bisher noch nicht ausimplementiert. Mir ging es nur darum, daß Objekt in einem eigenen Fenster zu verschieben.

                        Gruß Roma

                        Comment

                        Working...
                        X