TMyProc procedure of Object obj Txxx Create ProcPtr obj t

本文分享了Delphi程序设计的实例,包括按钮点击事件处理、方法传递等,通过具体代码展示了Delphi语言的使用技巧。

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               
type  TForm1 = class(TForm)    Button1: TButton;    Button2: TButton;    procedure Button1Click(Sender: TObject);    procedure   BBB(I:   Integer);    procedure   CCC(I:   Integer);    procedure Button2Click(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end;  Txxx=class     procedure test;  end;TMyProc=procedure of Object;TMyFunc=function(a: Integer): Integer of Object;var  Form1: TForm1;implementation{$R *.dfm}procedure Txxx.test;begin  showmessage('1');end;procedure   TForm1.BBB(I:   Integer);begin     showmessage( 'BBB: '   +   IntToStr(I)); end;procedure   TForm1.CCC(I:   Integer); begin     showmessage( 'CCC: '   +   IntToStr(I)); end;procedure TForm1.Button1Click(Sender: TObject);var ProcPtr:TMyProc; obj:Txxx;begin   obj:=Txxx.Create;  ProcPtr:= obj.test;//Txxx.test;  ProcPtr;   obj.Free;end;procedure TForm1.Button2Click(Sender: TObject);type         Taaa   =   procedure   (i:integer)   of   object   ; var     ap:   Taaa; begin     ap   :=   BBB; //这里有一个隐含Self,完整格式: self.BBB;这里把BBB这个方法赋给ap这个变量,注意BBB与ap的声明原型要一样,不然会有错    ap(1);     ap   :=   CCC;     ap(2); end;end.

           

给我老师的人工智能教程打call!http://blog.youkuaiyun.com/jiangjunshow
这里写图片描述
<think>在Delphi中,判断变量是否为空(即是否为nil)的函数或操作取决于变量的类型。以下是常见的几种情况:1.对于指针(包括对象引用):可以直接使用`Assigned`函数或与`nil`比较。2.对于函数指针:同样可以使用`Assigned`或与`nil`比较。3.对于字符串:可以使用`Length`函数或与空字符串`''`比较。4.对于动态数组:可以使用`Length`函数或与`nil`比较(注意动态数组是隐含指针的)。5.对于变体类型(Variant):可以使用`VarIsEmpty`或`VarIsNull`函数。根据引用内容,特别是引用[1]和[3]中提到函数指针,引用[4]中强调了`Assigned`函数的使用,以及释放对象后需要将指针置为nil的重要性。下面将详细说明:1.`Assigned`函数:用于检查指针或对象引用是否不为nil。它返回一个布尔值,如果指针不是nil则返回True,否则返回False。注意,对于已经释放但没有置为nil的指针,`Assigned`仍然返回True,因为指针本身的值(地址)并没有被改变(尽管指向的内存已被释放)。因此,在释放对象后,应该将指针置为nil,以避免悬垂指针。示例代码:-对象引用:```delphiifAssigned(MyObject)then//执行操作```-函数指针:```delphitypeTMyFunc=function(a:Integer):Integer;varMyFuncPtr:TMyFunc;begin//...ifAssigned(MyFuncPtr)thenMyFuncPtr(10);end;```2.直接与nil比较:也可以直接使用`@p=nil`(对于函数指针)或`p=nil`(对于对象引用)。示例:-对象引用:```delphiifMyObject<>nilthen//执行操作```-函数指针(根据引用[1]和[3]):```delphiif@MyFuncPtr=nilthen//函数指针为空```注意:对于函数指针,在Delphi中,`Assigned(MyFuncPtr)`和`@MyFuncPtr<>nil`是等效的。3.对于字符串:使用`Length(s)=0`或`s=''`。4.对于动态数组:使用`Length(arr)=0`或`arr=nil`。特别注意:在释放对象时,应该使用FreeAndNil过程(在SysUtils单元中),它会在释放对象后将指针置为nil,这样可以避免使用已释放的对象。示例:```delphiFreeAndNil(MyObject);//之后,Assigned(MyObject)将返回False```因此,具体使用哪种方式取决于要判断的变量类型。对于指针类型(包括对象、函数指针、动态数组等)使用`Assigned`或与nil比较;对于字符串和动态数组还可以使用长度判断。总结回答用户问题:在Delphi中判断变量是否为空,对于指针类型(对象、函数指针等)使用`Assigned`函数或与nil比较;对于字符串,判断其是否为空字符串或长度为0;对于动态数组,判断长度是否为0或是否为nil。下面提供几个常用类型的判断示例:1.对象:```delphiifnotAssigned(MyObject)then//对象为空//或者ifMyObject=nilthen//对象为空```2.函数指针:```delphiifnotAssigned(MyFunc)then//函数指针为空//或者if@MyFunc=nilthen//函数指针为空```3.字符串:```delphiifMyString=''then//字符串为空//或者ifLength(MyString)=0then//字符串为空```4.动态数组:```delphiifMyArray=nilthen//动态数组为空//或者ifLength(MyArray)=0then//动态数组为空(注意:长度为0不一定等于nil,但通常可以这样认为)```注意:对于动态数组,在Delphi中,长度为0的数组和nil并不完全等同,但在逻辑上都可以代表“空”。但为了避免混淆,建议使用`Length`函数来判断是否没有元素。最后,根据引用[4]中提到的,释放对象后一定要置为nil,以避免出现悬垂指针。§§相关问题§§1.Delphi中如何安全地释放对象并置为nil?2.在Delphi中,如何判断一个字符串或动态数组是否为空?3.Delphi中函数指针的使用方法和注意事项有哪些?4.在Delphi中,如何避免使用已释放的对象(悬垂指针)?</think> 在Delphi中判断变量是否为**空值**(主要指指针类型、函数指针或对象引用),主要有以下方法: ### 一、通用判断方法 1. **`Assigned()`函数**(最推荐) 判断指针或对象引用是否有效: ```delphi if Assigned(MyPointer) then // 非空指针的操作 else // 指针为空时的操作 ``` **原理**:检查指针是否指向有效内存地址(非`nil`),适用于: - 对象引用(如`TForm`) - 函数指针(如`TMyProc = procedure of object`) - 普通指针(如`PInteger`) > 注意:对象释放后需手动置`nil`,否则`Assigned`仍返回`True`(引用[^4]) 2. **直接与`nil`比较** 基础指针检查方式: ```delphi if MyPointer = nil then // 指针为空 ``` ### 二、特殊类型空值判断 1. **函数指针空值**(引用[^1][^3]) ```delphi type TMyFunc = function(X: Integer): Integer; var F: TMyFunc; begin if @F = nil then // 或 Assigned(F) ShowMessage('函数指针未初始化'); end; ``` **关键**:需用`@`取函数指针地址再判断 2. **字符串空值**(引用[^2]) 判断字符串是否为`''`: ```delphi if MyString = '' then // 空字符串 ``` 判断全数字字符可参考`isnum`函数(引用[^2]) 3. **动态数组空值** ```delphi if Length(MyArray) = 0 then // 空数组 ``` ### 三、使用注意事项 1. **对象释放规范**(引用[^4]) 释放对象后必须显式置`nil`: ```delphi FreeAndNil(MyObject); // 正确做法 // 错误做法:MyObject.Free后未置nil ``` 2. **线程安全**(引用[^5]) 多线程环境应使用同步机制: ```delphi var CriticalSection: TRTLCriticalSection; begin EnterCriticalSection(CriticalSection); try if Assigned(SharedVar) then ... finally LeaveCriticalSection(CriticalSection); end; end; ``` > **总结建议**:优先使用`Assigned()`判断指针/对象,字符串用`=''`,动态数组用`Length=0`,并在释放对象后务必置`nil`。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值