2,497
社区成员
发帖
与我相关
我的任务
分享
// 线程类的定义与实现:
type
TLoadDataThrd = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure SetGridWidth;
public
adoConn : TADOConnection;
SQLString:WideString;
DBGridTemp:TDBGrid;
adsData:TADODataSet;
dsData:TDataSource;
end;
{ TLoadDataThrd }
procedure TLoadDataThrd.SetGridWidth;
var
i : integer;
begin
for i := 0 to DBGridTemp.Columns.Count-1 do
begin
DBGridTemp.Columns[i].Width := 70;
end;
end;
procedure TLoadDataThrd.Execute;
begin
adsData.Close;
adsData.Connection := adoConn;
adsData.CommandText := SQLString;
try
adsData.Open;
if adsData.Active then
begin
SetGridWidth;// 虽然此处调用了此函数来设置Grid列宽度,但是最后显示出的宽度根本不正确!
end;
finally
end;
end;
// 在窗口类中实现调用线程
{TfrmData}
//function TfrmData.getSQLCmd:WideString; // 获取 sql语句的函数,返回如:select * from .....
// adoConn1:TAdoConnection;
// DBGridTest:TDBGrid;
// adsTest:TADODataSet;
// dsTest:TDatasource;
function TfrmData.RunThread(adoConnTemp:TADOConnection; SQLString : widestring;
DBGridTemp:TDBGrid; adsTemp: TADODataSet; dsTemp : TDataSource): TLoadDataThrd;
var
loadThread:TLoadDataThrd;
begin
loadThread := TLoadDataThrd.Create(True);
loadThread.adoConn := adoConnTemp;
loadThread.DBGPM := DBGridTemp;
loadThread.adsData := adsTemp;
loadThread.dsData := dsTemp;
loadThread.SQLString := SQLString;
loadThread.Resume;
Result := loadThread;
end;
// 此处调用线程取数据库数据
procedure TfrmData.btnSearchClick(Sender: TObject);
begin
RunThread(adoConn1,getSQLCmd,DBGridTest,adsTest,dsTest);
end;
TMyThread=class(TThread)
private
FVar: Integer;
procedure UpdateUI;
...
procedure Execute; override;
begin
FVar:= 100;
..
Synchronize(UpdateUI);
end;
procedure UpdateUI;
begin
Form1.caption:= Inttostr(FVar);
end;
function SetGridWidth:Boolean;
function SetGridWidth(iCount:integer):boolean;