Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Перетаскиваемая кнопка


Автор: Oleg 15.9.2005, 09:36
Как сделать чтобы кнопку можно было таскать по всей форме? Не в док но в драг-режиме.

Автор: Akella 15.9.2005, 09:39
Почитай в DRKB или FAQ`е статью про Drag&Drop

Автор: Poseidon 15.9.2005, 16:47
Цитата(Oleg @ 15.9.2005, 09:36)
Как сделать чтобы кнопку можно было таскать по всей форме?
Вот, набрасал на скорую руку:

Код
var
  Form1: TForm1;
  move: boolean;
  tX, tY: integer;

implementation

{$R *.dfm}

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
move:= True;
tX:= Mouse.CursorPos.X - Form1.Left - Button1.Left;
tY:= Mouse.CursorPos.Y - Form1.Top - Button1.Top;
end;

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if move then
  begin
  Button1.Left:= Mouse.CursorPos.X - Form1.Left - tX;
  Button1.Top:= Mouse.CursorPos.Y - Form1.Top  - tY;
  end;
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
Move:= false;
end;


Автор: Vet 15.9.2005, 16:55
Очень просто smile

Код

var
 Coord: TPoint;

...

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if ssLeft in Shift then
  begin
   Button1.BeginDrag(true);
   Coord := Point(X, Y);
  end;
end;

procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
 Accept := Source is TButton;
end;

procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
 Button1.Left := X - Coord.X;
 Button1.Top := Y - Coord.Y;
end;

Автор: Poseidon 15.9.2005, 17:02
Vet, не плохой пример. Но я бы добавил еще в FormDragDrop вот что:

Код
procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
Button1.Visible:= False;
Button1.Left := X - Coord.X;
Button1.Top := Y - Coord.Y;
Button1.Visible:= True;
end;


Мелькание кнопки раздражает. smile

Автор: Vet 15.9.2005, 17:10
Цитата
Мелькание кнопки раздражает

Poseidon, а ты ничего не перепутал? У меня ничего не мелькает, во время перетаскивания (FormDragOver) ничего же не перерисовывается, только разрешается перетаскивание:
Код

Accept := Source is TButton;

Автор: Poseidon 15.9.2005, 17:14
Vet, а ты попробуй сам, потягай. Мелькание заметно. Не все время, но есть. smile

Автор: Yanis 15.9.2005, 19:31
To Oleg
Можно ещё седлать это так:
Код

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
const
  SC_DragMove = $F012;
begin
  ReleaseCapture;
  Button1.perform(WM_SysCommand, SC_DragMove, 0);
end;

Автор: Vet 15.9.2005, 20:35
Poseidon, хоть убей, а не мелькает! smile Форма, на ней кнопка и больше ничего..

To Yanis:
Так тоже ничего, даже с рамкой smile
Только надо бы это дело в OnMouseMove засунуть, а то кнопка не нажимается. Интересно, откуда такое значение константы?

Автор: Yanis 16.9.2005, 00:23
To Vet
А как ты себе представляешь кнопку которую можно и таскать и нажимать!? Я с трудом.... Но твою идею можно реализовать, если ввести флаг, который будет указывать в каком режиме кнопка: таскающаяся smile, нажимающаяся. Мне видится это так:
Код

...

var
  Form1: TForm1;
  Dragging: Boolean = false;

...

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
const
  SC_DragMove = $F012;
begin
  if (not Dragging) then Exit;
  ReleaseCapture;
  Button1.perform(WM_SysCommand, SC_DragMove, 0);
end;

Цитата(Vet @ 15.9.2005, 20:35)
Интересно, откуда такое значение константы?
Если честно, то мне тоже очень хочется узнать smile

Автор: Poseidon 16.9.2005, 16:08
Цитата(Yanis @ 16.9.2005, 00:23)
А как ты себе представляешь кнопку которую можно и таскать и нажимать!?
Yanis, все предыдущие примеры (мой и Vetа) имеено так и делали. И тоскать можно и нажимать. smile

Автор: Vet 17.9.2005, 13:58
Согласен, зачем нужна такая кнопка, которую нажать нельзя?

Автор: Poseidon 17.9.2005, 14:12
Цитата(Vet @ 17.9.2005, 13:58)
зачем нужна такая кнопка, которую нажать нельзя?
Что бы её таскать smile

Oleg, ну что, хоть помогло что-нибудь?

Автор: Yanis 18.9.2005, 21:59
To Poseidon
Цитата(Poseidon @ 16.9.2005, 16:08)
Yanis, все предыдущие примеры (мой и Vetа) имеено так и делали. И тоскать можно и нажимать.

Я же написал:
Цитата(Yanis @ 15.9.2005, 19:31)
Можно ещё седлать это так:

(пускай и с ошибкой в слове "сделать" smile Я своего мнения не навязываю...)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)