2016-12-21 23 views
3

У меня есть форма, где я создал кнопку программно, как это:Как я могу позволить пользователю перемещаться или перетаскивать кнопку в форме?

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

end. 

Как я могу позволить пользователю двигаться FTableButton на форме путем перетаскивания его?

+1

Это не служба написания кода, а также служба дизайна. Вы должны приложить некоторые усилия в себе. Затем, если вы столкнетесь с определенной проблемой, покажите нам свою проблему, и мы постараемся помочь. Если вы не знаете, как перетащить, то google. Там много материала. – Dsm

+0

@Dsm Что именно делает один Google для того, чтобы сделать кнопку создания объекта в реальном времени –

+1

Это проект * проекта *, а не целенаправленный конкретный вопрос о проблеме программирования *. На первый взгляд, вопрос короткий и легкий, но решение для реализации этого потребует использования множества различных инструментов. Этот тип вопросов не соответствует теме - то, что вы действительно ищете, - это учебник или короткий курс. Если вы хотите спросить здесь, что вам нужно сделать, это разбить эту проблему на более мелкие части - выяснить, что каждый шаг будет достигнуть конечной цели и спросить о * конкретных местах, где вы застряли. –

ответ

2

Реализуя 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; 

При перемещении мыши, то вы можете обновить позицию управления, основанного на его исходном положении, а разница между текущим положением мыши и положение мыши, когда щелчок был сделан.

+0

Вам нужно быть осторожным в событии OnClick. Это позволяет вам перемещать кнопку, но не нажимать на нее (или она всегда будет щелкать в любом случае - не слишком уверен, какой). Вероятно, на практике вам понадобятся дополнительные состояния, чтобы указать кнопку «не нажата» или дополнительная кнопка, чтобы включить движение. – Dsm

+0

@ Dsm Конечно. Я не пишу учебник здесь - всегда есть миллион вещей, которые нужно соблюдать осторожно при написании реального кода. Это всего лишь минимальный пример того, как OP не застрял. –

+0

Итак, я немного изменил этот код, чтобы таблица была названа в зависимости от того, сколько таблиц было создано {Таблица (i), где i увеличивается каждый раз}, теперь я пытаюсь разрешить пользователю нажимать кнопку несколько раз для создания большего количества таблиц, но я не совсем уверен в том, какой цикл использовать, поскольку не существует какого-либо условия, например, один раз щелкнуть, чтобы можно было перерисовать, чтобы создать другую таблицу, которую я могу использовать. В текущем состоянии после щелчка его нельзя нажать снова. –

 Смежные вопросы

  • Нет связанных вопросов^_^