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

Вниз

Перемещение мышкой двух кнопок   Найти похожие ветки 

 
Nub83 ©   (2009-10-09 22:07) [0]

Вот код. Нужно чтоб при удержании ctrl и мышкой можно перетаскивать кнопки. С button1 работает а с button2 нет. Вроде прописал для обоих кнопок... А можно передвинать только первую со второй чот не выходит.
Как сдель чтоб button2 так же можно было таскать?
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Button1MouseUp(Sender: TObject; Button:
TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure Button2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Button2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Button2MouseUp(Sender: TObject; Button:
TMouseButton; Shift: TShiftState; X, Y: Integer);

private
{ Private declarations }
public
{ Public declarations }

MouseDownSpot : TPoint;
Capturing : bool;

end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ssCtrl in Shift then begin
SetCapture(Button1.Handle);
Capturing := true;
MouseDownSpot.X := x;
MouseDownSpot.Y := Y;
end;
end;

procedure TForm1.Button1MouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
begin
if Capturing then begin
Button1.Left := Button1.Left - (MouseDownSpot.x - x);
Button1.Top := Button1.Top - (MouseDownSpot.y - y);
end;
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button:
TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Capturing then begin
ReleaseCapture;
Capturing := false;
Button1.Left := Button1.Left - (MouseDownSpot.x - x);
Button1.Top := Button1.Top - (MouseDownSpot.y - y);
end;

end;

procedure TForm1.Button2MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ssCtrl in Shift then begin
SetCapture(Button1.Handle);
Capturing := true;
MouseDownSpot.X := x;
MouseDownSpot.Y := Y;
end;
end;

procedure TForm1.Button2MouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
begin
if Capturing then begin
Button2.Left := Button2.Left - (MouseDownSpot.x - x);
Button2.Top := Button2.Top - (MouseDownSpot.y - y);
end;
end;

procedure TForm1.Button2MouseUp(Sender: TObject; Button:
TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Capturing then begin
ReleaseCapture;
Capturing := false;
Button2.Left := Button2.Left - (MouseDownSpot.x - x);
Button2.Top := Button2.Top - (MouseDownSpot.y - y);
end;

end;


 
KilkennyCat ©   (2009-10-09 22:17) [1]

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   procedure Edit1MouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Edit1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
var
pt : TList;
begin
   if ssCtrl in Shift then begin
   ReleaseCapture;
   SendMessage(Edit1.Handle, WM_SYSCOMMAND, $F00F, 0);
   TStrings
 end;            
end;

end.


классический пример "magic number" поиграйся с $F00F


 
KilkennyCat ©   (2009-10-09 22:22) [2]


> Как сдель чтоб button2 так же можно было таскать?

проверить правильность назначения событий. Либо сделать общую обработку, и в ней определить, кто ее вызвал. Либо по имени, либо воспользоваться свойством tag

пример:

procedure TForm1.Button2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if (sender as TComponent).tag = 1 then begin...

end else begin...

end;
end;

соответствеено, в инспекторе объектов свойство tag назначить


 
Nub83 ©   (2009-10-09 22:49) [3]

Изменил назначение событий все по прежнему... Как сделать общую обработку?


 
KilkennyCat ©   (2009-10-09 23:01) [4]

unit Unit6;

interface

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

type
TForm6 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Button3: TButton;
   procedure Button3MouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
private
  { Private declarations }
public
  { Public declarations }
end;

var
Form6: TForm6;

implementation

{$R *.dfm}

procedure TForm6.Button3MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if ssCtrl in Shift then begin
    ReleaseCapture;
    SendMessage(TButton(Sender as Tcomponent).Handle, WM_SYSCOMMAND, $F009, 0);
  end;
end;

end.


кнопкам 1 и 2 сделать событие OnMouseMove равным Button3MouseMove


 
KilkennyCat ©   (2009-10-09 23:03) [5]

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


 
Nub83 ©   (2009-10-09 23:12) [6]


> кнопкам 1 и 2 сделать событие OnMouseMove равным Button3MouseMove

Допиши пожалуйста...


 
KilkennyCat ©   (2009-10-09 23:20) [7]

гм... как? картинки вставить? :)
Что такое инспектор объектов понятно?
состоит из двух частей. в левой - свойства, в правой - события. Выбираем компонент (кнопку). переключаемся в инспекторе на событийную часть, и в пустом месте, справа от MouseMove кликаем дважды. Появится имя процедуры, а сама она объявится в коде программы. Теперь выбираем вторую кнопку. лезем тудаже, но уже не щелкаем дважды, а выбираем из списка только что созданную.



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

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

Наверх




Память: 0.49 MB
Время: 0.014 c
15-1253659062
Германн
2009-09-23 02:37
2009.11.22
RAdmin etc.


15-1254213585
alek_1
2009-09-29 12:39
2009.11.22
DBGridEH


2-1254990753
palva
2009-10-08 12:32
2009.11.22
Ошибка при работе с ADODataSet Access тип DEC


6-1210167194
tytus
2008-05-07 17:33
2009.11.22
TRemoteDataModule и IP клиента.


2-1254735726
Серый
2009-10-05 13:42
2009.11.22
query, dbgrid размер ячеек