Delphi에서 메모리를 확보 할 수있는 TStringgrid (5000 개 이상의 행 포함)를 비우는 빠른 방법이 있습니까?Delphi에서 문자열 격자 비우기
행 개수를 1로 설정하면 표가 비워 지지만 메모리가 비어 있지 않습니다. 사전에
감사합니다,
폴
Delphi에서 메모리를 확보 할 수있는 TStringgrid (5000 개 이상의 행 포함)를 비우는 빠른 방법이 있습니까?Delphi에서 문자열 격자 비우기
행 개수를 1로 설정하면 표가 비워 지지만 메모리가 비어 있지 않습니다. 사전에
감사합니다,
폴
이 (행 텍스트가 저장되는 문자열 목록에서) 할당 된 문자열을 초기화 해제해야합니다. 행이 많으므로 열을 기준으로 정리가 수행됩니다. "메모리를 해제하지 않습니다"으로
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;
그 트릭을 했어 - 고마워요 –
, 당신은 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;
그 반대라고 부르는 것이 낫지 않습니까? 먼저'RowCount'와'ClearStringGrid'를 설정하십시오. 'BeginUpdate' /'EndUpdate'로 업데이트를 잠그지 않고 깜박일 수 있습니다. – TLama
사실, 아니요. :)'RowCount'를 먼저 변경하면, 그것들을 삭제하기 위해 이전 행에 대한 액세스 권한이 없습니다. 'Begin/EndUpdate'를 잊어 버리는 것이 맞습니다. 내 실제 코드는 다른 컴퓨터에 있으며, 나는 그들을 잊어 버렸다. 결정된. :) –
'TStringGrid.BeginUpdate' 또는'TStringGrid.EndUpdate';)하지만'Rows' 나'Cols'에 접근 할 수 있습니다. 그리고 OP는 그가'Cols'를 지우기로 결정한 많은 행을 가지고 있기 때문에 접근 할 수 있습니다. 물론 'RowCount'를 먼저 설정하면 행을 한 번만 반복합니다. – TLama
가장 빠른 방법을 TStringGrid가 OnGetValue/OnSetValue을 사용하고 사용 할 수 있습니다. 이 방법은 보이는 셀의 텍스트 만 동적으로 요청합니다. 행 추가 및 제거가 빠르게 켜집니다. 그렇지 않으면 5000 개 이상의 레코드가있을 때 TStringgrid는 입니다. 이렇게하면 초 내에 700.000 개의 레코드를 채우고 지울 수 있습니다!
문자열 값을 완전히 제어 할 수있는 자신의 메모리에 저장 한 다음 TDrawGrid 또는 더 나은 가상 TListView를 사용하여 필요에 따라 해당 메모리의 내용을 표시 할 것을 제안합니다.
+1 또는 내가 좋아하는 [VirtualTreeView] (http://code.google.com/p/virtual-treeview/source/browse/#svn%2Ftrunk) :) – TLama
메모리 사용이 중요한 인수 일 때 다른 격자 사용을 고려하십시오. 예를 들어, 직접 작성한 NLDStringGrid이며 MemoryOptions
이라는 추가 속성이 있습니다. Cols
및 Rows
속성 결과를 저장할지 여부와 데이터가 스파 스 방식으로 저장되는지 여부와 관계없이 저장소가 비례 (부분적으로 채워진 행과 열에 대한 메모리 사용량 감소) 여부에 관계없이 ColCount * RowCount
이상의 데이터를 저장할 수 있는지 여부를 제어합니다.
moBeyondGrid
이 메모리 옵션에서 제외 된 격자를 지우려면 RowCount
을 FixedRows
으로 설정하면 충분합니다.
오픈 소스이며 다운로드 할 수 있습니다. from here.
메모리에 어떤 문제가 있습니까? 행 수를 1로 설정하면 메모리를 확보 할 수 없지만 나에게 따르면 행을 다시 채울 때이 메모리가 다시 사용됩니다. 메모리를 해제하려면 TStringGrid를 다시 만들어서 다시 만듭니다. – philnext