DELPHI中BUG修改备忘

 

1.关于sizeof

同样的代码
var   LWindCode : array [0..15] of char;
begin
   showmessage(inttostr( sizeof(LWindCode)));
end;
在Delphi7和Delphi2009下结果分别是16/32,为什么?


这是因为widechar和AnsiChar的问题,2009默认的是WideChar了,而Delphi7是AnsiChar,导致String的长度也发生了变化!以后要注意了!

2.关于Assigned
  Assigned只是判断当前值是否为空,而不判断当前指着的内存是不是被释放,因此释放的时候要这样写:
if assigned(frm) then
begin
   frm.close;
   frm:=nil;
end;
或者
if assigned(frm) then
begin
frm.close;
freeandnil(frm);
end;

 3.关于assert(断言)

用法:   Assert(表达式);
如果为假, assert会产生一个EAssertionFailed异常,显示信息为:
   Assertion Failed (C:\src\unit1.pas, [size=+0]line 34)
当你不想再使用这些检查时,可以使用 {$ASSERTIONS OFF} 或 {$C-} 编译指令.
要想使Assert在整个项目中失效,   关闭Project Options | Compiler | Assertion 选项
缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。
用法总结与注意事项:
1)在函数开始处检验传入参数的合法性
2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败
3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题。
4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感
5)有的地方,assert不能代替条件过滤 

4.关于Owner和Parent的区别

Parent属性是指构件的包容器,构件只能在此范围内显示和移动

Owner属性是指构件的所有者,它负责构件的创建和释放。

posted @ 2010-05-20 15:14  Enli  阅读(438)  评论(0编辑  收藏  举报