Я гуглил и нашел много советов, но все это казалось несколько лет назад, и ничего из этого не помогло.
У меня есть строковая сетка с 8 столбцами, и как только я получаю более нескольких сотен строк, для заполнения требуется более 2 секунд (я сравнивал с помощью GetTickCount).
Я попробовал StringGrid.Perform(WM_SETREDRAW, 0, 0)
(и 0, 1
в конце). Я попытался установить
Visible := False
во время обновления. Оба бесполезны.
BeginUpdate()
метода нет.
Любой совет? Стартер Delphi XE2. Я был бы готов использовать сетку строк VCL сторонних производителей FOSS, если она будет опробована и протестирована.
[Обновление] с использованием TDrawGrid ... «TDrawGrid не имеет свойства «Ячейки», как его брат TStringGrid. Ваш код должен вычислить, где отображать данные, а затем он должен нарисовать представление данных на «холсте». «из сетки».
Это звучит как много работы для меня :-(
Использование VirtualTreeView - звучит нормально, если оно достаточно быстрое. У меня просто не будет дочерних узлов. (update++ Я только что прочитал это на домашней странице "Virtual Treeview is чрезвычайно быстро. Добавление одного миллиона узлов занимает всего 700 миллисекунд"). Тогда проблем со скоростью не будет. Но было бы неплохо просто использовать сетку строк. Особенно тот, где пользователь может щелкнуть и отсортировать.
В качестве альтернативы, stringgrid имеет высоту всего 20 строк. Может быть, я мог бы просто обрабатывать щелчки полосы прокрутки и очищать и повторно заполнять эти 20 строк, когда пользователь прокручивает?
[Дальнейшее обновление] Я перешел с TStringGrid на TListView, в коде которого есть Beginupdate())
, но это имело незначительное значение. Опс, забыл "виртуальный режим" - брб.
Кстати, данные доступны только для чтения, только для отображения.
Наверняка это очень распространенная проблема?
TStringGrid
на виртуальную сетку, например.TDrawGrid
в виртуальном режиме, который будет извлекать содержимое ячеек через событие из отдельного списка данных. Это будет намного быстрее, чем это ИМХО. Я используюTDrawGrid
с тысячами строк с мгновенным доступом, например. для нашего средства просмотра журналов — например, 280 Файл журнала МБ открывается менее чем за одну секунду на моем ноутбуке. В Seven для отображения диалогового окна «Открыть файл» требуется больше времени, чем для чтения и индексации содержимого размером 280 МБ. - person Arnaud Bouchez   schedule 12.10.2012TDrawGrid
вы можете изучить VirtualTreeView. Это не просто древовидное представление, как может показаться ;-) - person TLama   schedule 12.10.2012TStringGrid
. Невозможно сравниватьTDrawGrid
сVirtualTreeView
только потому, что они выглядят по-разному, но оба будут более эффективными, чемTStringGrid
, это точно. Я предложил вамVirtualTreeView
исходя из своих личных предпочтений и потому, что вы можете делать гораздо больше вещей, чем сTDrawGrid
. Но если вам действительно нужна просто старая сетка с очень простой функциональностью,TDrawGrid
может быть для вас достаточно. - person TLama   schedule 12.10.2012VirtualTreeView x TDrawGrid
оценка1:0
. - person TLama   schedule 12.10.2012TStringGrid
в этом случае - для отображения или редактирования данных? Если вам нужно только отображать данные, то дажеTListView
должен дать вам более чем достаточный прирост производительности, а если вы будете использовать его в виртуальном режиме, то выиграете еще больше. Тем не менее, я должен согласиться с @TLama по поводуVirtualTreeView
- это просто лучший компонент. Я давно перестал использоватьTStringGrid
и никогда не оглядывался назад. - person LightBulb   schedule 12.10.2012DBGrid
, которое «загружает» только видимые строки, также может работать лучше. - person NGLN   schedule 12.10.2012TListView
(в обычном режиме) с тысячами строк и никогда не замечал проблем с производительностью. Вы должны проверить две вещи: во-первых, как вы получаете отображаемые данные, а во-вторых, как вы вставляете данные в файлTListView
. Оба они могут быть узким местом, поэтому я советую вам пересмотреть свой код. Если вы можете, обновите свой вопрос с помощью кода, который вы используете для вставки данных, чтобы мы могли оказать дополнительную помощь. - person LightBulb   schedule 12.10.2012TStringGrid
сильно изменился за последние несколько лет, за исключением стилей VCL. - person Jerry Dodge   schedule 12.10.2012OwnerData
значение True и используйте его событиеOnData
для предоставления значений TListView, когда он их запрашивает. Храните ваши данные в памяти где угодно и как угодно. Если вам нужно реализовать более продвинутое кэширование, чтобы у вас не было всех данных в памяти одновременно, используйте событиеOnDataHint
, чтобы помочь вам сохранить в памяти только те данные, которые действительно нужны TListView в любой момент, и отбросить память для данных, которые ему не нужны. Я использую этот подход для отображения миллионов записей, и он работает очень хорошо. - person Remy Lebeau   schedule 13.10.2012