熟悉指针的朋友请进, 急!!! (200分)

  • 主题发起人 主题发起人 zhang12345
  • 开始时间 开始时间
Z

zhang12345

Unregistered / Unconfirmed
GUEST, unregistred user!
type
TOnError = procedure(aErrorID: integer; aErrorMsg: shortstring) of object; stdcall;

procedure Test.TestOnError(aErrorID: integer; aErrorMsg: shortstring); stdcall;
begin
Showmessage(aErrorMsg);
end;

var
TmpOnError: TOnError;
TmpOnError1: TOnError;
pOnError: ^TOnError;
p: pointer;
begin
New(pOnerror);
TmpOnError := TestOnError;
TmpOnError(1, '2');
p := @TmpOnError;
pOnError^ := TOnError(p)^; //此处赋值错误, 请给出正确用法
// pOnError^ := TmpOnError;
TmpOnError1 := pOnError^;
TmpOnError1(11, '3');
Dispose(pOnError);
end;

 
pOnError^ := TOnError(p^);
 
dreamliu2001:
试了你的程序,还是有问题
 
pOnError :=@ TOnError(p^);
 
你是想把TmpOnError赋给TmpOnError1吧,直接写就行了,为什么非要通过中间变量呢?
即:
TmpOnError := TestOnError;
TmpOnError(1, '2');
TmpOnError1 := TmpOnError;
TmpOnError1(11, '3');

不过这样写还是会出错,再把stdcall删掉就行了,不知道你为什么要用stdcall的调用方式?
 
pOnError^ := TOnError(p)^; //此处赋值错误, 请给出正确用法
这里的错误是因为p保存的是一个地址,p^才是TOnError
可以改为pOnError^ := TOnError(p^);
但编译后还是会出错
我估计可能和TOnError这种类型有关系,可能这类型是系统自己维护的(自创建,自释放),所以
不能赋给point这种类型,在转化过程中可能会丢失信息.对自己维护的类型不会有此现象,可顺利执行
我做了一个关于Query的,自己创建的,可顺利编译通过
var
Form1: TForm1;
TmpOnError: TOnError;
TmpOnError1: TOnError;
pOnError: ^TOnError;
p: pointer;
myQuery:TQuery;
myQuery1:TQuery;
pQuery:^TQuery;
procedure TForm1.Button2Click(Sender: TObject);
begin
new(pQuery);
myQuery:=TQuery.Create(Self);
myQuery.DatabaseName:='BCDEMOS';
p:=@myQuery;
pQuery^:=TQuery(p^);
myQuery1:=TQuery(pQuery^);
myQuery1.SQL.Add('select * from animals');
myQuery1.Open;
DataSource1.DataSet:=myQuery1;
Dispose(pQuery);
end;
如果你不需要中间变量,5rain6sky的做法是可以的
如果要中间变量也可以,通过^TOnError就行了,不需要通过p
New(pOnerror);
TmpOnError:=TestOnError;
TmpOnError(1,'2');
pOnError^:=TmpOnError;
TmpOnError1:=TOnError(pOnError^);
TmpOnError1(1,'2');
Dispose(pOnError);
 
接受答案了.
 

Similar threads

I
回复
0
查看
694
import
I
I
回复
0
查看
616
import
I
I
回复
0
查看
641
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部