Разбиране на собственика vs. Родител в приложенията на Delphi

Всеки път, когато поставите панел върху формуляр и бутон на него, правите „невидима“ връзка. Формата се превръща в собственик на бутона и панелът е настроен да бъде неговият родител.

Всеки компонент на Delphi има свойство Собственик. Собственикът се грижи освобождаващо притежаваните компоненти, когато се освобождава.

Подобно, но различно свойството Parent обозначава компонента, който съдържа компонента "child".

родител

Родител се отнася до компонента, в който се съдържа друг компонент, като TForm, TGroupBox или TPanel. Ако един контролен елемент (родител) съдържа други, то съдържа контроли са контрол на детето на родителя.

Родител определя как се показва компонентът. Например, левите и горните свойства са относителни към родителя.

Свойството Parent може да бъде зададено и променено по време на изпълнение.

Не всички компоненти имат Parent. Много форми нямат Родител. Например формулярите, които се появяват директно на работния плот на Windows, имат Parent, настроен на нула. Компонент HasParent метод връща булева стойност, показваща дали компонентът е назначен родител или не.

instagram viewer

Ние използваме свойството Parent, за да получим или зададем родителя на контрола. Например, поставете два панела (Panel1, Panel2) върху формуляр и поставете един бутон (Button1) на първия панел (Panel1). Това задава свойството Родител на Button на Panel1.

 Button1.Parent: = Panel2; 

Ако поставите горния код в събитието OnClick за втория панел, когато щракнете върху Panel2, бутонът „прескача“ от Panel1 до Panel2: Panel1 вече не е родителят на бутона.

Когато искате да създадете TButton по време на изпълнение, важно е да не забравяме да зададем родител - контрола, който съдържа бутона. За да бъде видим компонент, той трябва да има родител, за да се показва в себе си.

ParentThis и ParentThat

Ако изберете бутон по време на проектиране и погледнете обектния инспектор, ще забележите няколко свойства, съобразени с родителите. Най- ParentFont, например, показва дали шрифтът, използван за надписа на бутона, е същият като този, използван за родителя на бутона (в предишния пример: Panel1). Ако ParentFont е вярно за всички бутони на панела, смяната на свойството Font на Bold на Bold причинява всички надписи на Button на панела да използват този (удебелен) шрифт.

Контролира собствеността

Всички компоненти, които споделят един и същи родител, са достъпни като част от Контроли собственост на този родител. Например, може да се използва за управление повторете всички деца на контролния прозорец.

Следващото парче код може да се използва за скриване на всички съдържащи се компоненти на Panel1:

за ii: = 0 да се Panel1.ControlCount - 1 правя

 Panel1.Controls [ii]. Видим: = false;


Трикове

Прозоречните контроли имат три основни характеристики: те могат да получат фокус на входа, използват системни ресурси и могат да бъдат родители на други контроли.

Например компонентът Button е прозорец за управление и не може да бъде родител на някой друг компонент - не можете да поставите друг компонент върху него. Работата е там, че Delphi крие тази функция от нас. Пример е скритата възможност TStatusBar да има някои компоненти като TProgressBar върху него.

Собственост

Първо, имайте предвид, че формулярът е цялостният собственик на всички компоненти, които се намират в него (позициониран във формуляра по време на проектиране). Това означава, че когато формуляр е унищожен, всички компоненти на формуляра също са унищожени. Например, ако имаме приложение с повече от една форма, когато извикваме метода Free или Release за обект на форма, ние не трябва да се притеснявате, че изрично ще освободите всички обекти на този формуляр - защото формулярът е собственик на всички негови компоненти.

Всеки компонент, който създаваме по време на проектиране или изпълнение, трябва да бъде собственост на друг компонент. Собственикът на компонент - стойността на неговото свойство Owner - се определя от параметър, предаден на конструктора Create, когато компонентът е създаден. Единственият друг начин за преназначаване на собственика е използването на методите InsertComponent / RemoveComponent по време на изпълнение. По подразбиране формуляр притежава всички компоненти на него и от своя страна е собственост на Приложението.

Когато използваме ключовата дума себе си като параметър за метода Create - обектът, който създаваме, е собственост на класа, в който се съдържа методът - който обикновено е форма на Delphi.

Ако от друга страна, ние направим друг компонент (не формата) собственика на компонента, тогава правим този компонент отговорен за изхвърлянето на обекта, когато той е унищожен.

Както всеки друг Delphi компонент, персонализиран TFindFile компонент може да бъде създаден, използван и унищожен по време на изпълнение. За да създадете, използвайте и освободете a TFindFile компонент при стартиране можете да използвате следващия фрагмент на код:

употреби FindFile;

...
Var FFile: TFindFile;

процедура TForm1.InitializeData;

започвам // form ("Self") е Собственик на компонента // няма родител, тъй като този // е невидим компонент.

 FFile: = TFindFile. Създаване (Self);

 ...

край;

Забележка: Тъй като FFile е създаден със собственик (Form1), не е необходимо да правим нищо, за да освободим компонента - той ще бъде освободен, когато собственикът бъде унищожен.

Свойство на компонентите

Всички компоненти, които споделят един и същ собственик, са достъпни като част от Свойство на компонентите на този собственик Следната процедура се използва за изчистване на всички компоненти за редактиране, които са във формата:

процедура ClearEdits (AForm: TForm);

Var

 ii: цяло число;

започвам

за ii: = 0 да се Форма. ComponentCount-1 правя

ако (Форма. Компоненти [II] е TEdit) тогава TEdit (AForm. Компоненти [ii]). Текст: = '';

край; 

"Сираци"

Някои контроли (като ActiveX контроли) се съдържат в не-VCL прозорци, а не в родителски контрол. За тези контроли стойността на Parent е нула и на ParentWindow свойството определя не-VCL родителски прозорец. Настройката ParentWindow премества контрола така, че да се съдържа в посочения прозорец. ParentWindow се задава автоматично, когато се създаде контрола с помощта на CreateParented метод.

Истината е, че в повечето случаи не е нужно да се грижите за родители и собственици, а когато става въпрос за OOP и разработване на компоненти или когато искате да направите Delphi една стъпка напред, изказванията в тази статия ще ви помогнат да направите тази стъпка по-бързо.

instagram story viewer