2

我创建了一个类似于从 Tcustomcontrol 派生的 PageControl 组件,该组件托管从 TcustomPanel 派生的子选项卡表。

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

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

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

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

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

经过一番搜索,我在 Stackoverflow 上找到了一个示例,该示例表明

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

我这样做了,组件现在显示在表单树上,但作为通用“组件 [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;

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

有任何想法吗?

4

1 回答 1

6

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

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

在 TMyTabSheet 创建之后。

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

旁注2:不要使用with (甚至没有必要,因为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;
于 2019-01-31T23:51:59.570 回答