Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрет на повтор создания MDIChild 
V
    Опции темы
DenisTv
Дата 24.5.2010, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток!
Динамически создаю дочернюю форму. Надо запретить её повторное создание, если она не закрыта.

Делаю так:
Код


procedure TfmMain.FormActivate(Sender: TObject);
begin
    cfmNumber1 :=TfmNumber1 .Create(Application);
end;

procedure TfmMain.N17Click(Sender: TObject);
begin
   if cfmNumber1 = nil then  cfmNumber1 :=TfmNumber1 .Create(Application);
end;



.. но при закрытии cfmNumber1 не высвобождается (с nil нельзя сравнить, там болтаются остатки формы).

Подскажите как можно реализовать такое? И вообще возможно ли?
PM MAIL ICQ   Вверх
former
Дата 25.5.2010, 10:05 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


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

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



Цитата(DenisTv @  24.5.2010,  22:36 Найти цитируемый пост)
Подскажите как можно реализовать такое? И вообще возможно ли? 

Создай глобальную переменную типа integer. При создании присваивай ей 1, при закрытии формы - 0. Перед созданием формы проверяй значение.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
kami
Дата 25.5.2010, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(DenisTv @  24.5.2010,  22:36 Найти цитируемый пост)
(с nil нельзя сравнить, там болтаются остатки формы).

Правильно. А присвоить nil вручную можно? Например, в OnDestroy этой дочерней формы?
Цитата(former @  25.5.2010,  10:05 Найти цитируемый пост)
глобальную переменную типа integer.

Проще тогда boolean. Или будут нужны другие значения этого флага?
PM MAIL WWW   Вверх
Akella
Дата 25.5.2010, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Цитата(DenisTv @  24.5.2010,  22:36 Найти цитируемый пост)
.. но при закрытии cfmNumber1 не высвобождается (с nil нельзя сравнить, там болтаются остатки формы).

а ты при закрытии в OnClose делай так:
Form1 := nil

PM MAIL   Вверх
DenisTv
Дата 29.5.2010, 05:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



До последнего не хотел тащить родительский юнит в дочерний.. Но видимо по другому никак.

Спасибо!
PM MAIL ICQ   Вверх
DenisTv
Дата 2.6.2010, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Некоторое время (пока дочерних форм было 2), всё было замечательно. Но когда форм стало больше, то при закрытии одной из дочерних форм, начала вылетать ошибка памяти (access violation at XXXXXXXX. Read of address 00000008). Причем ошибка рандомная, не могу добиться её 100% появления, чтобы понять где происходит использование УЖЕ обнуленной переменной.

Создаю дочернюю форму так: 
Код

     if cfmSettings=nil then cfmSettings:=TfmSettings.Create(Application);


Уничтожаю:
Код

procedure TfmSettings.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    Action:=caFree;
    unMain.cfmSettings:=nil;
end;


cfmSettings : TfmSettings - глоб. в юните родительской формы.

Это сообщение отредактировал(а) DenisTv - 2.6.2010, 09:18
PM MAIL ICQ   Вверх
Akella
Дата 2.6.2010, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Цитата(DenisTv @  2.6.2010,  09:16 Найти цитируемый пост)
Уничтожаю:

повторить??
Повторяю:
не unMain.cfmSettings:=nil;
а fmSettings:=nil;
PM MAIL   Вверх
DenisTv
Дата 2.6.2010, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А так cfmSettings не обнуляется. Проверку if cfmSettings=nil then не проходит.

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


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



значит так:
сfmSettings := nil; 
PM MAIL   Вверх
DenisTv
Дата 2.6.2010, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(DenisTv @  2.6.2010,  14:16 Найти цитируемый пост)


Уничтожаю:
Код

procedure TfmSettings.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    Action:=caFree;
    unMain.cfmSettings:=nil;
end;




После события Close формы видимо происходит ещё какое-то обращение к этой переменной, но её уже нет, поэтому ошибка.

Пока вижу только вариант с созданием флагов, не содержащих ссылку на форму. Т.е. для каждой формы иметь cfmSettings:TfmSettings и cfmSettingsFlag:boolean; (об этом  говорили former и kami). Но такой вариант не совсем эстетичен (форм будет штук 20)  smile 
PM MAIL ICQ   Вверх
Akella
Дата 2.6.2010, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Цитата(DenisTv @  2.6.2010,  09:16 Найти цитируемый пост)
cfmSettings : TfmSettings - глоб. в юните родительской формы.

зачем? убери
PM MAIL   Вверх
CodeMonkey
Дата 2.6.2010, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Немного поздновато, но: создание формы можно проверять по Screen.Forms:

Код
for X := 0 to Screen.FormCount - 1 do
  if Screen.Forms[X] is TfmNumber1 then
    ShowMessage('Уже создана!');



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


Шустрый
*


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

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



Цитата(Akella @  2.6.2010,  17:14 Найти цитируемый пост)

cfmSettings : TfmSettings - глоб. в юните родительской формы.

зачем? убери 


Чтобы в Родительской форме делать проверку:
if cfmSettings=nil then cfmSettings:=TfmSettings.Create(Application);

Цель первоначальная то была: Не создавать форму, если она уже есть.

CodeMonkey, вариант более автоматизированный, чем флаги, но всё таки..

Это сообщение отредактировал(а) DenisTv - 3.6.2010, 16:38
PM MAIL ICQ   Вверх
Akella
Дата 3.6.2010, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Цитата(DenisTv @  3.6.2010,  16:38 Найти цитируемый пост)
Чтобы в Родительской форме делать проверку:
if cfmSettings=nil then cfmSettings:=TfmSettings.Create(Application);

Для этого необязательно создавать переменную в главной форме. Ведь переменная дочерней формы всё равно видна в главной (добавить модуль в USES нужно).
PM MAIL   Вверх
DenisTv
Дата 4.6.2010, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



хха) Ответ был близок с самого начала..
Akella, спасибо, что выдержал, пока я тебя понял  smile 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

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


 




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


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

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