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)
作为属性编辑器中的测试,我尝试向自定义控件添加一个标准按钮,结果相同.
有任何想法吗?
似乎你必须自己设置名称.添加一行
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)
| 归档时间: |
|
| 查看次数: |
54 次 |
| 最近记录: |