// Wenn bei der Form BorderStyle=bsNone ist, fehlt die Titelleiste
// um das Ganze mit der Maus verschieben zu können. Oder man möchte,
// dass der Anwender bestimmte Komponenten bei laufendem Programm
// selbst arrangieren kann. Dafür kann man eine der nachfolgenden
// Lösungen benutzen.


// Getestet mit D4 unter Win98

// 1.
// Ein Beispiel, wie man Button1 mit der Maus auf Form1 hin- und  
// herschieben kann, wenn man gleichzeitig die ALT-Taste gedrückt hält: 
 
var 
  Punkt: TPoint; 
  Schiebung: boolean; 
 
 
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin 
  if ssAlt in Shift then begin 
    SetCapture(Button1.Handle); 
    Schiebung := true; 
    Punkt.X := X; 
    Punkt.Y := Y; 
  end; 
end; 
 
procedure TForm1.Button1MouseMove(Sender: TObject; 
  Shift: TShiftState; X, Y: Integer); 
begin 
  if Schiebung then 
    Button1.SetBounds(Button1.Left - (Punkt.x - x), Button1.Top - (Punkt.y - y), 
      Button1.Width, Button1.Height); 
end; 
 
procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin 
  if Schiebung then begin 
    ReleaseCapture; 
    Schiebung := false; 
  end; 
end;

 
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
 
// 2.
// Eine allgemeine Möglichkeit, um Fenster oder Komponenten zu verschieben wäre:  
 
procedure schieben(tob: TObject);  
begin  
  releaseCapture;  
  tcontrol(tob).perform(WM_SysCommand, $F012, 0);  
end;  
  
// Form1 auf dem Desktop verschieben  
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;  
  Shift: TShiftState; X, Y: Integer);  
begin  
  if button = mbleft then schieben(sender);  
end;  
  
// Panel1 über die Form schieben  
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;  
  Shift: TShiftState; X, Y: Integer);  
begin  
  if button = mbleft then schieben(sender);  
end;  
  
// Form1 durch Anklicken von Panel2 verschieben 
// (siehe auch Punkt 5)
procedure TForm1.Panel2MouseDown(Sender: TObject; Button: TMouseButton;  
  Shift: TShiftState; X, Y: Integer);  
begin  
  if button = mbleft then schieben(Form1);  
end;

  
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
  
// 3.
// Eine weitere Methode um ein Fenster zu verschieben:  
  
...  
private  
procedure WmNCHitTest(var Msg: TWMNCHitTest); message WM_NCHITTEST;  
public  
  { Public-Deklarationen}  
end;  
  
var  
  Form1: TForm1;  
  
implementation  
  
{$R *.DFM}  
  
procedure TForm1.WmNCHitTest(var Msg: TWMNCHitTest);  
begin  
  DefaultHandler(Msg);  
  if Msg.Result = HTCLIENT then  
    Msg.Result := HTCAPTION;  
end;  


// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
  
// 4.
// Komponenten, die nicht auf die oben genannten Prozeduren reagieren
// (z.B. TImage), kann man z.B. so verschieben:  
  
var  
  diffw, diffs: integer;  
  isdown: boolean;  
  
procedure festlegen(tco: TControl);  
var p: TPoint;  
begin  
  getcursorpos(p);  
  diffw := p.x - tcontrol(tco).left;  
  diffs := p.y - tcontrol(tco).top;  
  isdown := true;  
end;  
  
procedure verschieben(tco: TControl);  
var p: TPoint;  
begin  
  if isdown then begin  
    getcursorpos(p);  
    tco.setbounds(p.x - diffw, p.y - diffs, tco.width, tco.height);  
  end;  
end;  
  
// Image1 auf Form1 verschieben  
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;  
  Shift: TShiftState; X, Y: Integer);  
begin  
  festlegen(tcontrol(sender));  
end;  
  
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,  
  Y: Integer);  
begin  
  verschieben(tcontrol(sender));  
end;  
  
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;  
  Shift: TShiftState; X, Y: Integer);  
begin  
  isdown := false;  
end;  

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
// 5.
// Fenster verschieben mittels eines Panels mit Änderung des Kursors im Moment
// des Drückens der linken Maustaste für dieses Panel :

const 
  unten: boolean = false; 
 
var 
  Punkt: TPoint; 
 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  Panel1.Cursor := crCross; 
end; 
 
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin 
  if Button = mbLeft then 
  begin 
    unten := True; 
    Punkt := Point(X, Y); 
    Panel1.Cursor := crSizeAll; 
    ReleaseCapture; 
    Application.processmessages; 
    SetCapture(Panel1.handle); 
  end; 
end; 
 
procedure TForm1.Panel1MouseMove(Sender: TObject; 
  Shift: TShiftState; X, Y: Integer); 
begin 
  if unten then 
    SetBounds(Left - Punkt.x + x, Top - Punkt.y + y, Width, Height); 
end; 
 
procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin 
  if unten then 
  begin 
    unten := False; 
    Panel1.Cursor := crCross; 
  end; 
end; 



Zugriffe seit 6.9.2001 auf Delphi-Ecke