把edit的enable属性置为false的时候,仅仅只是将font的颜色变了,但是edit的背景颜色没有变化。如果edit中没有字的话,就看不出区别,用户容易误会。    setenable是TControl的一个保护方法,调用的是Perform(CM_ENABLEDCHANGED, 0, 0);
    我给TControl增加了一个ffcolor的私有变量,在setenable中增加了一段
    if FEnabled then
      FColor:= FFColor
    else
      FColor:= clBtnFace;    ffcolor在setcolor方法中,保持与fcolor一致
    但是TControl.pas编译不通过
    报错: unit forms was compiled with a diffrent version of Controls.TWinControl    如何解决, 我想直接修改vcl实现,设置enable属性的时候,背景颜色跟着改变,这样TMemo,TComboBox都可以了

解决方案 »

  1.   

    我想直接修改vcl实现,设置enable属性的时候,背景颜色跟着改变,这样TMemo,TComboBox都可以了每个都去写太麻烦而且 setcolor是Tcontrol的私有方法
      

  2.   

    很多的地方又应用了TControl所在单元,需要都重新编译把?
      

  3.   

    直接修改VCL代码会有很多问题,建议你还是自己从TCustomEdit继承一个下来,这样比较简单,而且还有一个更好的办法,我给你写个例子,等等
      

  4.   

    更简单的办法
    如果你不想修改原来的程序这么写,建立一个新的unit MyTEdit
    unit Unit2;interfaceUses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, StdCtrls;
    type
      TEdit= Class(StdCtrls.TEdit)
      private
        FColor: TColor;
      protected
        procedure SetEnabled(Value: Boolean); override;
      end;
    implementation{ TEdit }
    procedure TEdit.SetEnabled(Value: Boolean);
    begin
      inherited;
      if FColor=0 then
        FColor:= Self.Color;
      if Value then
        Self.Color:= FColor
      else
        Self.Color:= clBtnFace;
    end;end.然后在你的正常程序里面interface
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Grids, DBGrids, MyTEdit;
    //.                                 ~~~~~~~~~
    这个MyTEdit一定要写在 StdCtrls 之后
    然后你再看看type
      TForm1 = class(TForm)
        Button1: TButton;
        DBGrid1: TDBGrid;
        Edit1: TEdit;
    …………
      

  5.   

    pazee(耙子) 谢谢你的回答,但是有一个问题这样的edit我就只能改变一次颜色了。比如在输入中 我发现输入的是负数   颜色改变为clred, 然后设置了enable属性下次输入中 输入的是正数, 颜色改变为clwindow, 这时如果设置enable属性 ,则颜色会变为clred, 如何解决?
      

  6.   

    你不能通过修改字体的颜色方式吗?比如把字体变红。
    否则你必须引入其他的属性来描述记载这东西,这对于兼容不是个好办法。如果你下定决心,自己重新完善一下这个控件,你还是从TCustomEdit继承一个。Color是从TControl继承下来的,想彻底修改它比较复杂。
      

  7.   

    最好不要直接修改VCL的代码,你直接新建一个组件继承自它就是了