![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
AOwner: TComponent [D7]
p314 © (2006-09-12 13:29:00)constructor TSuperComponent.Create(AOwner: TComponent);
Зачем в компонентах/классах, делают в конструкторе подобную конструкцию (AOwner:...)? И где это используют и как может пригодится?
При пременении этого обычно указывают Create() -- либо nil, либо self, объясните это тоже. Спасибо!
jack128 (2006-09-23 22:17:00) [1]_Ламер_ (23.09.06 21:40) [4]
child := *.create (parent) произошла ошибка
тоо объект child тут же уничтожается автоматом. условно говоря вместо кода Child := TSameComp.Create(Parent) компилятор вставляет такой код
Child := TSameComp.NewInstance; // выделяем парять под Child
try
Child.Create(Parent); // пытаемся выполнить собственно тело конструктора
except // если конструктор кинул исключение, то
Child.Destroy; // вызывается деструктор
raise;
end;
а раз Child уничтожен, то при уничтожении Parent он второй раз естественно не будет уничтожаться..
_Ламер_ (2006-09-23 21:40:00) [2]А можно вопрос?
А что будет, если при создании объекта child := *.create (parent) произошла ошибка и мы попытаемся освободить parent.free? А если создаваемый объект не единственный у parent - остановится ли процесс уничтожения объектов на child? Что в таких случаях делать - закрывать приложение?
MBo (2006-09-12 13:41:00) [3]AOwner компонента - его владелец - заносит его в свой список Components, а при своем уничтожении уничтожает и каждый компонент из этого списка. Если указывается nil - нужно уничтожать компонент вручную (Free делать, когда он больше не нужен). Self - экземпляр класса, для которого выполняется данный метод, например, если ты описываешь класс формы, то в ее методах, в обработчиках событий Self - сама форма
Loginov Dmitry (2006-09-12 13:40:00) [4]В качестве AOwner ты просто передаешь ссылку на компонент, который будет ответственным за удаление твоего компонента. Твой компонент при создании регистрируется в списке Components (фактически это свойство, с помощью которого ты можешь обратиться к дочерним компонентам) компонента-владельца. При уничтожении компонента - владельца твой компонент будет учичтожен автоматически.
Если указываешь nil, то ты сам должен следить за своевременным удалением объекта.
Self - указатель на экземпляр объекта, в реализации метода (любой процедуры или функции, контруктора, деструктора) которого ты создаешь свой объект. Т.е.:
TForm1.FormShow();
begin
TSuperComponent.Create(Form1);
end;
и
TForm1.FormShow();
begin
TSuperComponent.Create(Self);
end;
в случае главной формы - одно и тоже. Однако второй способ более правильный, так как не накладывает ограничений на количество экземпляров класса TForm1.
Reindeer Moss Eater (2006-09-12 13:39:00) [5]это просто такая игра и волшебные заклинания. не обращай внимания.