![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Форма создана or нет [D7, WinXP]
Kot Andrei © (2005-07-01 09:19:00)Вообщем-то сабж...
Грубо говоря по нажатию на Button1 происходит FormCreat, по нажатию на Button2 - FormFree. Так вот при нажатии на Button1 нужно проверить данная форма уже создана или нет (чтоб не создавать 2-ой раз).
Подскажите плиз как! С уважением!
Dimous (2005-07-01 10:30:00) [21]>> Digitman © (01.07.05 10:24) [7]
Можно добавить
procedure TMyForm.FormDestroy(Sender: TObject);
begin
MyForm := nil;
end;
-=XP=- (2005-07-01 10:28:00) [22]Сорри за повтор.
-=XP=- (2005-07-01 10:28:00) [23]А такой вариант чем плох? Покритикуйте.
А чего тут критиковать? Если автор задает такой вопрос, то он не совсем понимает, что на самом деле происходит. Поэтому, не исключена ситуация:
procedure TMyForm.OnFormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
Ваш код в нокдауне.
Digitman (2005-07-01 10:24:00) [24]
> Чапаев © (01.07.05 10:20) [5]
он плох тем что форма м.б. уничтожена в т.ч. и интерактивно, самим юзером, щелчком на "крестике"
при этом переменная MyForm, о которой уничтожаемая форма ничего не знает, останется <> nil
-=XP=- (2005-07-01 10:24:00) [25]Вариант 1. Assigned? > Глупость
Зависит от реализации.
Вариант 2. Screen.Forms
Зависит от реализации.
Минусы:
Вариант 1. Можно "забыть" присвоить nil переменной, хранящей ссылку на форму. Соответсвенно, может быть AV.
Вариант 2. Можно "забыть" проверить существование формы, и создать еще одну. Тогда в Screen.Forms будет несколько "одинаковых форм". Так как "забыли" проверить существование формы - то и ситуацию дубликатов обрабатывать, скорее всего, не будут.
Плюсы (с точностью до "наоборот"):
Вариант 1. В переменной формы может хранится ссылка только на одну форму, поэтому нет ситуации с дубликатами. Хотя, можно и "потерять" форму.
Вариант 2. А тут все формы будут присутствовать, по любому.
Вывод:Вопрос не в алгоритме, а в его реализации. Точнее - в кривизне рук.
Чапаев (2005-07-01 10:20:00) [26]
procedure B1Click();
begin
if not Assigned(MyForm) then
MyForm:=TMyForm.Create();
end;
procedure B2Click();
begin
if Assigned(MyForm) then
FreeAndNil(MyForm);
end;
А такой вариант чем плох? Покритикуйте.
Tor (2005-07-01 10:17:00) [27]if form1 <> nil then
form1.Show
else form1 := TForm.Create(Application);
Anatoly Podgoretsky (2005-07-01 10:11:00) [28]stone © (01.07.05 09:49) [2]
Глупость
stone (2005-07-01 09:49:00) [29]Assigned ?
Anatoly Podgoretsky (2005-07-01 09:21:00) [30]Screen.Forms