Forma jest właścicielem komponentów, które się na niej znajdują. Na przykład, umieszczasz na formie TPanel, potem na panelu TButton. Właścicielem przycisku jest forma, ale jego rodzicem jest panel. Posiadanie ma związek z przydzielaniem pamięci; forma alokuje i dealokuje pamięć dla panelu i przycisku. Z kolei właścicielem formy jest aplikacja i to ona jest odpowiedzialna za zarządzanie pamięcią. Rodzicielstwo zwykle opisuje graficzny sposób wyświetlania powierzchni.
TShape *MyShape = new TShape(Owner);Właściciel nie może być zmieniony bez zniszczenia obiektu i wywołania jego konstruktora. W czasie pracy programu przypisujesz właściciela podczas wywołania konstruktora. Często widzisz: TShape *MyShape = new TShape(this);Słowo kluczowe this jest użyte by określić adres obiektu. Wskaźnik this jest pośrednio użyty do odniesienia się do członków i funkcji należących do obiektu. Na przykład, wewnątrz funkcji należącej do Form1 słówko this odnosi się do adresu obiektu Form1. Tak więc w powyższej deklaracji właścicielem TShape będzie Form1, co jest równoznaczne z: TShape *MyShape = new TShape(Form1);Właścicielem nie musi być zawsze forma, chociaż ostatecznym właścicielem jest zawsze główna forma a właścicielem formy jest aplikacja. Ludzie często mylą rodzica z właścicielem. Właściciela określa się jedynie podczas wywołania konstruktora* i jest nie można go zmieniać. Rodzica natomiast można przypisać i zmieniać kiedykolwiek, nie musi on być tożsamy z właścicielem. Chcę na przykład, żeby właścicielem TShape (MyShape) był TPanel (Panel1), ale żeby był wyświetlany na TForm (Form1): TPanel *Panel1 = new TPanel(Form1); Panel1->Parent = Form1; TShape *MyShape = new TShape(Panel1); MyShape->Parent = Form1;W tym przypadku MyShape pojawi się na formie, a nie na panelu. Oto przykład hierarchii właścicieli: TPanel *MyPanel = new TPanel(this); TButton *MyButton = new TButton(MyPanel); TShape *MyShape = new TShape(MyButton);Jeżeli wykonałbyś poniższe komendy: ShowMessage(MyShape->Owner->ClassName()); ShowMessage(MyShape->Owner->Owner->ClassName()); ShowMessage(MyShape->Owner->Owner->Owner->ClassName()); ShowMessage(MyShape->Owner->Owner->Owner->Owner->ClassName());Zobaczyłbyś: "TButton" "TPanel" "TForm" "TApplication" *Właściciel komponentu może zostać zmieniony w czasie pracy programu przy użyciu funkcji InsertComponent o RemoveComponent. Poniższy przykład pokazuje jak tego dokonać: TButton *Button2 = new TButton(Panel1); Button2->Parent = Panel1; ShowMessage(Button2->Owner->Name); //Wyświetla "Panel1" //Zmienia właściciela przycisku Button2 na Panel2 Panel1->RemoveComponent(Button2); Panel2->InsertComponent(Button2); ShowMessage(Button2->Owner->Name); //Wyświetla "Panel2" ShowMessage(Panel1->ComponentCount); //Wyświetla "0" ShowMessage(Panel2->ComponentCount); //Wyświetla "1" delete Button2; |