Delphi, какой метод доступа к записи в TcxGrid или TDataSet самый быстрый?

StackOverflow https://stackoverflow.com/questions/4080196

  •  28-09-2019
  •  | 
  •  

Вопрос

Я использую Delphi 2007 и TcxGrid, чтобы показать содержимое библиотеки файлов.В базе данных хранится информация о типе файла, имени, пути и расширении.

При тестировании я загружаю в сетку 1700 записей через TDataSet.Я также освобождаю место в сетке для еще трех полей, которые еще предстоит рассчитать.Это наличие файлов, размер файла и дата изменения.

Моя цель — показать пользователю всю сохраненную информацию (которая работает отлично и быстро), затем в фоновом потоке найти информацию для трех других полей данных и затем вставить их в TcxGrid.Этот вопрос не имеет ничего общего с тем, что я делаю.Он работает нормально.

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

  1. Grid.DataController.Values[RecordIndex,FieldIndex] — но это вариант и я подозреваю, что именно поэтому он такой медленный

  2. Grid.datacontroller.dataset.findfirst grid.datacontroller.dataset.findnext grid.datacontroller.dataset.fields [FieldIndex], но использование этого метода «искать» так же медленно, как и первый метод.Поиск и перемещение также медленные.

Итак, короткий вопрос: каков самый быстрый способ получить доступ к записи?

Это было полезно?

Решение 3

Моей большой проблемой был код обновления, который должен был находиться в пределах начального/конечного обновления.

Спасибо, Ливен, за ваш комментарий, поскольку это решение моей проблемы.И спасибо Гаду и Дэниелу за ответы, из которых я извлек уроки.

Это было бы более очевидно для всех, если бы у меня вчера было больше времени, чтобы опубликовать код.

Другие советы

Также укажите, используете ли вы TcxGridDBTableView или TcxGridTableView?

Я думаю, используя TcxGridTableView или TcxBandedGridTableView, не поддерживающий базу данных, с

View.DataController.Values[RecordIndex, FieldIndex] — самый быстрый.

Даже если у вас есть приложение базы данных, вы можете загрузить версию представления, отличную от базы данных, при инициализации, а затем обрабатывать события DataController для обнаружения изменений данных и выдавать соответствующие команды SQL для обновления базы данных.

Вы можете заполнить представление следующим образом:

class procedure TForm1.FillView(const View: TcxGridBandedTableView; const Sql: string);
var
  Reader: TMyOrmDataReader;
  i: Integer;
begin
  Assert(Assigned(View), 'View is not assigned parameter.');
  with View.DataController do
  begin
    BeginFullUpdate;
    try
      Reader := TMyOrm.GetDataReader(SQL);
      try
        i := 0;
        RecordCount := 50 * 1000; // make it something big in order to avoid constant resizing by 1
        while Reader.Read do
        begin
          // Fill the view
         Values[i,  0] := Reader.GetInt32(0);
         Values[i,  1] := Reader.GetString(1);
         Inc(i);
        end;
        RecordCount := i - 1;
      finally
        Reader.Free;
      end;
    finally
      EndFullUpdate;
    end;
  end;
end;

А затем получите доступ к таким значениям, как:

View1.DataController.Values[View1.DataController.FocusedRecordIndex, View1Column1.Index].AsString

Вы можете работать с таблицей/набором данных, сначала добавляя недостающие данные, а затем отображать все поля как привязанные к данным.

Я знаю, что это старая тема, но отмечу, что переключение сетки в режим провайдера — это еще один способ улучшить скорость загрузки, поскольку по сути он превращает загрузку сетки в виртуальную операцию.(Записи не загружаются до тех пор, пока они не потребуются для отображения или другого доступа к данным.) После этого DataController кэширует их, поэтому после загрузки доступ происходит очень быстро.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top