如题目:  我现在 是做了一个循环
   for i :=0 to List.cout -1 do
       begin
         Stringlist .Cell[4,i] := ObjectList.Buybook[i-1].Money;
         Stringlist .Cell[5,i] := ObjectList.Buybook[i-1].bookNum;       end;这样的话,如果数量20万,需要很长时间才能 填充完毕,有没有更快的版本 填充?

解决方案 »

  1.   

    等高人,填充到stringgrid?我一般就是个循环
      

  2.   

    stringgrid.Cell[i,j]:=...
    好像只有循环导入,谁有更快的方法,我也很想知道
      

  3.   

    其实没必要填充到SringGrid上,做成Virtual方式,只需要在StringGrid的OnDrawCell中自绘一次就行了,这样就完全跳过填充的操作。var
      BmpGrid:TBitMap;//防止重绘时闪烁procedure TfrmFixIE.FormCreate(Sender: TObject);
    begin
      ...
      BmpGrid := TBitmap.Create;
      ...
    end;
    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    var
      ACanvas: TCanvas;
      ARect, R: TRect;
      Text: string;
    begin
      if (ACol = 4) or (ACol = 5) then
      try
        ARect := Rect;
        OffsetRect(ARect, -ARect.Left, -ARect.Top);
        BmpGrid.Width := ARect.Right;
        BmpGrid.Height := ARect.Bottom;
        ACanvas := BmpGrid.Canvas;
        ACanvas.Font := Font;
        ACanvas.Brush.Color := clWhite;
        ACanvas.Brush.Style := bsSolid;
        ACanvas.FillRect(ARect);
        if gdSelected in State then
        begin //选中时处理
          ACanvas.Brush.Color := clBlue; // $00F9F7F6;
          ACanvas.FillRect(ARect);
          ACanvas.Brush.Style := bsClear;
          ACanvas.Font.Color := clWhite;
        end
        else if ARow mod 2 = 0 then
        begin
          ACanvas.Font.Color := clBlack;
          ACanvas.Brush.Color := $00F0FFFF; // $00F9F7F6;
          ACanvas.FillRect(ARect);
        end
        else
        begin
          ACanvas.Font.Color := clBlack;
          ACanvas.Brush.Color := clWhite;
          ACanvas.FillRect(ARect);
        end;    case ACol of
          4: Text := ObjectList.Buybook[ACol-1].Money; ;
          5: Text := ObjectList.Buybook[ACol-1].bookNum;
        end;
        r:=ARect ;
        DrawText(
          ACanvas.Handle,
          PCHAR(Text),
          Length(Text),
          r,
          DT_SINGLELINE or DT_END_ELLIPSIS or DT_LEFT or DT_VCENTER);
      finally
        TStringGrid(Sender).Canvas.Draw(Rect.Left, Rect.Top, BmpGrid);
      end;
    end;以上代码你直接引用就可以用了
      

  4.   

    另外还需要设计StringGrid的RowCount
      

  5.   


    1、先设好StringGrid的RowCount
    2、循环前beginupdate或lock——不知道stringgrid有没有这样的函数,或者先隐藏看看是不是能快
      

  6.   

    不知道它支不支持Virtual Data的方式,如果可以的话就没问题了。(不支持的话看能不能设计一个子类,或者选择其他一个组件)e.g. TListView, TVirtualTreeView都支持virtual data (lazy-loading)的方式获取数据,别说是20万条,就是100万条也是瞬间的事情。
      

  7.   

    我测试了StringGrid ,这个控件有ondrawcell 这个事件;如果用  TopGrid 我看了,这个控件 好像没有ondrawcell 这个事件 很奇怪
      

  8.   

    to xzhifei  如果没有 Ondrawcell 事件,如何处理