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

Вниз

AOwner: TComponent   Найти похожие ветки 

 
p314   (2006-09-12 13:29) [0]

constructor TSuperComponent.Create(AOwner: TComponent);

Зачем в компонентах/классах, делают в конструкторе подобную конструкцию (AOwner:...)? И где это используют и как может пригодится?

При пременении этого обычно указывают Create() -- либо nil, либо self, объясните это тоже. Спасибо!


 
Reindeer Moss Eater ©   (2006-09-12 13:39) [1]

это просто такая игра и волшебные заклинания. не обращай внимания.


 
Loginov Dmitry ©   (2006-09-12 13:40) [2]

В качестве AOwner ты просто передаешь ссылку на компонент, который будет ответственным за удаление твоего компонента. Твой компонент при создании регистрируется в списке Components (фактически это свойство, с помощью которого ты можешь обратиться к дочерним компонентам) компонента-владельца. При уничтожении компонента - владельца твой компонент будет учичтожен автоматически.

Если указываешь nil, то ты сам должен следить за своевременным удалением объекта.

Self - указатель на экземпляр объекта, в реализации метода (любой процедуры или функции, контруктора, деструктора) которого ты создаешь свой объект. Т.е.:

TForm1.FormShow();
begin
 TSuperComponent.Create(Form1);
end;

и

TForm1.FormShow();
begin
 TSuperComponent.Create(Self);
end;

в случае главной формы - одно и тоже. Однако второй способ более правильный, так как не накладывает ограничений на количество экземпляров класса TForm1.


 
MBo ©   (2006-09-12 13:41) [3]

AOwner компонента  - его владелец - заносит его в свой список Components, а при своем уничтожении уничтожает и каждый компонент из этого списка. Если указывается nil - нужно уничтожать компонент вручную (Free делать, когда он больше не нужен). Self - экземпляр класса, для которого выполняется данный метод, например, если ты описываешь класс формы, то в ее методах, в обработчиках событий Self - сама форма


 
_Ламер_   (2006-09-23 21:40) [4]

А можно вопрос?
А что будет, если при создании объекта child := *.create (parent) произошла ошибка и мы попытаемся освободить parent.free? А если создаваемый объект не единственный у parent - остановится ли процесс уничтожения объектов на child? Что в таких случаях делать - закрывать приложение?


 
jack128 ©   (2006-09-23 22:17) [5]

_Ламер_   (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 он второй раз естественно не будет уничтожаться..



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

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

Наверх




Память: 0.48 MB
Время: 0.027 c
2-1158836853
TakTak
2006-09-21 15:07
2006.10.08
изменение свойств класса (наследование и т.д.)


11-1134842022
nester
2005-12-17 20:53
2006.10.08
KOL и x64


15-1158241058
ANB
2006-09-14 17:37
2006.10.08
Мадонна пела в Лужниках под фанеру !!!


2-1158306437
mmms-
2006-09-15 11:47
2006.10.08
Не могу разобратся с простым кодом (Бегущая строка из DelphiWorld


3-1155059935
GrandHiew
2006-08-08 21:58
2006.10.08
Вторичный индекс в Paradox