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

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

Правильно ли так проверять, создан ли компонент?


ButtonExplorer ©   (2006-02-15 16:37:00) 

Нет ли подводных камней, всегда ли это будет работать?


procedure TForm1.FormCreate(Sender: TObject);
VAR B:TButton;
begin
 B:=nil;

 B:=TButton.Create(self);
 B.Caption:='Test';
 B.OnClick:=B_Cl;
 B.Parent:=self;
 B.Left:=20;B.Top:=20;

 IF B<> nil then beep;
end;


Ещё можно tag присвоить и проверить.

А какие есть ещё способы?


Marser   (2006-02-15 18:39:00) [1]

> if Assigned(MyObject) then
>   begin
>     MyObject.Free;

Assigned и Free, в принципе, делают одно и тоже. Только Free при положительном реззультате вызывает Destroy. Поэтому [6] begin...end ©


begin...end   (2006-02-15 18:21:00) [2]

> Ega23 ©   (15.02.06 17:05) [4]
> if Assigned(MyObject) then

Это лишнее.


ButtonExplorer   (2006-02-15 17:41:00) [3]

>можно инициализировать при старте и при уничтожении nil
>Ну и приравнивай её потом к nil

Ясно.


Ega23   (2006-02-15 17:05:00) [4]


> Меня просто смущает, что переменная B изначально не равна
> nil, и непонятно её поведение после уничтожения объекта
> (B.Free).
>


Ну и приравнивай её потом к nil


 if Assigned(MyObject) then
   begin
     MyObject.Free;
     MyObject:=nil  
   end;


McSimm   (2006-02-15 17:04:00) [5]


> Способы узнать, был ли создан компонент или ещё нет или
> уже уничтожен

вы создаете, вы уничтожаете - все в ваших руках.
Лучше, безусловно, построить логику так, чтобы не возникало ситуации, когда вы сами не знаете что там с объектом.
Но если так сделать нельзя по каким-то причинам -
можно инициализировать при старте и при уничтожении nil.
можно изолировать класс объекта и создавать экземпляр не напрямую, через вызов функции (см. пример Clipboard() в исходниках)


ButtonExplorer   (2006-02-15 16:58:00) [6]

Это просто пример.

>Способы чего ?

Способы узнать, был ли создан компонент или ещё нет или уже уничтожен, т.е. текущее состояние узнать в произвольный момент в программе, что бы случайно не создать дубликат компонента. Меня просто смущает, что переменная B изначально не равна nil, и непонятно её поведение после уничтожения объекта (B.Free).


Jeer   (2006-02-15 16:42:00) [7]

А значит ли, что до
 IF B<> nil then beep;
не нужно было проверять на nil ?
Может все же через try ?

Способы чего ?


Наверх

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