gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:17:56 32 4
gpt4 key购买 nike

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

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

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

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

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

问题是,新页面没有名称,在对象检查器中显示为“未命名”,并且没有显示在表单结构 TreeMap 中。

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

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

我这样做了,组件现在显示在表单树上,但作为通用“组件 [14]”,子项在对象检查器中仍显示为“未命名”。

显然,集成的 Pagecontrol/tabsheet 有一些额外的调味料,可以向设计器正确注册组件,但我正在努力寻找它是什么。

属性(property)登记目前的样子

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:不要使用 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;

关于delphi - 宿主组件创建的自定义子组件未由设计器自动命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54470709/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com