Форум: "Система";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
ВнизПока работает моя программа Windows не может завершиться Найти похожие ветки
← →
KommandorDi (2003-12-01 19:15) [0]В обработчике OnCloseQuery я в некотором случае пишу CanClose:=True, но это не помогает выгрузиться Windows.
Что делать?
← →
KosilkA (2003-12-01 20:01) [1]попробуй terminate ...или destroy
← →
Anatoly Podgoretsky (2003-12-01 20:03) [2]Net Manage компоненты случайно не используются?
← →
DeadMeat (2003-12-02 17:23) [3]> KommandorDi © (01.12.03 19:15)
А что за некоторый случай...??
← →
Alex Konshin (2003-12-03 02:36) [4]Наверняка задается вопрос к пользователю.
Тебе нужно обрабатывать WM_QUERYENDSESSION (пишу по памяти, могу наврать). Я здесь уже приводил кусочек кода, поищи или дождись, когда я до дома дойду, тогда смогу повторить.
← →
sniknik (2003-12-03 08:28) [5]WM_QUERYENDSESSION насколько понимаю = OnCloseQuery,
"крутой" код который рубит компоненты NM
procedure TMainForm.OnCloseSession(var Mess: TMessage); //WM_QUERYENDSESSION
begin
inherited;
Destroy;
end;
на форме естественно
procedure OnCloseSession(var Mess: TMessage); message WM_QUERYENDSESSION;
← →
Карелин Артем (2003-12-03 13:24) [6]Halt
← →
KommandorDi (2003-12-03 16:44) [7]Net Manage не используется.
Описываю случай, когда срабатывает событие OnCloseQuery:
var
IsRunning:Bolean {глобальная переменная}
begin
If (IsRunning)
then
CanClose:=False
else
begin
{... еще освобождение памати у некоторых динамических массивов ...}
CanClose:=True;
end;
end;
>Alex Konshin
Мне надо разрешить Виндам завершить мою прогу, когда они закрываются.
Насколько я знаю, при этом моей проге посылается сообщение WM_QUERYENDSESSION (его я отлавливаю при помощи OnCloswQuery)
Но на практике это не срабатывает
← →
DeadMeat (2003-12-03 17:19) [8]Вроде везде всё правильно...
У меня была подобная ситуация, только чуть-чуть другая...
CanClose
я выставлял вClosing
, которая ставилась вTrue
в обработчике WM_QUERYENDSESSION...
А может твояIsRunning
не становиться вTrue
когда надо??...
В общем случае пользуйся sniknik © (03.12.03 08:28)
← →
KommandorDi (2003-12-03 18:03) [9]Нет, переменная устанавилвается правильно. Это точно.
Подожди, я попробую вариант sniknik © (03.12.03 08:28)
← →
KommandorDi (2003-12-03 19:05) [10]в событие
OnCloseSession
я придумал написать только
Application.Terminate
, если писатьDestroy
, то прога ругалась, что не может освободить память из-под компоненты, которая обеспечивала работу в трее.
Кажись сработало, но не уверен: В Win2000 прога завершилась, но сам Винд не ушел на ребут, и сделал это только после повторногоAlt+F4
, а в Win98, все перезагрузилось вроде бы нормально.
Я мало что могу из этого действа объяснить, но так вышло.
Это нормлаьно?
← →
sniknik (2003-12-03 22:37) [11]> то прога ругалась, что не может освободить память из-под компоненты, которая обеспечивала работу в трее.
ну вот и виновник,
перед самой перезагрузкой или выключением к чему беречь память? ну поставь в try except end; чтобы ошибка не вылезала и все. или так как оно у тебя уже работает.
> В Win2000 прога завершилась, но сам Винд не ушел на ребут
это плохо, это значит твое сообщение обрубило очередь (inherited послал не тот параметр, посмотри что нужно в справке по WM_QUERYENDSESSION (не помню точно ноль/один?) и посылай дальще в явном виде)
← →
sniknik (2003-12-03 22:38) [12]кстати попробуй убрать эту компоненту.
← →
KommandorDi (2003-12-04 09:21) [13]А как же я без этой компоненты?
Мне она нужна.
Пока попробуюtry...except
← →
Alex Konshin (2003-12-04 09:26) [14]
procedure TfmToolBar.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
//inherited WMQueryEndSession(Message);
FQuietClose := True; // эта переменная проверяется в FormCloseQuery
Message.Result := Integer(CallTerminateProcs);
Application.Terminate;
end;
← →
LordOfSilence (2003-12-04 09:42) [15]Не мучайся попусту. Скорее всего этот трей-компонент создает
свое невидимое окно с помощью 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 );
← →
KommandorDi (2003-12-04 10:45) [16]Я сделал глупо, но это сработало.
Ранее при отображении формы из трея я выковыривал иконку из трея.
Это я делал вForm.OnShow
.
Сейчас я на это забил. Сработало.
По крайней мере прога при завершении работы выгружается нормально и никакой ошибки не выдает.
А то что там не успевает или не может освободится память, я так мыслю, что это не важно: все равно идет ребут.
> LordOfSilence
А можно поподробнее с чем едятAllocateHWnd
Или какую-нибудь ссылочку.
Всем спасибо!!!!!
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.05 c