我已经创建了一个类似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;
作为在属性编辑器中的测试,我尝试向自定义控件中添加一个具有相同结果的标准按钮。
有什么想法吗?
答案 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;