大家好,
我想在运行时用鼠标移动自己的组件,就像在设计模式下一样。
直到鼠标按钮释放并且此期间显示一个空框架和提示来显示左上角的位置,才会移动该组件。
我已经尝试了很多次,但迄今为止没有成功。
需要帮助。
大家好,
我想在运行时用鼠标移动自己的组件,就像在设计模式下一样。
直到鼠标按钮释放并且此期间显示一个空框架和提示来显示左上角的位置,才会移动该组件。
我已经尝试了很多次,但迄今为止没有成功。
需要帮助。
$F012
并与TWinControl后代一起使用。procedure TForm.YourComponentMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const
SC_DRAGMOVE = $F012;
begin
ReleaseCapture;
YourComponent.Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
end;
$F008
。procedure TForm.YourComponentMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const
SC_DRAGSIZE = $F008;
begin
ReleaseCapture;
YourComponent.Perform(WM_SYSCOMMAND, SC_DRAGSIZE, 0);
end;
下载演示并进行评估,如果对您有效(包括组件源代码、演示源代码和编译的演示)。
如果你想在运行时移动控件,那么下面的代码可能会对你有帮助(你可能需要稍微修改一下):
var
MouseDownPos, LastPosition : TPoint;
DragEnabled,Resizing : Boolean;
procedure TForm1.ControlMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
MouseDownPos.X := X;
MouseDownPos.Y := Y;
DragEnabled := True;
end;
//handle dragging of controls
procedure TForm1.ControlMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
begin
if DragEnabled then
begin
if Sender is TControl then
begin
TControl(Sender).Left := TControl(Sender).Left + (X - MouseDownPos.X);
TControl(Sender).Top := TControl(Sender).Top + (Y - MouseDownPos.Y);
end;
end;
end;
如果要调整控件的大小,可以使用以下代码:
procedure TForm1.ControlMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
var cntrl : TControl;
begin
cntrl := Sender as TControl;
if ((cntrl.Width - X) < 15) and ((cntrl.Height - Y) < 15) then
cntrl.Cursor := crSizeNWSE
else cntrl.Cursor := crDefault;
if Resizing then
begin
cntrl.Width := cntrl.Width + (X - LastPosition.X);
LastPosition.X := X;
cntrl.Height := cntrl.Height + (Y - LastPosition.Y);
LastPosition.Y := Y;
end;
end;
procedure TForm1.ControlMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var cntrl : TControl;
begin
if ((cntrl.Width - X) < 15) and ((cntrl.Height - Y) < 15) then
begin
LastPosition.X := X;
LastPosition.Y := Y;
Resizing := True;
end;
end;
扩展此功能可能需要将其对齐到网格。这段代码可能需要稍作修改。
SC_DRAGSIZE
实际上是SC_SIZE + WMSZ_BOTTOMRIGHT
。例如,要从左上方进行调整大小,可以使用SC_SIZE + WMSZ_TOPLEFT
。 - Sertac Akyuz