Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.46 MB
Время: 0.042 c
1-1081804770
LORDMAXX
2004-04-13 01:19
2004.05.02
Как обратится из под Windows к секторам HDD


7-1078774263
Гиричев Руслан
2004-03-08 22:31
2004.05.02
Раскладка клавиатуры


14-1081675876
rams
2004-04-11 13:31
2004.05.02
Turbo Pascal


14-1081346341
}|{yk
2004-04-07 17:59
2004.05.02
Загрузчик данных


4-1078926004
nuflin
2004-03-10 16:40
2004.05.02
Приведите пример с использовнием функции VirtualQueryEx() ///////





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский