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

Вниз

Перетаскиваем окно   Найти похожие ветки 

 
Мишка   (2003-12-17 11:57) [0]

Привет, спецы!

Подскажите плиз, начинающему, какое событие возникает у TForm, когда я перетаскиваю форму?


 
Skier ©   (2003-12-17 11:58) [1]

WM_MOVING


 
Мишка   (2003-12-17 12:07) [2]

Чего-то не работает... :(

TfrmMain = class(TForm)
...
protected
procedure WMMoving(var message :TMessage); message WM_MOVING;
...
end;

procedure TfrmMain.WMMoving(var message : TMessage);
begin
if (message.wParam = SC_MOVE) then
begin
label1.Caption:="Меня двигают!";
end
else inherited;
end;


 
Skier ©   (2003-12-17 12:10) [3]

Ты хоть справку иногда читай...

wParam - edge of window to be moved

WMSZ_BOTTOM Bottom edge
WMSZ_BOTTOMLEFT Bottom-left corner
WMSZ_BOTTOMRIGHT Bottom-right corner
WMSZ_LEFT Left edge
WMSZ_RIGHT Right edge
WMSZ_TOP Top edge
WMSZ_TOPLEFT Top-left corner
WMSZ_TOPRIGHT Top-right corner

lParam - screen coordinates of drag rectangle


 
Мишка   (2003-12-17 12:28) [4]

> Skier © (17.12.03 12:10) [3]

В модуле Windows.pas описано восем переменных:

WMSZ_LEFT = 1;
{$EXTERNALSYM WMSZ_RIGHT}
WMSZ_RIGHT = 2;
{$EXTERNALSYM WMSZ_TOP}
WMSZ_TOP = 3;
{$EXTERNALSYM WMSZ_TOPLEFT}
WMSZ_TOPLEFT = 4;
{$EXTERNALSYM WMSZ_TOPRIGHT}
WMSZ_TOPRIGHT = 5;
{$EXTERNALSYM WMSZ_BOTTOM}
WMSZ_BOTTOM = 6;
{$EXTERNALSYM WMSZ_BOTTOMLEFT}
WMSZ_BOTTOMLEFT = 7;
{$EXTERNALSYM WMSZ_BOTTOMRIGHT}
WMSZ_BOTTOMRIGHT = 8;

Я поставил BreakPoint на строке if (message.wParam = SC_MOVE) then

И когда начинаю двигать форму - программа останавливается на этой строке и...

значение message.wParam = 9

почему?


 
Мишка   (2003-12-17 12:30) [5]

SC_MOVE забыл заменить. :(


 
Skier ©   (2003-12-17 12:37) [6]

wParam :
This parameter can be a combination of the following values:

Читать-то мы будет ?!


 
Мишка   (2003-12-17 12:47) [7]

Угу. :)
Значит, если я двигаю форму, происходит WMSZ_TOPLEFT и WMSZ_TOPRIGHT и получаем 9.

Спасибо за проявленную выдержку.
За культурное и вежливое обяснение. :)

Теперь второй вопрос:

Как мне узнать что перетаскивание завершилось?


 
Skier ©   (2003-12-17 12:49) [8]


>
> Как мне узнать что перетаскивание завершилось?

The WM_MOVE message is sent after a window has been moved.


 
Мишка   (2003-12-17 13:00) [9]

Спасибо.
Будеш в Харькове - с меня пиво!

TfrmMain = class(TForm)
...
protected
procedure WMMoving(var message :TMessage); message WM_MOVING;
procedure WMMove(var message :TMessage); message WM_MOVE;
...
end;

procedure TfrmMain.WMMove(var message : TMessage);
begin
if (message.wParam = тут с чем сравнивать?) then
begin
label1.Caption:="Двигать закончили!";
end
else inherited;
end;


 
Skier ©   (2003-12-17 13:10) [10]


> тут с чем сравнивать?)

не надо здесь ничего сравнивать !


 
Мишка   (2003-12-17 13:59) [11]

Процедуру обработки сообщения WM_MOVE необходимо построить таким образом что-бы учесть все особенности.
Например:

1. WM_MOVE - прилетает раньше чем создается форма (TfrmMain.FormCreate)
2. Необходимо использовать флаг: булеан что-бы при начале движения - присваивать TRUE, по окончании FALSE


 
Skier ©   (2003-12-17 14:02) [12]


> 1. WM_MOVE - прилетает раньше чем создается форма (TfrmMain.FormCreate)

???!!! Это как ?


> 2. Необходимо использовать флаг: булеан что-бы при начале
> движения - присваивать TRUE, по окончании FALSE

Ну и ?


 
Мишка   (2003-12-17 14:07) [13]

procedure TfrmMain.FormCreate(Sender: TObject);
begin
BreakPoint1 StartDrop:=True;
end;

procedure TfrmMain.WMMove(var message : TMessage);
begin
BreakPoint2 if frmMain.Active then
if not StartDrop then
begin
label1.Caption:="Остановили.";
StartDrop:=True;
end;
end;

При пошаговой отладке программа сначала останавливается на BreakPoint2 а потом на BreakPoint1


 
Skier ©   (2003-12-17 14:11) [14]

Есть хороший метод TWinControl.HandleAllocated
Это то что тебе нужно...


 
Мишка   (2003-12-18 18:24) [15]

Решил вопрос!

TfrmMain = class(TForm)
...
protected
procedure WMMoving(var message :TMessage); message WM_MOVING;
...
end;

procedure TfrmMain.WMMoving(var message : TMessage);
begin
if (message.wParam = 9) then
begin
frmAdd.Left:=frmMain.Left+ShiftLeft;
frmAdd.Top:=frmMain.Top+ShiftTop;
end
else inherited;
end;

procedure TfrmAdd.FormDeactivate(Sender: TObject);
begin
ShiftLeft:=frmAdd.Left - frmMain.Left;
ShiftTop:=frmAdd.Top - frmMain.Top;
end;



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

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

Наверх




Память: 0.5 MB
Время: 0.02 c
14-12123
guest_Dmitry
2003-12-13 15:37
2004.01.05
Учет компьютерной техники


14-12070
}|{yk
2003-12-08 16:36
2004.01.05
Фильм Калигула


14-12133
Beaver
2003-12-13 14:21
2004.01.05
Глюки компиляции


4-12198
Kinder
2003-11-04 16:15
2004.01.05
месторасположение TaskBara


1-11976
Intro
2003-12-17 23:19
2004.01.05
SaveDialog - как сним боротся?