采用ADO异步形式,即:eoAsyncFetchNonBlocking;通过线程执行,运行后通知事件FetchComplete
[code=Delphi(Pascal])
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;
[/code]
执行结果由事件:
[code=Delphi(Pascal])
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;
[/code]问题:结果可以回来,跟踪代码有传值回来.但界面的RadioGroup控件没有显示;而且程序退出会出现"无效的窗口句柄"
该怎么解决啊...急

解决方案 »

  1.   

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

  2.   

    showmessage(DataSet.fieldbyname('MsgTitle').AsString);之于无效的窗口句柄,还要看其它代码~~
      

  3.   


    是这样的,在一个窗体里面有个RaidioGroup,里面的Item必须通过数据库返回的结果集显示.
    在这个窗体中构造好AODQuery(使用异步方式即:eoAsyncFetchNonBlocking)后,把它放到一个线程执行(线程很简单,就exec的部分执行ADOQuery.open).
    线程执行完毕后,AODQuery里有个事件FetchComplete,这个事件是写在开始那个窗体所在的单元.现在的问题是:这个事件已经有结果回来,结果也正确(HandUpMsg_rg.Items.Append(DataSet.fieldbyname('MsgTitle').AsString));可就是界面的这个RadioGroup里没显示任何数据,而且退出程序后还会报"无效的窗口句柄"的问题...该如何解决哈..
      

  4.   


    //线程代码
    { TAnsycDBThread }constructor TAnsycDBThread.Create(var DataSet: TCustomADODataSet; Btn: TButton=nil);
    begin
      FDataSet := DataSet;
      FBtn := Btn;
      Inherited Create(False);
    end;procedure TAnsycDBThread.Execute;
    begin
      FreeOnTerminate := True;
      try
        FDataSet.Open;
        FDataSet := nil;
      except
        if Assigned(FBtn) then
        begin
          FBtn.Enabled := True;
          FBtn.Caption := '查询';
        end;
      end;
      { Place thread code here }
    end;//事件返回代码
    procedure TFormAlarmSend.BusinessCfgADOQueryFetchComplete(
      DataSet: TCustomADODataSet; const Error: Error;
      var EventStatus: TEventStatus);
    begin
      while not DataSet.Eof do
      begin
        rgDBusiness.Items.Append(DataSet.FieldByName('Business').AsString);
        DataSet.Next;
      end;
    end;
      

  5.   

    其实很简单,只要在中止线程或释放线程前,给线程一个terminate,之后在线程的执行部分,判断属性terminated是否为真,如果为真就不执行下面的代码即可
    如下:
    procedure FetchComplete(DataSet: TCustomADODataSet; const Error: Error;
       var EventStatus: TEventStatus);
     begin
       //增加以下两行
        if terminated then  
         exit;     HandUpMsg_rg.Items.Clear;  //radioGroup控件
       while not DataSet.Eof do
       begin
         HandUpMsg_rg.Items.Append(DataSet.fieldbyname('MsgTitle').AsString);
         DataSet.Next;
       end;
     end;