Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.038 c
2-1158939772
ycuk
2006-09-22 19:42
2006.10.08
MySQL


2-1158646489
pkm
2006-09-19 10:14
2006.10.08
Объявление массива.


15-1158361464
Doblclick
2006-09-16 03:04
2006.10.08
Nokia 6610 i


3-1154889900
Ilg
2006-08-06 22:45
2006.10.08
Ошибка при удалении


2-1158521673
Aleksandr
2006-09-17 23:34
2006.10.08
форма и компоненты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский