如何在Delphi中访问父表单

时间:2016-04-15 18:16:33

标签: forms delphi components parent

我正在编写自己继承自TButton的组件。我需要使用父表单进行一些操作,我的新组件将被放置。

那么,如何从我自己的组件代码访问父表单?

代码示例(MyComponentCode.pas):

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

帮我解决这个问题。谢谢。

2 个答案:

答案 0 :(得分:12)

要访问组件所在的父TForm,即使您的组件实际上位于其他容器控件上(例如TPanelTFrame),也请使用{{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 )某些控件没有父级。