请问如何能快速的对StringGrid进行写入?我的记录大家有7K,大概需要时间有20秒以上,感觉等待的时间太长。
请大家指教下下。我的代码如下:
  if ADOF.RecordCount>0 then
  begin
    mGrid.ColCount:=ADOF.FieldCount;
    for i :=0  to ADOF.FieldCount-1 do
    begin
        mGrid.Cells[i+1,0]:=ADOF.Fields[i].FieldName;
    end;
  end;
  if not  ADOF.Active then ADOF.Active :=True;
  for i :=0  to ADOF.RecordCount -1 do
  begin
     for j := 0 to ADOF.FieldCount-1 do
     begin
       mGrid.Cells[j+1,i+1]:= ADOF.Fields[j].AsString ;
     end;
      if i>8 then 
         mGrid.RowCount:=mGrid.RowCount+1; 
      ADOF.Next;
  end;   

解决方案 »

  1.   

    可以在第一次遍历字段名称的是否把字段名称记录到一个stringlist中,并记住字段个数在第二次遍历时就不必用这个循环了,直接去用stringlist中的值就ok了
      

  2.   

    在第二次遍历时就不必用for j := 0 to ADOF.FieldCount-1 do 这个循环了,直接去用stringlist中的值就ok了试试能不能快点
      

  3.   

    有两个地方要注意
    1.第二次的代码
    for j := 0 to ADOF.FieldCount-1 do 
        begin 
          mGrid.Cells[j+1,i+1]:= ADOF.Fields[j].AsString ; 
        end; 
    没必要,可以遍历StringGrid的行2.mGrid.RowCount:=mGrid.RowCount+1; 这个不要这样一行行的加,在for循环外,一次性添加,比如mGrid.RowCount:= ADOF.RecordCount
      

  4.   

    把这部分
    for j := 0 to ADOF.FieldCount-1 do 
    改成:
    while not ADOF.EOF do
    begin
      ....
      Next;
    end;
      

  5.   

    支持三楼,
    mGrid.RowCount:= ADOF.RecordCount设定好StringGrid的行数
    遍历StringGrid的行,和表的字段对应上
      

  6.   

    楼主遍历字段的用意是要取字段名称,作为stirnggrid的表头吧。
      

  7.   

    是的,谢谢楼主正确理解。因为我想做一个通过的导出,我的MIS中有不同个表的导出,这样可以任意选择表了。
      

  8.   

    我试了一下,先进行mGrid.RowCount:= ADOF.RecordCount设定好StringGrid的行数 ,但速度还是不明显。
    还有没有更好的解决的办法。
      

  9.   

    if i>8 then 
            mGrid.RowCount:=mGrid.RowCount+1;
    这两行删了吗?按道理可以快不少。
    在循环前把ADOF.FieldCount-1赋给一个变量,使用那个变量循环。
      

  10.   

    兄弟,你有这么大的数据,为什么一定要导到StringGrid来,
    如果非要这样,同时为了提高速度,建议把数据导出到数组,然后写DrawCell过程,估计不太会有停顿的感觉了,或者索性用TDrawGrid
      

  11.   

    另一种改进方式,就是改变数据库引擎。不知道你采用的是什么后台数据库,那么前台的数据库引擎最好选择最合适的。比如连接Oracle,就不推荐用ADO,可以用DOA等
      

  12.   

    批量加
    SELF.StringGrid1.Cols[0].AddStrings(ADOF.Fields[j]);
    SELF.StringGrid1.ROWS[0].AddStrings(ADOF.Fields[j]);