各位仁兄,仁姐,小弟碰到一个问题,因为数据库有百万条记录,而我简单的实现一个导入功能,不过他要首先去其他表中搜索数据,按条件插入,这就碰到问题了,一点击,就停在那里,不动了,跟死机一样。所以小弟想实现一个跳出框,不用显示进度,只要提示正在处理数据便可,另外把鼠标事件改为漏斗,试着弄过一个form,点击导入的时候,form.show,执行完以后,form.close,但是form上的字都显示不出来,只显示了form的边框,中间什么都没有,是不是需要数据库在后台操作,form前台跳出啊,希望能提供些解决方案,最好有源码?/高分必送!
form.refresh;或者;
Application.ProcessMessage
在公共UNIT中自建非模态窗口过程和释放过程:
procedure MyShow(str: string);
begin
MyMessagefrm:=TMyMessagefrm.Create(Application);
MyMessagefrm.Label1.Caption:=str;
MyMessagefrm.Show;
MyMessagefrm.Refresh;
end;procedure MyShowFree;
begin
myMessagefrm.Hide;
myMessagefrm.Free;
myMessagefrm:=nil;
end;然后在insert, update操作之前调用myshow('正在保存数据, 请稍候......');
操作之后调用myshowfree释放
unit Main;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ActiveX,DB, ADODB;const
WM_TASK_FINISH = WM_USER + 1001;
type
TMainFrm = class(TForm)
btnTest: TButton;
procedure btnTestClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure TradeFinish(var Msg:TMessage);message WM_TASK_FINISH;
end; TDBThread=class(TThread)
protected
procedure Execute();override;
public
MsgWnd:THandle;//接收线程完成通知消息的窗口
ConnectionString:string; //ado 连接串
end;var
MainFrm: TMainFrm;implementation{$R *.dfm}
{ TDBThread }procedure TDBThread.Execute;
var
Index:Integer;
SQL:string;
adoQry:TAdoQuery;
begin
CoInitialize(nil);
adoQry := TAdoQuery.Create(nil);
try
adoQry.ConnectionString := ConnectionString;
//模拟插入1000条记录s
for Index := 1 to 100 do
begin
SQL := 'INSERT INTO DEDAK_TEST (BH,MC) VALUES(''%s'',''%s'')';
(*
数据库是Access 2000
表结构
DEDAK_TEST
(
BH varchar(50),
MC varchar(50)
)
*)
SQL := Format(SQL,[IntToStr(Index),'A' + IntToStr(Index)]);
adoQry.SQL.Text := SQL;
adoQry.ExecSQL();
Sleep(2);
end;
finally
CoUninitialize();
//通知主窗体任务完成
PostMessage(MsgWnd,WM_TASK_FINISH,0,0);
end;
end;procedure TMainFrm.btnTestClick(Sender: TObject);
var
Obj:TDBThread;
ConnStr:string;
begin
ConnStr := 'Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=F:\DataBase40.mdb;' +
'Persist Security Info=False';
Obj := TDBThread.Create(TRUE);
Obj.FreeOnTerminate := TRUE;
Obj.MsgWnd := Self.Handle;
obj.ConnectionString := ConnStr; Screen.Cursor := crSQLWait;
obj.Resume(); //启动线程
end;procedure TMainFrm.TradeFinish(var Msg: TMessage);
begin
Screen.Cursor := crDefault;
ShowMessage('数据插入完成');
end;end.