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

Вниз

Почему не работает данный код   Найти похожие ветки 

 
Vemer ©   (2003-12-25 20:44) [0]

Здравствуйте.
В приведенном коде я пытаюсь поймать момент сворачивания формы по 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.


 
Игорь Шевченко ©   (2003-12-25 21:52) [1]

А не проще ли ловить по WM_SYSCOMMAND с wParam=SC_MINIMIZE ?


 
shluz ©   (2003-12-26 10:08) [2]

чем проще??


 
YuRock ©   (2003-12-26 10:22) [3]

Удалено модератором


 
alex_*** ©   (2003-12-26 11:12) [4]

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


 
YuRock ©   (2003-12-26 12:05) [5]

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


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

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


 
panov ©   (2003-12-26 12:21) [7]

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

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


 
YuRock ©   (2003-12-26 12:37) [8]

> 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 14:23) [9]

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

procedure WMSize(var Message: TMessage); message WM_Size

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

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


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

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


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

На счет

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

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


 
panov ©   (2003-12-26 16:05) [11]

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

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

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


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

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

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

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

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

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


 
YuRock ©   (2003-12-26 16:38) [13]

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

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


 
panov ©   (2003-12-26 16:51) [14]

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

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


 
panov ©   (2003-12-26 17:06) [15]

>YuRock

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


 
YuRock ©   (2003-12-26 17:10) [16]

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


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

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

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

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


 
YuRock ©   (2003-12-26 17:16) [18]

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


 
panov ©   (2003-12-26 17:20) [19]

>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:34) [20]

Ох... Я и сам могу разобраться почему 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) должны вызываться события! Но они не вызываются...... Если хочешь дальше поспорить - найди меня в аське.


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


> 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.


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

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

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

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


 
Vemer ©   (2003-12-30 12:24) [23]

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

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



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

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

Наверх




Память: 0.53 MB
Время: 0.018 c
14-12485
Manulo
2004-02-13 16:27
2004.03.05
Разыскивается


3-12298
diwin
2004-02-10 00:11
2004.03.05
как программно получить перечень таблиц?


7-12546
Shurik_212
2003-12-17 14:37
2004.03.05
Как узнать, что винда заблокирована?


3-12266
Yurko
2004-02-06 11:30
2004.03.05
Помогите с запросом


1-12393
denik
2004-02-24 19:51
2004.03.05
Как програмно развернуть ComboBox в LookUp поле ?