2016-04-15 7 views
0

Ich schreibe meine eigene Komponente, die von TButton geerbt hat. Ich muss etwas Manipulation mit Elternformular machen, wo meine neue Komponente platziert wird.So greifen Sie auf das übergeordnete Formular in Delphi zu

So, wie auf das übergeordnete Formular von meinem eigenen Komponentencode zugreifen?

Code-Beispiel (MyComponentCode.pas):

ButtonParent.Canvas.Pen.Color := RGB(255,255,255); // where "ButtonParent" have to be a parent form 

mir helfen, dieses Problem zu lösen. Vielen Dank.

+0

Eltern Kontrolle ist nicht unbedingt eine Form, es kann zum Beispiel 'TPanel' sein. Machen Sie klar, was Sie brauchen - ein Elternsteuerelement oder ein Eigentümerformular. – kludg

+0

@ user246408 Ich brauche Besitzer Formular. –

+0

Dann brauchen Sie Eigentümereigenschaft Ihrer Komponente; IDE setzt es, wenn Sie eine Komponente in einem Formular löschen; und ich denke, Sie müssen den Unterschied zwischen "Besitzer" und "Eltern" in Delphi lernen. – kludg

Antwort

10

Um den übergeordneten Zugriff TForm, die Ihre Komponente auf residiert, auch wenn Ihre Komponente tatsächlich auf einem anderen Container-Steuerelement ist (wie ein TPanel oder TFrame), verwenden Sie die GetParentForm() Funktion in der Vcl.Forms Einheit:

uses 
    ..., Forms; 

var 
    Form: TCustomForm; 
begin 
    Form := GetParentForm(Self); 
    //... 
end; 
1

Das übergeordnete Element ist das Steuerelement, das das Steuerelement enthält.
Wenn Sie ein Steuerelement in einem Panel löschen, wird das übergeordnete Element das Panel sein.

Der Besitzer eines Steuerelements wird normalerweise die Form sein, die es enthält, aber das ist nicht immer der Fall. Wenn Sie mit Frames arbeiten, besitzt der Frame die Steuerelemente darin.

Der Weg zum Formular, das Ihre Kontrolle besitzt, ist, den Baum hinauf zu gehen, bis Sie ein echtes Formular finden.

Sie können VCL.Forms.GetParentForm nennen, die wie folgt aussieht:

function GetParentForm(Control: TControl; TopForm: Boolean = True): TCustomForm; 
begin 
    while (TopForm or not (Control is TCustomForm)) and (Control.Parent <> nil) do 
    Control := Control.Parent; 
    if Control is TCustomForm then 
    Result := TCustomForm(Control) else 
    Result := nil; 
end; 

Oder wenn Sie durch den Eigentümer wollen bekommen dort können Sie tun:

function GetOwningForm(Control: TComponent): TForm; 
var 
    LOwner: TComponent; 
begin 
    LOwner:= Control.Owner; 
    while Assigned(LOwner) and not(LOwner is TCustomForm) do begin 
    LOwner:= LOwner.Owner; 
    end; {while} 
    Result:= LOwner; 
end; 

Es ist wichtig, den Unterschied zwischen der grok Eltern und der Besitzer, siehe:
http://delphi.about.com/od/objectpascalide/a/owner_parent.htm

Natürlich können Sie den gleichen Trick verwenden mit der parent Eigenschaft. Wenn Sie den Baum lange genug (fast) hochgehen, wird jedes Steuerelement das Formular als sein Eltern haben.

) Einige Steuerelemente haben kein Parent.

+0

Dies setzt voraus, dass die "Eigentümer" -Kette schließlich zu einem "TForm" führt, was nicht garantiert ist. Sie sollten stattdessen ['GetParentForm()'] (http://docwiki.embarcadero.com/Libraries/en/Vcl.Forms.GetParentForm) verwenden. –