Zrozumienie właściciela i rodzica w aplikacjach Delphi

Spis treściZwiększać

Za każdym razem, gdy umieścisz panel na formularzu i przycisk na tym panelu, tworzysz „niewidzialne” połączenie. Forma staje się właściciel Przycisku, a Panel jest ustawiony jako jego rodzic .





Każdy komponent Delphi ma właściwość Owner. Właściciel dba o uwolnienie posiadane komponenty, gdy są uwalniane.

Podobna, ale inna, właściwość Parent wskazuje składnik, który zawiera składnik „podrzędny”.



Rodzic

Parent odnosi się do komponentu, w którym znajduje się inny komponent, taki jak TForm, TGroupBox lub TPanel. Jeśli jedna kontrolka (rodzic) zawiera inne,zawarte kontrolkisą kontrolkami podrzędnymi rodzica.

Parent określa sposób wyświetlania komponentu. Na przykład wszystkie właściwości Left i Top są względne w stosunku do Parent.



Właściwość Parent można przypisywać i zmieniać w czasie wykonywania.

Nie wszystkie komponenty mają element nadrzędny. Wiele form nie ma Rodzica. Na przykład formularze, które pojawiają się bezpośrednio na pulpicie systemu Windows, mają wartość Rodzic ustawioną na zero. Składnik Ma rodzica Metoda zwraca wartość logiczną wskazującą, czy składnik został przypisany do rodzica.

Używamy właściwości Parent, aby pobrać lub ustawić rodzica kontrolki. Na przykład umieść dwa panele (Panel1, Panel2) na formularzu i umieść jeden przycisk (Button1) na pierwszym panelu (Panel1). Ustawia to właściwość Parent przycisku na Panel1.

|_+_||_+_|

Jeśli umieścisz powyższy kod w zdarzeniu OnClick dla drugiego Panelu, po kliknięciu Panel2 przycisk „przeskakuje” z Panel1 do Panel2: Panel1 nie jest już elementem nadrzędnym dla przycisku.



Gdy chcesz utworzyć TButton w czasie wykonywania, ważne jest, abyśmy pamiętali o przypisaniu rodzica - kontrolki zawierającej przycisk. Aby komponent był widoczny, to musi mieć rodzica, aby się w nim pokazać .

RodzicTo i RodzicTo

Jeśli wybierzesz przycisk w czasie projektowania i spojrzysz na Inspektora obiektów, zauważysz kilka właściwości „Parent-aware”. The Czcionka nadrzędna , na przykład wskazuje, czy czcionka użyta do podpisu przycisku jest taka sama, jak ta użyta do elementu nadrzędnego przycisku (w poprzednim przykładzie: Panel1). Jeśli ParentFont ma wartość True dla wszystkich przycisków na panelu, zmiana właściwości Font panelu na Bold spowoduje, że wszystkie podpisy przycisku na panelu będą używać tej (pogrubionej) czcionki.



Kontroluje Właściwość

Wszystkie komponenty, które mają tego samego rodzica, są dostępne w ramach Sterownica własności tego Rodzica. Na przykład Kontrole mogą być używane do: iteruj po wszystkich dzieciach kontrolki okienkowej .

Kolejny fragment kodu może zostać użyty do ukrycia wszystkich zawartych komponentów w Panelu1:



|_+_||_+_|
|_+_|
|_+_|

Podstępne sztuczki

Kontrolki okienkowe mają trzy podstawowe cechy: mogą otrzymywać fokus wprowadzania, wykorzystują zasoby systemowe i mogą być rodzicami innych kontrolek.

Na przykład składnik Button jest kontrolką okienkową i nie może być elementem nadrzędnym innego składnika — nie można umieścić na nim innego składnika. Rzecz w tym, że Delphi ukrywa przed nami tę funkcję. Przykładem jest ukryta możliwość, że TStatusBar ma na sobie pewne komponenty, takie jak TProgressBar.



Własność

Po pierwsze, zwróć uwagę, że formularz jest ogólnym właścicielem wszystkich komponentów, które się w nim znajdują (umieszczone w formularzu w czasie projektowania). Oznacza to, że gdy formularz zostanie zniszczony, wszystkie elementy formularza również zostaną zniszczone. Na przykład, jeśli mamy aplikację z więcej niż jednym formularzem, kiedy wywołujemy metodę Free lub Release dla obiektu formularza, nie musimy się martwić jawnym zwolnieniem wszystkich obiektów w tym formularzu — ponieważ formularz jest właścicielem wszystkie jego składniki.

Każdy komponent, który tworzymy, w czasie projektowania lub wykonywania, musi być własnością innego komponentu. Właściciel składnika — wartość jego właściwości Owner — jest określany przez parametr przekazany do konstruktora Create podczas tworzenia składnika. Jedynym innym sposobem ponownego przypisania właściciela jest użycie metod InsertComponent/RemoveComponent w czasie wykonywania. Domyślnie formularz jest właścicielem wszystkich znajdujących się w nim składników, a z kolei jest własnością Aplikacji.

Kiedy używamy słowa kluczowegoSamego siebiejako parametr metody Create — obiekt, który tworzymy, jest własnością klasy, w której znajduje się metoda — co zwykle jest formą Delphi.

Jeśli z drugiej strony uczynimy inny komponent (nie formę) właścicielem komponentu, to czynimy ten komponent odpowiedzialnym za pozbycie się obiektu, gdy zostanie zniszczony.

Jak każdy innykomponent Delphi,niestandardowy komponent TFindFile może być tworzony, używany i niszczony w czasie wykonywania. Aby tworzyć, używać i bezpłatnieKomponent TFindFilepo uruchomieniu możesz użyć następnego fragmentu kodu:

|_+_||_+_|
...
|_+_|

|_+_|
|_+_|
|_+_|
|_+_|
|_+_|

Uwaga: Ponieważ plik FFile jest tworzony z właścicielem (Formularz 1), nie musimy nic robić, aby zwolnić komponent — zostanie on zwolniony, gdy właściciel zostanie zniszczony.

Właściwość składników

Wszystkie komponenty, które mają tego samego Właściciela są dostępne w ramach Właściwość składników tego Właściciela. Poniższa procedura służy do usuwania wszystkich komponentów edycji znajdujących się w formularzu:

|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|

„Sieroty”

Niektóre kontrolki (takie jak kontrolki ActiveX) są zawarte w oknach innych niż VCL, a nie w kontrolce nadrzędnej. Dla tych kontrolek wartość Parent jest zero i Okno rodzica właściwość określa okno nadrzędne inne niż VCL. Ustawienie ParentWindow przenosi kontrolkę tak, aby była zawarta w określonym oknie. ParentWindow jest ustawiana automatycznie, gdy kontrolka jest tworzona za pomocą Utwórz Rodzicielstwo metoda.

Prawda jest taka, że ​​w większości przypadków nie musisz dbać o Rodziców i Właścicieli, ale jeśli chodzi o OOP irozwój komponentówlub gdy chcesz zrobić krok naprzód w Delphi, stwierdzenia zawarte w tym artykule pomogą ci zrobić ten krok szybciej.