Форум: "Основная";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];
ВнизПеретаскиваем окно Найти похожие ветки
← →
Мишка (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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c