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、Assign的用法通俗讲解

nil、Assigned

如果说指针是一个地址,它指向了一个值,那么同样有一个地址指向了这个指针。
有点螳螂捕蝉,黄雀在后的意思。螳螂就是那个指针,他指向了一个蝉,而最终的大BOSS黄雀瞄准了螳螂
看下面一段代码

procedure TForm1.Button1Click(Sender: TObject);
var
  Value: integer;
  p: Pointer;
begin
  //假想螳螂为p,禅为$365
  Value := $365;
  p := @Value;
  //黄雀为nil(空), p := nil 等价于 p := 0, 用nil更正规
  p := nil;
  //Assigned专门用来判断某一指针(pointer)或过程引用是否为nil(空),返回True不为空
  if Not Assigned(p) then
    Caption := '黄雀为nil';
  //我们同样可以用 Assigned来判断窗体是否创建
  if Assigned(form1) then
    ShowMessage('form1已经被创建');
end;

Assign

有A对象 B对象
A:=B;//A和B指向同一地址,操作A的属性和操作B的属性将是同一个东西,浅复制。
A.Assign(B);//把对象属性依次复制过来,深复制。
有句很形象的话:一个改名字,一个生小孩。

直接操作内存
move(a, b, SizeOf(a));
Move(b,a,a.InstanceSize);
CopyMemory(@a,@b,sizeof(a))
这种方法对于长串、动态数组、Variant、OleVariant、Interface和dispinterface等生存期自管理的数据类型,会导致严重错误。

PS:TPersistent.Assign方法
Procedure Assign(Source:TPersistent);virtual;
这个过程用于把Soruce参数指定的对象的的所有属性赋值给自己,它的功能实际上是由AssignTo完成的。而TPersistent的AssignTo方法并未实现上述功能,只是由其派生类重载的AssignTo方法实现。

5、array[Boolean] of string的妙用

我们有时候需要真返回一个固定字符串,假返回另外一个固定字符串
而我们以前一般会使用 if xxxx=True then yyyy:='Busy' 比较啰嗦。

通过一个字符串数组的声明就能实现
EnabledStr: array[Boolean] of string = ('Ready', 'Busy');
其实等价于
EnabledStr: array[False..True] of string = ('Ready', 'Busy');

就是两个元素的字符串数组
yyyy:=EnabledStr[False]; //yyyy为'Ready'
yyyy:=EnabledStr[True]; //yyyy为'Busy'

posted on 2022-08-01 19:03  YXGust  阅读(206)  评论(0编辑  收藏  举报

导航