代码之家  ›  专栏  ›  技术社区  ›  Andy k

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

  •  2
  • Andy k  · 技术社区  · 6 年前

    选项卡页由宿主pagecontrol通过newpage方法创建,或者通过创建新的选项卡页并设置其pagecontrol属性来创建,与标准pagecontrol几乎相同。

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

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

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

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

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

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

    财产登记目前看起来像

    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;
    

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

    有什么想法吗?

    1 回复  |  直到 6 年前
        1
  •  6
  •   Uwe Raabe    6 年前

    看来你得自己定名字了。加行

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

    在创建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;
    
    推荐文章