Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Вниз

Модальное окно прячется за другое окно.   Найти похожие ветки 

 
афвуд2   (2004-03-16 18:09) [0]

Наверно некоторые встречались с непонятным поведением модального окна. Иногда, при потере фокуса приложением, оно(модальное окно) оказывается ниже окна, вызвавшего его. Причём приклада ни на что не реагирует - ну это понятно - окно то модальное(т.е. пока его не закроешь ничего нельзя сделать), а оно не видно, т.е. ни закрыть его и вообще ничего нельзя сделать. Лечится свёртыванием приложения и обратно развёртыванием. Хотелось бы вылечить это на уровне Delphi. Никто не знает способа?


 
Suntechnic ©   (2004-03-16 20:43) [1]

Приложение многопоточное?


 
Sergey Masloff   (2004-03-16 21:11) [2]

Suntechnic ©   (16.03.04 20:43) [1]
>Приложение многопоточное?
Да нет. Обычное. Случается такой глючок хотя и редко.

афвуд2   (16.03.04 18:09)  
А ты разверни на весь экран какое-нибудь постороннее окно и потом сверни его. Модальное вылезет ;-)


 
Suntechnic ©   (2004-03-16 21:17) [3]

>Sergey Masloff   (16.03.04 21:11)
Я почему спросил то.... Такой глюк обычно вылазит когда модальное окно было создано не в основном GUI потоке. Такая проблема в принципе решается через AttachThreadInput, но лучше пересматривать логику программы.

Ну а если всё в одном потоке.... поробуй ALT-TAB.


 
Sergey Masloff   (2004-03-16 21:30) [4]

Suntechnic ©   (16.03.04 21:17) [3]
Я не знаю то это или нет но я пару раз с этим сталкивался. У меня при запуске программы (естественно после создания всего что нужно) была попытка соединения с сервером. Это делалось в отдельном потоке правда. И в случае неудачи этот поток посылал главному Message WM_USER + XXX чтобы главный поток показал юзеру диалог настройки соединения. Так вот иногда этот диалог действительно оказывался ЗА главным окном и помогало закрыть другим приложением (вобщем инвалидировать) мое окно и диалог "всплывал". Происходил глюк КРАЙНЕ редко но имел место быть. А когда у меня дошли руки до него он затаился. Вот уже 2 года, больше тысячи установок - вроде юзеры не жаловались ;-)


 
Suntechnic ©   (2004-03-16 22:01) [5]

>Sergey Masloff   (16.03.04 21:30)
...И в случае неудачи этот поток посылал главному Message WM_USER + XXX


А как посылал? Если через SendMessage, то это именно случай описанный Suntechnic ©   (16.03.04 21:17) [3]. Ведь SendMessage, не ставит сообщение в поток, а вызывает оконную процедуру прямо, т.е. вызов процедуры и как следствие создание окна происходит в доп. потоке.


 
Sergey Masloff   (2004-03-16 22:21) [6]

Suntechnic ©   (16.03.04 22:01) [5]
Не-а. Post конечно.


 
Sergey Masloff   (2004-03-16 22:29) [7]

Suntechnic ©   (16.03.04 22:01) [5]
Слушай, не поленился залез в исходники. Мой же комментарий: обязательно Post чтобы не было ошибки с пропаданием окна.
так что ты прав а у меня память дырявая...


 
афвуд ©   (2004-03-18 18:01) [8]

Есть дополнения к проблеме:
У меня это модальное окно долго открывается(ну там просто ещё много чего делается - выполнение запроса прямо во время открытия окошка - маразм конечно, но мне этого не избежать - можете мне поверить :)) ) и если в этот момент юзер тыкает мышкой по другому окну... модальное окошко прячется.


 
Suntechnic ©   (2004-03-18 18:37) [9]

>афвуд ©
У меня это модальное окно долго открывается(ну там просто ещё много чего делается - выполнение запроса прямо во время открытия окошка - маразм конечно...

Это точно замечено.

... но мне этого не избежать - можете мне поверить :))

Не верим :) Практически любое действие, которое требует некоторого времени, можно вынести в дополнительный поток.

и если в этот момент юзер тыкает мышкой по другому окну... модальное окошко прячется

Трудно по столь скупым объяснением понять что происходит, но я могу поиграть в Нострадамуса....

- Если модальное окно и длительное действие находятся в доп. потоке, тогда см. дискуссию выше.
- Если всё-таки всё находится в одном потоке, тогда окошко никуда не прячется, оно просто не перерисовывается.


 
Гаврила   (2004-03-18 18:46) [10]

первая проблема (без дополнения в посте [8]) - это проблема Билли и операционки, и никакими средствами delphi не вылечится, имхо.

По дополнению к проблеме, присоединяюсь к выше выступавшим товарищам - не верю


 
Defunct ©   (2004-03-18 18:56) [11]

афвуд ©   (18.03.04 18:01) [8]

Модальное окно надо делать со стилем fsStayOnTop


 
афвуд ©   (2004-03-19 12:19) [12]

Ну ок. Расскажу почему нельзя. У меня прога - Дизайнер пользовательских интерфейсов. Что-то типа Delphi - но без программирования(команды типа "Открыть окно", "Выполнить процедуру"(на сервере Oracle)). В общем долго рассказывать. Факт в том, что При открытии окна юзер может навешать много всяких запросов и всего другого. И выводить в отдельный поток нельзя, т.к. прямо в открытом окошке надо увидеть результаты запроса.

Про fsStayOnTop - юзеры ставили это свойство окнам. Не помогло.



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

Форум: "Основная";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.031 c
7-1074221596
Марат
2004-01-16 05:53
2004.04.04
Принтер


6-1074765464
KalmykovSergei
2004-01-22 12:57
2004.04.04
Запуск DialUp через API


1-1079696077
Max
2004-03-19 14:34
2004.04.04
Сортировка в TList


1-1079301312
Troy
2004-03-15 00:55
2004.04.04
паскаль. integer


3-1078378722
user
2004-03-04 08:38
2004.04.04
Как отобразить данные возвращаемые TADOStoredProc





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский