插入大型TStringGrid的顶行

时间:2011-01-04 07:33:41

标签: delphi

我担心这可能是“一段字符串有多长”的问题,但是想知道是否有人有一些难以理解的数字或建议。

我有一个TStringGrid可能有3,600行,可能更多,我们还不确定。由于显示器显然没有空间,屏幕上只显示20或30行。不幸的是,这些是第一个写的,用户必须向下滚动才能看到添加的行。

反转行的顺序可能更加用户友好,m表示最新的最后一行。要做到这一点,我需要做这样的事情(代码可能不准确)

  // slightly quicker if there are many rows & no flicker
  myStringGrid.Visible := False;      
  rowCount := myStringGrid.RowCount;
  for row := 1 to Pred(rowCount) do
      myStringGrid.Rows[row + 1] := myStringGrid.Rows[row];
  myStringGrid.RowCount := myStringGrid.RowCount + 1;
  // now add new row...
  myStringGrid.Cells[1, 0] := <somthing>;
  myStringGrid.Cells[1, 1] := <somthing else>;
  myStringGrid.Cells[1, 2] := <etc>;
  TestRunDataStringGrid.Visible := True;

我关注表现。如果没有人有任何经验,我会编写测试代码。报告回来。

只是想知道是否有人有这方面的经验或意见......

2 个答案:

答案 0 :(得分:3)

试试这个

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    ---
    ---
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  type
  TStringGridHack = class(TStringGrid)
  protected
    procedure InsertRow(ARow: Longint);
  end;

implementation

{$R *.dfm}


procedure TStringGridHack.InsertRow(ARow: Longint);
var
  iRow: Integer;
begin
  iRow := Row;
  while ARow < FixedRows do Inc(ARow);
  RowCount := RowCount + 1;
  MoveRow(RowCount - 1, ARow);
  Row := iRow;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TStringGridHack(StringGrid1).InsertRow(1);
end;

答案 1 :(得分:1)

我建议使用虚拟网格控件而不是VirtualTreeView。我有一个,由Roman Mochalov(РоманМочалов)编写,我认为它是100%开源的,但在网上没有多少。我在这里[{3}} [在skydrive上]: