开发的容器控件,如何限定容器中允许添加的子控件类型?我想开发一个容器,可以添加其他的子控件。但是我想只让这个容器添加某几个指定的控件类型。例如你可以向这个容器中添加 TLabel 但是不能添加TButton,在设计期时能出现提示拒绝添加。我的容器控件从TWinControl继承。 看过它的InsertControl方法,但是这个方法无法被override。大家有没有什么建议?

解决方案 »

  1.   

    就帮你Up ,没尝试过,找了一下也没找到>_<
      

  2.   

    看看
    TComponent 的    procedure ValidateContainer(AComponent: TComponent); dynamic;
        procedure ValidateInsert(AComponent: TComponent); dynamic;
      

  3.   

    to: kaguo,帮忙找已经很感激了。呵呵。to: aiirii(ari-爱的眼睛)
    多谢,你一出手就击中了要害,昨天晚上没有深入进去看,真是惭愧呵呵。不过我上班时无法试,等晚上试过之后,再给出结论。
    欢迎其他朋友继续讨论。
      

  4.   

    to: aiirii(ari-爱的眼睛)
      昨晚试过override procedure ValidateInsert(AComponent: TComponent); dynamic;
    可以在 InsertControl 之前对子控件进行检测。 但是由于 ValidateInsert 是方法,不是函数,无法通过 validateInsert 的情况中止 InsertControl 的进行,只能Raise Exception中止InsertControl ,不过这样好像无法把AComponent free 掉, 我试过在Raise Exception 之前调用 AComponent.free 方法释放AComponent,总是报非法异常。另外试过捕捉 CM_ControlChange 的消息。 这样可以在 InsertControl 之后对子控件检测,删除非法的子控件,不过这样也不是很好的方式。不知你是否对这个问题有兴趣,期待你能提出更好的见解。
      

  5.   

    不知道有没有这个必要,Delphi所有的VCL都没限制这样操作如果一个容器只允许放置你自己的VCL,你可以这样做
    begin
      ControlStyle :=ControlStyle +[csAcceptsControls];
      //在这里创建你的子控件
      ControlStyle :=ControlStyle -[csAcceptsControls];
    end
      

  6.   

    就像DBGrid,它本身不是容器类控件,
    但它有各种数据类型的编辑器,都是封装好了动态创建的,你也可以借鉴它的思想,把所有的子控件封装好,
    对于父控件,只需要开放属性与方法接口就行了,
    不知道是不是你想要达到的目的
      

  7.   

    To:liuziran(CSDN第一帅哥(原倒立旋风转的青蛙))你好,你可以这样做
    begin
      ControlStyle :=ControlStyle +[csAcceptsControls];
      //在这里创建你的子控件
      ControlStyle :=ControlStyle -[csAcceptsControls];
    end
    或许真的可以在这个方面上做些文章,不过感觉在设计期很难对ControlStyle进行灵活的控制。我会做做这方面的尝试再给你大幅。
    另外有时候是需要进行这方面的控制的,你说的DBGRID,它的功能很强大,但是因为它不是容器,所以可以调整和添加的地方就太少了。