整整一年前,我在bcb论坛贴过一个帖子《为什么这么多人总发现了一个bug?》
当时的帖子很热烈,现在我觉这里也需要贴一下了。大家感兴趣的搜索以下论坛,会发现很多关于Delphi Bug 的帖子,仔细看过帖子,可以说其中绝大部分都不是什么bug。相对于VC,VB的论坛,没有人会这么说,他们都是说 为什么是 xxx 这样?而borland的用户,却总说“发现一个bug xxx”这类的话,为什么?首先,说这类话我可以说,十之八九都是初学者,但是又有一点的经验,反映出一种浮躁的情绪,让我想起儿时课文《石钟山记》记中说的“乱石中择其一二,扣之空空焉,自以为得其是”;
其次,这表现出他们对boland产品的信心不足;大家作何感想?
当时的帖子很热烈,现在我觉这里也需要贴一下了。大家感兴趣的搜索以下论坛,会发现很多关于Delphi Bug 的帖子,仔细看过帖子,可以说其中绝大部分都不是什么bug。相对于VC,VB的论坛,没有人会这么说,他们都是说 为什么是 xxx 这样?而borland的用户,却总说“发现一个bug xxx”这类的话,为什么?首先,说这类话我可以说,十之八九都是初学者,但是又有一点的经验,反映出一种浮躁的情绪,让我想起儿时课文《石钟山记》记中说的“乱石中择其一二,扣之空空焉,自以为得其是”;
其次,这表现出他们对boland产品的信心不足;大家作何感想?
解决方案 »
- activeform开发的问题:程序需要的文件怎么处理呢?
- 在ado 环境下如何使用 decison 控件??
- 关于导出Excel问题
- 请高手帮忙怎么样在Dbgrid中动态显示当前新增的记录(新手提问)
- 有关Realaudio控件和Media Player 6.4控件的使用,想参与讨论请于我联系QQ:17588775
- 怎样操作aodquery中返回的结果集
- 有没有用Formula one 6的,进来看看
- 请问李维那三本书是什么出版社出版的,市面上有售吗?
- 请问各位高手们,how to 在delphi中实现把unicode纯文本转成ani纯文本?
- delphi cxGrid如何用代码实现OncellClick
- ★★请问turbo pascal 7.0中的清屏命令是什么?就像QB中的CLS命令。
- 关于TUXEDO的问题!高分相送(救命了)
不过bug还是有存在的,比如ado 2.0以前的版本,老就出现EOF和BOF的错误,升级ado就没事了,这是一个实实在在存在的bug
就像生活中一样,不要把眼光总停留在别人的缺点或我认为是别人的缺点的层面上
其实每个人都有自己的优点,就像软件,如果一条路走不通(可能就是不通,也可能是你不会走),总还有其他的方法可以达到自己的目的。
本人初学时是从项目入手,没经过系统的学习,也提出过问题,比如duduwolf(嘟嘟狼) 说的问题,但只以为是自己水平不行,根本就没想到是BUG,在网上查一查才知道原因。还是老话,谦虚使人进步!
-------------------------------------------------------------------------------
回复人: eastliangliang(青苹果)(学而不思则惘) ( ) 信誉:137 2003-10-30 08:24:00 得分:0
用的多才会发现BUG,他们觉得Delphi应该这样才对,但是Delphi没有这样做,所以不习惯;VC里人们不知道VC应该是什么样子,所以看见的都以为是对的。
-------------------------------------------------------------------------------支持!
耙子的话题,有意思!
BUG还是有的,只是没有有些人想的那么多、那么容易出现罢了我遇见过一个
用 CTRL+SPEACE 代码导航的时候,
有时只要导航的是True,就会出一个index out of list的错误
这时我必须重新启动启动delphi,否则这个错误会一直出现
不知这是一个BUG,还是我的系统的问题程序调不通的时候,说是有BUG的人,十个有九个是自己的错误
>程序调不通的时候,说是有BUG的人,十个有九个是自己的错误
http://expert.csdn.net/Expert/topic/2408/2408069.xml?temp=.8710749
程序调不通的时候,说是有BUG的人,十个有九个是自己的错误都很有见解啊!
////
这也叫Bug?
我曾经和cker也琢磨过TACTIONBAR。基本意见就是他们不适合传统的MDI窗口开发,因为大家认为他没了右边的ICON,
认为是bug的一派,在发现D7仍是如此的时候也无话可说,因为如果是bug,borland不可能不修改了。
继Office 2000以后,office 不再采用原来的MDI,而是采用2000和xp开始支持的MTI窗口,
Frontpage 虽然仍是MDI,但是他也一样没有了右上角的的ICON了
阿嚏,阿嚏,谁骂我。嘿嘿,我才不在乎bug呢。
不知道为什么
好像他们都能解决!
D6没用过
D7的dbExpress For MSSQL 的驱动, 这么明显的Bug, 难道宝兰没有测试人员, 或者都忙着向.net进军了,又出现他妈两个C++的变种开发工具, 有这个精力还不如好好改善一下Delphi的开发环境, 或者对C++ Builder 进行换血, 重振BC的往日雄风, 他妈的, 宝兰的领导层简直是白痴!
为什么D7的在编辑(非执行时)会莫名其妙的退出
为什么ActionManager这些东西Bug一大堆(DevExpress的就不会)
我不是想怎么样, 只是这几年的Dephi的表现实在是太让人失望了, 我是恨铁不成钢啊!
如果Delphi的开发环境做得再人性化一点, 说个笑话, 你用SQLConnection连接数据, 有用ADO连接的爽吗, 再看看他妈的在设置数据库密码连个 * 都没有
D6的BUG也多,QDocuments之所以无法推出D6的版本,就是因为OTA上BUG太多,无法处理KeyBindings。狂郁闷。
>为什么D7的在编辑(非执行时)会莫名其妙的退出这两个从来没碰到过。SQLConnection还好,习惯了就好chechy说的是D4是BUG最多的一个版本,用过的人没有不骂的。个人认为D3和D5是最好的两个版本(D5的ADO BUG其实不是BUG,而是MS在ADO2。6中改了一些东东,所以D5的ADO就出错了,如果用ADO2。5或之前的版本,D5是没有问题的)
D5 引入了ADO,完善了MIDAS这也是很好的进步,
D4 开始增加了 DBX,我非常喜欢。可能论坛里面没几个人是从D1开始用到D7的,D1是for win16的,我当时正在学OWL,看到delphi吃惊非小!Delphi bug的确有,很现在论坛里面很多嚷嚷的都不是borland的错,记得D3当时和S3现实卡还冲突,和Win95 OEM 版的ComCtl32.dll 也冲突,这都不能怪,borland,因为ms在D3之后改了东西。同样D5的ADO的问题,也是正如 猛禽 所说的,怪不得borland.dbx 密码没有用*,我觉得这是习惯问题,试想弄成*号这不是举手之劳?IBX也不是*,呵呵 ;)
>>为什么D7的在编辑(非执行时)会莫名其妙的退出
證實, 以上兩個問題我都碰過!!>> 再看看他妈的在设置数据库密码连个 * 都没有
同意...
**是不 PAS文件本身就是乱码,用文本编辑器看看?
没有碰到过乱码的。
D7的在编辑(非执行时)会莫名其妙的退出
**碰到了,原因不知,只知道重装一下又可以了。
D5中的ADO有问题
**好像有问题,听说有补丁,不过D6、D7中是肯定没有问题的。我碰到过很多所谓的BUG基本很多是程序代码本身的问题或者是
重装就能解决的。
而且从D4开始,Delphi的启动速度慢了许多,俺很崇拜的雅典娜女神也没了(4就若隐若现了),同时有了按了F9,发现Delphi没了。另外,Delphi有个BUG,可能从4-7都没有解决。就是TreeView在发生Dock后,每个TreeNode所关联的Data,内容发现丢失,访问的时候居然出现AV错误。
你说的是Dock 还是Drag, Drag好像不会啊
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls;type
TForm1 = class(TForm)
TreeView1: TTreeView;
Panel1: TPanel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}
type
PD = ^TD;
TD = record
A: Integer;
B: array [0..10] of char;
end;procedure TForm1.Button1Click(Sender: TObject);
var
p: PD;
begin
p := PD(TreeView1.Items.Item[0].Data);
ShowMessage(IntToStr(p.A) + #9 + p.B);
end;procedure TForm1.FormCreate(Sender: TObject);
var
p: PD;
begin
Panel1.DockSite := True;
TreeView1.DragKind := dkDock;
TreeView1.DragMode := dmAutomatic; TreeView1.Items.AddChild(nil, 'aaa');
TreeView1.Items.AddChild(nil, 'bbbb');
TreeView1.Items.AddChild(nil, 'bbbb');
New(p);
p.A := 10;
p.B := 'abcd';
TreeView1.Items.Item[0].Data := p;
end;end.
1)我写Tree,Data关联的都是Class,而不是Record。
2)我是在Class中保存了TreeNode的值,然后Dock后,在调用TreeNode,就出现AV错误。
3)这个错误,我在D4的时候发现。D5/D6都验证了这个BUG继续存在。D7我没有验证过。不过,这个似乎不是Borland的BUG,但是这个BUG确实很让人讨厌。我不得不在每次Dock后,重新给每个Data中的TreeNode重新赋值。
我前面的描述可能有些失误。
type
PD = ^TD;
TD = record
A: Integer;
B: array [0..10] of char;
C: TTreeNode;
end;procedure TForm1.Button1Click(Sender: TObject);
var
p: PD;
begin
p := PD(TreeView1.Items.Item[0].Data);
ShowMessage(p^.C.Text);
end;procedure TForm1.FormCreate(Sender: TObject);
var
p: PD;
begin
Panel1.DockSite := True;
TreeView1.DragKind := dkDock;
TreeView1.DragMode := dmAutomatic; TreeView1.Items.AddChild(nil, 'aaa');
TreeView1.Items.AddChild(nil, 'bbbb');
TreeView1.Items.AddChild(nil, 'bbbb');
New(p);
p.A := 10;
p.B := 'abcd';
p.C := TreeView1.Items[0].
TreeView1.Items.Item[0].Data := p;
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls;type
TForm1 = class(TForm)
TreeView1: TTreeView;
Panel1: TPanel;
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure TreeView1EndDock(Sender, Target: TObject; X, Y: Integer);
private
procedure ShowAddress(o: TObject);
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}
type
PD = ^TD;
TD = record
A: Integer;
B: array [0..10] of char;
C: TTreeNode;
end;procedure TForm1.Button1Click(Sender: TObject);
var
p: PD;
begin
p := PD(TreeView1.Items.Item[0].Data);
ShowMessage(p^.C.Text);
end;procedure TForm1.FormCreate(Sender: TObject);
var
p: PD;
t: TTreeNode;
begin
Panel1.DockSite := True;
TreeView1.DragKind := dkDock;
TreeView1.DragMode := dmAutomatic; TreeView1.Items.AddChild(nil, 'aaa');
TreeView1.Items.AddChild(nil, 'bbbb');
TreeView1.Items.AddChild(nil, 'bbbb');
p := New(PD);
p.A := 10;
p.B := 'abcd';
p.C := TreeView1.Items.Item[0];
TreeView1.Items.Item[0].Data := p; ShowAddress(TreeView1);
ShowAddress(TreeView1.Items.Item[0]);
ShowAddress(TreeView1.Items.Item[0].Data);
end;procedure TForm1.ShowAddress(o: TObject);
begin
ListBox1.Items.Add(IntToStr(Integer(o)));
end;procedure TForm1.TreeView1EndDock(Sender, Target: TObject; X, Y: Integer);
begin
ShowAddress(TreeView1); //这个不变
ShowAddress(TreeView1.Items.Item[0]); //这个变
ShowAddress(TreeView1.Items.Item[0].Data); //这个变
end;end.
这应该不算不Bug吧
按照正常的思维,TReenode的地址应该是不变的,对不?
此外,Delphi也是在不断发现BUG的基础上发展的。比如D4的时候MIDAS解析表名,统统改为大写,结果dbo就变成了DBO,呵呵数据库可没有DBO这个用户,结果报错。到了D5,明显修正了这个错误,给Provider提供了一个OnGetTableName的事件,这样,就防止了表名解析错误带来的麻烦。
Delphi的一些BUG不是说打了的补丁就能解决的,有些BUG甚至下个版本都无法解决。
不如干点好玩的,嘿嘿
昨天測試一個網友的代碼, 有問題, 那位能說說是什麼回事!!
d7 + win2K; delphi自己幫助的代碼!!uses SysUtils;
const
S: PChar = 'A fUnNy StRiNg'
begin
Canvas.TextOut(5, 10, string(StrLower(S)) + ' ' + string(StrUpper(S)));
end;
还有,现在CSDN的星星可真的多呀!
我用UpperCase就不会, 大家认为算不算
Canvas.TextOut(5, 10, string(LowerCase(S)) + ' ' + string(UpperCase(S)));
比如,我在开发QDocuments的时候,就发现,在D6,只要Add一个KeyBinding,在D6退出的时候,有时就会引发AV错误。如果去掉AddKeyBinding的代码,AV错误就消失了。
这个BUG被GExperts的作者证实了,在他的网站上就有这个东西:
Known bugs in the Delphi 6 Open Tools API (some apply to Delphi/BCB 5):
TIModuleInterface.GetFormInterface is deprecated and always returns nil. You must use IOTAFormEditor instead.
The Open Tools keybinding interfaces sometimes raise AVs when using IOTAKeyBoardServices.AddKeyboardBinding.
IOTAEditView.PosToCharPos raises an AV in dfwedit.dll every time it is used.
IOTAEditorServices.TopView raises an AV in the coride package if called with no files open. 我就奇怪,这个牛人写的GExperts视如何避免的,我研究了半天源码都没有研究出来。
解决的方法1)在点击菜单的时候,重新设置一下。2)加一个Timer,毛估估几秒后启动一把,重新设置快捷键,这样就可以回避这个BUG。
这招,俺就是从GExperts中学到的。
也许我对它了解不够,但的确是比较多的。不过和CB相比,delphi是好了许多!
另外,帮助里有的代码有问题我也发现过多次
支持DWGZ,呵呵500年的朋友嘛。
你的问题在大富翁上有过详细的讨论。S:= 'A fUnNy StRiNg';
这句话的含义是:
把一个字符串常量'A fUnNy StRiNg'的地址赋给S。
这里这个字符串常量不是动态分配给S的,而是在程序
启动的时候在堆栈中预先分配好的,所以说是个字符串
常量。这个常量的定义跟你定义S为变量还是常量没有
关系。 而StrLower函数需要对传入的字符串直接做修改,(由于不能对常量进行修改),所以会报错。
前一段用D7做过几个WEBSNAP应用,最常见的问题就是LOGIN,经常LOGIN不进去,有时用WAD是好的,改DSO/ISAPI就不行,要不就是LOGIN进去后又出不来(在DR‘BOB上找到其中一个问题的解决办法,但还是没能完全解决)。还有就是LINKTOPAGE有一个很大的BUG:就是那个ERROR页面根本到不了,而这个在D6中却是正常的。FT还有COM方面有些小BUG,最有名的就要算F1BOOK了,在D6中导入F1BOOK6。1的TLB会丢失很多东东,结果不能用,还要自己手工加入才行,而用D5导入则没有问题。套一句九斤老太的名言:“一代不如一代啊”
我知道的BUG就是ADO的那个,一段时间折腾了我够呛。不过我觉得Delphi的BUG和Windows的PACK相比,还是差了很多的。
------------------------
偶也提个D7+sql2k问题:
点开ADODataSet.CommandText时,左边有数据表,底下是字段,
在点击添加数据表时,不能自动添加用户登陆名,因为没有用户登陆名,打开出错!
不知这个功能不全算不算BUG?
这个其实也不能算是Bug, 并不是所有的数据库都有支持用户, 这只能说是Delphi做的不够人性化而已, 不过好像C# 可以自动产生吧记不得了
var
s1,s2,s3:WideString;
begin
s2:='';
s3:='';
s1:='Hello';
s1:=s2+s3;
ShowMessage(s1); // s1 还是 “Hello”
end;
lea eax [ebp-$08] //s2=''
call @WStrClrlea eax [ebp-$0c] //s3=''
call @WStrClrlea eax [ebp-$04] //s1='hello'
mov edx $004521d0 //$004521d0应该就是‘hello’吧
call @WStrLAsg
//s1=s2+s3
lea eax [ebp-$04] //这里就是s1的地址
mov ecx [ebp-$0c] //s3
mov ecx [ebp-$08] //s2
call @WstrCat3 //问题就应该出在这个子程序里吧 ,谁给我讲讲,我迷糊了,呵呵
把它改成 s1 := '' + ''; 当然我这是固定常量
结果是 '';
捐分是好方法。
我有几十分,
愿意全部捐出,
捐向哪位?
>> S:= 'A fUnNy StRiNg';
>>把一个字符串常量'A fUnNy StRiNg'的地址赋给S。
>>所以说是个字符串
>>常量。这个常量的定义跟你定义S为变量还是常量没有关系。
我还不是很明白, 那你说, 能解决这个问题吗, 我的意思是用 StrLower(S) 能避免AV错吗??如何才是正确的使用方法??
我想下面的例子能够解答你的问题procedure TForm1.Button1Click(Sender: TObject);
var
P1, P2: PChar;
begin
case RadioGroup1.ItemIndex of
0:
begin
P1 := 'Hello'; //字符串常量, 将出错
end;
1:
begin
P1 := StrAlloc(10 * SizeOf(Char));
StrPCopy(P1, 'Hello');
end;
end;
P2 := StrNew(P1);
P2 := StrUpper(P1);
ShowMessage(P2);
end;
s1:=s2+s3+'';
procedure TForm1.Button1Click(Sender: TObject);
const
I: Integer;
begin
Inc(I); //居然可以改
ShowMessage(IntToStr(I));
end;
The $J directive controls whether typed constants can be modified or not. In the {$J+} state, typed constants can be modified, and are in essence initialized variables. In the {$J-} state, typed constants are truly constant, and any attempt to modify a typed constant causes the compiler to report an error.
procedure TForm1.Button1Click(Sender: TObject);
const
I: Integer;
begin
Inc(I); //居然可以改
ShowMessage(IntToStr(I));
end;
编译能通过吗? 不懂就别乱说,好好学吧
http://expert.csdn.net/Expert/topic/2439/2439703.xml?temp=.6849939
他可能是写错了
const
I: Integer = 某个值;不过他的可以在D5下通过, 因为D5 缺省是 {$J+}, D7缺省是{$J-}