![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Пока работает моя программа Windows не может завершиться [D6, Win95/98]
KommandorDi © (2003-12-01 19:15:00)
В обработчике OnCloseQuery я в некотором случае пишу CanClose:=True, но это не помогает выгрузиться Windows.
Что делать?
KommandorDi (2003-12-04 10:45:00) [1]
Я сделал глупо, но это сработало.
Ранее при отображении формы из трея я выковыривал иконку из трея.
Это я делал вForm.OnShow.
Сейчас я на это забил. Сработало.
По крайней мере прога при завершении работы выгружается нормально и никакой ошибки не выдает.
А то что там не успевает или не может освободится память, я так мыслю, что это не важно: все равно идет ребут.
> LordOfSilence
А можно поподробнее с чем едятAllocateHWnd
Или какую-нибудь ссылочку.
Всем спасибо!!!!!
LordOfSilence (2003-12-04 09:42:00) [2]
Не мучайся попусту. Скорее всего этот трей-компонент создает
свое невидимое окно с помощью AllocateHWnd( ИмяОконнойПроцедуры ). Вот в коде этой оконной процедуры, скорее всего, ошибка. Далее привожу примерный, схематичныйкод этой процедуры:
procedure THANTray.IconWindowProc( var Message : TMessage );
begin
with Message do begin
if Msg = HudTrayWindowMessage then begin
case LParam of
WM_MOUSEMOVE : DoMouseMove();
WM_LBUTTONDOWN : begin
SetForegroundWindow( FIconWindow );
FClickTimer.Enabled := True;
end;
WM_LBUTTONDBLCLK : begin
SetForegroundWindow( FIconWindow );
FIsDblClick := True;
DoDblClick();
end;
WM_RBUTTONDOWN : begin
SetForegroundWindow( FIconWindow );
DoPopup();
PostMessage( FIconWindow, WM_USER, 0, 0 );
end;
end
end
else Result := DefWindowProc( FIconWindow, Msg, WParam, LParam );
end;
end;
Обрати внимание на вызов
else Result := DefWindowProc( FIconWindow, Msg, WParam, LParam );
Alex Konshin (2003-12-04 09:26:00) [3]
procedure TfmToolBar.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
//inherited WMQueryEndSession(Message);
FQuietClose := True; // эта переменная проверяется в FormCloseQuery
Message.Result := Integer(CallTerminateProcs);
Application.Terminate;
end;
KommandorDi (2003-12-04 09:21:00) [4]
А как же я без этой компоненты?
Мне она нужна.
Пока попробуюtry...except
sniknik (2003-12-03 22:38:00) [5]
кстати попробуй убрать эту компоненту.
sniknik (2003-12-03 22:37:00) [6]
> то прога ругалась, что не может освободить память из-под компоненты, которая обеспечивала работу в трее.
ну вот и виновник,
перед самой перезагрузкой или выключением к чему беречь память? ну поставь в try except end; чтобы ошибка не вылезала и все. или так как оно у тебя уже работает.
> В Win2000 прога завершилась, но сам Винд не ушел на ребут
это плохо, это значит твое сообщение обрубило очередь (inherited послал не тот параметр, посмотри что нужно в справке по WM_QUERYENDSESSION (не помню точно ноль/один?) и посылай дальще в явном виде)
KommandorDi (2003-12-03 19:05:00) [7]
в событие
OnCloseSessionя придумал написать только
Application.Terminate, если писатьDestroy, то прога ругалась, что не может освободить память из-под компоненты, которая обеспечивала работу в трее.
Кажись сработало, но не уверен: В Win2000 прога завершилась, но сам Винд не ушел на ребут, и сделал это только после повторногоAlt+F4, а в Win98, все перезагрузилось вроде бы нормально.
Я мало что могу из этого действа объяснить, но так вышло.
Это нормлаьно?
KommandorDi (2003-12-03 18:03:00) [8]
Нет, переменная устанавилвается правильно. Это точно.
Подожди, я попробую вариант sniknik © (03.12.03 08:28)
DeadMeat (2003-12-03 17:19:00) [9]
Вроде везде всё правильно...
У меня была подобная ситуация, только чуть-чуть другая...
CanCloseя выставлял вClosing, которая ставилась вTrueв обработчике WM_QUERYENDSESSION...
А может твояIsRunningне становиться вTrueкогда надо??...
В общем случае пользуйся sniknik © (03.12.03 08:28)
KommandorDi (2003-12-03 16:44:00) [10]
Net Manage не используется.
Описываю случай, когда срабатывает событие OnCloseQuery:
var
IsRunning:Bolean {глобальная переменная}
begin
If (IsRunning)
then
CanClose:=False
else
begin
{... еще освобождение памати у некоторых динамических массивов ...}
CanClose:=True;
end;
end;
>Alex Konshin
Мне надо разрешить Виндам завершить мою прогу, когда они закрываются.
Насколько я знаю, при этом моей проге посылается сообщение WM_QUERYENDSESSION (его я отлавливаю при помощи OnCloswQuery)
Но на практике это не срабатывает
Карелин Артем (2003-12-03 13:24:00) [11]
Halt
sniknik (2003-12-03 08:28:00) [12]
WM_QUERYENDSESSION насколько понимаю = OnCloseQuery,
"крутой" код который рубит компоненты NM
procedure TMainForm.OnCloseSession(var Mess: TMessage); //WM_QUERYENDSESSION
begin
inherited;
Destroy;
end;
на форме естественно
procedure OnCloseSession(var Mess: TMessage); message WM_QUERYENDSESSION;
Alex Konshin (2003-12-03 02:36:00) [13]
Наверняка задается вопрос к пользователю.
Тебе нужно обрабатывать WM_QUERYENDSESSION (пишу по памяти, могу наврать). Я здесь уже приводил кусочек кода, поищи или дождись, когда я до дома дойду, тогда смогу повторить.
DeadMeat (2003-12-02 17:23:00) [14]
> KommandorDi © (01.12.03 19:15)
А что за некоторый случай...??
Anatoly Podgoretsky (2003-12-01 20:03:00) [15]
Net Manage компоненты случайно не используются?
KosilkA (2003-12-01 20:01:00) [16]
попробуй terminate ...или destroy