2011-11-11 5 views
3

Delphiでは、メモリを解放するTStringgrid(5000行以上含む)を空にする方法がありますか?Delphiの文字列グリッドを空にする

rowcountを1に設定すると、グリッドは空になりますが、メモリは解放されません。予め

おかげで、

ポール

+0

メモリにはどのような問題がありますか? rowcountを1に設定してもメモリは解放されませんが、私によれば、このメモリは行を補充するときに再び使用されます。メモリを解放したい場合は、TStringGridを解放して再作成してください。 – philnext

答えて

10

これは(行のテキストが格納されている文字列リストから)に割り当てられた文字列を非初期化すべきです。あなたはたくさんの行があるので、クリーニングは列で行われます。 「メモリを解放しません」と

procedure TForm1.Button1Click(Sender: TObject); 
var 
    I: Integer; 
begin 
    for I := 0 to StringGrid1.ColCount - 1 do 
    StringGrid1.Cols[I].Clear; 
    StringGrid1.RowCount := 1; 
end; 
+1

それはトリックでした - ありがとうたくさん –

4

、あなたがRowCount := 1を設定し、RowCount := 10' you can still see the old content of the Cells`を設定している場合ことを意味していますか?

これは古い問題で、解放されていないメモリとは関係ありません。メモリがゼロになっていないため、メモリの以前の内容が再び割り当てられたときにそれを見ているだけだからです。

グリッドがの巨大なが十分に速くない限り、私はこの視覚的グリッチを扱うユーティリティユニットでかなり標準的なルーチンを持っています。 RowCountまたはColCountの前に、の前に変更すると、低い値に変更されます。

procedure ClearStringGrid(const Grid: TStringGrid); 
var 
    c, r: Integer; 
begin 
    for c := 0 to Pred(Grid.ColCount) do 
    for r := 0 to Pred(Grid.RowCount) do 
     Grid.Cells[c, r] := ''; 
end; 

このようにそれを使用します。

ClearStringGrid(StringGrid1); 
StringGrid1.RowCount := 1; 
+0

それを逆にする方が良いとは思いませんか?最初に 'RowCount'を設定してから' ClearStringGrid'を設定しますか?あなたは 'BeginUpdate' /' EndUpdate'によって更新をロックしておらず、ちらつくかもしれません。 – TLama

+1

実際、いいえ。 :)最初に 'RowCount'を変更すると、古い行をクリアするために古い行にアクセスすることはできません。あなたは 'Begin/EndUpdate'を忘れることについては正しいです。私の実際のコードは別のマシンにあり、私はそれらを忘れてしまった。一定。 :) –

+0

'TStringGrid.BeginUpdate'や' TStringGrid.EndUpdate';)はありませんが、 'Rows'や' Cols'にアクセスすることができ、OPには多くの行があるので、 'Cols'をクリアすることにしました。もちろん、あなたが正しいのですが、最初に 'RowCount'を設定すると、行を1回しか反復しません。 – TLama

2

TStringGridを使用するための最速の方法をOnGetValue/OnSetValueを使用しています。 この方法では、可視セルのテキストのみが動的に要求されます。 行を追加したり削除したりするのが早く点灯します。それ以外の場合は、5000個を超えるレコードがある場合、TStringgridは と非常にスローです。 この方法で、1秒以内に700.000レコードのグリッドを埋めることができます。

4

私はあなたが完全にコントロールしている自分のメモリにあなたの文字列の値を格納し、TDrawGrid、またはより良い仮想TListViewを使用して、そのメモリの内容を必要に応じて表示することをお勧めします。

+0

+1、またはお気に入り[VirtualTreeView](http://code.google.com/p/virtual-treeview/source/browse/#svn%2Ftrunk):) – TLama

1

メモリ使用量が重要な引数である場合は、別のグリッドの使用を検討してください。たとえば、自分で書いた(再)NLDStringGridで、MemoryOptionsという追加のプロパティがあります。 ColsRowsのプロパティ結果を格納するかどうか、およびデータが疎な方法で格納されているかどうかにかかわらず、データがColCount * RowCountを超えて格納できるかどうかを制御します。

moBeyondGridがメモリオプションから除外されているグリッドを消去するには、RowCountFixedRowsに設定するだけで十分です。

オープンソースでダウンロード可能from hereです。

関連する問題