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.
//------------------------------------------------------------------------------------------------