type
  GETCNAME = class(TThread)
  private
  GRID:Tdbgrideh;
  ADOConn:TADOConnection;
  protected
   procedure  getCName();
    procedure Execute; override;
  public
   constructor create(AGrid: TDBGRidEh;AADOConn:TADOConnection);
  end;implementationuses main_unit;
 procedure GETCNAME.Execute;
   begin
     synchronize(getCName);
   end;constructor GETCNAME.create(AGrid: TDBGRidEh;AADOConn:TADOConnection);
   begin
   self.GRID:=AGrid;
   self.ADOConn:=main.ADOConn; //为什么在这句会出错
  end;
 procedure CreateTable(Fields:TFields;FieldCount:integer;TableName:String);
 var
   Table: TTinyTable;
   i:integer;
  begin
    Table:=TTinyTable.Create(nil);
    Table.DatabaseName:=ExtractFilePath(Application.ExeName)+'temp.tdb';
    Table.TableName:=TableName;
    for i:=0 to FieldCount-1 do
    begin
    if Fields.Fields[i].DataType=ftString then
    Table.FieldDefs.Add(Fields.Fields[i].FieldName,Fields.Fields[i].DataType,Fields.Fields[i].DataSize);
    if (Fields.Fields[i].DataType=ftInteger) or (Fields.Fields[i].DataType=ftFloat) or (Fields.Fields[i].DataType=ftDateTime) then
    Table.FieldDefs.Add(Fields.Fields[i].FieldName,Fields.Fields[i].DataType,0);
    end;
    table.CreateTable;
    Table.Close;
    Table.Free;
  end; procedure GETCNAME.getCName();
  var
    Query: TADOQuery;
    i: integer;
  begin
    Query := TADOQuery.Create(nil);
    Query.Close;
    Query.Connection := ADOConn;
    Query.SQL.Clear;
    Query.SQL.Add('select * from sys_fielddict where fieldname=:name');
    for i := 0 to Grid.Columns.Count - 1 do
    begin
        if  Grid.Columns.Items[i].Visible then
        begin
        Query.Parameters.ParamValues['name'] := Grid.Columns.Items[i].FieldName;
        Query.Open;
        if Query.RecordCount = 1 then
        begin
            Grid.Columns.Items[i].Title.Caption := Query.FieldByName('display').AsString;
            Grid.Columns.Items[i].Width := Query.FieldByName('display_width').AsInteger;
        end;
        Query.Close;
         Application.ProcessMessages;
        end;
    end;
    Query.Close;
    Query.Free;
   end;

解决方案 »

  1.   

    constructor GETCNAME.create(AGrid: TDBGRidEh;AADOConn:TADOConnection);
       begin
       self.GRID:=AGrid;
       self.ADOConn:=AADOConn;
    end;应该是没有错的,或者你可以在线程创建的时候把这个ADOCONNECTION传进来
      

  2.   

    谁说不会出错,你的线程内部的ADOConn没有创建就直接使用,不错才奇怪了。
    应该
    AdoConn := TADOConnection.Create(AADoConn);
    AdoConn :=AADoConn;
      

  3.   

    把上面两句代码放到你重载的Create里面
      

  4.   

    ADOConnection有线程同步的问题。
    在现程中不要涉及到对adoconnection的操作。
    把对adoconnection的操作放到Form中。
      

  5.   

    self.ADOConn:=AADOConn;
    现程中不要涉及到对adoconnection的操作,建议你操作qdoquery
      

  6.   

    我没有对ADOCONNECTION 进行操作现在问题是解决了,但是速度不是很让人满意,这是怎么回事呀
      

  7.   

    问题的解决方式是在  self.ADOConn:=main.ADOConn;  
    下面加上
       inherited Create(false);
    一句