![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| DenisTv |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 3.11.2005 Репутация: нет Всего: нет |
Доброго времени суток!
Динамически создаю дочернюю форму. Надо запретить её повторное создание, если она не закрыта. Делаю так:
.. но при закрытии cfmNumber1 не высвобождается (с nil нельзя сравнить, там болтаются остатки формы). Подскажите как можно реализовать такое? И вообще возможно ли? |
|||
|
||||
| former |
|
|||
![]() MEMS Expert ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1166 Регистрация: 1.3.2006 Где: Россия Репутация: 5 Всего: 17 |
Создай глобальную переменную типа integer. При создании присваивай ей 1, при закрытии формы - 0. Перед созданием формы проверяй значение. -------------------- Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами. |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Правильно. А присвоить nil вручную можно? Например, в OnDestroy этой дочерней формы? Проще тогда boolean. Или будут нужны другие значения этого флага? |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
||||
|
||||
| DenisTv |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 3.11.2005 Репутация: нет Всего: нет |
До последнего не хотел тащить родительский юнит в дочерний.. Но видимо по другому никак.
Спасибо! |
|||
|
||||
| DenisTv |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 3.11.2005 Репутация: нет Всего: нет |
Некоторое время (пока дочерних форм было 2), всё было замечательно. Но когда форм стало больше, то при закрытии одной из дочерних форм, начала вылетать ошибка памяти (access violation at XXXXXXXX. Read of address 00000008). Причем ошибка рандомная, не могу добиться её 100% появления, чтобы понять где происходит использование УЖЕ обнуленной переменной.
Создаю дочернюю форму так:
Уничтожаю:
cfmSettings : TfmSettings - глоб. в юните родительской формы. Это сообщение отредактировал(а) DenisTv - 2.6.2010, 09:18 |
||||
|
|||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
||||
|
||||
| DenisTv |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 3.11.2005 Репутация: нет Всего: нет |
А так cfmSettings не обнуляется. Проверку if cfmSettings=nil then не проходит.
|
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
значит так:
сfmSettings := nil; |
|||
|
||||
| DenisTv |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 3.11.2005 Репутация: нет Всего: нет |
После события Close формы видимо происходит ещё какое-то обращение к этой переменной, но её уже нет, поэтому ошибка. Пока вижу только вариант с созданием флагов, не содержащих ссылку на форму. Т.е. для каждой формы иметь cfmSettings:TfmSettings и cfmSettingsFlag:boolean; (об этом говорили former и kami). Но такой вариант не совсем эстетичен (форм будет штук 20) |
||||
|
|||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
||||
|
||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Немного поздновато, но: создание формы можно проверять по Screen.Forms:
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| DenisTv |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 3.11.2005 Репутация: нет Всего: нет |
Чтобы в Родительской форме делать проверку: if cfmSettings=nil then cfmSettings:=TfmSettings.Create(Application); Цель первоначальная то была: Не создавать форму, если она уже есть. CodeMonkey, вариант более автоматизированный, чем флаги, но всё таки.. Это сообщение отредактировал(а) DenisTv - 3.6.2010, 16:38 |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
||||
|
||||
| DenisTv |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 3.11.2005 Репутация: нет Всего: нет |
хха) Ответ был близок с самого начала..
Akella, спасибо, что выдержал, пока я тебя понял |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |