博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
论证 Assigned(btn) 与 Assigned(@btn) 的区别 - 答复 "sunnet"
阅读量:6854 次
发布时间:2019-06-26

本文共 2007 字,大约阅读时间需要 6 分钟。

  hot3.png

问题来源:

unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls;type  TForm1 = class(TForm)    Button1: TButton;    Button2: TButton;    procedure Button1Click(Sender: TObject);    procedure Button2Click(Sender: TObject);  end;var  Form1: TForm1;implementation{$R *.dfm}var  BtnGlobal: TButton; {定义一个全局的对象(TButton)变量}procedure TForm1.Button1Click(Sender: TObject);var  BtnLocal: TButton;  {定义一个局部的对象(TButton)变量}begin  {"对象" 本身就是指针, 它指向对象数据存在的位置;}  {"@对象" 是指向对象的指针, 它指向 "对象" 变量本身, 如果 "对象" 变量存在, 它肯定是存在的}  {下面 4 行代码能获取指针的地址, 如果结果为 0 则表示对象还没有赋值, 也就是为 nil}  ShowMessage(IntToStr(Integer(BtnGlobal)));  {0;}  ShowMessage(IntToStr(Integer(@BtnGlobal))); {4607236}  ShowMessage(IntToStr(Integer(BtnLocal)));   {0}  ShowMessage(IntToStr(Integer(@BtnLocal)));  {1242560}  {在没有给对象(BtnGlobal、BtnLocal)赋值以前, Assigned(对象)应该返回 False}  ShowMessage(BoolToStr(Assigned(BtnGlobal), True));  {False}  ShowMessage(BoolToStr(Assigned(BtnLocal), True));   {False}  {因为对象变量已经存在, 所以指向对象变量的 "@对象" 也不会为 nil}  ShowMessage(BoolToStr(Assigned(@BtnGlobal), True)); {True}  ShowMessage(BoolToStr(Assigned(@BtnLocal), True));  {True}  {赋值以后...}  BtnGlobal := TButton(Sender);  BtnLocal  := TButton(Sender);  ShowMessage(BoolToStr(Assigned(BtnGlobal), True));  {True}  ShowMessage(BoolToStr(Assigned(BtnLocal), True));   {True}  ShowMessage(BoolToStr(Assigned(@BtnGlobal), True)); {True}  ShowMessage(BoolToStr(Assigned(@BtnLocal), True));  {True}end;{因为 Delphi 会给部分类型的局部变量一个无用的默认值, 所以会出现下面情形}procedure TForm1.Button2Click(Sender: TObject);var  Btn: TButton;begin  ShowMessage(IntToStr(Integer(Btn))); {15012064; 如果不注释掉下面一句, 这里会是 0}  //ShowMessage(IntToStr(Integer(@Btn)));  {1242560}  {我的结论是: 用 Assigned 判断一个没有初始化的局部变量是不可靠的, 这应该算个 Bug}  {解决方案: 如果程序中确需这样的判断, 那就先初始化局部变量为空, 譬如:}  Btn := nil;  ShowMessage(BoolToStr(Assigned(Btn), True));  {False}  Btn := TButton(Sender);  ShowMessage(BoolToStr(Assigned(Btn), True));  {True}end;end.

转载于:https://my.oschina.net/hermer/blog/319552

你可能感兴趣的文章
LVS 自开发脚本
查看>>
Linux下如何使CP命令不提示覆盖(转)
查看>>
12月第1周网络安全报告:85.9万境内主机感染病毒
查看>>
8月国内电脑分辨率TOP10:1920*1080连续三月夺冠
查看>>
全球六大国际域名解析总量达1.6亿 环比净增4.7万
查看>>
12月国内操作系统份额:Win10突破3% 涨幅近1%
查看>>
python基础教程
查看>>
Centos中无法使用make
查看>>
mysql 5.5编译安装
查看>>
生产环境编译安装LNMP环境
查看>>
打通钉钉+WebHook:日志服务告警升级
查看>>
Powerdesigner 自动生成注释
查看>>
C盘安装WIN7,D盘安装CentOS
查看>>
Linux零基础入学之1-4 Linux文件管理-xfs文件系统的备份恢复-服务器来电后自动开机...
查看>>
***的致命诱惑 蜜罐程序
查看>>
php生成图片,在html的img标签中可以正常显示,直接访问网址乱码的问题解决
查看>>
SQL server数据库资料
查看>>
安装 CDH
查看>>
大数据虚拟化零起点-1开篇
查看>>
好看的Ubuntu&Linux命令提示符
查看>>