Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.03.05;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.03.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.008 c
1-12339
kamerad
2004-02-21 22:43
2004.03.05
TRichView


14-12489
V-Isa
2004-02-12 16:40
2004.03.05
Алгоритм подсчета счастливых чисел


4-12580
Marco
2003-12-26 22:33
2004.03.05
Named pipes


14-12515
SergP
2004-02-08 10:54
2004.03.05
Модем не понимает сигнала


11-12309
BelchonokH
2003-06-10 21:02
2004.03.05
MHToolTip куда пропадают подсказки?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский