窗体在创建时,fenter()还没有创建,请将fenter()放在 formonshow()中去!

解决方案 »

  1.   

    to jieyuanwang(界渊) :不是运行错误,是编译错误。
      

  2.   

    of object是说在类里面定义的函数,脱离了类,那就不是类函数了。可以如下一试:
    procedure OnChange(Sender: Tobject);
    begin
      //如果不在类里,它传不过参数过来,不管是Sender还是其它参数
      if Assigned(Sender) then
        Form1.Caption := TEdit(Sender).Text else
        Form1.Caption := 'sender is null';
    end;procedure TForm1.FormCreate(Sender: TObject);
    var
      P: Pointer;
    begin
      P := @OnChange;
      @Edit1.OnChange := P;
    end;
      

  3.   

    xfei (zzz^^^) :
    问题是这样的:
        过程FEnter根本就不是属于TForm1类的,所以你在TForm1的FormCreate事件中调用这个过程肯定会报错的,编译的时候会出错,建议你多看看OO吧。good luck!
      

  4.   

    改成下面格式就可以了
    @Edit1.OnEnter:=@FEnter;//通过,FEnter定义在TForm外就不行,如下面
      

  5.   

    问题是这样的:我有个通用过程,要控制某些控件的行为,如OnEnter,OnChanged,这个过程在一个独立的pas中,我要把那些控件的过程
    指针指向我的通用过程。
    copy_paste(木石三) :不行,Sender是传不来。还有办法吗?
    OO我也还熟悉,可这次遇到了个特殊的问题。
    请大家继续!!!
      

  6.   

    你看看类事件中如
    OnEnter类型的过程定义就明白了它必定是 procedure ProcName(...) of object;
                                    ~~~~~~~~~~~
    注意~~~~~的部分,这就是为什么你在外面定义不行的原因。类型不匹配!
    它必须是属于对象的一个方法,但可以不是Form的方法,可以是任何一个
    可用对象的方法,可以不在TForm1类中。
    [ xiaokang520(Nova) 的理解有问题]
    bely_zhou()的方法应该可行,我没有测试过!刚些完才发现 copy_paste(木石三) 已经讲得
    比较清楚了,懒得删了,就这样发了!
      

  7.   

    我来给你描述描述:class 1 (建一个类,封装所有的处理函数)
      procedure FEnter(Sender:TObject);
      begin
        ......
      endclass 2
      TForm1 = class(TForm)
      var 
        class1的实例:class 1
      procedure TForm1.FormCreate(Sender: TObject);
      begin
         class1的实例:=class 1.create;     
         Edit1.OnEnter:=class1的实例.FEnter(sender);
      end;
    如上所示就可以传递值了
    你可以试试看,要知道面向对象的程序设计,OO,封装,继承,多态,直接写的话不是面向过程了吗?怎么越编越退步了
      

  8.   

    如你所说,我以前我试过想用通用函数代替一些,或应该很多单元的类过程/函数,但是像上面通过全局变量/方法函数来实现,我是没做到。
    我做这个时,是专门写了类,将一些公共的东西都放在那,控制Application.Forms的风格。具体怎么做,那是各个风格和需要问题