如题我们怎么才能获取一个变量改变的事件呢?
估计这个问题很多人都想知道!因为如果真的可以的话,有很多东西都很好实现了!而不需要去做太多的东西!我想编程世界里面没有什么东西是不可能,只有你敢与不敢去想,还有就是你能不能想到而已!首先,变量是储存在一个内存块里面的,我想,不知道有没有什么函数或者东西能获取到这个内存块改变的方法呢?如果有那可就好办多了!但我感觉这个好像不那么容易实现!而我对这个问题的另外一个想法就是:说到变量!其实变量的含义不紧紧是一个数或者一个字符串那么简单!其实可以说那是一个对象!既然是对象,那么我们可以对它这个对象的类做更多的方法,或者说在原来的基础上做更多的方法!我是想为这个类改变某些东西的时候做一个方法,就像Java或者C++那样!一个对象的某个属性改变所使用的setXXX这样的语句,在这个类里面的setXXX方法去获取改变的信息,然后完成自己想完成的东西!但是Delphi好像没有这样的一种方法!还是我学不到家,根本不知道能做这些东西呢?请大伙指教一下!

解决方案 »

  1.   

    setXXX这样的语句,你看一下vcl代码能看到很多这样的语句
      

  2.   

    没错,VCL中有很多这样的例子。很多属性的改变都是是通过GetXX,SetXX来实现的。
    而且也有很多属性改变即触发事件的例子。
      

  3.   

    问题在于控件的属性好像没有setXXX的吧?如enable属性,它好像直接赋值给这个属性的,我要获取改变某个控件的enable属性我该如何获取?如果有setXXX方法的话,我可以重载这个方法来实现我想要的功能啊!但是如果继承这个控件,向这个控件添加这个setXXX方法也没什么,但是如果多了的话,那可真麻烦了!
      

  4.   

    如果你们说的没错!那么我如何获取某个控件的enable属性改变的事件呢?
      

  5.   

    我也没办法!我看的书都没有这些东西!能否举个Delphi帮助里面的东西来看看?目前本人的所有编程知识都是靠自己的摸索出来的,公司就本人做软件!你说我能有什么办法?所以上来请教大家!希望大家能给个意见,让我少走点弯路!
      

  6.   

    那你认为那种方法好?read write后面跟的东西没看到?把属性的读写统一到一个接口有什么错?如果这种方法不好,C#中的属性也没必要搞个get,setC++中编译器不支持属性,要用模板高效率实现同样的东西,要多做多少事,你知道吗?如果连以上你提到的几种语言的基本语法都不是很清楚,真的不好提这种问题
      

  7.   

    TTest = class
    private
      FTest: Integer;
      function GetTest: Integer;
      procedure SetTest(Value: Integer);
    published
      property DoTest: Integer read GetTest write SetTest;
    end;function TTest.GetTest: Integer;
    begin
      Result := FTest;
    end;procedure TTest.SetTest(Value: Integer);
    begin
      FTest := Value;
      //Do some thing
    end;当然像上面的例子
    property DoTest: Integer read GetTest write SetTest;
    一般直接写成
    property DoTest: Integer read FTest write SetTest;有时候也会用
    property DoTest: Integer read FTest write FTest;
      

  8.   

    当然这不是事件~~~事件就是把上面的数据类型由Integer换成函数指针,是类实例化后通过属性给它赋一个具体函数,然后类中的成员就可以回调类外的函数了,这才是我们常说的事件机制
      

  9.   

    procedure TControl.SetEnabled(Value: Boolean);
    begin
      if FEnabled <> Value then
      begin
        FEnabled := Value;
        Perform(CM_ENABLEDCHANGED, 0, 0);
      end;
    end;
      

  10.   

    你可以覆盖他的方法type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
        procedure Setenabled(value:boolean);override;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    procedure TForm1. Setenabled(value:boolean);
    begin
      showmessage('can not disable');
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      form1.Enabled:=false;
    end;
      

  11.   

    也可一重载他本来的功能并添加自己的事件type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
        procedure Setenabled(value:boolean);override;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    procedure TForm1. Setenabled(value:boolean);
    begin
      inherited;
      caption:='被禁用!'
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      form1.Enabled:=false;
    end;
      

  12.   

    谢谢!"把属性的读写统一到一个接口"这个确实是个不错的方法!这是我第一次看这样的例子,就是说Delphi中很多属性都采用了这种统一到某个接口的了!你帮我看看你的TTest的应用对不对:
    var
    test:TTest;
    begin
    edit1.text:=inttostr(test);
    test:=strtoint(edit2.text);
    end;
    不知道这样是不是使用到了你的TTest呢?请指教!
      

  13.   

    指点一下买哪一本书好吗?没办法!没时间看啊!白天工作,谁给你时间看?晚上学习java,我怎么看啊!不过就看看你推荐的书是什么书了!