2017-06-28 1 views
1

Bitte beachten Sie die folgende Abbildung:Ist dies in Delphi Docking möglich, oder muss Drag & Drop angepasst werden?

  • Panel1 und Panel2 andockbaren sind.
  • Das Panel auf der rechten Seite ist Dock-Site.
  • Ich weiß, wie das Standard-Docking funktioniert, wenn Sie Panel1 und Panel2 einzeln auf das rechte Panel ziehen.

enter image description here

Meine Frage: Kann ich steuern, um das Rechteck Docking Vorschau und letzten Andockrechteck, so dass die dockte Panel seine Höhe beibehält und volle Breite der rechten Seite einnimmt? Mit anderen Worten: Kann ich einen Effekt vom Typ "Snap-In" erstellen, bei dem beim Andocken an das erste Feld oben auf dem rechten Feld eine eigene Höhe angezeigt wird. Dann schnappt das zweite Panel, wenn es angedockt ist, darunter mit seiner eigenen Höhe ein?

Ich vermute, dass ich meine eigenen Drag & Drop anstelle von Andocken verwenden muss, um diese Art von Ziehen und Fallenlassen an der richtigen Stelle zu machen. Ich wollte Docking verwenden, weil es ein nettes Ziel-Vorschau-Rechteck-Feature ist, für das ich meinen eigenen Code per Drag and Drop machen muss.

Antwort

1

Hier ist ein Beispiel für Sie dieses

procedure TForm3.ScrollBox1DockDrop(Sender: TObject; Source: TDragDockObject; X, 
    Y: Integer); 
begin 
    //Change the dropped component (source) Align property to alTop to achieve top 
    //alignment of docked control 
    Source.Control.Align := alTop; 
end; 

procedure TForm3.ScrollBox1UnDock(Sender: TObject; Client: TControl; 
    NewTarget: TWinControl; var Allow: Boolean); 
begin 
    //Reset Align property to alNone to revert undocked control to original size 
    //NOTE: Changing Source.DocRect like in OnDockOver event below will also change 
    //original size of the control. So when undocked it will no longer have same 
    //dimensions as it did before docking 

    Client.Align := alNone; 
end; 

//Here we can manipulate the size of DockRect to get better preview of docked component. 
//NOTE: Changing Source.DocRect like in OnDockOver event below will also change 
//original size of the control. So when undocked it will no longer have same 
//dimensions as it did before docking 
procedure TForm3.ScrollBox1DockOver(Sender: TObject; Source: TDragDockObject; X, 
    Y: Integer; State: TDragState; var Accept: Boolean); 
var 
    ARect: TRect; 
begin 
    Accept := Source.Control is TPanel; 
    if Accept then 
    begin 
    ARect.TopLeft := (Sender as TScrollBox).ClientToScreen(Point(0,Y)); 
    ARect.BottomRight := (Sender as TScrollBox).ClientToScreen(Point((Sender as TScrollBox).ClientWidth, Source.Control.Height+Y)); 
    Source.DockRect := ARect; 
    end; 
end; 

Auch wollen erreichen Sie könnten diese Frage für weitere Informationen über Docking einschließlich Vorschläge für einige Komponenten von Drittanbietern

How do I make dockable forms like the IDE's without the very slow freezing movement of the dockable form?

+0

Danke überprüfen ! Das Vorschau-Rechteck funktionierte perfekt, aber ich konnte den DockOver nicht funktionieren, bis ich den UseDockManager des rechten Fensters auf False gesetzt habe. – user173399

+0

Gibt es einen weiteren Beispielcode zum Anpassen des Docking-Managers unter Verwendung der IDockManager-Schnittstelle usw.? – user173399

+0

Leider kenne ich kein Beispiel für die Anpassung des Docking Managers. Vielleicht können Sie einige Open-Source-Docking-Komponenten finden. – SilverWarior