如题:过程类型及方法指针的用法,请大家踊跃发言,多举例子!!!
解决方案 »
- MSAgent中的精灵只能读edit,不能读memo中的英文?
- delphi 调用相关问题~!!!!~~~~
- 多次查询的怎么邦定到一个DBGird里面去的啊??
- 动态链接库(DLL)使用奇怪问题,求救!
- dhtmledit的内容怎么直接付给sendmessage.body
- 请问我这个线程程序为什么不对?
- ComboBox额外信息和item.string相对应的问题???希望大家帮忙!~
- 请问一个有关borland database engine问题
- 程序安装问题?
- 怎么让一个窗口以独占的方式显示!!!!!
- 多线程 开启,停止的问题。
- 怎么不能给StringGrid.Rowcount赋初值为零?
myp=procedure(str:string;icount:int);
mypp=procedure(strtmp:string;i:int;mybool:boolean) of object;
上面的带与不带of object有什么区别呢?
过程指针也是个指针
指针就是个变量,用来赋值或传参数的
都是定义过程类型,都是指针,区别是带of object指的是对象的过程,你自己用SizeOf()函数看看就明白了,
SizeOf(myp)应该是4 SizeOf(mypp)应该是8,myp只是过程地址,mypp还包含了对象域(所属对象)
myp=procedure(str:string;icount:int);;//自定义的过程类型
mypp=procedure(strtmp:string;i:int;mybool:boolean) of object;//自定义的过程类型,最好是T开头,习惯问题,比如Tmypp
TmainForm=Class(TForm)
Procedure YourProc(strtmp:string;i:int;mybool:boolean);
...
end
var
MainForm:TmainForm;
Proc:mypp;
..... Proc:=MainForm.YourProc;//明白了?带所属对象域的
看看下面的例子type
TFunc1 = procedure(Sender: TObject);
TFunc2 = procedure(Sender: TObject) of Object;{ TForm1 }procedure TForm1.Func2(Sender: TObject);
begin
ShowMessage('Hello');
end;procedure Func1(Sender: TObject);
begin
ShowMessage('Hello');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
f1: TFunc1;
f2: TFunc2;
begin
f1 := Func1;
f2 := Func2; f1(nil);
f2(nil);
end;把Button1Click翻译成汇编(关键部分)f1 := Func1
mov edx,$00460108 //把函数Func1的地址给f1这个变量
f2 := Func2
mov [esp + $04], eax //把Form1实例的地址给f2变量的data部分(因为Func2是在TForm1中定义的)
mov [esp], $004600ec //把函数Func2的地址给f2变量的code部分
f1(nil)
mov ebx,edx //把f1中保存的Func1的函数地址给ebx
xor eax,eax //为调用Func1函数准备参数(传入的是nil,因此使用xor指令清空eax)
call ebx //调用Func1
f2(nil)
xor edx,edx //为Func2准备参数(注意,这个是Func2的第二个参数)
mov eax,[esp+$04] //为Func2准备第一个参数,这个参数是隐含的
call dword ptr [esp] //调用Func2 (注意mov [esp], $004600ec 这句,[esp]就是函数地址)