2011-11-11 4 views
3

Delphi에서 메모리를 확보 할 수있는 TStringgrid (5000 개 이상의 행 포함)를 비우는 빠른 방법이 있습니까?Delphi에서 문자열 격자 비우기

행 개수를 1로 설정하면 표가 비워 지지만 메모리가 비어 있지 않습니다. 사전에

감사합니다,

+0

메모리에 어떤 문제가 있습니까? 행 수를 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`를 설정하는 것이 의미합니까?

그렇다면이 문제는 오래된 문제이며 해제되지 않은 메모리와는 아무런 관련이 없습니다. 메모리가 0이 아니기 때문에 다시 할당 될 때 메모리의 이전 내용을 보았 기 때문에 간단합니다.

그리드가 거대한이면 충분히 빠르지 만 나는이 시각적 인 결함을 다루는 유틸리티 유닛에서 꽤 표준적인 루틴을가집니다. TStringGrid 전에 전달하면 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'를 먼저 설정하면 행을 한 번만 반복합니다. – TLama

2

가장 빠른 방법을 TStringGrid가 OnGetValue/OnSetValue을 사용하고 사용 할 수 있습니다. 이 방법은 보이는 셀의 텍스트 만 동적으로 요청합니다. 행 추가 및 제거가 빠르게 켜집니다. 그렇지 않으면 5000 개 이상의 레코드가있을 때 TStringgrid는 입니다. 이렇게하면 초 내에 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.

관련 문제