Porozumění vlastníkovi vs. Rodič v aplikacích Delphi

Pokaždé, když umístíte panel do formuláře a tlačítko na tomto panelu, vytvoříte „neviditelné“ spojení. Formulář se stává majitel tlačítka a panel je nastaven na svůj rodič.

Každá komponenta Delphi má vlastnost Vlastník. Majitel se stará o osvobození vlastněné komponenty při uvolňování.

Podobná, ale odlišná vlastnost Parent označuje komponentu, která obsahuje komponentu „child“.

Rodič

Nadřazený odkazuje na komponentu, ve které je obsažena jiná komponenta, například TForm, TGroupBox nebo TPanel. Pokud jeden ovládací prvek (nadřazený) obsahuje jiné, obsahoval kontroly jsou podřízené kontroly nad rodičem.

Nadřazený určuje způsob zobrazení komponenty. Například vlastnosti Levý a Horní jsou relativní vůči nadřazenému.

Vlastnost Rodič může být přiřazena a změněna během běhu.

Ne všechny komponenty mají Parent. Mnoho forem nemá rodiče. Například formuláře, které se objevují přímo na ploše Windows, mají nadřazené nastaveno na nulu. Součást HasParent metoda vrací booleovskou hodnotu označující, zda byla komponentě přiřazena nadřazená položka.

instagram viewer

Vlastnost Rodič používáme k získání nebo nastavení nadřazeného ovládacího prvku. Například umístěte dva panely (Panel1, Panel2) do formuláře a umístěte jedno tlačítko (Button1) na první panel (Panel1). Tím nastavíte vlastnost Parent Button na Panel1.

 Button1.Parent: = Panel2; 

Pokud umístíte výše uvedený kód do události OnClick pro druhý panel, po klepnutí na Panel2 tlačítko „přeskočí“ z Panel1 na Panel2: Panel1 již není nadřazeným tlačítkem.

Pokud chcete vytvořit TButton za běhu, je důležité si zapamatovat nadřazeného - ovládací prvek, který obsahuje tlačítko. Aby byla součást viditelná, bude to musí mít rodiče, aby se v něm zobrazil.

ParentThis a ParentThat

Pokud vyberete tlačítko v době návrhu a podíváte se na inspektor objektů, všimnete si několika vlastností „Rodičovský“. ParentFontnapříklad označuje, zda je písmo použité pro titulek tlačítka stejné jako písmo použité pro nadřazeného tlačítka (v předchozím příkladu: Panel1). Pokud je ParentFont True pro všechna tlačítka na panelu, změna vlastnosti písma panelu na tučné způsobí, že všechny tituly tlačítka na panelu budou používat toto (tučné) písmo.

Kontroluje vlastnost

Všechny součásti, které sdílejí stejný rodič, jsou k dispozici jako součást systému Řízení majetek tohoto rodiče. Například lze použít ovládací prvky iterovat nad všemi dětmi ovládacího prvku okna.

Další část kódu lze použít ke skrytí všech obsažených komponent na panelu1:

pro ii: = 0 na Panel1.ControlCount - 1 dělat

 Panel1.Controls [ii] .Visible: = false;


Trikové triky

Ovládací prvky v okně mají tři základní vlastnosti: mohou se zaměřit na vstup, používají systémové prostředky a mohou být rodiči jiných ovládacích prvků.

Například komponenta Button je ovládací prvek v okně a nemůže být nadřazeným prvkem jiné komponenty - nemůžete na ni umístit jinou součást. Jde o to, že Delphi u nás tuto funkci skrývá. Příkladem je skrytá možnost, aby TStatusBar obsahoval některé komponenty jako TProgressBar.

Vlastnictví

Nejprve si všimněte, že formulář je celkovým vlastníkem všech komponent, které jsou na něm umístěny (umístěné na formuláři v době návrhu). To znamená, že při zničení formuláře budou zničeny také všechny komponenty ve formuláři. Například pokud máme aplikaci s více než jedním formulářem, když voláme metodu Free nebo Release pro objekt form, my nemusíte si dělat starosti s explicitním uvolněním všech objektů v tomto formuláři - protože formulář je vlastníkem všech jeho objektů komponenty.

Každá součást, kterou vytvoříme, v době návrhu nebo spuštění, musí být vlastněna jinou součástí. Vlastník komponenty - hodnota její vlastnosti Owner - je určen parametrem předaným konstruktoru Create při vytvoření komponenty. Jediným jiným způsobem, jak znovu přiřadit vlastníka, je použití metod InsertComponent / RemoveComponent během běhu. Ve výchozím nastavení vlastní formulář všechny komponenty a je zase ve vlastnictví aplikace.

Když použijeme klíčové slovo jako parametr metody Create - objekt, který vytváříme, je vlastněn třídou, ve které je metoda obsažena - což je obvykle formulář Delphi.

Pokud na druhou stranu uděláme z komponenty jinou vlastníka (nikoli formu), pak z ní uděláme zodpovědnost za likvidaci objektu, když je zničen.

Jako každý jiný Komponenta Delphi, komponentu TFindFile vyrobenou na míru lze vytvořit, použít a zničit za běhu. Chcete-li vytvořit, používat a zdarma Komponenta TFindFile za běhu můžete použít následující fragment kódu:

použití FindFile;

...
var FFile: TFindFile;

postup TForm1.InitializeData;

začít // form ("Self") je vlastníkem komponenty // neexistuje žádný nadřazený prvek, protože tento // je neviditelný komponent.

 FFile: = TFindFile. Vytvořit (vlastní);

 ...

konec;

Poznámka: Protože soubor FFile je vytvořen s vlastníkem (Form1), nemusíme dělat nic pro uvolnění komponenty - bude uvolněno, když je vlastník zničen.

Vlastnost komponent

Všechny součásti, které sdílejí stejného vlastníka, jsou k dispozici jako součást systému Vlastnost komponenty tohoto vlastníka. Následující postup se používá k vymazání všech součástí Upravit, které jsou ve formuláři:

postup ClearEdits (AForm: TForm);

var

 ii: Celé číslo;

začít

pro ii: = 0 na AForm. ComponentCount-1 dělat

-li (AForm. Komponenty [ii] je TEdit) pak TEdit (AForm. Složky [ii]) Text: = '';

konec; 

"Sirotci"

Některé ovládací prvky (například ovládací prvky ActiveX) jsou obsaženy v oknech jiných než VCL, nikoli v nadřazeném ovládacím prvku. U těchto ovládacích prvků je hodnota Parent nula a ParentWindow Vlastnost určuje nadřazené okno než VCL. Nastavení ParentWindow přesune ovládací prvek tak, aby byl obsažen v zadaném okně. ParentWindow se nastaví automaticky, když je ovládací prvek vytvořen pomocí CreateParented metoda.

Pravda je, že ve většině případů se nemusíte starat o rodiče a vlastníky, ale pokud jde o OOP a vývoj součástí nebo pokud chcete učinit Delphi o krok vpřed, prohlášení v tomto článku vám pomohou tento krok urychlit.