Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Пока работает моя программа 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


Наверх

Титульная страница Поиск, карта сайта Написать письмо