神奇啊,神奇!(30分)

  • 主题发起人 茶叶蛋
  • 开始时间

茶叶蛋

Unregistered / Unconfirmed
GUEST, unregistred user!
我的问题是:当我单步跟踪时,居然会从一大段代码中直接飞跃过去! ?
(本来我有一个Invalid Variant Type Conversation错误,
怀疑是在ConvertThreadintoHTML函数里头,想单步跟踪进去,没想到......)
是我的设置或者程序有问题,还是d4的bug?但是F7, F8都不行啊!
我的函数如下:
procedure TMainForm.NewArticle( AId : Integer );
var
Query : TQuery; Article : TBBS;
begin
Query := TQuery.Create(nil);
Query.DatabaseName:= DM.DBBS.DatabaseName;
Query.SQL.Add( Format( 'Select * from letters where id=%d', [ AID ] ) );
Query.Open;
Article := TBBS.Create( AID, Query ); //我的函数

IDText.Caption := Query[ 'ID' ];
showmessage( 'id' );
UserText.Caption := Query[ 'UserFrom' ];
showmessage( 'userfrom' );
// <font color="#ff0000">在这,就是在这! 从这跳走的! 天啊! :-((((((</font>
ExpertText.Caption := Query[ 'Expert' ];
showmessage( 'expert' );
PointText.Caption := Query[ 'Points' ];
showmessage( 'points' );
TimeText.Caption := Query[ 'RegDateTime' ];
showmessage( 'regdatetime' );
if FirstSelect then
begin
Label1.Visible := true;
Label2.Visible := true;
Label3.Visible := true;
Label4.Visible := true;
Label5.Visible := true;
IDText.Visible := true;
UserText.Visible := true;
ExpertText.Visible := true;
PointText.Visible := true;
TimeText.Visible := true;
Panel3.Visible := true;
Bar.Visible := true;
end;
Query.free;

Article.ConvertThreadintoHTML( ExtractFilePath( ParamStr( 0 ) ) + '0.html',
FormatHtml,
FormatTable ); //我的函数
if Activity then
WebBrowser1.Refresh
else
// <font color="#ff0000">跳到这里了! :-(</font>
WebBrowser1.OleObject.navigate( ExtractFilePath( ParamStr( 0 ) ) + '0.html');
end;
 
用F7跟踪,F8一定会跳过的
 
对不起,我是茶叶蛋,我现在在BiJ的机器上!
F7, F8都用过了!
不过有些怪,但如果将出现Invalid Variant Type Conversation错误,(条件满族)
则跟踪失败,如果不出现错误,则跟踪正常.
我也搞不懂呀!
 
初步搞清楚问题了:
好像是ExpertText这些TStaticText的访问错误.
跳到后面以前那些TStaticText都是有值的,
跳过去以后前两个变为:
access violation at00000013 accessing ffffffff
后两个变为空.

但是我在程序中并没有使用线程,而且刚才我也用了信号灯,
不会有两个进程同时对TStaticText进行访问啊!
 
有且仅有三种可能导致上述现象:
1. 使用多线程或时钟控制,其它线程或时钟进程被启动,会导致上述问题。
2. Delphi的程序优化功能。这时编辑器左边的行标志将不显示。并且一般
不会退出到过程外,而是被优化的一个或多个语句之后。
3. 异常。通常情况下,一个异常会导致退出发生异常的过程。系统会显示
一个异常对话框。但是,Delphi有些时候弹不出异常对话框来(??!!!!),或
者由于你定制了异常对话框,也会使对话框显示不正常。
----------------------
上面提到的现象好象是异常所致的。
 
的确有异常对话框.

不过阿明啊,问题已被我解决了.
我用Query.FieldByName( 'ID' ).asInteger来代替Query[ 'ID' ];
结果就没有这种现象了.
不好意思,虽然问题已经解决,但我还是想问:
1.这两种表示方法有什么不同吗?
2.这种跳过一段代码直接去执行下面一段的程序常见吗?可不可以利用之呢?
我们转而讨论这两个问题吧!
 
IDText.Caption是什么类型的?看你的程序来说,应该是integer类型。
缺省情况下Query[ 'ID' ]得到的是字符串类型。所以赋值不兼容。

1.
========
Query.FieldByName( 'ID' ).asInteger其实等于StrToInt(Query[ 'ID' ])

2.
========
这是异常。在Delphi中是一种出错处理。是可以利用的,但Delphi有专门的
异常出错机制。随便查看一份Delphi资料都有了。 :)
 
>IDText.Caption是什么类型的?看你的程序来说,应该是integer类型。
>缺省情况下Query[ 'ID' ]得到的是字符串类型。所以赋值不兼容。

但是,阿明啊,并不是每一次都会这样啊!
 

>缺省情况下Query[ 'ID' ]得到的是字符串类型.
其实 缺省情况下Query[ 'ID' ]得到的是Variant类型,
它的实际写法为 Query['ID'].value (value是TField的默认属性,
所以你可以写成 Query['ID'])
Variant的真正的数据类型决定了赋值的兼容性, 因为
Variant的数据类型是不定的, 所以有可能赋值正确,
例如
Label1.caption:=query1['Name']
下面的赋值就有可能出错.
Label2.caption:=query1['TotalNum']
 
并且你要记住, 发生奇怪跳转时, 一定有异常(EXCEPTION)发生.
 
清楚了,看样子我还得向阿明和SeaSky多多讨教啊!
<font color="#ff0000">根基不牢,又想速成,有何办法?</font>
 

Similar threads

I
回复
0
查看
560
import
I
I
回复
0
查看
763
import
I
I
回复
0
查看
538
import
I
I
回复
0
查看
634
import
I
I
回复
0
查看
512
import
I
顶部