Очистка сетки строк в Delphi - PullRequest
3 голосов
/ 11 ноября 2011

Есть ли в Delphi быстрый способ очистки TStringgrid (содержащий более 5000 строк), который также освобождает память?

Если для параметра rowcount задано значение 1, сетка очищается, но не освобождаетсяпамять.

Заранее спасибо,

Пол

Ответы [ 5 ]

10 голосов
/ 11 ноября 2011

Это должно неинициализировать выделенные строки (из списка строк, где хранятся тексты строк). Очистка выполняется по столбцам, так как у вас много строк.

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;
4 голосов
/ 11 ноября 2011

Я бы предложил сохранить ваши строковые значения в вашей собственной памяти, над которыми вы имеете полный контроль, а затем использовать TDrawGrid, или, лучше, виртуальный TListView, для отображения содержимого этой памяти по мере необходимости.

4 голосов
/ 11 ноября 2011

Под «не освобождает память», вы имеете в виду, что если вы установите RowCount := 1, а затем установите RowCount := 10' you can still see the old content of the Cells`?

Если это так, это старая проблема и не имеет ничего общего с не освобождаемой памятью;это просто потому, что вы просто видите предыдущее содержимое памяти, когда она снова выделяется, потому что память не обнуляется.

У меня есть довольно стандартная подпрограмма в служебной единице, которая имеет дело с этим визуаломсбой, и если сетка огромная работает достаточно быстро.Просто передайте 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;
2 голосов
/ 11 ноября 2011

Самый быстрый способ использовать TStringGrid - это использование OnGetValue / OnSetValue.Таким образом, только текст видимых ячеек запрашивается динамически.Добавление и удаление строк затем быстро подсвечивается, иначе TStringgrid будет очень медленным, когда у вас более 5000 записей.Таким образом, я могу заполнить и очистить сетку с 700 000 записей в секунду!

1 голос
/ 12 ноября 2011

Когда использование памяти является критическим аргументом, рассмотрите возможность использования другой сетки. Например, NLDStringGrid , который (пере) написан мной, и который имеет дополнительное свойство под названием MemoryOptions. Он контролирует, могут ли данные храниться за пределами ColCount * RowCount, является ли хранилище пропорциональным (меньшее использование памяти для частично заполненных строк и столбцов), сохранять ли результаты свойств Cols и Rows и хранятся ли данные в разреженном виде образом.

Чтобы очистить сетку, в которой moBeyondGrid исключен из параметров памяти, достаточно установить RowCount в FixedRows.

Он с открытым исходным кодом и доступен для скачивания отсюда .

...