行号大于1048560的行都显示为空白,为什么?
 

解决方案 »

  1.   

    既然不能显示,为何又允许将RowCount设为更大的值呢?
      

  2.   

    允许将RowCount进行设置
    只是根据情况显示所需要的行吧!
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      i:integer;
    begin
      StringGrid1.ColCount:=1;
      StringGrid1.FixedCols:=0;
      StringGrid1.FixedRows:=0;
      StringGrid1.RowCount:=1048600;
      for i:=1035000 to 1048559 do  //大于1048559就出错,为什么?
      begin
        StringGrid1.Cells[0,i]:=inttostr(i);
      end;
    end;
      

  4.   

    既然用StringGrid不行,那么用什么控件才可以?怎样用DBGrid来显示超大的StringList呢?
      

  5.   

    我并不是想把那么多数据一次性全显示出来呀。所有的数据已经在TStringList中了,我需要的只不过是找一个合适的控件,在我把滚动条拖至任何位置时,能够方便的确定当前需要显示的是对应TStringList中的哪一小段,只显示区区十几行而已。退一步说,记录条数达到几百万条的数据库也有需要显示的时候啊。我见过许多彩票软件可以显示几百万条的全部组合,用的好像是DBGrid类的控件。用户有时后需要通过拖动滚动条大概浏览一下记录,总不能说记录太多,不给他看吧。
      

  6.   

    不是说不给用户看,只是说你不要一次性的把所有记录都取回来放到stringgrid中,你可以分页取么,每次取回几十条,给用户一个翻页的导航条,点下一页时再去取下一页的几十条.
      

  7.   

    似乎是StringGrid本身的局限导致的。。StringGrid内部存储数据时在SPASmall模式下把16行作为一个Section,每个Section都有一个SectionIndex(secIndex),这个secIndex的类型是word(0..65535)。所以当行数大于1048560时,由于secIndex := Index shr secShift;其中index=1048560,secShift=16,所以secIndex=65535。在给数据存储区域重新进行内存分配ReallocMem(Result, newSlots * SizeOf(Pointer))时,此处的newSlots=secIndex + 1=65535+1=0,所以delphi回收了分配的内存并且将指向数据内存的指针置为nil。(这里分配的空间是用于存放段目录指针数组secDir的)因此在行数大于1048599的行进行赋值时,会将grid数据清空。还有好多地方看不懂,但差不多就是这个意思了。。
      

  8.   

    谢谢 ph1() 的回答,看了你的分析,觉得分析的挺有道理。谢谢。既然用StringGrid不行,那么用什么控件才可以?怎样用DBGrid来显示超大的StringList呢?
    我试过用RichEdit+ScrollBar,通过滚动条的位置计算需要显示的部分载入显示,能够做到任意滚动都可以迅速平滑显示,但是把光标定位在richedit中通过光标上下移动,拖动选择,翻页,还有Ctrl+End等键盘操作时一些问题老是解决不好。
      

  9.   

    如果用DbGrid有一个解决方法:用RX组件包里的RxMemoryData组件这个东西是在内存中的数据集,可以自己往里面写数据,DataSource可以和它连接然后通过DBGrid显示出来。。但是我不知道它能不能支持1048559行以上的数据,你可以自己试一下
      

  10.   

    我的机子Rxlib for D7装完后D7启动出错。大富翁论坛有网友提出建议如下:
    將dbgrid与TClientDataSet连接, 然后将tstringlist中的数据注入TClientDataSet即可。TClientDataSet我不知道怎样用,请各位讲讲如何將tstringlist中的数据注入TClientDataSet