Schliessen-Symbol bei dockbaren Panels



  • Selbst mit der Holzhammermethode (Style und extended Style auf 0) verschwindet dieser Balken mit dem "x" nicht. Hat noch jemand einen Tipp?



  • Was willst du denn erreichen, das Schliessen verhindern?



  • Genau. Das Problem ist, dass es dafür keinen Handler gibt, den man einfach per BCB IDE überschreiben kann. Das folgende Posting habe ich zum Thema per Google Groups gefunden:

    This little button, together with the grab bar, is drawn by
    the docking manager. In order to alter the behaviour of this docking
    manager you need to create your own docking manager, equipped with the
    IDockManager interface and (possibly) descending from TDockTree (both
    defined in Controls.pas/.hpp).

    The dock manager for your control is controlled by the UseDockManager
    property, combined with the DockManager property itself.

    The PaintDockFrame of the TDockTree class is responsible for drawing the
    close button, so you need to override this method in order NOT to draw the
    button (alternatively override PaintSite which calls PaintDockFrame).

    In order to override the closing behaviour, you need to override the
    HitTest method; this method returns "HTCLOSE" in the HTFlag parameter if
    the "Close" button is hit - you would probably want to replace any returnd
    occurence of HTCLOSE with HTCAPTION or something similarly "harmless".

    Ich habe nun also mal eine eigene DockTree-Klasse von TDockTree abgeleitet und die HitTest-Methode überschreiben. Ich rufe die HitTest Methode der Vaterklasse auf und ändere HTFlag zu HTCAPTION, wenn es HTCLOSE ist. Das Problem ist jetzt, dass ich diese Implementierung nicht einfach dem DockManager meines Panels zuweisen kann - ich habe vermutlich leider nicht genug Erfahrung mit der VCL, um da den notwendigen Durchblick durch die Klassenhierarchie zu haben.

    Hat jemand einen Rat? Jansen?



  • Hab ehrlich gesagt keine Lust, mich da jetzt einzuarbeiten. 🙂

    Aber nochmal zu deinem eigentlichen Ziel: die Panels sollen schon an- und abdockbar bleiben, du willst nur das Schliessen verhindern? Wenn ja, warum?

    Üblicherweise lässt man doch beim Schliessen solcher Dock-Fenster die entsprechende Komponente einfach wieder auf ihrem ursprünglichen Platz auf der Form erscheinen.



  • Vom Schliessen bekommt man aber leider nichts mit. Wie gesagt, es gibt keinen Event, den man mit BCB Bordmitteln abfangen könnte (OnClose o.ä.). Ausserdem bleibt dann im Hintergrund auch das Dockpanel in voller Grösse stehen, weil das nichts davon mitbekommt ...



  • Nimm doch eine Form vom Typ "ToolWindow".



  • Vielleicht hilft das hier etwas weiter?

    Ich habe kurz mit dem __classid-Vorschlag rumgespielt, konnte es aber nicht so recht nachvollziehen. Im OnEndDock musste ich Panel::Parent auf Form2 setzen und diese explizit anzeigen, ansonsten verschwindet das Panel einfach. Und die Position des Panels auf Form2 ist auch eher ungewöhnlich. 😉

    Zumindest gibt's da aber noch ein Beispiel für die DockManager-Zuweisung.



  • Hallo,

    Ich wollte bloss mal meine Variante darstellen. Ich hatte das Problem nämlich ebenfalls.

    void __fastcall TForm1::ToolBar2EndDock(TObject *Sender,
          TObject *Target, int X, int Y)
    {
       TToolBar *toolbar = dynamic_cast<TToolBar *>(Sender);
       if( toolbar != NULL)
       {
          if( toolbar->Parent->ClassNameIs("TToolDockForm"))
          {
            EnableMenuItem(GetSystemMenu(toolbar->Parent->Handle,false),
              SC_CLOSE,MF_BYCOMMAND|MF_GRAYED);
          }
       }
    }
    

    Das verhindert das Schliessen lediglich. Das Kreuz wird dabei aber immernoch angezeigt (grau).

    Ciao



  • Original erstellt von Jansen:
    Zumindest gibt's da aber noch ein Beispiel für die DockManager-Zuweisung.

    Das Zuweisungsproblem ist gelöst, es gibt einen extra Casting-Operator, der mir nicht aufgefallen war. Mit Braunstreins Ansatz hindere ich den Benutzer immerhin daran, das Panel zu schliessen, das ist schonmal eine große Hilfe, danke.



  • Hab mich wohl zu früh gefreut. Bin erst heute dazu gekommen, das zu testen. So lässt sich das "x" problemlos deaktivieren, wenn man das Panel abdockt (weil dann die Parent-Form eine TCustomDockForm ist). Aber im angedockten Zustand bringt's leider nichts. Any ideas?



  • Was ist denn jetzt das Problem bei an- bzw. eingedockten Panels?


Anmelden zum Antworten