Главная страница
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.034 c
3-11772
peypivo
2003-12-09 18:12
2004.01.05
TDbgrid


14-12067
Style
2003-12-15 18:36
2004.01.05
Люди ХЕЛП!!!! TToolButton или TImageList


4-12199
X-Disa
2003-11-04 15:40
2004.01.05
Снова окна


7-12179
genek84
2003-10-24 12:42
2004.01.05
Проблема с отображение JPEG в Image


1-11891
GH@ST
2003-12-18 13:38
2004.01.05
TreeView определение родителя