Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.05;
Скачать: CL | DM;

Вниз

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

 
ButtonExplorer   (2006-02-15 16:37) [0]

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


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 присвоить и проверить.

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


 
Jeer ©   (2006-02-15 16:42) [1]

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

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


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

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

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

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


 
McSimm ©   (2006-02-15 17:04) [3]


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

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


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


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


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


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


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

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

Ясно.


 
begin...end ©   (2006-02-15 18:21) [6]

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

Это лишнее.


 
Marser ©   (2006-02-15 18:39) [7]

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

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



Страницы: 1 вся ветка

Текущий архив: 2006.03.05;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.052 c
15-1139492255
Странник
2006-02-09 16:37
2006.03.05
Borland уходит из бизнеса IDE


8-1127291626
Виталька2005
2005-09-21 12:33
2006.03.05
Наложение изображений


3-1136760672
parovoZZ
2006-01-09 01:51
2006.03.05
Зачем связывают таблицы?


15-1139498551
PARUS
2006-02-09 18:22
2006.03.05
Дельфи-находка...


15-1139490279
AlterEgo of WondeRu
2006-02-09 16:04
2006.03.05
Холода, надо согреваться - Новая Samara Mastak Party!!!