宿主组件创建的自定义子组件未由设计器自动命名

Custom child component created by host component is not autonamed by designer

我创建了一个派生自 Tcustomcontrol 的类似 PageControl 的组件,它承载派生自 TcustomPanel 的子标签页。

Tabsheets 由主机 pagecontrol 通过 newpage 方法创建,或者通过创建新的 tabsheet 并设置其 PageControl 属性,与标准 pagecontrol 几乎相同。

我用 "Add Page" 动词为 Pagecontrol 创建了 属性 编辑器。

由于 Tabsheet 不在组件托盘上,我在设计器代码中创建了 RegisterClass 条目。

一切正常,我可以创建子标签表,甚至 select 在设计器中创建它们并设置属性。

问题是,新页面没有名称,在对象检查器中显示为"Unnamed",在表单结构树图中没有显示。

经过一番搜索,我在 Whosebug 上找到了一个示例,该示例显示

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

我这样做了,组件现在显示在表单树上,但作为通用 "Component[14]" 并且子项在对象检查器中仍然显示为 "unnamed"。

显然,集成 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;

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

有什么想法吗?

看来你必须自己设置名称。添加一行

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;