![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать: была ли уже создана форма или нет ? [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]А ты создаёшь её в своём приложении?