Guest:
Register
|
Login
|
Member List
|
Search
|
Statistics
|
FAQ
Language
----------
Simplifed Chinese
Traditional Chinese
English
CnPack Forum
»
技术板块灌水区
» CnPack Delphi Bug 集
‹‹ Last Thread
|
Next Thread ››
Poll
Trade
Reward
Activity
Printable Version
|
Email to Friend
|
Subscription
|
Favorites
Subject: CnPack Delphi Bug 集
skyjacker
版主
茶农
UID 2239
Digest Posts
9
Credits 617
Posts 269
点点分 617
Reading Access 100
Registered 2006-6-8
Status Offline
#1
Post at 2007-3-17 11:25
Profile
|
Blog
|
P.M.
|
CnPack Delphi Bug 集
CnPack Delphi Bug 集
整理: SkyJacker
http://www.cnpack.org
CnPack IV QQ Group: 130970
Bug发布人: 谁知我心
2007-3-16 谁知我心发布以下 D6 Bug
Bug1:
unit Masks;
function Matches(P: PChar; Start: Integer): Boolean;
中的
msMBCSLiteral:
while (P^ <> #0) do
begin
if (P^ <> LeadByte) then Inc(P, 2)
else
begin
Inc(P);
if (P^ = TrailByte) then
Break;-->bug
Inc(P);
end;
end;
解决:
if (P^ = TrailByte) then
begin
dec(P);
Break;-->bug就解决了中文匹配的问题
end;
Bug2:
d6还有一个bug就是ado 的int64的问题。本来是负数变成正数,也已经解决了
你改了这些编译后的VCL版本和原来的不一样,那如果编译成DCU和别人的程序要交互会很麻烦吧。
一壶清茶煮青春.
skyjacker
版主
茶农
UID 2239
Digest Posts
9
Credits 617
Posts 269
点点分 617
Reading Access 100
Registered 2006-6-8
Status Offline
#2
Post at 2007-3-17 11:34
Profile
|
Blog
|
P.M.
|
Bug3: 2007- 03-17 SkyJacker 发布 Delphi 默认意外处理函数可能发生意外.
测试环境: D6 +up2
procedure TApplication.ShowException(E: Exception);
var
Msg: string;
begin
Msg := E.Message;
if (Msg <> '') and (AnsiLastChar(Msg) > '.') then Msg := Msg + '.';
// 在消息的末尾加个 '.' ,但是太不严格了吧。因为在 '.' 的前面还有其他常见的 ascii 字符。
// 这一句到底要实现什么功能呢?谁能告诉我。
// 直接将这一句注释掉,应该更好。或者干脆写 msg = '未知 E.Message';
// 为什么注释掉更好,继续往下看就会更明白了。
MessageBox(PChar(Msg), PChar(GetTitle), MB_OK + MB_ICONSTOP);
end;
AnsiLastChar 返回的是指向字符串最后一个字符的指针。
那么 (AnsiLastChar(Msg) > '.') 可以这样写吗?一个指针和一个字符的比较。
测试发现: 如果 一个 PChar 与 一个字符比较, Delphi 会自动将 PChar 转为 PChar^。
有意思吧。
再来 AnsiLastChar 源码
function AnsiLastChar(const S: string): PChar;
var
LastByte: Integer;
begin
LastByte := Length(S);
if LastByte <> 0 then
begin
while ByteType(S, LastByte) = mbTrailByte do Dec(LastByte);
Result := @S[LastByte];
end
else
Result := nil; // 如果 S = '' ,则返回 nil
end;
注意了,如果使用 AnsiLastChar 要注意空指针的问题:
比如:
Msg := '';
if (AnsiLastChar(Msg) >= '.') then
将会出现访问非法内存 $00000000 的错误。
再返回来看
Msg := E.Message;
if (Msg <> '') and (AnsiLastChar(Msg) > '.') then Msg := Msg + '.';
也就是说, Delphi 并不能保证 E.Message 不为空。因此,加了 (Msg <> '') 的条件。
问题又来了,既然不能保证 E.Message 不为空,又因为 if A and B 这种条件会因为编译条件的不同而产生不同的结果。
因此,将编译选项改为完全计算,在Compiler Options 对话框中选择Complete Boolean Evaluation 选项,
那么,"Read of Address 00000000" 应该是意外处理中的意外了。
之所以认为是 Bug, 是因为 Delphi 并没有说明它所有的编译必须使用部分编译.
还有实在不能理解 if (Msg <> '') and (AnsiLastChar(Msg) > '.') then Msg := Msg + '.'; 的功能.
[
本帖最后由 skyjacker 于 2007-3-17 11:37 编辑
]
一壶清茶煮青春.
Passion
(LiuXiao)
管理员
UID 359
Digest Posts
19
Credits 6838
Posts 3591
点点分 6838
Reading Access 102
Registered 2004-3-28
Status Offline
#3
Post at 2007-3-17 14:48
Profile
|
Blog
|
P.M.
“你改了这些编译后的VCL版本和原来的不一样,那如果编译成DCU和别人的程序要交互会很麻烦吧。”
——这个我倒是不认为会有什么麻烦,一来这几个函数不存在啥交互的,二来是bug,修正总比没修正好。
这个bug修正不同于模块间的数据结构的接口,后者一个改了另外不改就会出问题。
kendling
(小冬)
高级版主
MyvNet
UID 703
Digest Posts
5
Credits 978
Posts 580
点点分 978
Reading Access 101
Registered 2005-2-18
Location 广东
Status Offline
#4
Post at 2007-3-17 15:49
Profile
|
Site
|
Blog
|
P.M.
|
|
哈,VCL的代码,,
小冬
http://MyvNet.com
zzzl
(早安的空气)
版主
UID 590
Digest Posts 0
Credits 399
Posts 199
点点分 399
Reading Access 100
Registered 2004-11-29
Status Offline
#5
Post at 2007-3-19 09:35
Profile
|
Blog
|
P.M.
|
期待bds2006的bug
zjy
管理员
UID 2
Digest Posts
6
Credits 2385
Posts 1543
点点分 2385
Reading Access 102
Registered 2002-12-16
Location China
Status Offline
#6
Post at 2007-3-19 12:02
Profile
|
Site
|
Blog
|
P.M.
QUOTE:
原帖由
skyjacker
于 2007-3-17 11:34 发表
Bug3: 2007- 03-17 SkyJacker 发布 Delphi 默认意外处理函数可能发生意外.
测试环境: D6 +up2
procedure TApplication.ShowException(E: Exception);
var
Msg: string;
begin
Msg := E.Message;
if (Msg < ...
if (Msg <> '') and (AnsiLastChar(Msg) > '.') then Msg := Msg + '.';
这行代码的作用是:如果错误消息没有用 . , ! 这些标点符号结尾,自动在后面加上一个英文的句号。
不过这样一来我们会发现一个很不爽的问题:我们有时会在异常消息中用中文的句号"。"结束,结果你会发现弹出来的异常框中中文句号后面会多个英文的句号:(
Zhou JingYu
CnPack Administrator
http://www.cnpack.org/
skyjacker
版主
茶农
UID 2239
Digest Posts
9
Credits 617
Posts 269
点点分 617
Reading Access 100
Registered 2006-6-8
Status Offline
#7
Post at 2007-3-19 14:17
Profile
|
Blog
|
P.M.
|
有意思.
不加点的消息会有如下 :
1、 . , ! 正好在 . 的前面的符号
2、意外(...) 括号内
3、"意外"
.....
Borland 程序员也有偷懒的时候
一壶清茶煮青春.
kendling
(小冬)
高级版主
MyvNet
UID 703
Digest Posts
5
Credits 978
Posts 580
点点分 978
Reading Access 101
Registered 2005-2-18
Location 广东
Status Offline
#8
Post at 2007-3-20 10:10
Profile
|
Site
|
Blog
|
P.M.
|
|
哈哈哈,我也偷懒。。。。而且经常。。。
小冬
http://MyvNet.com
jAmEs_
灌水部部长
UID 886
Digest Posts 0
Credits 1134
Posts 600
点点分 1134
Reading Access 10
Registered 2005-6-5
Location 广东
Status Offline
#9
Post at 2007-3-20 10:54
Profile
|
Blog
|
P.M.
回复 #6 zjy 的帖子
还真是这样。。。
Poll
Trade
Reward
Activity
CnPack Forum
CnPack English Forum
> CnWizards IDE Wizards
> CVSTracNT
> Announcements & Others
All times are GMT++8, the time now is 2024-11-25 12:21
Powered by
Discuz!
5.0.0
© 2001-2006
Comsenz Inc.
Processed in 0.009726 second(s), 9 queries , Gzip enabled
TOP
Clear Cookies
-
Contact Us
-
CnPack Website
-
Archiver
-
WAP
Member's CP Home
Edit Profile
Credits Transaction
Public User Groups
Buddy List
Main
Page Views
User Agents
Posts History
Top Forums
Top Threads
Post Ranking
Credit Ranking
Online Time
Team
Moderation Stats