![]() |
Модераторы: THandle, bems |
![]() ![]() ![]() |
|
cemick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 416 Регистрация: 6.7.2006 Где: Санкт-Петербург Репутация: 3 Всего: 6 |
Может быть это даже фича, но в делфи 7 модальность модальной формы может чудным образом пропасть.
Делаем следующее: 1. Имеем главную форму, делаем ее fsMDIForm 2. Из главной формы вызываем модально другую fsNormal форму. 3. В модальной форме делаем:
4. Наблюдаем эффект. Главная форма стала доступна и сообщения обрабатываются в цикле обработке очереди модального окна. Может кто сталкивался уже. На всякий случай в файле иллюстрация с exe. Присоединённый файл ( Кол-во скачиваний: 1 ) ![]() |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 4 Всего: 89 |
А в чём баг-то?
Ты ж сам сказал Application.MainForm.Enabled := true; и удивляешься теперь, почему главное окно доступно? -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
cemick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 416 Регистрация: 6.7.2006 Где: Санкт-Петербург Репутация: 3 Всего: 6 |
О-ло-ло! CodeMonkey, тогда может у тебя будут предположения, почему Application.MainForm.Enabled при ShowModal не меняется на false. И почему описанный мною именно баг проявляется только, если главная форма fsMDIForm. Где задокументировано данное поведение? В чем его логика? Точнее я понимаю почему оно становится доступным, но это не отменяет факт бага. Это сообщение отредактировал(а) cemick - 4.2.2011, 10:08 |
|||
|
||||
cemick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 416 Регистрация: 6.7.2006 Где: Санкт-Петербург Репутация: 3 Всего: 6 |
Хотя, сейчас проверил, еще раз, fsMDIFrom не влияет, и с fsNormal тоже самое. CodeMonkey да ты прав, ничего удивительного, кроме того, что Application.MainForm.Enabled не отображает реального состояния,и потому требуется сброс флага. Ок, назовем это не багом, а леностью борландовских разрабов. Интересно, в последних версия Делфи это уже поправили?
|
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 4 Всего: 89 |
В DXE поведение такое же.
Это не баг, а побочный эффект by design, полученный в результате эмуляции. В Delphi модальность реализуется не системными средствами, а эмулируется через Enabled. Однако, при ShowModal свойство Enabled не меняется. Сделано это по той простой причине, что ты сам лично не блокировал окно. И неожиданное переключение Enabled при выполнении несвязанной операции было бы неудачным дизайном. К примеру, если бы ShowModal реализовывал бы модальность средствами системы, то Enabled тоже было бы True. Вот почему оно не меняется, когда ты делаешь ShowModal. Потому что если бы Enabled менялось бы при ShowModal на False, то это была бы привязка к конкретной реализации, раскрытие деталей. Понятно, что если ты руками начинаешь его менять, то вся эмуляция идёт лесом. Вероятно, наилучшим решением было бы игнорировать смену Enabled при ShowModal. Известен и другой пример, когда эмуляция поведения имеет нежелательные эффекты - Application.MainFormOnTaskBar := False. Это сообщение отредактировал(а) CodeMonkey - 4.2.2011, 11:20 -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
cemick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 416 Регистрация: 6.7.2006 Где: Санкт-Петербург Репутация: 3 Всего: 6 |
На счет неожиданности не совсем согласен. И как раз, если это эмуляция то логично видеть цикл по окнам с установкой Enable свойства, который в конечной итоге сделал бы то же самое.
пожалуй да)) |
|||
|
||||
VLK32 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 22.1.2011 Репутация: нет Всего: нет |
Не хочу создавать еще одну тему о багах раз уж такая есть. Так что начну жаловаться прямо здесь.
Около месяца мучаю дженерики. Инструмент конечно супер. Пусть он и опоздал лет на пять. Но есть нюансы. Дженерики в Delphi есть, но они не работают. Суть такова. Начал писать класс на дженериках. Через какое-то время начали сыпаться internal error. Синтаксис естественно в порядке. Лечилось это просто - добавлялась (или удалялась) в код какая-нибудь мишура типа перевода строки или "//" и после это все компилировалось нормально. И так в цикле. Т.е. чтобы откомпилировать программу надо было жать Shift+F9, делать правку и еще раз Shift+F9. Ну то такое. Можно пережить. Но в один прекрасный день был закончен еще один класс на дженериках и все.. приплыл. Вычислил виновника торжества:
Нормально. Пока не используешь экземпляр класса все в шоколаде, как только создаешь - пройдите на выход. Очень полезный получился класс. Я конечно могу его исковеркать и добиться компиляции, но зачем мне такой уродец и такие дженерики? Немного рассуждений. А что делать если internal error посыпались бы когда уже написано несколько десятков классов, тысячи строк кода, потрачена уйма времени и земля горит под ногами? И вдруг ты понимаешь что дженерики просто не работают. Печаль. Я ,будучи честным пиратом и занимаясь дженериками на досуге, не расстраиваюсь и смотрю вперед с оптимизмом. Гудбай, Delphi! Долго я оттягивал этот момент, но пора расчехлять груды талмудов по C# (не зря же я их качал). зы. Использовать дженерики в таком виде в котом они сейчас находятся в крупных проектах - это все равно что путешествовать по зыбучим пескам. Всем удачи! |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 4 Всего: 89 |
Дай угадаю - работал на непатченной D2009?
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
VLK32 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 22.1.2011 Репутация: нет Всего: нет |
Работаю на Delphi 2007 (уговорил шефа купить лицензию). Балуюсь на честно ломанной Delphi 2010 c Update 4 и 5. Кстати расковырял таки в чем беда:
Как видно FItems никакого отношения к дженерикам не имеет. Почему компилятор не может справиться с FItems := Copy(A.FItems); одному богу известно. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Delphi" | |
|
Добро пожаловать в форум группы "Delphi". В разделе разрешается:
Строго запрещено:
Если Вам понравилась атмосфера форума, заходите к нам чаще! Люблю, целую, вечно Ваш, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Форум группы: delphi | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |