//采用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控件没有显示;而且程序退出会出现"无效的窗口句柄"
该怎么解决?

解决方案 »

  1.   

    1、线程中的FDataSet,没有定义。FDataSet应该在线程内定义。无效的窗口句柄一般是指线程关闭时,调用的对象关不掉。
    2、在FetchComplete事件,应检查DataSet有没有记录数据。RadioGroup控件没有显示与此有关。
      

  2.   

    1.线程只是传参,难道不能传这样的参数吗?
    2.在线程结束后DataSet,是有数据的(有跟踪到)
      

  3.   

    关键是FDataSet 需要一个create的过程,你最好在线程内部创建。
    如果FDataSet在外部创建,也可以使用Synchronize()同步更新FDataSet中数据。
    在FetchComplete事件中,跟一跟while not DataSet.Eof do 是否为真。
    然后显示DataSet.fieldbyname('MsgTitle').AsString是否有字符数据。
      

  4.   

    刚做了测试,发现跟线程没有关系.
    就是简单的一个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;以上结果仍然会出现"无效的窗口句柄"
      

  5.   

    跟这句有关。
    ADOQuery1.ExecuteOptions := [eoAsyncFetchNonBlocking];
    建议不要用eoAsyncFetchNonBlocking,试试。记得我以前也遇到这种情况。ADO的异步模式有问题。
      

  6.   


    RadioGroup1.Items.Append(DataSet.FieldByName('Userphone').AsString);
    //改成Memo控件就没有问题,奇怪了:
    Memo1.lines.Append(DataSet.FieldByName('Userphone').AsString)