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