Delphi, какой метод доступа к записи в TcxGrid или TDataSet самый быстрый?
Вопрос
Я использую Delphi 2007 и TcxGrid, чтобы показать содержимое библиотеки файлов.В базе данных хранится информация о типе файла, имени, пути и расширении.
При тестировании я загружаю в сетку 1700 записей через TDataSet.Я также освобождаю место в сетке для еще трех полей, которые еще предстоит рассчитать.Это наличие файлов, размер файла и дата изменения.
Моя цель — показать пользователю всю сохраненную информацию (которая работает отлично и быстро), затем в фоновом потоке найти информацию для трех других полей данных и затем вставить их в TcxGrid.Этот вопрос не имеет ничего общего с тем, что я делаю.Он работает нормально.
Моя проблема в том, что доступ к полям в уже построенной сетке сильно замедляется, когда я обращаюсь к ней.Я пробовал два разных способа...
Grid.DataController.Values[RecordIndex,FieldIndex] — но это вариант и я подозреваю, что именно поэтому он такой медленный
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 кэширует их, поэтому после загрузки доступ происходит очень быстро.