Delphi初学者易犯的两个错误,高手勿入(22分)

  • 主题发起人 主题发起人 暮佳雨
  • 开始时间 开始时间

暮佳雨

Unregistered / Unconfirmed
GUEST, unregistred user!
公司的培训资料里总结了很多对Delphi初学者来说很隐蔽的错误案例,这里摘抄两例,希望初学者共勉,大家有什么自己的案例体会,可以拿出来一起学习[:D]

procedure TForm1.Button1Click(Sender: TObject);
var
Pass:Cardinal;
S:string;
begin
Pass := 3331421845;
s:=IntToStr(Pass);
Pass := StrToInt(s);
ShowMessage(IntToStr(Pass));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i:Cardinal;
Lst:TStringList

begin
Lst := TStringList.Create; 
for i := 0 to Lst.Count-1 do
begin
ShowMessage('Run');
Exit;
end;

Lst.Free;
end;
 
学习一下
 
菜鸟
学习。。。
 
帮顶!

╭=========================================╮

80G海量源代码,控件,书籍全免费狂下不停!

http://www.source520.com

╰=========================================╯
 
值得学习
 
学习中。。。再来点好东西!!
 
上面两个列子错在那里,可以说说吗?~
 
来自:xuhaobo, 时间:2006-2-22 21:48:31, ID:3361401
上面两个列子错在那里,可以说说吗?~

1,整形变量有效值范围
2,内存泄漏
 
弱弱的问:
2 为什么内存泄漏
 
因为用了EXIT
 
第一个例子,由于Integer的是有符号整形,有效范围是:-2147483648..2147483647(Cardinal是无符号整形,它的有效范围是:0..4294967295 ),所以在Pass:=StrToInt这句的时候会报错,说S不是有效的整形,修改如下则无错了:
procedure TForm1.Button1Click(Sender: TObject);
var
Pass:Cardinal;
S:string;
begin
Pass := 3331421845;
s:=IntToStr(Pass);
Pass := StrToInt64(s);
ShowMessage(IntToStr(Pass));
end;

第二个例子最差的地方是没有用保护语句,这样当执行完eixt后,函数体中止,下面的Lst.Free将不会得到执行,所以Lst将一直在内存中占用空间(尽管已经不会在用到它了),直到程序中止(如果这个Button2经常被点击的话,那么每点击一次就会造成内存泄漏一次)。改为如下则不存在问题了:

procedure TForm1.Button2Click(Sender: TObject);
var
i:Cardinal;
Lst:TStringList;
begin
Lst := TStringList.Create;
try 
for i := 0 to Lst.Count-1 do
begin
ShowMessage('Run');
Exit;
end;
finally
Lst.Free;
end;
end;
由于Exit是在try finally语句内的,所以Delphi会在推出函数体之前执行finally里面的语句,故每次无论如何,Lst.Free都会被执行,不会出现内存泄漏了。
 
前几天写代码,Update——execsql语句后面使用了RecordCount,总是提示错误(我的E文不太好),百思不得其解,查了一天资料,一见到“返回结果集”,恍然大悟——RowsAffected!
还有循环语句怎么点控制按键也不管用,原来还有application.ProcessMessages!
赫赫,真是菜鸟啊!!!
 
楼主能不能将你们的资料共享一下,不胜感激!leavesofautumn@163.com
 
对啊,楼主把你的资料给我一份吧。
感激不尽
stjnu#163.com
 
获益不浅,希望楼主都提出相这样对于菜鸟来说比较有意义的经典问题。
 
哈哈,很经典的回答;
 
不错,受益匪浅。
能把资料共享一下就太好了。zhanghay1@sina.com
 
后退
顶部