我正在编写自己继承自TButton的组件。我需要使用父表单进行一些操作,我的新组件将被放置。
那么,如何从我自己的组件代码访问父表单?
代码示例(MyComponentCode.pas):
ButtonParent.Canvas.Pen.Color := RGB(255,255,255); // where "ButtonParent" have to be a parent form
帮我解决这个问题。谢谢。
答案 0 :(得分:12)
要访问组件所在的父TForm
,即使您的组件实际上位于其他容器控件上(例如TPanel
或TFrame
),也请使用{{3} Vcl.Forms
单位中的函数:
uses
..., Forms;
var
Form: TCustomForm;
begin
Form := GetParentForm(Self);
//...
end;
答案 1 :(得分:2)
父母是持有控件的控件 如果在控制面板上放置控件,则父级将成为面板。
控件的所有者通常是持有它的形式,但情况并非总是如此。如果你使用Frames,那么框架将拥有它内部的控件。
获取拥有您控件的表单的方法是继续向上移动树,直到找到真实的表单。
您可以拨打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;
了解父母和主人之间的区别非常重要,请参阅:
http://delphi.about.com/od/objectpascalide/a/owner_parent.htm
当然,您可以使用parent
属性的相同技巧。如果你在树上走得太长(差不多),那么每个控件 1 都会将表格作为其父级。
1 )某些控件没有父级。