Форум: "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