Использование компонентов VCL для отображения очень больших наборов данных в сетке - PullRequest
0 голосов
/ 23 февраля 2012

My C ++ CAD-приложение ведет журналы операций моделирования пользователя, чтобы их можно было не применять и не применять повторно.Любой конкретный проект может содержать всего несколько операций или может содержать сотни тысяч операций.У меня уже есть свои собственные структуры данных для управления этими данными способом, который эффективно использует память, и это работало хорошо.Но теперь я добавляю функцию, которая позволяет пользователю просматривать свои журналы операций в сетке.(Я использую Embarcadero RAD Studio 2010; все графические интерфейсы используют VCL.)

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

TDBGrid.DataSource = TDataSource

TDataSource.DataSet = TClientDataSet

TClientDataSet.ProviderName = TDataSetProvider

TDataSetProvider.DataSet = a ProjectDataSet

ProjectDataSet - это класс, производный от TDataSet.

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

Чтобы минимизировать использование памяти при отображении большого количества операций, я установил свойство 'FetchOnDemand' в моем TClientDataSet, и я установил для 'PacketRecords' значение 100. Итак, изначально только первые 100 операцийпоявляются в сетке.Как только пользователь прокручивает до конца сетки, следующие 100 операций автоматически выбираются с помощью TClientDataSet и отображаются в сетке.

Все это работает очень хорошо.Моя проблема в том, что когда пользователь прокручивает сетку, TClientDataSet продолжает получать все больше и больше записей, даже не выпуская их.Итак, если пользователь прокручивает страницу достаточно далеко в очень большом проекте, мне в итоге не хватает памяти.

Итак, мой вопрос: каков наилучший способ заставить этот графический интерфейс работать?По сути, я хочу, чтобы сетка вела себя как электронная таблица.Я хочу, чтобы пользователь мог прокручивать список операций вверх и вниз (или переходить к определенной строке) независимо от количества операций, и я не хочу, чтобы компоненты графического интерфейса сохраняли много памяти,пользователь не нуждается в неминуемой необходимости.

Я предполагаю, что TDBGrid (или некоторый другой компонент VCL) спроектирован так, чтобы он мог отображать произвольно большие наборы данных, выбирая только несколько записей за раз, так как это должно быть сделано?

Если мне нужно переосмыслить графический интерфейс, это нормально.Но было бы очень хорошо, если бы я мог использовать один и тот же графический интерфейс для отображения проектов с 10 операциями или проектов с 100000 операциями.

Спасибо.

1 Ответ

1 голос
/ 12 мая 2012

Попробуйте VirtualTreeView как компонент Delphi, но он работает в C ++ Builder.Вам придется перенести функцию заполнения данными в новую сетку.

VT очень быстр и очень прост в использовании.

...