Delphi, какой самый быстрый метод доступа к записи в TcxGrid или TDataSet - PullRequest
3 голосов
/ 02 ноября 2010

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

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

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

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

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

  2. Grid.DataController.DataSet.FindFirst Grid.DataController.DataSet.FindNext Grid.DataController.DataSet.Fields [FieldIndex] Но использование этого метода поиска происходит так же медленно, как и первый, который я пробовал. Локация и перемещение также медленные.

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

Ответы [ 4 ]

2 голосов
/ 03 ноября 2010

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

Я думаю, что я использую TcxGridTableView без поддержки db или TcxBandedGridTableView с

View.DataController.Values ​​[Поле RecordIndex], поле [RecordIndex], полеfasttest.

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

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

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
1 голос
/ 26 января 2011

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

1 голос
/ 03 ноября 2010

Обновление кода должно быть в начале / конце обновления было моей большой проблемой.

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

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

1 голос
/ 03 ноября 2010

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

...