Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать: была ли уже создана форма или нет ? [D6, WinXP]


eruc ©   (2002-09-07 15:12:00) 

Как узнать: была ли уже создана форма или нет ?


Юрий Зотов   (2002-09-07 22:41:00) [1]

> И Form1 := Self происходит при создании в любом случае.

Не в любом, а только если Form1 еще рано nil (для того там и поставлен if). То есть, если ни одна такая форма еще не создана. Аналогично при уничтожении - переменную Form1 будет очищать только та форма, на которую это переменная и ссылается.

В итоге переменную Form1 будет менять только ПЕРВЫЙ экземпляр формы. Он ее проинициализирует (в OnCreate), он же ее и очистит (в OnDestroy) - а все остальные экземпляры ее НЕ ТРОНУТ (потому что для них переменная Form1 будет уже и не nil, и не Self). Что и позволяет избежать ГАРАНТИРОВАННОГО перезатирания каждой новой формой ссылки на предыдущую.

А за остальное, естественно, отвечает программер. Например, если ему это нужно, он может создать массив (или список) форм. Или может прописать Action := caFree в OnClose. Или может показывать формы модально и тут же убивать их:

with TForm1.Create(...) do
try
if ShowModal = mrOK then
begin
...
end
finally
Free
end;

Существует еще целая куча способов и рецептов. Но универсальный, на все случаи жизни лишь один - внимательность и аккуратность.


Kopetr   (2002-09-07 21:47:00) [2]

>> Юрий Зотов :
А как в таком случае избежать утечек памяти?
Ведь мы в любом случае теряем адреса всех созданных форм, кроме одной. И Form1 := Self происходит при создании в любом случае.


Kopetr   (2002-09-07 21:35:00) [3]

>> Юрий Зотов :
Круто. А я уж думал, просто так :)


Юрий Зотов   (2002-09-07 21:30:00) [4]

> Kopetr © (07.09.02 21:27)

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


Kopetr   (2002-09-07 21:27:00) [5]

>> Юрий Зотов:
А зачем
OnCreate:
if Form1 = nil then Form1 := Self;
?



Kopetr   (2002-09-07 21:12:00) [6]

>> Просто прохожий:
Тогда проще FreeAndNil(..)


Просто прохожий   (2002-09-07 21:03:00) [7]

> Kopetr (07.09.02 20:53)
Тогда можно после каждого уничтожения присваивать MyForm := nil


Юрий Зотов   (2002-09-07 20:58:00) [8]

OnCreate:
if Form1 = nil then Form1 := Self;

OnDestroy:
if Form1 = Self then Form1 := nil;

Проверка:
if Form1 <> nil then ... // форма существует


Kopetr   (2002-09-07 20:53:00) [9]

>> Просто прохожий:
Если форма создана, а потом уничтожена (Form.Free), то
Assigned(Form) все равно будет = True, хотя формы-то уже и нет.


Просто прохожий   (2002-09-07 20:45:00) [10]

Assigned(MyForm) = True, если форма MyForm создана.


Anatoly Podgoretsky   (2002-09-07 16:40:00) [11]

Ой ответ мой не совсем верный, она не позволяет узнать была ли, а только существует ли в данный момент


Anatoly Podgoretsky   (2002-09-07 16:37:00) [12]

Объект Screen свойство Forms содержит полный список всех твоих созданных форм


Grande   (2002-09-07 16:13:00) [13]

Слушай, а в чём, собственно, проблема?


eruc   (2002-09-07 15:49:00) [14]

а чего нибудь такого нету (КАКОЙ нибудь ФУНКЦИИ):

EXIST(Form1)

чтобы возвращала
true OR fALSE


Grande   (2002-09-07 15:24:00) [15]

Элементарно: Обработчик события формы OnCreat (OnActivate), далее что-нибудь типа ShowMessage("Приплыли...");
That"s all!


Grande   (2002-09-07 15:23:00) [16]

ЭлементарЭлемОбработчик события формы OnCreat (OnActivate), далее что-нибудь типа ShowMessage("Приплыли...");
That"s all!


eruc   (2002-09-07 15:20:00) [17]

в данный момент


eruc   (2002-09-07 15:19:00) [18]

т.е. нужно знать : существует ли данная форма или нет


eruc   (2002-09-07 15:18:00) [19]

да


Grande   (2002-09-07 15:16:00) [20]

А ты создаёшь её в своём приложении?


Наверх

Титульная страница Поиск, карта сайта Написать письмо