Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.037 c
15-1139675986
vidiv
2006-02-11 19:39
2006.03.05
Parser Лебедева


1-1138730854
md
2006-01-31 21:07
2006.03.05
Canvas


2-1139830117
TrainerOfDolphins
2006-02-13 14:28
2006.03.05
Как запретить перерисовку DBGrid а?


1-1138962770
zema
2006-02-03 13:32
2006.03.05
как узнать высоту всплывающего меню?


2-1139789335
antoxa2005
2006-02-13 03:08
2006.03.05
Подскажите, какими средствами можно создать скрипт БД Access




   Наверх