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

  • 主题发起人 主题发起人 暮佳雨
  • 开始时间 开始时间
这2个问题是非常经典的,但是zqw0117对于第二个问题的回答错了。
 
经测试 zqw0117第二个回答没有问题,代码如下:
Var
a: TStringList;
i: Integer;
begin
a:= TStringList.Create;
Try
for i:=1 to 100 do
begin

end;

Exit;
Finally
ShowMessage('测试释放!');
a.Free;
End;
end;

Finally 中的ShowMessage 正常执行,当然 也会执行Free了
 
第二个问题应该跟第一个差不多吧 i:Cardinal... i:= 0 to -1??
 
第二个问题和第一个相同,都是强制转换造成的
 
受益非浅。。。顺便请教一下
[?]用Query,DataSource控件连接没有密码的access数据库,程序运行时老弹出输入用户名和密码的对话框,怎么设置能让它消失
 
获益不浅,楼主把你的资料给我一份吧:youngwind1978@163.com,thanks
 
新手上路,有知道的朋友帮指点一下,多谢。。。
用Query,DataSource控件连接没有密码的access数据库,程序运行时老弹出输入用户名和密码的对话框,怎么设置能让它消失
 
to 风卷残月:
你把楼主以及zqw0117兄台的第二个例子的代码直接拷过去测试分析就知道了,你写的代码倒是没错,不过意义就不大了。
楼主都已经指明2个例子的代码有错误,而且第1个还放在前面,然而还是有很多人都没有看出第2个例子的隐蔽错误,所以我才说楼主的例子非常经典啊!“高手勿入”这几个字应该去掉。
PS:另外,本身也不太建议将一个大的循环放在try..finally里面。
 
to 风林坡
谢谢你的的提示, 我已经测试过zqw0117的代码,确实有错,但只错在Try后面有一个未知字符:' ' 但删掉就没什么了, 感觉这种错没有什么大问题,可能是Delphi本身的问题吧,
另一个 Try...Finally... End
我在Finally 与 End 之间放了一个ShowMessage 感觉并不是多此一举,至少代表Finally后面的东西会执行(当然代表会释放了), 而 没Try Finally 的就不一定了

呵呵,再细看了原来的贴子,再次感谢你的提示, 爱元哥哥那里已经说了.自己没有注意到第二个例子还有类型转换的问题(就是隐蔽的错误吗?) 不过只能说 aqw0117兄台没有完全指出错误, 不是吗:)

呵呵,不好意思再补一句, 再看楼主的第二个贴, 第一贴已经很明白地说明了类型转换的问题,而第二个不知道楼主是不是故意还是如何, 给人第一感觉应该是 Try..Finally 的问题吧~`
 
to 风卷残月:
在楼主的第二个例子中,加上ShowMessage('Run');只是让大家看看效果,实际上真正按照逻辑来说,本身不应该执行到这一句话的,Exit如果不加的话,那就好玩了,成了一个死循环。
虽然都是类型转换的错误,但。。。真的还有点不同:)
 
其实楼主主要的意图是想说明没有try finally保护的代码将不会执行Lst.Free这句,楼主的代码仅仅只是一个演示,只不过这个演示中,for语句并不会被执行,也不像风林波兄说道的那样,会进入死循环。因为for根本就不会执行begin下面的代码,只有to后面的数值>I,才会执行循环体。其实楼主只要加几句代码就不存在这个问题了:
procedure TForm1.Button2Click(Sender: TObject);
var
i:Cardinal;
Lst:TStringList

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

Lst.Free;
end;
 
呵呵,我真是看不懂两位争论的问题了,加上
Lst.Add('abc');
Lst.Add('cdf'); 
和不加有什么区别?
循环只执行一次,然后就退出了,Lst.Free;得不到执行,是菜鸟常犯的错误,难道中间还有什么其他的奥妙?
我是菜鸟,我看不出还有什么其他的可以值得争论的地方,呵呵!
 
学习中。。。
 
多人接受答案了。
 
to guth: 不加和加确实有些区别
Lst := TStringList.Create;
Lst.Add('abc');
Lst.Add('cdf'); 
for i := 0 to Lst.Count-1 do

想一下啊,如果不用 .Add 添加孖项的话 Lst.Count 的结果就会为 0 即表示 For 循环永远不会执行[:D]

当然如果是在设计界面的时候已经加上就没必要了,这样只是确定运行通过,呵呵,心思很细
 
后退
顶部