Zurück zu Delphi-Code.

Delphi, Beispiel, DockDrop, DockOver, DockSite, DragKind, DrackMode, dmAutomatic, GetSiteInfo, UnDock, EndDock, Perform

 

Ein Delphi Beispiel für Dock and Drop mit DockDrop, DockOver, DockSite, DragKind, DrackMode, dmAutomatic, GetSiteInfo, UnDock, EndDock, Perform.

Das Beispiel ist noch zimlich grob, aber es ist alles drin was man braucht, und gut zum Testen der Reihenfolge der Ereigniss Aufrufe. Es ist sinn voll wenn ihr ein wenig herum probier um zu verstehen was abläuft. Diese Eigenschaften solten so eingestellt werden, Ruhig mal Probieren was passiert wenn die eine oder andere Eigenschaft geändert wird. DockSite := True; // Nur für die Empfangenden Komponeten DragKind := dkDock; // DragKind muss dkDock für Empfänger Komponente // und die anzudockende sein. DrackMode := dmAutomatic; // DrackMode muss dmAutomatic für Empfänger // Komponente und die anzudockende sein. Statt die "NewGroupBox" einfach "GroupBox" verwenden!

Wer Fehler findet kann die behalten!

//--------------------------------------------------------------------------------------------- { Ich über nehme keine Verantwortung, alles auf eigenes Risiko. Der Code darf frei benutzt werden und verbessert und geändert. Bei Commercialer Nutzung hat man mich zu fragen. } unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, Mask, NewGroupBox, ExtCtrls; type TForm1 = class(TForm) Panel1: TPanel; NewGroupBox1: TNewGroupBox; Label1: TLabel; NewGroupBox2: TNewGroupBox; Panel2: TPanel; Button1: TButton; CheckBox1: TCheckBox; CheckBox2: TCheckBox; CheckBox3: TCheckBox; procedure NewGroupBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Panel1UnDock(Sender: TObject; Client: TControl; NewTarget: TWinControl; var Allow: Boolean); procedure Panel1DockOver(Sender: TObject; Source: TDragDockObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure Panel1DockDrop(Sender: TObject; Source: TDragDockObject; X, Y: Integer); procedure Panel1EndDock(Sender, Target: TObject; X, Y: Integer); procedure NewGroupBox1StartDock(Sender: TObject; var DragObject: TDragDockObject); procedure NewGroupBox2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure NewGroupBox2StartDrag(Sender: TObject; var DragObject: TDragObject); procedure NewGroupBox2EndDock(Sender, Target: TObject; X, Y: Integer); procedure Panel2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); procedure NewGroupBox1EndDock(Sender, Target: TObject; X, Y: Integer); procedure Panel1GetSiteInfo(Sender: TObject; DockClient: TControl; var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean); procedure NewGroupBox1GetSiteInfo(Sender: TObject; DockClient: TControl; var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean); procedure FormGetSiteInfo(Sender: TObject; DockClient: TControl; var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean); procedure FormDockDrop(Sender: TObject; Source: TDragDockObject; X, Y: Integer); procedure FormDockOver(Sender: TObject; Source: TDragDockObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure Panel2EndDock(Sender, Target: TObject; X, Y: Integer); private NGB1Height, NGB1Width: Integer; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.NewGroupBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin NewGroupBox1.Perform(WM_LBUTTONUP, 0, 0); NewGroupBox1.Perform(WM_SYSCOMMAND, SC_MOVE+2, 2); end; //444444444444444444444 // Ereignis trit auf wenn eine Kompnete wieder runter gezogen wird procedure TForm1.Panel1UnDock(Sender: TObject; Client: TControl; NewTarget: TWinControl; var Allow: Boolean); begin if Client = NewGroupBox1 then NewGroupBox1.Align := alNone; if Client = NewGroupBox2 then NewGroupBox2.Align := alNone; if Client = Panel2 then Panel2.Align := alNone; NewTarget := Form1; end; ///2222222222222222222 procedure TForm1.Panel1DockOver(Sender: TObject; Source: TDragDockObject; X, Y: Integer; State: TDragState; var Accept: Boolean); var ARect: TRect; begin Accept := (Source.Control is TNewGroupBox) or (Source.Control is TPanel); if Accept then begin caption := IntTostr(NGB1Height); end; end; //333333333333333 procedure TForm1.Panel1DockDrop(Sender: TObject; Source: TDragDockObject; X, Y: Integer); begin if Source.Control = NewGroupBox1 then NewGroupBox1.Align := alLeft; if Source.Control = NewGroupBox2 then NewGroupBox2.Align := alLeft; if Source.Control = Panel2 then Panel2.Align := alLeft; end; procedure TForm1.Panel1EndDock(Sender, Target: TObject; X, Y: Integer); begin Label1.caption := 'xxx'; end; procedure TForm1.NewGroupBox1StartDock(Sender: TObject; var DragObject: TDragDockObject); begin NGB1Height := NewGroupBox1.Height; // Werte Merken für UnDocking NGB1Width := NewGroupBox1.Width; // zum wieder Herstellen caption := IntTostr(NGB1Height); end; procedure TForm1.NewGroupBox2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin NewGroupBox2.Perform(WM_LBUTTONUP, 0, 0); NewGroupBox2.Perform(WM_SYSCOMMAND, SC_MOVE+2, 2); end; procedure TForm1.NewGroupBox2StartDrag(Sender: TObject; var DragObject: TDragObject); begin Label1.caption := 'xxx'; end; procedure TForm1.NewGroupBox2EndDock(Sender, Target: TObject; X, Y: Integer); begin if Target = Form1 then begin if Sender = NewGroupBox2 then begin NewGroupBox2.Height := 83; // Aus gemerken Werten NewGroupBox2.Width := 91; // alt Größe wieder Herstellen end; end; end; procedure TForm1.Panel2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Panel2.Perform(WM_LBUTTONUP, 0, 0); Panel2.Perform(WM_SYSCOMMAND, SC_MOVE+2, 2); end; procedure TForm1.FormCreate(Sender: TObject); begin NGB1Height := 73; NGB1Width := 137; end; procedure TForm1.NewGroupBox1EndDock(Sender, Target: TObject; X, Y: Integer); begin // Auf Alte größe setzen if Target = Form1 then begin if Sender = NewGroupBox1 then begin NewGroupBox1.Height := 53; // Aus gemerken Werten NewGroupBox1.Width := 150; // alt Größe wieder Herstellen end; end; end; // Wird nur beim ziehen von einer Komponete procedure TForm1.Panel1GetSiteInfo(Sender: TObject; DockClient: TControl; var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean); var ARect: TRect; begin // nur zum auslesen zu gebrauchen ARect := InfluenceRect; Label1.caption := 'xxx'; end; procedure TForm1.NewGroupBox1GetSiteInfo(Sender: TObject; DockClient: TControl; var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean); begin Label1.caption := 'xxx'; end; procedure TForm1.FormGetSiteInfo(Sender: TObject; DockClient: TControl; var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean); begin Label1.caption := 'xxx'; end; procedure TForm1.FormDockDrop(Sender: TObject; Source: TDragDockObject; X, Y: Integer); begin if Source.Control = NewGroupBox1 then NewGroupBox1.Align := alNone; if Source.Control = NewGroupBox2 then NewGroupBox2.Align := alNone; if Source.Control = Panel2 then Panel2.Align := alNone; end; procedure TForm1.FormDockOver(Sender: TObject; Source: TDragDockObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept := (Source.Control is TNewGroupBox) or (Source.Control is TPanel); end; procedure TForm1.Panel2EndDock(Sender, Target: TObject; X, Y: Integer); begin if Target = Form1 then begin if Sender = Panel2 then begin Panel2.Height := 63; // Aus gemerken Werten Panel2.Width := 100; // alt Größe wieder Herstellen end; end; end; end. //------------------------------------------------------------------------------------------------