![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перетаскивание формы [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]А это действительно так сложно? может и мараться не стоит?