Gawayn
Erfahrenes Mitglied
Ich sehe schon, es ist zu kompliziert, um es hier mit Worten zu erklären. Deswegen will ich einmal vollständigen Code hier posten. Den hab ich extra für dich geschrieben .
Mein Programm hat ein Fenster (namens MainWin) mit einem einzigen Button (namens Button). Wenn du mit der rechten Maustaste auf den Button klickst, kannst du ihn ziehen. Die Variable OldDelta ist notwendig, damit der Button nicht dauernd hin- und herspringt. Wenn man nämlich den Button bewegt, während der Mauszeiger über ihm steht, wird ein neues MouseMove-Ereignis ausgelöst, was wiederum ein Bewegen des Buttons verursacht, was wiederum ein MouseMove-Ereignis verursacht... usw. Mit OldDelta berechne ich, ob sich der Mauszeiger tatsächlich selber bewegt hat oder ob sich nur der Button unter dem Mauszeiger bewegt hat. In letzterem Fall darf der Button nicht erneut bewegt werden.
Ist es das, was du realisieren wolltest? Ich hoffe...
Mein Programm hat ein Fenster (namens MainWin) mit einem einzigen Button (namens Button). Wenn du mit der rechten Maustaste auf den Button klickst, kannst du ihn ziehen. Die Variable OldDelta ist notwendig, damit der Button nicht dauernd hin- und herspringt. Wenn man nämlich den Button bewegt, während der Mauszeiger über ihm steht, wird ein neues MouseMove-Ereignis ausgelöst, was wiederum ein Bewegen des Buttons verursacht, was wiederum ein MouseMove-Ereignis verursacht... usw. Mit OldDelta berechne ich, ob sich der Mauszeiger tatsächlich selber bewegt hat oder ob sich nur der Button unter dem Mauszeiger bewegt hat. In letzterem Fall darf der Button nicht erneut bewegt werden.
Ist es das, was du realisieren wolltest? Ich hoffe...
Code:
unit MoveButton_Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
TMainWin = class(TForm)
Button: TButton;
procedure ButtonMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure ButtonClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ButtonMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure ButtonMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
OldPos: TPoint ;
OldDelta: TPoint ;
Dragging: Boolean ;
end;
var
MainWin: TMainWin;
implementation
{$R *.dfm}
procedure TMainWin.ButtonMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if( Button=mbRight ) then
begin
Dragging := True ;
end ;
end;
procedure TMainWin.ButtonClick(Sender: TObject);
begin
ShowMessage( 'Clicked' ) ;
end;
procedure TMainWin.FormCreate(Sender: TObject);
begin
Dragging := False ;
end;
procedure TMainWin.ButtonMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if( Dragging and ((X-OldDelta.X<>OldPos.X) or (Y-OldDelta.Y<>OldPos.Y)) ) then
begin
OldDelta.X := OldPos.X-X ;
OldDelta.Y := OldPos.Y-Y ;
Button.Left := Button.Left-OldDelta.X ;
Button.Top := Button.Top-OldDelta.Y ;
end ;
OldPos.X := X ;
OldPos.Y := Y ;
end;
procedure TMainWin.ButtonMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Dragging := False ;
end;
end.
Zuletzt bearbeitet: