Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.24;
Скачать: CL | DM;

Вниз

Как создать кнопку, которую можно двигать мышью?   Найти похожие ветки 

 
vegarulez ©   (2006-12-07 12:44) [0]

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


 
Elen ©   (2006-12-07 12:58) [1]


> vegarulez

DragDrop!


 
vegarulez ©   (2006-12-07 13:15) [2]

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

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


 
Elen ©   (2006-12-07 13:20) [3]


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

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

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.


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


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

Вот совсем простой пример для перемещения 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 }


 
Loginov Dmitry ©   (2006-12-07 14:41) [5]

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;


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


 
Gydvin ©   (2006-12-07 15:25) [6]

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

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;


 
Gydvin ©   (2006-12-07 15:27) [7]

вай дот


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

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;


конечно


 
Officeman   (2006-12-08 08:40) [8]

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

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


 
Elen ©   (2006-12-08 08:54) [9]


> Officeman

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.12.24;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.167 c
5-1145681307
mufan
2006-04-22 08:48
2006.12.24
TListView - заполнение ячейки текстом


8-1147104861
NORDmen
2006-05-08 20:14
2006.12.24
прорисовать линию между компонентами


15-1164790906
Юрий Зотов
2006-11-29 12:01
2006.12.24
Шутка от BIOS


3-1160650236
svt
2006-10-12 14:50
2006.12.24
Подскажите пожайлусата как отображать данные real в бд


15-1165178576
Real
2006-12-03 23:42
2006.12.24
Тюнеры от AverMedia - управление громкостью