Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.25;
Скачать: CL | DM;

Вниз

Пока работает моя программа 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.035 c
3-79620
deadbitch
2004-02-01 11:19
2004.02.25
Отрицательные значения в TDBGrid


14-80163
Арр'акктур
2004-01-24 20:44
2004.02.25
Перехват нажатия на 3-ю кнопку крысы


3-79637
ИМХО
2004-01-31 10:03
2004.02.25
TDBGrid с dgMultiSelect


1-79815
Romba
2004-02-11 10:37
2004.02.25
Как в ToolBar сделать чтобы некоторые кнопки были всегда в конце?


8-80034
andre
2003-10-26 16:33
2004.02.25
SDL_MIXER (Jedi-SDL)