线程代码unit myThread;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData,
cxDataStorage, cxEdit, DB, cxDBData, cxGridLevel, cxClasses, cxControls,
cxGridCustomView, cxGridCustomTableView, cxGridTableView,
cxGridDBTableView, cxGrid, ExtCtrls, ComCtrls, DBAccess, Ora, MemDS,
ToolWin, dxStatusBar,datatime,data,cxExportGrid4Link;
type
Tchange = class(TThread)
private
cxGrid1DBTableView1:TcxGridDBTableView;
OraQuery3:TOraQuery;
i:Integer;
protected
procedure Execute; override;
public
constructor Create(j:Integer;cxGrid1DBTableView:TcxGridDBTableView;OraQuery:TOraQuery);
end;
var
CS:TRTLCriticalSection;//临界区implementation{uses
fygl;}
constructor Tchange.Create(j:Integer;cxGrid1DBTableView:TcxGridDBTableView;OraQuery:TOraQuery);
begin
cxGrid1DBTableView1:=cxGrid1DBTableView;
OraQuery3:=OraQuery;
i:=j;
FreeOnTerminate := True; // 自动删除
inherited Create(False); // 直接运行
end;
{------------------------------------------------------------------------------}
procedure Tchange.Execute;
begin
inherited;
EnterCriticalSection(CS); //进入临界区
with OraQuery3 do
begin
Close;
SQL.Clear;
SQL.Add('select DLFYBM,ZLFYBM,MXFYBM,MXFYMC,ZDXMBM,ZDXMMC,FYDWMC from fymxb');
Open;
end; {费用单位}
OraQuery3.First; //移动指针在第一条
while not OraQuery3.eof do
begin
if (cxGrid1DBTableView1.DataController.Values[i,0]=OraQuery3.Fields[0].DisplayText) and (cxGrid1DBTableView1.DataController.Values[i,1]=OraQuery3.Fields[1].DisplayText) and (cxGrid1DBTableView1.DataController.Values[i,2]=OraQuery3.Fields[2].DisplayText) and (cxGrid1DBTableView1.DataController.Values[i,7]=OraQuery3.Fields[4].DisplayText) then
begin
cxGrid1DBTableView1.DataController.Values[i,12]:=OraQuery3.Fields[6].DisplayText;
end;
OraQuery3.Next;
end; {终点费用}
OraQuery3.First; //移动指针在第一条
while not OraQuery3.eof do
begin
if (cxGrid1DBTableView1.DataController.Values[i,0]=OraQuery3.Fields[0].DisplayText) and (cxGrid1DBTableView1.DataController.Values[i,1]=OraQuery3.Fields[1].DisplayText) and (cxGrid1DBTableView1.DataController.Values[i,2]=OraQuery3.Fields[2].DisplayText) and (cxGrid1DBTableView1.DataController.Values[i,7]=OraQuery3.Fields[4].DisplayText) then
begin
cxGrid1DBTableView1.DataController.Values[i,7]:=OraQuery3.Fields[5].DisplayText;
end;
OraQuery3.Next;
end; {明细费用}
OraQuery3.First; //移动指针在第一条
while not OraQuery3.eof do
begin
if (cxGrid1DBTableView1.DataController.Values[i,0]=OraQuery3.Fields[0].DisplayText) and (cxGrid1DBTableView1.DataController.Values[i,1]=OraQuery3.Fields[1].DisplayText) and (cxGrid1DBTableView1.DataController.Values[i,2]=OraQuery3.Fields[2].DisplayText) then
begin
cxGrid1DBTableView1.DataController.Values[i,2]:=OraQuery3.Fields[3].DisplayText;
end;
OraQuery3.Next;
end;
{二级费用}
with OraQuery3 do
begin
Close;
SQL.Clear;
SQL.Add('select * from fyzlfybm');
Open;
end;
OraQuery3.First; //移动指针在第一条
while not OraQuery3.eof do
begin
if (cxGrid1DBTableView1.DataController.Values[i,0]=OraQuery3.Fields[0].DisplayText) and (cxGrid1DBTableView1.DataController.Values[i,1]=OraQuery3.Fields[1].DisplayText) then
begin
cxGrid1DBTableView1.DataController.Values[i,1]:=OraQuery3.Fields[2].DisplayText;
break;
end;
OraQuery3.Next;
end; {一级费用}
with OraQuery3 do
begin
Close;
SQL.Clear;
SQL.Add('select * from fydlfybm');
Open;
end;
OraQuery3.First; //移动指针在第一条
while not OraQuery3.eof do
begin
if (cxGrid1DBTableView1.DataController.Values[i,0]=OraQuery3.Fields[0].DisplayText) then
begin
cxGrid1DBTableView1.DataController.Values[i,0]:=OraQuery3.Fields[1].DisplayText;
break;
end;
OraQuery3.Next;
end;
LeaveCriticalSection(CS); //退出临界区
end;initialization
InitializeCriticalSection(CS);finalization
DeleteCriticalSection(CS);
end.
主程线调用线程代码如下 cxGrid1dbtableview1.Columns[0].caption :='一级费用名称';
cxGrid1dbtableview1.Columns[1].caption :='二级费用名称';
cxGrid1dbtableview1.Columns[2].caption :='明细费用名称';
cxGrid1dbtableview1.Columns[3].caption :='年份';
cxGrid1dbtableview1.Columns[4].caption :='月份';
cxGrid1dbtableview1.Columns[5].caption :='日';
cxGrid1dbtableview1.Columns[6].caption :='录入人';
cxGrid1dbtableview1.Columns[7].caption :='运输终点或设备、材料名称';
cxGrid1dbtableview1.Columns[8].caption :='计量单位';
cxGrid1dbtableview1.Columns[9].caption :='单价';
cxGrid1dbtableview1.Columns[10].caption:='金额';
cxGrid1dbtableview1.Columns[11].caption:='数量'; //最可恨的是错误居然出现在这一行.可能是IDE有问题
cxGrid1dbtableview1.Columns[12].caption:='费用单位'; for i:= 0 downto 0 do
begin
Thread2[i]:=Tchange.Create(i,cxGrid1DBTableView1,OraQuery2);
Sleep(50);
end;
线程我定义的是一个数组
Thread2: array of Tchange;
现在的问题是.除了上面标注的错误外.程序只改变了一行ROW.就算我把for i:= 0 downto 0 do换成
for i:= 0 to cxGrid1DBTableView1.DataController.RowCount -1 do也是一样.提示的错误什么暴力访问某某地址之类的.如果解决?
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData,
cxDataStorage, cxEdit, DB, cxDBData, cxGridLevel, cxClasses, cxControls,
cxGridCustomView, cxGridCustomTableView, cxGridTableView,
cxGridDBTableView, cxGrid, ExtCtrls, ComCtrls, DBAccess, Ora, MemDS,
ToolWin, dxStatusBar,datatime,data,cxExportGrid4Link;
type
Tchange = class(TThread)
private
cxGrid1DBTableView1:TcxGridDBTableView;
OraQuery3:TOraQuery;
i:Integer;
protected
procedure Execute; override;
public
constructor Create(j:Integer;cxGrid1DBTableView:TcxGridDBTableView;OraQuery:TOraQuery);
end;
var
CS:TRTLCriticalSection;//临界区implementation{uses
fygl;}
constructor Tchange.Create(j:Integer;cxGrid1DBTableView:TcxGridDBTableView;OraQuery:TOraQuery);
begin
cxGrid1DBTableView1:=cxGrid1DBTableView;
OraQuery3:=OraQuery;
i:=j;
FreeOnTerminate := True; // 自动删除
inherited Create(False); // 直接运行
end;
{------------------------------------------------------------------------------}
procedure Tchange.Execute;
begin
inherited;
EnterCriticalSection(CS); //进入临界区
with OraQuery3 do
begin
Close;
SQL.Clear;
SQL.Add('select DLFYBM,ZLFYBM,MXFYBM,MXFYMC,ZDXMBM,ZDXMMC,FYDWMC from fymxb');
Open;
end; {费用单位}
OraQuery3.First; //移动指针在第一条
while not OraQuery3.eof do
begin
if (cxGrid1DBTableView1.DataController.Values[i,0]=OraQuery3.Fields[0].DisplayText) and (cxGrid1DBTableView1.DataController.Values[i,1]=OraQuery3.Fields[1].DisplayText) and (cxGrid1DBTableView1.DataController.Values[i,2]=OraQuery3.Fields[2].DisplayText) and (cxGrid1DBTableView1.DataController.Values[i,7]=OraQuery3.Fields[4].DisplayText) then
begin
cxGrid1DBTableView1.DataController.Values[i,12]:=OraQuery3.Fields[6].DisplayText;
end;
OraQuery3.Next;
end; {终点费用}
OraQuery3.First; //移动指针在第一条
while not OraQuery3.eof do
begin
if (cxGrid1DBTableView1.DataController.Values[i,0]=OraQuery3.Fields[0].DisplayText) and (cxGrid1DBTableView1.DataController.Values[i,1]=OraQuery3.Fields[1].DisplayText) and (cxGrid1DBTableView1.DataController.Values[i,2]=OraQuery3.Fields[2].DisplayText) and (cxGrid1DBTableView1.DataController.Values[i,7]=OraQuery3.Fields[4].DisplayText) then
begin
cxGrid1DBTableView1.DataController.Values[i,7]:=OraQuery3.Fields[5].DisplayText;
end;
OraQuery3.Next;
end; {明细费用}
OraQuery3.First; //移动指针在第一条
while not OraQuery3.eof do
begin
if (cxGrid1DBTableView1.DataController.Values[i,0]=OraQuery3.Fields[0].DisplayText) and (cxGrid1DBTableView1.DataController.Values[i,1]=OraQuery3.Fields[1].DisplayText) and (cxGrid1DBTableView1.DataController.Values[i,2]=OraQuery3.Fields[2].DisplayText) then
begin
cxGrid1DBTableView1.DataController.Values[i,2]:=OraQuery3.Fields[3].DisplayText;
end;
OraQuery3.Next;
end;
{二级费用}
with OraQuery3 do
begin
Close;
SQL.Clear;
SQL.Add('select * from fyzlfybm');
Open;
end;
OraQuery3.First; //移动指针在第一条
while not OraQuery3.eof do
begin
if (cxGrid1DBTableView1.DataController.Values[i,0]=OraQuery3.Fields[0].DisplayText) and (cxGrid1DBTableView1.DataController.Values[i,1]=OraQuery3.Fields[1].DisplayText) then
begin
cxGrid1DBTableView1.DataController.Values[i,1]:=OraQuery3.Fields[2].DisplayText;
break;
end;
OraQuery3.Next;
end; {一级费用}
with OraQuery3 do
begin
Close;
SQL.Clear;
SQL.Add('select * from fydlfybm');
Open;
end;
OraQuery3.First; //移动指针在第一条
while not OraQuery3.eof do
begin
if (cxGrid1DBTableView1.DataController.Values[i,0]=OraQuery3.Fields[0].DisplayText) then
begin
cxGrid1DBTableView1.DataController.Values[i,0]:=OraQuery3.Fields[1].DisplayText;
break;
end;
OraQuery3.Next;
end;
LeaveCriticalSection(CS); //退出临界区
end;initialization
InitializeCriticalSection(CS);finalization
DeleteCriticalSection(CS);
end.
主程线调用线程代码如下 cxGrid1dbtableview1.Columns[0].caption :='一级费用名称';
cxGrid1dbtableview1.Columns[1].caption :='二级费用名称';
cxGrid1dbtableview1.Columns[2].caption :='明细费用名称';
cxGrid1dbtableview1.Columns[3].caption :='年份';
cxGrid1dbtableview1.Columns[4].caption :='月份';
cxGrid1dbtableview1.Columns[5].caption :='日';
cxGrid1dbtableview1.Columns[6].caption :='录入人';
cxGrid1dbtableview1.Columns[7].caption :='运输终点或设备、材料名称';
cxGrid1dbtableview1.Columns[8].caption :='计量单位';
cxGrid1dbtableview1.Columns[9].caption :='单价';
cxGrid1dbtableview1.Columns[10].caption:='金额';
cxGrid1dbtableview1.Columns[11].caption:='数量'; //最可恨的是错误居然出现在这一行.可能是IDE有问题
cxGrid1dbtableview1.Columns[12].caption:='费用单位'; for i:= 0 downto 0 do
begin
Thread2[i]:=Tchange.Create(i,cxGrid1DBTableView1,OraQuery2);
Sleep(50);
end;
线程我定义的是一个数组
Thread2: array of Tchange;
现在的问题是.除了上面标注的错误外.程序只改变了一行ROW.就算我把for i:= 0 downto 0 do换成
for i:= 0 to cxGrid1DBTableView1.DataController.RowCount -1 do也是一样.提示的错误什么暴力访问某某地址之类的.如果解决?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货