RAD Studio 10.4 for delphi XE Assigned和Nil的联系与区别

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

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专讲冷知识

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值