tema писал(а):Ок. Поймали. Термин указал неверный. Не рефреш, а рекреат. Функция вся вот:
- Код: Выделить всё
if ((PopupMode = pmNone) and HandleAllocated) and not (csDestroying in ComponentState) then
RecreateWnd(Self); // need to refresh handle for pmNone because ParentWindow changes if (fsModal in FFormState) - see
Команда RecreateWnd вызывается только при определённых условиях, которые судя по коду, при втором вызове - УЖЕ являются сбоем. И второй вызов RecreateWnd, что-то вроде костыля, на случай "если вдруг всё ещё не ..., то в любом случае сделать RecreateWnd" т.к. ParentWindow changes. Из этого следует что, ошибка и сбой находятся раньше, т.к. при вызове приведённой функции, вызывается команда "на случай если ВДРУГ всё ещё (PopupMode = pmNone), то обязательно RecreateWnd". Соответственно, PopupMode - почему-то всё еще pmNone... Почему?
Я смотрел Вашу форму Form2 и у меня там почему-то на форме лежало три одинаковых SQL-connection, которые завязаны на одну дату. На мой взгляд когда они все три единовременно и параллельно пытаются подключиться и потом записать информацию в дату - происходит обрушение. Я думаю у Вас неправильная организация интерфейса с взаимосвязями между компонентами и как следствие обрушение. И это приводит к тому что, PopupMode - почему-то всё еще pmNone... Хотя давно уже всё "ShowModal"
Добавлено спустя 5 минут 55 секунд:С другой стороны, костыль с повторным вызовом RecreateWnd - говорит, о том что, всё же там что-то иногда было, ещё при создании модуля и это что-то попытались исправить/защитить таким костылём. Соответственно возможно "баг" есть, но он не в этой функции, т.к. здесь только костыль.
И естественно, когда Вы делаете нетипичную организацию интерфейса - происходит двойное обрушение и PopupMode - всё еще pmNone. Вы должны ясно понимать, что ShowModal - используют все... Если бы там был баг, то... об этом орали бы все программисты... Но говорите об этом только Вы.
Делайте выводы и ищите баг в своём коде и организации интерфейса.