RAD Studio 10.4 for delphi XE Assigned和Nil的联系与区别
一、原理
系统级别的函数System.pas : System.Assigned
function Assigned(var P): Boolean;
1、用于测试值为nil(未赋值的unassigned)的指针Pointer或方法变量procedural variable。
2、使用Assigned来确定指针Pointer或被Assigned(var P)中的方法变量function:P或procedure(var P)引用的方法是否为空。P必须是变量类型(var)的指针或方法类型(function或procedure)的引用。
3、Assigned(P)相当于测试var P:Pointer指针变量P<>nil,@P<>nil相当于测试function:P或procedure(var P)的P<>nil。
4、如果P=Nil,Assigned返回False,否则返回True。
5、特别注意:
5.1、当测试对象事件object events不能测试其是否nil,此时使用Assigned是正确的方法。
5.2、关于方法指针与过程指针:(1)、无论方法指针还是过程指针,均能有效测试@P=nil或@P<>nil;(2)、方法指针既能有效测试Assigned(@P)或not Assigned(@P),也能有效测试@P=nil或@P<>nil;(3)、过程指针不能有效测试Assigned(@P)或not Assigned(@P),但能有效测试@P=nil或@P<>nil。
二、使用方法案例
1、对象事件object event、方法指针与过程指针
1.1、对象事件object events
var
LNotifyEvent: TNotifyEvent; //:事件对象
begin
if LNotifyEvent <> nil then {这种写法是错误的:会产生编译错误 }
Writeln('这种写法是错误的:会产生编译错误');
if Assigned(LNotifyEvent) then {这种写法是才是正确的 }
Writeln('这种写法是才是正确的');
end;
对象的通知事件的赋值:
type
TNotifyEvent = procedure(Sender: TObject) of object;
TMainForm = class(TForm)
procedure ButtonClick(Sender: TObject);
//...
end;
var
MainForm: TMainForm;
OnClick: TNotifyEvent;
OnClick := MainForm.ButtonClick; //:通知事件的赋值
1.2、方法指针与过程指针
概念:
type
TProcedureMyProc = procedure; //:过程类型
TMethodMyMethod = procedure of object; //:方法类型
var
FmyProc:TProcedureMyProc; //:过程指针变量
FmyMethod:TMethodMyMethod; //:方法指针变量
var
FmyFunc_Pointer:Pointer; //:普通指针变量
关于方法指针与过程指针:(1)、无论方法指针还是过程指针,均能有效测试@P=nil或@P<>nil;(2)、方法指针既能有效测试Assigned(@P)或not Assigned(@P),也能有效测试@P=nil或@P<>nil;(3)、过程指针不能有效测试Assigned(@P)或not Assigned(@P),但能有效测试@P=nil或@P<>nil。官方解释原文:
http://docwiki.embarcadero.com/RADStudio/Rio/en/Procedural_Types_(Delphi)#Method_Pointers
试验后确实如此:
type
TProcedureMyProc = procedure; //:过程类型
TMethodMyMethod = procedure of object; //:方法类型
var
FmyProc:TProcedureMyProc; //:过程指针变量
FmyMethod:TMethodMyMethod; //:方法指针变量
var
FmyFunc_Pointer:Pointer; //:普通指针变量
function myFunc(var APointer:Pointer):Pointer; //:函数:可供方法指针或过程指针调用,当然也可供方法或过程调用
//var LAPointer:^Integer;
begin //LAPointer:=Pointer(1);
if APointer=nil then Result:=nil
else Result:=APointer;
end;
procedure myProc; //:过程
var LRef:Integer;
begin
LRef:=1;
@FmyProc:=@myProc; //:@myProc等价于:Pointer(myProc);
FmyProc:=myProc;
FmyFunc_Pointer:=myFunc(@FmyProc); //FmyProc:=nil;
end;
function myMethod :string; //:函数:可供方法指针或过程指针调用,当然也可供方法或过程调用
var LRef:Integer;
LStr:string;
begin
LRef:=1; LStr:='AaBb方法指针。,.,';
Result:=LStr;
end;
procedure TForm2.FormShow(Sender: TObject);
var LmyProcPointerValue:Integer;
begin
Memo_Test.Lines.Add('一、方法指针:');
Memo_Test.Lines.Add(' 比如1、:方法:procedure myProc;');
if Assigned(@myProc) then
Memo_Test.Lines.Add(' 返回Assigned(@myProc)=true,方法指针能识别Assigned(@myProc),内存中的内容: '+PChar(@myProc) );
if @myProc<>nil then
Memo_Test.Lines.Add(' 返回(@myProc<>nil)=true,方法指针能识别@myProc<>nil,内存中的内容: '+PChar(@myProc) );
@FmyMethod:=Pointer(myMethod);
if ( (@myMethod<>nil) and (@FmyMethod<>nil) )
and ( Assigned(@myMethod) and Assigned(@Fmy

本文详细解析了RADStudio10.4中Assigned与Nil的使用场景与区别,重点介绍了如何在不同变量类型如指针、方法变量、普通变量中正确使用这两个关键字,以及它们在对象事件、方法指针与过程指针中的具体应用。
最低0.47元/天 解锁文章
3131

被折叠的 条评论
为什么被折叠?



