网上看了个ADO线程的帖子
然后把他加入到MDI窗口中来用
子窗口查询后,关闭时跳出这个错误:
   system Error  code:1400 无效的窗口句柄
   control '' has no parent window
如果再建立新窗口会跳出
  A component named form1 already exists 
然后无法建立整个MDI关掉后,报这样的错误
exception einvalidpointer in module project1.exe at 00003d39 invalid pointer operation单元代码是unit Mdatabas;interfaceuses
  Classes, ADODB,activex;
type
  TDatabaseThread = class(TThread)
  private
    FADODataSet:TADODataSet;
    FADOQuery:TADOQuery;
    FADOCommand:TADOCommand;
    SQLString:string;
    protected procedure Execute; override;
  public
    constructor Create(ADO:TADODataSet;S:String); overload;
    constructor Create(ADO:TADOQuery;S:String); overload;
    constructor Create(ADO:TADOCommand;S:String); overload;
    destructor destroy;
  end;implementationuses Unit1;
{ TDatabaseThread }
constructor TDatabaseThread.Create(ADO:TADODataSet;S:String);
begin
  FADODataSet:=ADO;
  SQLString:=S;
  inherited Create(False);
end;constructor TDatabaseThread.Create(ADO:TADOQuery;S:String);
begin
  FADOQuery:=ADO;
  SQLString:=S;
  inherited Create(False);
end;constructor TDatabaseThread.Create(ADO:TADOCommand;S:String);
begin
  FADOCommand:=ADO;
  SQLString:=S;
  inherited Create(False);
end;destructor tDatabaseThread.destroy;
begin
   FADODataSet.Free;
   FADOQuery.Free;
   FADOCommand.Free;
   couninitialize;
end;
procedure TDatabaseThread.Execute;
begin
  FreeOnTerminate:=True;
  coinitialize(nil);
  if FADODataSet<>nil then
  begin
    FADODataSet.Close;
    FADODataSet.CommandType:=cmdText;
    FADODataSet.CommandText:=SQLString;
    FADODataSet.Open;
  end;
  if FADOQuery<>nil then
  begin
    FADOQuery.Close;
    FADOQuery.SQL.Clear;
    FADOQuery.SQL.Add(SQLString);
    FADOQuery.ExecSQL;
  end;
  if FADOCommand<>nil then
  begin
    FADOCommand.CommandText:=SQLString;
    FADOCommand.Execute;
  end;
  couninitialize;
  if Terminated then exit;
end;end.子窗口运行时调用语句直接是:
mdatabas.tdatabasethread.create(ADODataset1,'select * from a');请问这如何解决
像MDI子窗口,如何实现ADO的多线程查询

解决方案 »

  1.   

    断点 跟踪 抓取特定值 Watch List...
      

  2.   

    是俺眼花了,耐着性子看了半天,除了查询,没有看到传说中的MDICHILD窗体的影子啊……看你的错误提示,应该是findcontrol(hwnd)的时候,提示是无效的句柄。
    而findcomponet('form1')又能找到该窗体~~是不是screen的问题?
      

  3.   

    如果是管理系统则无需要用到多线程了。Dephi不善于做这个的。
      

  4.   

    回4楼
    上面那个事ADO线程查询的单元文件MDICHILD打开后查询调用这个单元文件进行查询
    MDICHILD窗口就个按钮,DBGRID,DataSource,ADODataset
    onclosed事件就写action:=carfree;
    按钮的事件就是调用线程单元mdatabas.tdatabasethread.create(ADODataset1,'select * from a'); 
    不运行查询,子窗口可以正常关闭,运行查询后子窗口关闭就是提示
     system Error  code:1400 无效的窗口句柄 
      control '' has no parent window 
    再要打开一个新这个子窗口就打不开了
    提示就是  A component named form1 already exists而exception einvalidpointer in module project1.exe at 00003d39 invalid pointer operation 错误时整个MDI关掉时跳出来的先试下异步查询看看
      

  5.   

    基本上每种数据库都有自己的查询机制,DELPHI只是把查询指令发送过去,具体查询还是由数据库本身实现的,所以说用线程来实现数据库查询没太大实际意义。貌似couninitialize;重复执行了,去掉一个试试……
      

  6.   

    ADO组件是COM组件,需要包含在特定套件之中。Create时是在主线程的套件之中,不能够拿到子线程中使用。建议直接在子线程中创建,也就是在Excute中创建ADO组件然后执行相关方法。如需数据显示,请使用中间变量进行同步到主线程处理。