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;
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;
问题是这样的:
过程FEnter根本就不是属于TForm1类的,所以你在TForm1的FormCreate事件中调用这个过程肯定会报错的,编译的时候会出错,建议你多看看OO吧。good luck!
@Edit1.OnEnter:=@FEnter;//通过,FEnter定义在TForm外就不行,如下面
指针指向我的通用过程。
copy_paste(木石三) :不行,Sender是传不来。还有办法吗?
OO我也还熟悉,可这次遇到了个特殊的问题。
请大家继续!!!
OnEnter类型的过程定义就明白了它必定是 procedure ProcName(...) of object;
~~~~~~~~~~~
注意~~~~~的部分,这就是为什么你在外面定义不行的原因。类型不匹配!
它必须是属于对象的一个方法,但可以不是Form的方法,可以是任何一个
可用对象的方法,可以不在TForm1类中。
[ xiaokang520(Nova) 的理解有问题]
bely_zhou()的方法应该可行,我没有测试过!刚些完才发现 copy_paste(木石三) 已经讲得
比较清楚了,懒得删了,就这样发了!
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,封装,继承,多态,直接写的话不是面向过程了吗?怎么越编越退步了
我做这个时,是专门写了类,将一些公共的东西都放在那,控制Application.Forms的风格。具体怎么做,那是各个风格和需要问题