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

And*_*y k 2 delphi delphi-10.3-rio

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

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

我使用"添加页面"动词为Pagecontrol创建了属性编辑器.

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

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

麻烦的是,新页面没有名称,在对象检查器中显示为"未命名",并且不显示在表单结构树图上.

经过一番搜索后,我在Stackoverflow上找到了一个显示a的示例

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;
Run Code Online (Sandbox Code Playgroud)

编辑代码是

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;
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

Uwe*_*abe 6

似乎你必须自己设置名称.添加一行

Ts.Name := Designer.UniqueName(Ts.ClassName);
Run Code Online (Sandbox Code Playgroud)

创建TMyTabSheet之后.

旁注1:不要使用某人所有者!而是使用Designer.Root.

旁注2:不要! (甚至没有必要,因为TComponent已经介绍了所有者属性)

所以你的代码最好看起来像这样:

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