主机组件创建的自定义子组件不会由设计者自动命名

时间:2019-01-31 23:21:04

标签: delphi delphi-10.3-rio

我已经创建了一个类似TPageControl的组件,该组件派生自Tcustomcontrol,它承载着从TcustomPanel派生的子选项卡。

标签页是由宿主pagecontrol通过newpage方法或通过创建新的标签页并设置其PageControl属性来创建的,与标准pagecontrol几乎相同。

我使用“添加页面”动词为Pagecontrol创建了属性编辑器。

由于Tabsheet不在组件面板上,因此我在设计器代码中创建了RegisterClass条目。

这一切正常,我可以创建子选项卡,甚至可以在设计器中选择它们并设置属性。

问题是,新页面没有名称,并且在对象检查器中显示为“未命名”,并且没有显示在“表单”结构树图中。

经过一些搜索,我在Stackoverflow上找到了一个示例,显示了一个

RegisterNoIcon([Myclass])需要与registerClass一起添加。

我这样做了,该组件现在显示在表单树上,但显示为通用的“ Component [14]”,而子对象在对象检查器中仍显示为“未命名”。

很明显,集成的Pagecontrol / tabsheet有一些额外的调味料,可以在设计器中正确注册该组件,但是我一直在努力寻找它的含义。

目前的财产注册状况

procedure Register;
begin
  RegisterComponents('My Page Control', [TMyPageControl,TMytitlebar,TMyTabset]);
  RegisterComponentEditor (TMypageControl, TMyCompEditor);
  RegisterComponentEditor (TMyTabSet, TMyTabEditor);
  RegisterClass(TMytabSheet);
  RegisterNoIcon([TMytabSheet]);
end;

,修改代码为

procedure TMyCompEditor.ExecuteVerb(Index: Integer);
var ts:MyTabsheet;
begin
  inherited;
  case Index of
    0: with Component as TMyPageControl do
    begin
      Ts:=TmyTabsheet.Create(Owner);
      Ts.Pagecontrol:=(Component as TMyPageControl);
    end;
  end;
end;

作为在属性编辑器中的测试,我尝试向自定义控件中添加一个具有相同结果的标准按钮。

有什么想法吗?

1 个答案:

答案 0 :(得分:6)

似乎您必须自己设置名称。添加一行

Ts.Name := Designer.UniqueName(Ts.ClassName);

在创建TMyTabSheet之后。

注释1:请勿使用他人所有者!而是使用Designer.Root

注释2:请勿将一起使用! (甚至没有必要,因为TComponent已经引入了 Owner 属性)

所以您的代码最好像这样:

  case Index of
    0: begin
      Ts := TmyTabsheet.Create(Designer.Root);
      Ts.Name := Designer.UniqueName(Ts.ClassName);
      Ts.Pagecontrol := (Component as TMyPageControl);
    end;
  end;