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