Главная страница
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.024 c
8-1075968210
SH
2004-02-05 11:03
2004.05.02
Чёрнобелый Jpeg


1-1081844516
snake1977
2004-04-13 12:21
2004.05.02
Наблюдение за окнами


1-1082013961
Yanis
2004-04-15 11:26
2004.05.02
Cursors


14-1080857843
VID
2004-04-02 02:17
2004.05.02
Купил комп...


3-1080896476
kat
2004-04-02 13:01
2004.05.02
создание TADOConnection