问题一:如果我在自定义控件上加入一个属性FocusControl,类似于TLabel控件的那个属性的,通过这个属性可以关联到另一个控件,现在我想做到当被关联的控件的位置发生移动的时候,我自定义的控件的位置也跟着移动,只是不知道应该怎样接收那个消息.
    另外,如果不只是位置的移动,广义的说,只要是被关联的控件的某个属性发生了改变,要求我自定义的控件都能接收到这个消息,应该怎么做?问题二:如果我写一个Edit的子类MyEdit控件,那么它自动继承了父类的MaxLength属性(当然还有其他),现在我希望当MyEdit控件的MaxLength属性发生改变时控件能够执行一些自定义的操作(比如说弹出一个对话框等等)但因为MaxLength的Set和Get过程都是封装在祖先中的,我无法在其中插入代码,请教应该怎么做?
    这里只是举MaxLength作为例子,如果任何一个这种继承来的控件的属性发生改变时,我应该怎么添加代码?以上两个问题在我公司内部使用的专用控件中都得到了应用,但是不知道是如何实现的,为此想请教各位有控件开发经验的高手,谢谢!

解决方案 »

  1.   

    我也不能确定,不过可以试试用reintroduce来重载SetMaxLength方法。不过要记得inherited
      

  2.   

    设置一个外部的WndProc取代目标控件原来的。拦截WM_SIZE消息,做完你自己的操作后记得调用事先保存好的老的WndProc。
      

  3.   

    以上各位的支持我表示感谢!
      但是对属性的Set和Get过程都是放在祖先类的private当中,对子类是不可见的,如果我在子类中采用override方法进行重载则编译器会告诉我不存在相应的祖先过程,(这是肯定的,因为对于子类来说,本来就应该不知道的),而如果不使用override,很显然,我新加入的这个过程不会被调用,等于没用.
      以上是我测试的结果,希望有兴趣的高手们多多指教,或者提一些思路建议,再次表示感谢!
      

  4.   

    对了,刚刚忘记了,那就是reintroduce不能起作用,我查阅了Delphi自带帮助(选中reintroduce单击F1),里面有一句明确的说明关于控件的Set和Get方法是不能使用reintroduce指示符的.诸位有兴趣可以看一看.
      

  5.   

    那就试试重载WndProc的方法。对于很多的属性变化都会有CM_...或者WM_...消息的。
    此外,截获每一个控件的每一个属性变化用一般的方法应该是不可能的(先假设你不打算扫描内存……就像爱护皮椅那样:P)。如果只是像你说的那样取得位置的变化则好办得多,截获WM_SIZE就可以了。
      

  6.   

    用d6,有一构件把edit和label给绑在一起。
      

  7.   

    1。是设计期的事情还是运行后才发生?如果是前者,算了,难搞,后者就很好搞定的了2。最好不要直接继承TEdit,而是继承TCoustomEdit
      

  8.   

    重新定义MaxLength  TMyEdit = class(TEdit)
      private
        function GetMaxLength: integer;
        procedure SetMaxLength(const Value: integer);
      published
        property MaxLength:integer read GetMaxLength write SetMaxLength;
      end;
    function TMyEdit.GetMaxLength: integer;
    begin
      result:=inherited MaxLength;
    end;procedure TMyEdit.SetMaxLength(const Value: integer);
    begin
      inherited MaxLength:=Value;
      showmessage('');
    //你的代码end;
      

  9.   

    第一个问题:
      例如 TCustomClass2 要随TCustomClass1而动
    那么在TCustomClass1中声明一个公开变量 FOwner :TCustomClass2;
    type
     TCustomClass2 =class;
     TCustomClass1 =class(TCustomParentClass1)
     public
       OwnerClass :TCustomClass2;
     ...
    end;
     
    TCustomClass2=class(TCustomParentClass2)
    private
      CustomClass1 :TCustomClass1;
    public
      constructor Create(AOwner:TComponnet);override;
      destructor  Destroy; override;
    end;constructor TCustomClass2.Create(AOwner:TComponnet);
    begin
      Inherited Create(AOwner);
      CustomClass1 :=TCustomClass1.Create(Self);
      CustomClass1.OwnerClass :=Self;
      //OK,接下来就可以在CustomClass1中操作CustomClass2了,
    end;
      
    destructor  Destroy;
    begin
      CustomClass1.Free;
      Inherited Destroy;
    end;end;第二个问题:
    直接从TCustomEdit 的父类TWinControl继承重写就是了,然后把TCustomEdit的大部分代码COPY过来,加入自己的,就OK了
      

  10.   

    不过绝大多数的Owner属性是用Delphi IDE自动设定为Form的。自己好象没什么办法修改。