Delphi中的冷门知识点

前言

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

1、assert函数的用法

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

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

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);
begin
  if 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);
var
  p: Pointer;
  Value: integer;
begin
  Value := $365;
  p := @Value;
  p := @p;
  p := 0;
  if Assigned(p) then
    ShowMessage('被定义了(Assigned)');
  if p = nil then
    ShowMessage('未被定义了(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);
var
  test2: 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’ 比较啰嗦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

D-Nolan

请我喝杯咖啡吧,鼓励一下创作!

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

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

打赏作者

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

抵扣说明:

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

余额充值