我正在编写一个继承自TButton的组件。我需要在我的新组件所放置的父窗体中进行一些操作。
那么,如何从我的组件代码中访问父窗体呢?
示例代码(MyComponentCode.pas):
ButtonParent.Canvas.Pen.Color := RGB(255,255,255); // where "ButtonParent" have to be a parent form
帮我解决这个问题。谢谢。
我正在编写一个继承自TButton的组件。我需要在我的新组件所放置的父窗体中进行一些操作。
那么,如何从我的组件代码中访问父窗体呢?
示例代码(MyComponentCode.pas):
ButtonParent.Canvas.Pen.Color := RGB(255,255,255); // where "ButtonParent" have to be a parent form
帮我解决这个问题。谢谢。
要访问您的组件所在的父级 TForm
,即使您的组件实际位于另一个容器控件(如 TPanel
或 TFrame
)上,也可以使用 Vcl.Forms
单元中的 GetParentForm()
函数:
uses
..., Forms;
var
Form: TCustomForm;
begin
Form := GetParentForm(Self);
//...
end;
VCL.Forms.GetParentForm
方法,其代码如下: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;
或者如果您想通过所有者进入,可以执行以下操作:
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;
TPanel
。请明确您需要的是父控件还是拥有者表单。 - kludgOwner
属性;当你将一个组件拖放到窗体上时,IDE 会自动设置它;我猜你需要学习 Delphi 中Owner
和Parent
的区别。 - kludgTForm
上,则可以保证Owner
仅为TForm
。如果它被放置在TFrame
上,则Owner
将是TFrame
。如果组件在运行时通过代码动态创建,则Owner
将是调用者传递给组件构造函数的对象。组件不应该对其Owner
(或其Parent
)做出任何假设。 - Remy Lebeau