Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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.033 c
14-80215
Clift
2004-02-05 17:38
2004.02.25
ХР


1-79715
Rulezz
2004-02-12 17:25
2004.02.25
как использовать HTTP -протокол?


7-80307
--= Eagle =--
2003-12-06 09:16
2004.02.25
Как читать байты из памяти запущенной проги?


6-80075
Makep
2003-12-15 23:38
2004.02.25
Прослушивание UDP порта


14-80096
MPS
2004-02-03 10:55
2004.02.25
Чайнические вопросы по Линуксу





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский