//采用ADO异步形式,即:eoAsyncFetchNonBlocking;通过线程执行,运行后通知事件FetchComplete
constructor TAnsycDBThread.Create(var DataSet: TCustomADODataSet);
begin
FDataSet := DataSet;
Inherited Create(False);
end; procedure TAnsycDBThread.Execute;
begin
FreeOnTerminate := True;
FDataSet.Open;
{ Place thread code here }
end; //执行结果由事件(该事件写在窗体里):
procedure FetchComplete(DataSet: TCustomADODataSet; const Error: Error;
var EventStatus: TEventStatus);
begin
HandUpMsg_rg.Items.Clear; //radioGroup控件
while not DataSet.Eof do
begin
HandUpMsg_rg.Items.Append(DataSet.fieldbyname('MsgTitle').AsString);
DataSet.Next;
end;
end; 问题:结果可以回来,跟踪代码有传值回来.但界面的RadioGroup控件没有显示;而且程序退出会出现"无效的窗口句柄"
该怎么解决?
解决方案 »
- 大家帮我看一下这句delphi语句
- ⊙⊙⊙⊙⊙⊙怎样实现在“内存”和“缓存”中《查找》并【替换】一个『字符串』? 求示例代码⊙⊙⊙⊙⊙
- 两个 TDate 类型变量的“差”怎么求——————在线等待!!!!
- 如何将DBGrid做成flat样式,不用第三方控件?
- 如何将rtf文件导入数据库?
- 关于软件运行过程中的一个问题??
- 有没有参加了top面试的朋友?
- TStringField是怎么定义出来的?
- 請問如何在Win98下用Delphi的ADO系列組件
- 有人了解jpeg吗?
- 散分:有感步惊云对intraweb的感言,分享intraweb 10.0.23的下载地址供大家学习
- 一条insert语句 麻烦大家看看
2、在FetchComplete事件,应检查DataSet有没有记录数据。RadioGroup控件没有显示与此有关。
2.在线程结束后DataSet,是有数据的(有跟踪到)
如果FDataSet在外部创建,也可以使用Synchronize()同步更新FDataSet中数据。
在FetchComplete事件中,跟一跟while not DataSet.Eof do 是否为真。
然后显示DataSet.fieldbyname('MsgTitle').AsString是否有字符数据。
就是简单的一个ADOQuery.procedure TForm1.Button2Click(Sender: TObject);
var
Sql: string;
begin
Sql := 'select * from TABUserphone';
ADOQuery1.ExecuteOptions := [eoAsyncFetchNonBlocking];
ADOQuery1.SQL.Text := Sql;
ADOQuery1.Open;
end;//结果
procedure TForm1.ADOQuery1FetchComplete(DataSet: TCustomADODataSet;
const Error: Error; var EventStatus: TEventStatus);
begin
//RadioGroup控件
RadioGroup1.Items.Append(DataSet.FieldByName('Userphone').AsString);
end;以上结果仍然会出现"无效的窗口句柄"
ADOQuery1.ExecuteOptions := [eoAsyncFetchNonBlocking];
建议不要用eoAsyncFetchNonBlocking,试试。记得我以前也遇到这种情况。ADO的异步模式有问题。
RadioGroup1.Items.Append(DataSet.FieldByName('Userphone').AsString);
//改成Memo控件就没有问题,奇怪了:
Memo1.lines.Append(DataSet.FieldByName('Userphone').AsString)