文章目录

  • 前言
  • 1、assert函数的用法
  • 2、回车符与换行符
  • 3、Sender关键字的妙用
  • 4、nil、Assigned的用法通俗讲解
  • 5、字节数组转换为字符串String
  • 6、array[Boolean] of string的妙用

前言

平时使用Delphi编程的过程中,经常会有一些模棱两可的概念,似懂非懂。有的冷门知识当时通过搜索引擎获取学会了,可用不了几个月又全忘光,第二次出现又得重新学习。这里对平时遇到的冷门知识点做一个记录汇总,方便日后查看。

1、assert函数的用法

函数原型:procedure Assert(expr : Boolean [; const msg: string]);
函数作用:用来进行条件测试
使用方法:参数如果为True,没有任何反应。如果为False,就会报错,如下图


当然,它是一个重载函数,第二个参数是可以自定义的。

2、回车符与换行符

编程的时候经常遇到需要处理回车符与换行符,回车符可以用Chr(13)或者#13表示,换行符同理Chr(10),示例代码:

//  JvInterpreterProgram1.Source := 'begin' + Chr(13) +
//    'result := ' + Edit1.Text + ';' + Chr(13) +
//    'end;';JvInterpreterProgram1.Source :='begin' + #13 +'result := ' + Edit1.Text + ';' + #13 +'end;';

3、Sender关键字的妙用

看下面一个点击按钮事件代码:

procedure TForm1.Button1Click(Sender: TObject);
begin
end;

现在有button2和button3同时使用Button1的按钮事件,Sender就可以很好的区分是哪个按钮点击过来的.

procedure TForm1.Button1Click(Sender: TObject);
beginif Sender = Button1 then ShowMessage('Button1');if Sender = Button2 then ShowMessage('Button2');if Sender = Button3 then ShowMessage('Button3');
end;

4、nil、Assigned的用法通俗讲解

上述的几个关键字容易混淆,对于初学者用法也不容易讲解,这里结合汇编来讲解,讲一次一辈子都不会忘记。
nil:字面解释nil:空指针,空地址,对象也是指针,可以object := nil;
看下面一段代码

procedure TForm1.Button1Click(Sender: TObject);
varp: Pointer;Value: integer;
beginValue := $365;p := @Value;p := @p;p := 0;if Assigned(p) thenShowMessage('被定义了(Assigned)');if p = nil thenShowMessage('未被定义了(nil)');
end;

我们知道在内存中
每一个变量、数值、指针等都会有一个地址
只有通过这个地址才能操作他们。
举例:
0x0018F57C==>>0x00000000中
0018F57C是地址,00000000就是值
要想修改值,知道地址就可以了
就像一个住址对应一套房子,装修工人要装修房子只要知道住址就能找到房子去装修。

Value := $365;

语句执行完成之后

0x0018F57C==>>0x00000000

0x0018F57C==>>0x00000365
0x00000000值被修改为0x00000365
我们可以这样理解值就是Value,而该值的地址就是0x0018F57C

p := @Value;

语句执行完成之后

0x0018F580==>>0x00000000

0x0018F580==>>0x0018F57C
0x00000000值被修改为0x0018F57C
p是指针,本身也是值,他也有自己的地址,0x0018F580就是他的地址。
@Value就是取Value的地址赋值给p,
所以也就顺理成章的把@Value的地址0x0018F57C写入到内存中。
我们可以这样理解值就是p,而该值的地址就是0x0018F580

p := @p;

不相信我们可以再次尝试,取指针的p的地址赋值给p会怎样?
按照上面逻辑p的地址为0x0018F580,执行完成之后应该
0x0018F580==>>0x0018F580
地址与值应该一样。
去调试器中跟踪,发行与我们设想一致。

那么要想p成为空指针,只需要
0x0018F580==>>0x0000000 值为0即可

通过编程语句

p := nil;
//或者,等同效果,建议还是使用nil
p := 0;

那么我们要判断指针p是不是空指针,只需要判断
0x0018F580==>>0x0000000 的值是否为0
简单说就是判断p是不是0
这里p是指针
我们不能简单写语句 if p=0 then 编译器通不过

通过编程语句

if Assigned(p) then
//或者
if p <> nil then

写了这么多,希望能各位能理解nil的底层逻辑。

5、字节数组转换为字符串String

有时候关键字符串存放在字节数组中,我们想要取出来并转化为String类型
假设定义一个字节数组类型:
test1: array[0…$0006] of Byte = ($56, $4f, $62, $6b, $65, $63, $00);//注意要以00结尾,

procedure TForm1.Button1Click(Sender: TObject);
vartest2: string;str: string;
begin//强制把字节数组转换为PChar指针,PChar是可以直接传给string的str := StrPas(PChar(@test1[0]));test2 := '(你好' + str + '这里是Delphi)';Caption := test2;
end;

6、array[Boolean] of string的妙用

我们有时候需要把布尔类型转换为字符串,通过一个字符串数组的声明就能实现
EnabledStr: array[Boolean] of string = (‘Ready’, ‘Busy’);
其实等价于
EnabledStr: array[False…True] of string = (‘Ready’, ‘Busy’);
就是两个元素的字符串数组
EnabledStr[False]返回’Ready’;EnabledStr[True]返回’Busy’

而我们以前一般会使用 if xxxx=True then yyyy:=‘Busy’ 比较啰嗦。

Delphi中的冷门知识点相关推荐

  1. java中可以用浮点作为循环变量吗_Java千问:Java循环语句的几个冷门知识点你都知道吗?...

    我们在进行Java开发的时候,经常会用到循环结构,但是有几个关于循环的"冷门"知识点,不知道你是不是都已经掌握了呢?我们一起来看看 一.大括号可以不写吗? 我们都知道,如果每次循环 ...

  2. C/C++冷门知识点你知道多少呢?

    在学习C语言的过程中,我们都自己总结了一些重要的知识点,但是有些不常用的冷门知识点可能就被我们选择性忘记了,你要不要来回一下呢? 1:int跟signed int是一回事,short.long亦然,但 ...

  3. php冷门知识,PHP程序员经常忽略的冷门知识点

    有些时候我们习惯了主流的方法,每一步都按部就班的写代码,殊不知,我们可能会遗漏一些好的想法和知识点,接下来我就谈谈那些容易呗忽略的php知识点. 1. array_filter函数,这个函数是通过回调 ...

  4. c语言冷门小知识,C/C++冷门知识点你知道多少呢?

    原创 zhellow 2019-10-15 在学习C语言的过程中,我们都自己总结了一些重要的知识点,但是有些不常用的冷门知识点可能就被我们选择性忘记了,你要不要来回一下呢? 1:int跟signed ...

  5. c语言冷门小知识,这些C/C++冷门知识点你知道多少呢?来看一下

    在学习C语言的过程中,我们都自己总结了一些重要的知识点,但是有些不常用的冷门知识点可能就被我们选择性忘记了,你要不要来回一下呢? 1:int跟signed int是一回事,short.long亦然,但 ...

  6. DELPHI 中 Window 消息大全使用详解

    Window 消息大全使用详解 导读: Delphi是Borland公司的一种面向对象的可视化软件开发工具. Delphi集中了Visual C++和Visual Basic两者的优点:容易上手.功能 ...

  7. Delphi中的容器类(二)

    TStrings类 出于效率的考虑,Delphi并没有象C++和Java那样将字符串定义为类,因此TList本身不能直接存储字符串,而字符串列表又是使用非常广泛的,为此Borland提供了TStrin ...

  8. Delphi中的线程类

    Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchr ...

  9. 探究:如何判断Delphi中的对象指针是否可用

    2019独角兽企业重金招聘Python工程师标准>>> 近日,在网上看到有网友问曰:如何确定一个对象指针是否可用?也就是说,如何确定一个对象指针是否指向一个真正可用的对象实例?其实这 ...

最新文章

  1. 上传图片被防火墙拦截_Web安全:文件上传漏洞
  2. 测试RDA5807收音机模块
  3. php di,PHP-DI中文文档(基于有道翻译,基本是直接拿过来使用,并没有润色)
  4. .net ajax 怎么写,.NET学习篇--Ajax中Url的写法
  5. Nc105-二分查找-II
  6. save(),saveOrUpdate(),merge()的区别
  7. movielens推荐系统_案例|推荐系统的评估指标
  8. 36岁自学C语言,C语言的数据类型
  9. Redis面试 - 内存淘汰机制
  10. 如何在Windows上安装Python
  11. Android 完全退出应用程序实现代码
  12. understand 4 for linux register key code 随意、任性拥有。。。。
  13. java中的quartz_java 中对Quartz表达式的执行
  14. 【腾讯TMQ】测试建模兵器谱
  15. android支持svg格式图片么,Android Studio2.0中使用SVG图片格式
  16. java agent简介热部署SDK接入
  17. 怎么把启用计算机的d磁盘,Win10计算机怎么隐藏磁盘盘符?
  18. 用牛顿迭代法求方程。
  19. MacPorts 初装后提示 command not found: port 解决方案
  20. mkdir,rmdir详解

热门文章

  1. electron复制粘贴
  2. 十二五物联网重点投资十大领域
  3. python中类的继承关系使用什么符号_Python 入门 之 类的三大关系(依赖 / 组合/ 继承关系)...
  4. 仿10086电信业务平台
  5. office 打开wps乱_WPS文档怎么清除格式解决复制粘贴格式错乱的问题
  6. 智慧水务管理系统、 智慧泵房、水厂监控、水质监控、数据中心
  7. 学计算机专业的学生生活,网络生活对计算机专业学生的影响
  8. 达梦数据库的静默安装
  9. 7月视频号直播热度榜来了,第一名单场直播热度超1500万!
  10. python内置函数callable用法详解