Модераторы: THandle, bems
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Забавный баг, ShowModal и MDI 
:(
    Опции темы
cemick
Дата 3.2.2011, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 416
Регистрация: 6.7.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 6



Может быть это даже фича, но в делфи 7 модальность модальной формы может чудным образом пропасть. 
Делаем следующее: 
1. Имеем главную форму, делаем ее fsMDIForm
2. Из главной формы вызываем модально другую fsNormal форму.
3. В модальной форме делаем:
Код

  Application.MainForm.Enabled := false;
  Application.MainForm.Enabled := true;

4. Наблюдаем эффект. Главная форма стала доступна и сообщения обрабатываются в цикле обработке очереди модального окна.

Может кто сталкивался уже.

На всякий случай в файле иллюстрация с exe.



Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  ShowModalTest.rar 156,83 Kb
PM MAIL WWW   Вверх
CodeMonkey
Дата 3.2.2011, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 4
Всего: 89



А в чём баг-то?

Ты ж сам сказал Application.MainForm.Enabled := true; и удивляешься теперь, почему главное окно доступно?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
cemick
Дата 4.2.2011, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 416
Регистрация: 6.7.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 6



Цитата(CodeMonkey @  3.2.2011,  18:45 Найти цитируемый пост)
А в чём баг-то?

Ты ж сам сказал Application.MainForm.Enabled := true; и удивляешься теперь, почему главное окно доступно? 


О-ло-ло!
CodeMonkey,  тогда может у тебя будут  предположения, почему Application.MainForm.Enabled при ShowModal не меняется на false. И почему описанный мною именно баг проявляется только, если главная форма fsMDIForm. Где задокументировано данное поведение? В чем его логика? 

Точнее я понимаю почему оно становится доступным, но это не отменяет факт бага.

Это сообщение отредактировал(а) cemick - 4.2.2011, 10:08
PM MAIL WWW   Вверх
cemick
Дата 4.2.2011, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 416
Регистрация: 6.7.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 6



Хотя, сейчас проверил,  еще раз, fsMDIFrom  не влияет, и с fsNormal тоже самое. CodeMonkey  да ты прав, ничего удивительного, кроме того, что Application.MainForm.Enabled не отображает реального состояния,и потому требуется сброс флага. Ок, назовем это не багом, а леностью борландовских разрабов. Интересно, в последних версия Делфи это уже поправили? 
PM MAIL WWW   Вверх
CodeMonkey
Дата 4.2.2011, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
cemick
Дата 4.2.2011, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 416
Регистрация: 6.7.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 6



Цитата(CodeMonkey @  4.2.2011,  11:15 Найти цитируемый пост)
В Delphi модальность реализуется не системными средствами, а эмулируется через Enabled. Однако, при ShowModal свойство Enabled не меняется. Сделано это по той простой причине, что ты сам лично не блокировал окно. И неожиданное переключение Enabled при выполнении несвязанной операции было бы неудачным дизайном.

На счет неожиданности не совсем согласен.  И как раз, если  это эмуляция то логично видеть цикл по окнам с установкой Enable свойства, который в конечной итоге сделал бы то же самое.

Цитата(CodeMonkey @  4.2.2011,  11:15 Найти цитируемый пост)
Вероятно, наилучшим решением было бы игнорировать смену Enabled при ShowModal.

пожалуй да))

PM MAIL WWW   Вверх
VLK32
Дата 10.2.2011, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 22.1.2011

Репутация: нет
Всего: нет



Не хочу создавать еще одну тему о багах раз уж такая есть. Так что начну жаловаться прямо здесь.

Около месяца мучаю дженерики. Инструмент конечно супер. Пусть он и опоздал лет на пять. Но есть нюансы. Дженерики в Delphi есть, но они не работают. Суть такова. Начал писать класс на дженериках. Через какое-то время начали сыпаться internal error. Синтаксис естественно в порядке. Лечилось это просто - добавлялась (или удалялась) в код какая-нибудь мишура типа перевода строки или "//" и после это все компилировалось нормально. И так в цикле. Т.е. чтобы откомпилировать программу надо было жать Shift+F9, делать правку и еще раз Shift+F9. Ну то такое. Можно пережить. Но в один прекрасный день был закончен еще один класс на дженериках и все.. приплыл. Вычислил виновника торжества:
Код

if L1=Nil then L1 := LinkedList<TTestRec>.Create;


Нормально. Пока не используешь экземпляр класса все в шоколаде, как только создаешь - пройдите на выход. Очень полезный получился класс. Я конечно могу его исковеркать и добиться компиляции, но зачем мне такой уродец и такие дженерики?

Немного рассуждений. А что делать если internal error посыпались бы когда уже написано несколько десятков классов, тысячи строк кода, потрачена уйма времени и земля горит под ногами? И вдруг ты понимаешь что дженерики просто не работают.  Печаль.

Я ,будучи честным пиратом и занимаясь дженериками на досуге, не расстраиваюсь и смотрю вперед с оптимизмом. Гудбай, Delphi! Долго я оттягивал этот момент, но пора расчехлять груды талмудов по C# (не зря же я их качал).  

зы. Использовать дженерики в таком виде в котом они сейчас находятся в крупных проектах - это все равно что путешествовать по зыбучим пескам. Всем удачи!
PM MAIL   Вверх
CodeMonkey
Дата 10.2.2011, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 4
Всего: 89



Дай угадаю - работал на непатченной D2009?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
VLK32
Дата 10.2.2011, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 22.1.2011

Репутация: нет
Всего: нет



Цитата(CodeMonkey @ 10.2.2011,  22:07)
Дай угадаю - работал на непатченной D2009?

Работаю на Delphi 2007 (уговорил шефа купить лицензию).

Балуюсь на честно ломанной Delphi 2010 c Update 4 и 5.

Кстати расковырял таки в чем беда:

Код


 TNode = record
   Data : Pointer; // pointer to data
   Prev : Integer; // previous node (index in FItems array)
   Next : Integer; // next node     (index in FItems array)
 end;
 
 FItems : array of TNode;
 
 procedure List<T>.Assign(const A:List<T>);
  var i : Integer;
  begin
   if A=Nil then Exit;
   FItems := Copy(A.FItems); <<< бяка!
   FCount   := A.FCount;
   FCMP     := A.FCMP;
   FSO      := A.FSO;
   FCurrent := A.FCurrent;
  end;


Как видно FItems никакого отношения к дженерикам не имеет. Почему компилятор не может справиться с FItems := Copy(A.FItems); одному богу известно.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle

Добро пожаловать в форум группы "Delphi".

В разделе разрешается:

  • Флудить (в приемлемых величинах)
  • Обсуждать модерирование данного раздела (но не его модератора)
  • Добавлять свои правила если они не противоречат существующим
  • Делать наезды на пешеходов***

Строго запрещено:

  • Размещать рекламу
  • Совершать оскорбления личностей
  • Материться
  • *** Пешеходами не являются (ко)модераторы, админы, участники клуба.

Если Вам понравилась атмосфера форума, заходите к нам чаще! Люблю, целую, вечно Ваш, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Форум группы: delphi | Следующая тема »


 




[ Время генерации скрипта: 0.1070 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.