读书人

用MDI窗口ADO多线程查询报错解决办法

发布时间: 2013-01-11 11:57:35 作者: rapoo

用MDI窗口ADO多线程查询报错
网上看了个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;

interface

uses
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;

implementation

uses 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的多线程查询

[解决办法]
断点 跟踪 抓取特定值 Watch List...
[解决办法]
是俺眼花了,耐着性子看了半天,除了查询,没有看到传说中的MDICHILD窗体的影子啊……



看你的错误提示,应该是findcontrol(hwnd)的时候,提示是无效的句柄。
而findcomponet('form1')又能找到该窗体~~是不是screen的问题?
[解决办法]
基本上每种数据库都有自己的查询机制,DELPHI只是把查询指令发送过去,具体查询还是由数据库本身实现的,所以说用线程来实现数据库查询没太大实际意义。

貌似couninitialize;重复执行了,去掉一个试试……
[解决办法]
ADO组件是COM组件,需要包含在特定套件之中。Create时是在主线程的套件之中,不能够拿到子线程中使用。建议直接在子线程中创建,也就是在Excute中创建ADO组件然后执行相关方法。如需数据显示,请使用中间变量进行同步到主线程处理。

读书人网 >.NET

热点推荐