Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-12034
Ufa
2003-12-14 14:39
2004.01.05
Хакнули сайт помогите разобраться


14-12066
Sergo
2003-12-09 16:53
2004.01.05
Компонент


1-11892
prophet
2003-12-21 22:29
2004.01.05
Что такое TTreeView.Workareas?


3-11834
Марат
2003-12-08 07:24
2004.01.05
DBComboBox


6-12028
senya
2003-11-05 15:00
2004.01.05
запуск html файла





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский