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

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

Перетаскивание формы [D6, XP]


Demand ©   (2006-08-11 18:02:00) 

как сделать перетаскивание формы не за заголовок, а за скажем панель?


Loginov Dmitry   (2006-08-12 10:54:00) [1]

> тем что в данной условие будет истинно, даже если кнопка
> была зажата за пределами формы


[11] = False

:)


tButton   (2006-08-12 08:24:00) [2]


> Чем вам ssLeft in Shift

тем что в данной условие будет истинно, даже если кнопка была зажата за пределами формы


Германн   (2006-08-12 01:15:00) [3]

2 Maloy   (12.08.06 00:27) [9]
Опять "магическое число". :-)

Ещё один вариант - обработка WM_NCHITTEST с подменой Result на HTCAPTION.


Maloy   (2006-08-12 00:27:00) [4]


procedure TSysWin.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);

 const SC_DragMove = $F012;
begin
 ReleaseCapture;
 SysWin.perform(WM_SysCommand, SC_DragMove, 0);
end;


Loginov Dmitry   (2006-08-11 19:02:00) [5]

> FCatched : Boolean;



> Bool: Boolean;


У всех что-ли такая привычка - использовать переменные для запоминания факта нажатия клавиши?

Чем вам ssLeft in Shiftне нравится :)


PSPF2003   (2006-08-11 18:50:00) [6]

procedure TFastForm.Image1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
const
 Sc_dragmove = $F012;
begin
 ReleaseCapture;
 Perform(WM_SYSCOMMAND, Sc_dragmove, 0);
end;


Demand   (2006-08-11 18:31:00) [7]

ок спс, я так и делал, но таскать пробовал за разделитель на тоолбаре... все работает


ArtemESC   (2006-08-11 18:30:00) [8]

umbra ©   (11.08.06 18:28) [2]
Эх, не успел...


tButton   (2006-08-11 18:29:00) [9]

а это действительно так нужно?)
можно обрабатывать MouseDown, MouseMove и MouseUp
но есть более красивые способы
их обычно публикуют в учебных пособиях
рядом с "как сделать окно нестандартной формы"


ArtemESC   (2006-08-11 18:29:00) [10]

Demand   (11.08.06 18:02)  
Что то вроде этого не проверял


Bool: Boolean;
X_, Y_: Integer;

procedure TForm1.MouseDown (Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
  Bool := True;
  X_ := X;
  Y_ := Y;
end;

procedure TForm1.MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
var DX, DY: integer;
 begin
 If Bool then
   begin
    DX := X - X_;
    DY := Y - Y_;
    Form1.Top := Form1.Top + DY;
    Form1.Left := Form1.Left + DX;
   end;
 end;

procedure TForm1.MouseUP((Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 Bool := False;
end;

procedure TForm1.Create(Sender: TObject);
begin
 Bool := False
end;


umbra   (2006-08-11 18:28:00) [11]

вот простейший вариант. Недостаток - движение не такое плавное, как при перетаскивании за заголовок.
unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
   FCatched : Boolean;
   FCatchedX : Integer;
   FCatchedY : Integer;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 FCatched := true;
 FCatchedX := X;
 FCatchedY := Y;
end;

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

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
 if FCatched then
   begin
     Left := Left + X - FCatchedX;
     Top := Top + Y - FCatchedY;
   end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 FCatched := False;
end;

end.


Demand   (2006-08-11 18:17:00) [12]

А это действительно так сложно? может и мараться не стоит?


Наверх

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