Реализуя OnMouseDown
, OnMouseMove
и OnMouseUp
события управления вы можете позволить пользователю перемещать его так:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
FTableButton : TButton;
FTableButtonDragging : boolean;
FMouseDownLocation : TPoint;
FButtonStartingLocation : TPoint;
procedure TableButtonMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure TableButtonMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure TableButtonMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if not Assigned(FTableButton) then begin
FTableButton := TButton.Create(self);
FTableButton.Parent := self;
FTableButton.Caption := 'I am New';
FTableButton.OnMouseDown := TableButtonMouseDown;
FTableButton.OnMouseMove := TableButtonMouseMove;
FTableButton.OnMouseUp := TableButtonMouseUp;
end;
end;
procedure TForm1.TableButtonMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FTableButtonDragging := true;
FMouseDownLocation := Mouse.CursorPos;
FButtonStartingLocation := TPoint.Create(FTableButton.Left, FTableButton.Top);
end;
procedure TForm1.TableButtonMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if FTableButtonDragging then begin
FTableButton.Left := FButtonStartingLocation.X + (Mouse.CursorPos.X - FMouseDownLocation.X);
FTableButton.Top := FButtonStartingLocation.Y + (Mouse.CursorPos.Y - FMouseDownLocation.Y);
FTableButton.Invalidate;
end;
end;
procedure TForm1.TableButtonMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FTableButtonDragging := false;
end;
end.
Здесь мы добавили три новые процедуры в виде:
procedure TableButtonMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure TableButtonMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
procedure TableButtonMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
и мы назначили эти процедуры как обработчики для событий новой FTableButton
Коллекция:
FTableButton.OnMouseDown := TableButtonMouseDown;
FTableButton.OnMouseMove := TableButtonMouseMove;
FTableButton.OnMouseUp := TableButtonMouseUp;
При нажатии на кнопку вам нужно сохранить местоположение элемента управления и положение мыши, когда вы поместили клик, а также что мышь в данный момент находится down. Три новые поля используются для этого:
FTableButtonDragging : boolean;
FMouseDownLocation : TPoint;
FButtonStartingLocation : TPoint;
При перемещении мыши, то вы можете обновить позицию управления, основанного на его исходном положении, а разница между текущим положением мыши и положение мыши, когда щелчок был сделан.
Это не служба написания кода, а также служба дизайна. Вы должны приложить некоторые усилия в себе. Затем, если вы столкнетесь с определенной проблемой, покажите нам свою проблему, и мы постараемся помочь. Если вы не знаете, как перетащить, то google. Там много материала. – Dsm
@Dsm Что именно делает один Google для того, чтобы сделать кнопку создания объекта в реальном времени –
Это проект * проекта *, а не целенаправленный конкретный вопрос о проблеме программирования *. На первый взгляд, вопрос короткий и легкий, но решение для реализации этого потребует использования множества различных инструментов. Этот тип вопросов не соответствует теме - то, что вы действительно ищете, - это учебник или короткий курс. Если вы хотите спросить здесь, что вам нужно сделать, это разбить эту проблему на более мелкие части - выяснить, что каждый шаг будет достигнуть конечной цели и спросить о * конкретных местах, где вы застряли. –