Форум: "KOL";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "KOL";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.035 c