线程代码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也是一样.提示的错误什么暴力访问某某地址之类的.如果解决?