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

Вниз

KOLOpenSaveDialog мешает закрыться приложению?   Найти похожие ветки 

 
Ал   (2003-10-10 08:37) [0]

Кооперативные приложения обмениваются собственными зарегистрированными сообщениями.
Одно из таких сообщений - сообщение на закрытие приложений.
Если приложение получает его - то должно самостоятельно закрыться, выполняя Form1.Form.Close.
Проблема:
если в этом приложении пользователем открыт KOLOpenSaveDialog, то приложение, получая сообщение выполняет
1) Form1.Form.Close;
2) обрабатывает событие OnClose;
3) визуально и форма и открытый поверх нее KOLOpenSaveDialog исчезают,
НО:
само приложение не закрывается и в диспетчере задач его видно (пока не снимешь через диспетчер)!
Экспериментировал:
посылал сообщения через PostMessage, SendMessage.
Выяснил:
если приложению, где открыт KOLOpenSaveDialog, послать не один раз это сообщение, а два, причем не PostMessage, а SendMessage, то вроде закрывается. Такое поведение мне непонятно - а потому неприятно.

Другой вопрос.
Приложение запущено одно (кооперативных нет). Пользователь открывает KOLOpenSaveDialog. Затем, не закрывая KOLOpenSaveDialog, хочет сразу закрыть все приложение, используя вызов пункта меню "Выход" через пиктограмму в трее. В пункте меню стоит вызов Form1.Form.Close.
Результат аналогичный:
визуально диалог и форма закрываются, операторы, стоящие в OnClose выполняются, но само приложение не завершается!

И в первом и во втором случае замена Form1.Form.Close на Applet.Close результатов не дала.
D6, Win98. Проект имеет несколько форм (Form1 - главная), используется отдельный компонент Applet.

Предполагаю:
окно KOLOpenSaveDialog открывается в модальном режиме, мешая главной Form1 корректно обработать сообщения на закрытие?
Возможно ли как-то программно сначала закрыть KOLOpenSaveDialog, а потом закрывать все приложение?

Подскажите, знатоки.


 
mdw ©   (2003-10-10 15:39) [1]

>...Пользователь открывает KOLOpenSaveDialog. Затем, не закрывая KOLOpenSaveDialog, хочет сразу закрыть все приложение....

Если в любом приложениии, например том же делфи, открыть ЛЮБОЙ диалог, то нормально приложение закрыть не получится (если не предусмотрена спец. обработка). Это Windows виноваты :))) - диалоговое окно оно на то и диалоговое.... Но это так, к слову.

Возможно ли как-то программно сначала закрыть KOLOpenSaveDialog, а потом закрывать все приложение?

1. Найти окно диалога с помощью FindWindow, но тогда заголовок окна должен иметь уникальное название, среди окон данного класса,
что не очень хорошо :(((.
...
var WND, PWND: HWND;
...
   WND:= FindWindow("#32770", "уникальное название");
   if Wnd <> 0 then begin
     PWND:= GetWindowLong(WND, GWL_HWNDPARENT);
     if PWND = Form.Handle then begin
       SendMessage(WND, WM_CLOSE, 0, 0);
     end;
   end;
...

2. Код ниже закрывает все окна класса "#32770"(open dialog), в текущем потоке.

...
function EnumWinProc(Wnd: HWND; Param: lParam): BOOL; stdcall;
var S: String;
begin
   SetLength(S, 1024);
   SetLength(S, GetClassName(Wnd, PChar(S), 1024));
   if S = "#32770" then
     SendMessage(WND, WM_CLOSE, 0, 0);
   Result := True;
end;
...
var Param: lParam;
...
   EnumThreadWindows(GetCurrentThreadId, @EnumWinProc, Param);
...

Вот только, я не уверен что во всех ОС класс для open dialog -  "#32770". Пробовал под w2000. :((


 
SPeller ©   (2003-10-11 02:26) [2]

Можно подправить слегка MHFontDialog и получить хендл окна диалога, и уже по конкретному хендлу слать WM_CLOSE и всё что душе угодно.


 
Gandalf ©   (2003-10-11 19:58) [3]

Насчкольку я помню у MHFontDialog - есть хендл (в последней версии) к которому можно обращаться (ReadOnly)... Т.е. править ничего не надо. Насчет mdw диалонрв не помню, а в KOL иалогов handle своего нет, но не так сложно код поправить и такую возможность ввести (WndProc свой сделать).



Страницы: 1 вся ветка

Текущий архив: 2004.05.02;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.027 c
7-1078918644
xex
2004-03-10 14:37
2004.05.02
Как в ХР выключить монитор? в 98 то без проблем,


6-1079072036
Ricko
2004-03-12 09:13
2004.05.02
Автоматическая настройка прокси сервера


6-1078908506
_netman_
2004-03-10 11:48
2004.05.02
TCP/IP


8-1075561020
GrayFace
2004-01-31 17:57
2004.05.02
Как убрать(и восстановить) звук в системе?


6-1078708961
Greenpeace
2004-03-08 04:22
2004.05.02
Вопрос новичка: где поискать информацию?