相关疑难解决方法(0)

如何安全地绕过Delphi错误:"正式和实际参数的类型必须相同"

我需要一种方法来编写一个通用过程来处理对象类型或其任何后代.

我的第一次尝试是宣布

procedure TotalDestroy(var obj:TMyObject);
Run Code Online (Sandbox Code Playgroud)

但是当它与后代对象一起使用时

type TMyNewerObject = class(TMyObject);
var someNewerObject: TMyNewerObject;

TotalDestroy(someNewerObject);
Run Code Online (Sandbox Code Playgroud)

我得到了臭名昭着的错误"正式和实际参数的类型必须相同"

因此,在寻找解决方案时,我查看了Delphi系统FreeAndNil过程的源代码.我发现这个令人敬畏的声明,以及这个令人惊讶的评论

{ FreeAndNil frees the given TObject instance and 
  sets the variable reference to nil.  
  Be careful to only pass TObjects to this routine. }

procedure FreeAndNil(var Obj);
Run Code Online (Sandbox Code Playgroud)

它避免了类型检查错误,但它没有使用安全网.

我的问题是......是否有任何安全的方法来检查无类型var参数的类型?

或者换句话说,你能改进这个Delphi源代码,以便不需要警告吗?

procedure FreeAndNil(var Obj);
var
  Temp: TObject;
begin
  Temp := TObject(Obj);
  Pointer(Obj) := nil;
  Temp.Free;
end;
Run Code Online (Sandbox Code Playgroud)

delphi

6
推荐指数
2
解决办法
1797
查看次数

标签 统计

delphi ×1