![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
KOLOpenSaveDialog мешает закрыться приложению?
Ал © (2003-10-10 08:37:00)Кооперативные приложения обмениваются собственными зарегистрированными сообщениями.
Одно из таких сообщений - сообщение на закрытие приложений.
Если приложение получает его - то должно самостоятельно закрыться, выполняя 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, а потом закрывать все приложение?
Подскажите, знатоки.
Gandalf (2003-10-11 19:58:00) [1]Насчкольку я помню у MHFontDialog - есть хендл (в последней версии) к которому можно обращаться (ReadOnly)... Т.е. править ничего не надо. Насчет mdw диалонрв не помню, а в KOL иалогов handle своего нет, но не так сложно код поправить и такую возможность ввести (WndProc свой сделать).
SPeller (2003-10-11 02:26:00) [2]Можно подправить слегка MHFontDialog и получить хендл окна диалога, и уже по конкретному хендлу слать WM_CLOSE и всё что душе угодно.
mdw (2003-10-10 15:39:00) [3]>...Пользователь открывает 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. :((