Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как создать кнопку, которую можно двигать мышью? [D6, XP]


vegarulez ©   (2006-12-07 12:44:00) 

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


DVM   (2006-12-08 10:24:00) [1]

Еще через WM_NCHITTEST можно заставить двигаться.


Elen   (2006-12-08 08:54:00) [2]


> Officeman

Например в [3] замени буттон на панель


Officeman   (2006-12-08 08:40:00) [3]

мм. подскажие пожалуйста. тотже самый вопрос.
только таскать надо TPanel  по форме (захватив панель мышью)

заранее спасибо.


Gydvin   (2006-12-07 15:27:00) [4]

вай дот


Нажимаем контрол )))

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
if ssCtrl in Shift then begin
ReleaseCapture;
SendMessage(Button1.Handle, WM_SYSCOMMAND, 61458, 0);
end;
end;


конечно


Gydvin   (2006-12-07 15:25:00) [5]

Нажимаем контрол )))

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
if ssCtrl in Shift then
ReleaseCapture;
SendMessage(Button1.Handle, WM_SYSCOMMAND, 61458, 0);

end;


Loginov Dmitry   (2006-12-07 14:41:00) [6]

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;


Только с нажатием на саму кнопку - траблы :)


PZ   (2006-12-07 13:36:00) [7]

Вот совсем простой пример для перемещения Image. Наверно его можно приспособить для Button

Var
 Move : Boolean;
 X0, Y0 : Integer;

procedure TDominoFrm.Image1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 If Button <> mbLeft then exit;
 X0 := X;
 Y0 := Y;
 Move := True;
end;      { TDominoFrm.Image1MouseDown }

procedure TDominoFrm.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
 { Одновременное изменение всех координат }
 If Move then With (Sender as TControl).Parent do
   With (Sender as TControl).Parent do
     SetBounds(Left+X-X0, Top+Y-Y0, Width, Height);
end;      { TDominoFrm.Image1MouseMove }

procedure TDominoFrm.Image1MouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 Move := False;
end;      { TDominoFrm.Image1MouseUp }


Elen   (2006-12-07 13:20:00) [8]


> А можно маленький примерчик?

Маленький нет.
Есть средне-большой и на скорую руку :

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Label1: TLabel;
   Button1: TButton;
   procedure Label1DragDrop(Sender, Source: TObject; X, Y: Integer);
   procedure Label1DragOver(Sender, Source: TObject; X, Y: Integer;
     State: TDragState; var Accept: Boolean);
   procedure Label1EndDock(Sender, Target: TObject; X, Y: Integer);
   procedure Label1EndDrag(Sender, Target: TObject; X, Y: Integer);
   procedure Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
   procedure Label1MouseLeave(Sender: TObject);
 private
   { Private declarations }
 public ax,ay:integer;
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Label1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
Button1.tag:=0;
end;

procedure TForm1.Label1DragOver(Sender, Source: TObject; X, Y: Integer;
 State: TDragState; var Accept: Boolean);
var t:Tpoint;al:integer;
begin
t:=form1.ScreenToClient(Mouse.CursorPos);
caption:=tcomponent(sender).Name+'-'+ inttostr(al)+' '+inttostr(t.x-label1.tag);
Button1.Left:=t.x-Button1.tag;
 ax:=x;ay:=y ;
end;

procedure TForm1.Label1EndDock(Sender, Target: TObject; X, Y: Integer);
begin
Button1.tag:=0;
end;

procedure TForm1.Label1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
Button1.tag:=0;
end;

procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
Button1.Tag:=x;
end;

procedure TForm1.Label1MouseLeave(Sender: TObject);
var t:tpoint;
begin
if Button1.Dragging then begin
 t.x:=ax;t.Y:=ay;
 Mouse.CursorPos:=Button1.ClientToScreen(t);
end;
end;

end.


В нем есть подводные камни.


vegarulez   (2006-12-07 13:15:00) [9]

А можно маленький примерчик?

Я просто не совсем понимаю как туда координаты передать
procedure DragDrop(Source: TObject; X, Y: Integer);
Там же X,Y передавать нужно... а у мышки X,Y немного другие нежели у кнопки.


Elen   (2006-12-07 12:58:00) [10]


> vegarulez

DragDrop!


Наверх

Титульная страница Поиск, карта сайта Написать письмо