用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.
看你的错误提示,应该是findcontrol(hwnd)的时候,提示是无效的句柄。
而findcomponet('form1')又能找到该窗体~~是不是screen的问题?
[解决办法]
基本上每种数据库都有自己的查询机制,DELPHI只是把查询指令发送过去,具体查询还是由数据库本身实现的,所以说用线程来实现数据库查询没太大实际意义。
貌似couninitialize;重复执行了,去掉一个试试……
[解决办法]
ADO组件是COM组件,需要包含在特定套件之中。Create时是在主线程的套件之中,不能够拿到子线程中使用。建议直接在子线程中创建,也就是在Excute中创建ADO组件然后执行相关方法。如需数据显示,请使用中间变量进行同步到主线程处理。