[原创]Delphi调试点滴

作者在 2008-01-17 10:59:37 发布以下内容

Delphi的错误提示莫名其妙,把调试中碰到的一些错误和处理方法记录下来

我真服了Delphi了,真是笨到一定境界了.还说什么聪明的程序员用Delphi,我看是因为Delphi实在太笨了,所以才需要聪明的程序员来用,这不是浪费人才嘛.

                                                                               ---------------我说的

===========================================================

1: Unsatisfied forward or external declaration

出现在程序一开始的函数声明,

意思就是声明和定义不一样,可能就是因为在定义的时候的数据类型,参数个数等不同而引起的,不过最可能的原因是,在定义的时候,前面少了一个前缀

比如在TForm1中声明的函数,在定义的前面加一个"TForm1."的前缀就行了

2: Types of actual and formal var parameters must be identical

出现在调用函数的地方

意思可能是不能用指针传递,在函数定义的地方,前面加个var表示这个值会被改变,加个const表示这个值不会被改变

这个错误要注意一下对传入参数的定义和处理

3: Incompatible types

数据类型不匹配,这个错误是我最经常碰到的.Delphi的类型太乱了.

一般后面会有两个类型,比较一下就行了.不过有时候后面没有数据类型,这个时候一般是指针类型不匹配,比较一下也可以发现.

新增:Incompatible types: 'Integer' and 'Extended',某次调试的时候出现这个,我研究了半天也没研究出来为什么,最后发现原来是除法的问题,如果定义a是integer,那么除法如果用a/2那就会报这个错误.百度了一下,要改成a div 2才可以.我真服了Delphi了,笨到一定境界了.还说什么聪明的程序员用Delphi,我看是因为Delphi实在太笨了,所以才需要聪明的程序员来用,这不是浪费人才嘛.

4.调试的时候,timer控件的一些语句不能被执行到

如以下程序(其中i是全局变量,tmr1是时钟控件):
procedure TForm1.tmr1Timer(Sender: TObject);
begin
  if i < 5 then
  begin
    Inc(i);
    MessageBox(Handle, PChar(IntToStr(i)), '提示', MB_OK + MB_ICONINFORMATION + MB_TOPMOST);
    Form1.Caption := Form1.Caption + IntToStr(i);
  end;
  Inc(i);//在i小于5的时候,这一句将不能被执行,大于5之后,这句就能执行到
end;

经过试验,有如下现象:
1. 仅发生在timer控件上,如果用循环语句,没此错误
2. 肯定是MessageBox函数引起的,如果不用MessageBox函数,也不会出现
3. 如果提高timer控件的interval,然后在弹出提示的时候,及时在下次timer控件被启用的时候点击确定,则这种现象也不会出现
4. 无论何时,点击了弹出的提示框,那么后面的语句会被执行一次

原因也可以大概推测的出,就是MessageBox并不停止timer的计时,如果没有点击提示框的确定,则函数不会向下执行,但是下一次timer事件又会发生,这样就会出现连续的弹出提示框,而如果点击的一个提示框,则后面的语句会被执行,就好像MessageBox使线程被暂时挂起一样,等到点击了确定,这个线程才被执行.(难道真的是传说中的多线程)

原创 | 阅读 6115 次
文章评论,共0条
游客请输入验证码