Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему не работает данный код [D6, WinME]


Страницы:   1 2

Vemer ©   (2003-12-25 20:44:00) 

Здравствуйте.
В приведенном коде я пытаюсь поймать момент сворачивания формы по WM_Size, но ничего не работает. Помогите разобраться пожалуйста.
unit F_Main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
protected
procedure WMSize(var Message: TMessage); message WM_Size;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMSize(var Message: TMessage);
begin
If Message.wParam = SIZE_MINIMIZED Then ShowMessage("KUKU");
inherited;
end;

end.


Vemer   (2003-12-30 12:24:00) [1]

Всем спасибо, автор все равно ничего не понял и просто переделал в другом месте, чтоб не заниматься непонятными вещами с WinApi.

Всех с наступающими.


Игорь Шевченко   (2003-12-26 23:20:00) [2]

Вдогонку к предыдущему посту: это одна из несогласнованностей в документации MSDN. Если бы этот абзац был написан в Remarks к WM_SIZE и WM_MOVE, а не только к WM_WINDOWPOSCHANGED, то причина разрешилась бы гораздо быстрее. И ветка бы так не разрослась :))

Для MDIChild-форм, например, процедура автора работает нормально.

Автору: В случае таких вот непонятных явлений нужно запускать WinSight или Spy++ и детально анализировать сообщения, приходящие окну.


Игорь Шевченко   (2003-12-26 23:12:00) [3]


> YuRock © (26.12.03 12:37) [8]
> > Alexander S.
> К сведению: с сообщением WM_SIZE проходит параметр fwSizeType,
> который может принимать следующие значения: SIZE_MAXHIDE,
> SIZE_MAXIMIZED, SIZE_MAXSHOW, SIZE_MINIMIZED, SIZE_RESTORED.


Также к сведению:

By default, the DefWindowProc function sends the WM_SIZE and WM_MOVE messages to the window. The WM_SIZE and WM_MOVE messages are not sent if an application handles the WM_WINDOWPOSCHANGED message without calling DefWindowProc. It is more efficient to perform any move or size change processing during the WM_WINDOWPOSCHANGED message without calling DefWindowProc.


YuRock   (2003-12-26 17:34:00) [4]

Ох... Я и сам могу разобраться почему Delphi глючит! При чем здесь это... Активация должна обрабатываться для всех окон (так в Windows задумано)! Через API все работает же. Если сделать так:

...
protected
procedure WndProc(var Msg: TMessage); override;
...

procedure TForm1.WndProc(var Msg: TMessage);
begin
inherited;
case Msg.Msg of
WM_ACTIVATE: begin
if Msg.WParamLo = WA_ACTIVE then
Caption := "ACTIVE"
else
Caption := "INACTIVE";
end;
end;
end;


То все работает отлично! А именно при WM_ACTIVATE (или WM_NCACTIVATE для MDI) должны вызываться события! Но они не вызываются...... Если хочешь дальше поспорить - найди меня в аське.


panov   (2003-12-26 17:20:00) [5]

>YuRock © (26.12.03 17:16) [18]

В OnActivate обрабатываются сообщения CM_ACTIVATE для тех форм и контролов, которые имеют Parent.
У Application.MainForm Parent=nil, поэтому и не отрабатывают эти методы.

procedure DoNestedActivation(Msg: Cardinal; Control: TWinControl; Form: TCustomForm);
begin
if Control = nil then Exit;
{ Find the closest parent which is a form }
while (Control.Parent <> nil) and not (Control is TCustomForm) do
Control := Control.Parent;
if Assigned(Control) and (Control <> Form) then
SendMessage(Control.Handle, Msg, 0, 0)
end;


YuRock   (2003-12-26 17:16:00) [6]

Не понял. Почему? Сообщение WM_ACTIVATE приходит! Я это там могу обрабатывать! Почему не работают OnActivate/OnDeActivate? (Вернее работают, но иногда)


panov   (2003-12-26 17:11:00) [7]

>YuRock © (26.12.03 17:10) [16]

Для Application.MainForm и не будет отрабатывать-)

Только для других форм из проекта.


YuRock   (2003-12-26 17:10:00) [8]

Быть не может. Ты извини, но panov@hotbox.ru я на скину проэкт


panov   (2003-12-26 17:06:00) [9]

>YuRock

Всё прекрасно отрабатывает, на активацию и деактивацию срабатывают соответствующие методы.


panov   (2003-12-26 16:51:00) [10]

>YuRock © (26.12.03 16:35) [12]

Ну учить я не учу, а вот пример этот попробую-)


YuRock   (2003-12-26 16:38:00) [11]

А вообще таких примеров море. Приводить больше не буду.

И вообще - хоче сказать, что не смотря на эти глючки я все-равно считаю VCL лучшей библиотекой классов (оконных)!


YuRock   (2003-12-26 16:35:00) [12]

> panov ©
А насчет времени - так если его потратить один раз на решение проблем и исправление ошибок в коде, то экономия оного значительно превысит его расходы.

Только не надо меня учить!

>Хотелось бы посмотреть на эти примеры.
Сделай форму (бордюр - скажем, bsSingle), и на OnActivate и OnDeActivate повесь, например, ShowMessage("Act") и ShowMessage("DeAct") соответственно. Потом создай форму с бордюром bsDialog и вызывай его модально по нажатию на кнопку первой формы.
Никаких сообщений ты не увидишь! (только при запуске - одно и все).
Этот глюк тянется с Delphi2!
А если через WndProc обрабатывать WM_ACTIVATE - все приходит и обрабатывается отлично!

Так что, найдешь ошибки в "этих функциях"? - в них одна строка - ShowMessage.

Если что-то не получится - могу скинуть тебе на почту проэкт. Можешь меня и в аське найти по анкете


panov   (2003-12-26 16:05:00) [13]

>YuRock © (26.12.03 14:56) [10]
Тебе привести примеры, когда глючат всякие события типа OnPaint, OnActivate?... Не стоит тратить на это время.

Хотелось бы посмотреть на эти примеры.
Больше чем уверен, что дело не в "глюкавости процедур и методов", а в том, как они написаны.

А насчет времени - так если его потратить один раз на решение проблем и исправление ошибок в коде, то экономия оного значительно превысит его расходы.


YuRock   (2003-12-26 14:56:00) [14]

> panov ©
Ты очень уверенно сказал, что вот эта процедура работает нестабильно


Не надо ничего придумывать за меня и тем более переиначиватьмои слова! Я сказал, что "такого рода" функции работают не всегда. И я в этом уверен! Тебе привести примеры, когда глючат всякие события типа OnPaint, OnActivate?... Не стоит тратить на это время.

На счет

procedure WMSize(var Message: TMessage); message WM_Size;

я ничего не говорю - я сразу не заметил этой записи. Меня сбила с толку запись Inherited - я думал, что это перекрытый метод (такой есть у TWinControl), но он private! - Т.е. естественно лажа. Потом только заметил... Но я уже выше извинялся


panov   (2003-12-26 14:23:00) [15]

>YuRock © (26.12.03 12:37) [8]

procedure WMSize(var Message: TMessage); message WM_Size

Ты очень уверенно сказал, что вот эта процедура работает нестабильно, и вообще, что это дурь, если переиначить твои слова.

Объясни, если ты в этом так уверен?


YuRock   (2003-12-26 12:37:00) [16]

> Alexander S.
К сведению: с сообщением WM_SIZE проходит параметр fwSizeType, который может принимать следующие значения: SIZE_MAXHIDE, SIZE_MAXIMIZED, SIZE_MAXSHOW, SIZE_MINIMIZED, SIZE_RESTORED.

Так вот: только если fwSizeType = SIZE_RESTORED, окно меняет размеры, в остальных случаях WM_SIZE имеет прямое отношение к "сворачиванию/разворачиванию". F1 надо нажимать.

> panov ©
> Не надо говорить то, в чем не уверен.
А в чем я не уверен (из того, что сказал)?


panov   (2003-12-26 12:21:00) [17]

>YuRock © (26.12.03 10:22) [3]

Не надо говорить то, в чем не уверен.


Alexander S.   (2003-12-26 12:15:00) [18]

делать надо как [1]
по логике, изменение размера окна к сворачиванию вообще никак не относится.


YuRock   (2003-12-26 12:05:00) [19]

> alex_***
Я гнал не на человека, а на Delphi - читай повнимательней! Все равно извиняюсь, если кого-то задел


alex_***   (2003-12-26 11:12:00) [20]

если Form1 - MainForm, то можно ловить Application.OnMinimize
зы [3] -> чем гнать на человека, F1 нажал бы сначала.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо