![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Timer & Messages BUG !!!
AndreyRus © (2006-09-11 04:55:00)Я обнаружил, что сообщение (возможно не только WM_POWERBROADCAST) обрабатывается дважды, если в программе используется таймер.
function TForm1.KOLForm1Message(var Msg: tagMSG; var Rslt: Integer): Boolean;
begin
Result:= false;
if Msg.message = WM_POWERBROADCAST then
begin
MsgOk('APM Event detected - ' + UInt2Str(Msg.wParam));
result:= true;
end;
end;
AndreyRus (2006-10-12 16:57:00) [1]Вот в таком, случае вот код, позволяющий корректно обрабатывать широковещательные сообщения:
function TForm1.KOLForm1Message(var Msg: tagMSG; var Rslt: Integer): Boolean;
begin
Result:= false;
if (Msg.message = WM_POWERBROADCAST ) and (Msg.hwnd = Form.Handle)then
begin
MsgOk('APM Event detected - ' + UInt2Str(Msg.wParam));
result:= true;
end;
end;
Vladimir Kladov (2006-10-11 20:03:00) [2]это комментарий остался неисправленный с тех времен. Правильнее исправить комментарии, что я и сделаю.
AndreyRus (2006-10-11 10:13:00) [3]
> Да, я совсем забыл. В начальных версиях для этого использовался
> апплет.В принципе, несложно сделать IFDEF'ом, чтобы снова
> использовалось окно апплета.
> От апплета не получается правильно уничтожить таймер, потому
> что в этот момент Aplet уже nil.
Уважаемый Владимир! Вы пишите прямо противоположные вещи.
P.S. В посте [27] я указал места в KOL, которые не соответствую реальному положению дел.
Vladimir Kladov (2006-10-10 19:43:00) [4]оставить как есть - я имею в виду как сейчас. С отдельным окном. Окно на все таймеры одно. А не через апплет.
AndreyRus (2006-10-10 17:24:00) [5]> От апплета не получается правильно уничтожить таймер, потому что в этот момент Aplet уже nil.
А как раньше то работало?
> Проще оставить как есть.
Проще то оно проще, но в этом случае необходимо задокументировать эту особенность в реализации таймера, т.к. на эти "грабли" будут периодически наступать.
function NewForm( AParent: PControl; const Caption: String ): PControl;
{* |<#control>
Creates form window object and returns pointer to it. If You use only one form,
and You are not going to do applet button on task bar invisible, it is not
necessary to create also special applet button window - just pass
your (main) form object to Run procedure. In that case, it is a good
idea to assign pointer to your main form object to Applet variable
immediately following creating it - because some objects (e.g. TTimer)
want to have Applet assigned to something.
TTimer = object( TObj )
{* Easy timer incapsulation object. Uses applet window to
receive timer events. So, either assign your main form
to Applet variable or create applet button object (and
assign it to Applet) before enabling timer. }
property Enabled : Boolean read fEnabled write SetEnabled;
{* True, is timer is on. Initially, always False. Before assigning True,
make sure, that Applet global variable is assigned to applet object
(NewApplet) or to form (NewForm). }
Vladimir Kladov (2006-10-08 15:40:00) [6]вообще без окна не получается узнать от какого объекта пришло событие. От апплета не получается правильно уничтожить таймер, потому что в этот момент Aplet уже nil. Проще оставить как есть.
AndreyRus (2006-10-08 14:58:00) [7]Если вообще без окна, то лучше использовать CallBackфункцию указываемую при создании таймера. Либо путем создания бесполезного окна, которому будет приходить сообщение WM_TIMER, в очереди сообщений которого нужно отлавливать и обрабатывать срабатывание таймера.
Vladimir Kladov (2006-10-08 12:17:00) [8]в проектах mck были проблемы с созданием таймера, потому вариант с отдельным окном и пришелся ко двору. Вообще непонятно, чем плохо иметь единственное окно для всех простых таймеров. Для нас главное, что требует мало кода. Я так и не проверил возможность работы вообще без окна, вроде в msdn что-то мельком написано.
AndreyRus (2006-10-08 09:45:00) [9]Я вот, что подумал. Те, кому нужно использование таймера без единого окна, могут реализовать его и на API, т.к. ничего особо сложного в этом нет. Большенство других программ используют хотя бы одно окно. Поэтому, условная директива компиляции должна именно исключатькод создающий дополнительно окно. К тому же это позволит сэкономить несколько байт. Предлагаю назвать директиву - TimerWithWindow.
Vladimir Kladov (2006-10-08 07:49:00) [10]несколько байт будет if. А вот то, чот будет в {} будет больше, и потребует еще кое-чего вне {}.
AndreyRus (2006-10-07 12:49:00) [11]Логично :)
IMHO. В таком случае лучше использовать не директивы условной компиляции, а код размером несколько байт
if Applet = nil then {} else {}
Vladimir Kladov (2006-10-07 11:41:00) [12]Тогда Applet = этой форме.
AndreyRus (2006-10-07 11:15:00) [13]А как быть, если в приложении не используется Applet, а его роль выполняет обычная форма (TKOLForm)?
Vladimir Kladov (2006-10-07 06:39:00) [14]Да, я совсем забыл. В начальных версиях для этого использовался апплет. Потом выяснилось, что есть люди, которые хотят иметь возможность работать с таймером даже при отсутствии в приложении окон. В принципе, несложно сделать IFDEF'ом, чтобы снова использовалось окно апплета. Так всяко лучше для размера, чем проверять наличие присвоенного, и ветвить код.
AndreyRus (2006-10-06 22:23:00) [15]
procedure TTimer.SetEnabled(const Value: Boolean);
begin
if Value then
begin
if TimerOwnerWnd = nil then
begin
TimerOwnerWnd := _NewWindowed( nil, '', TRUE ); // !!!
TimerOwnerWnd.fStyle := 0;
TimerOwnerWnd.fIsControl := TRUE;
end;
end;
Уважаемый Владимир Кладов, а зачем создается дополнительно окно при использовании таймера?
AndreyRus (2006-10-04 19:47:00) [16]
> что происходит, если таймер не активный?
Если таймер не активный, то все работает так как и должно - сообщение приходит однократно. Причем, если MultiMedia:= true, то глюк исчезает.
Unknown Mystic (2006-10-04 12:24:00) [17]А какому все таки каждое из сообщений идет? И что происходит, если таймер не активный?
AndreyRus (2006-10-04 02:16:00) [18]Так почему же, если на форме расположен активный таймер, то приходят два сообщения, а если таймера нет, то одно?
Unknown Mystic (2006-10-01 00:28:00) [19]
> Msg.hwnd отличается.
А то сразу на меня напустились вместо того, чтоб проверить... ;)
Vladimir Kladov (2006-09-30 08:56:00) [20]существуют таймеры с callback ом и таймеры посылающие сообщения окну. Мы используем вторые вроде. Так что особо никакого отношения нет, просто сообщение WM_TIMER должно проходить по тому же маршруту, что и все прочие.