Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как узнать создан ли объект?

20K
09 апреля 2009 года
HowlingWind
32 / / 13.01.2008
Добрый день!

У меня есть объект
var
Button: TButton;

При наступлении события, например щелчке мышью, требуется узнать создани ли объект. Если не создан - создать (Button:=TButton.Create). Если уже создан - работать с ним. Есть ли функции для проверки существования объекта или что-то подобное? Использовать защищеный блок (try ... except) не предлагать.
5
09 апреля 2009 года
hardcase
4.5K / / 09.08.2005
Думать пробовали?

 
Код:
if Button = nil then
    Button = TButton.Create();
303
09 апреля 2009 года
makbeth
1.0K / / 25.11.2004
HowlingWind, ну... я бы сказал, что в общем случае - никак не узнаешь. Надеятся на то, что для не созданного объекта ссылка будет nil - глупо. Хотя все зависит от ситуации и прямоты рук.

hardcase, а почему не Assigned?
5
09 апреля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: makbeth
hardcase, а почему не Assigned?

Один фиг, он на nil сравнивает. Хотя, признаюсь, забыл о нем.

402
10 апреля 2009 года
ToRNaDo
70 / / 27.01.2004
могу только предложить в разделе инициализации или при создании формы с этой кнопкой написать
 
Код:
Button:=nil;

а уже в коде программы проверять
 
Код:
if Assigned(Button) then...
8.5K
10 апреля 2009 года
FrostFX
121 / / 01.03.2007
эээ, а как, простите... на "не созданном" объекте кликать мышью? О_о
или я опять чего-то не понял...
45K
11 апреля 2009 года
qpokyc
21 / / 27.03.2009
Исчо вот так можно:
 
Код:
Assigned(Button)

Хотя все действительно сводится к одному - проверке указателя на nil и прямые руки тут совсем не помешают. Уничтожать объект надо так:
 
Код:
if Assigned(Button)
  then begin
    Button.free;
    Button := nil;
  end;

Тогда ошибка очень маловероятна, но не исключена, опять таки. Оказалось, что фраза типа:
 
Код:
Button1 is TButton

Вернет "истина", даже после такого:
 
Код:
Button1.Free;
TEdit(Button1) := TEdit.Create(Self);

(а по сути правильно, ведь мы объявили Button1 как TButton, а какие имена мы присваиваем типам, переменным и классам интересно только компилятору)Так что объект класса и переменная, которая ссылается на объект класса - совсем разные вещи! Кстати я проверил - Button.Free вполне достаточно чтобы полностью унчтожить объект вместе с указателем (а ведь учили меня совсем по другому :confused:). Главное - лишнего не извращаться и не самодельничать, тогда ошибки можно миновать. А для этого чаще смотреть документацию.
303
12 апреля 2009 года
makbeth
1.0K / / 25.11.2004
Вместо
 
Код:
if Assigned(Button)
  then begin
    Button.free;
    Button := nil;
  end;
достаточно просто:
 
Код:
FreeAndNil(Button1);
Цитата:
Кстати я проверил - Button.Free вполне достаточно чтобы полностью унчтожить объект вместе с указателем (а ведь учили меня совсем по другому :confused:).

:eek: Это как?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог