Delphi中的冷门知识积累
前言
平时在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);
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'
如果觉得文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
作者:YXGust
出处:https://www.cnblogs.com/YXGust/p/16541503.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
本博文版权归本博主所有,转载请注明原文链接