Использование компонентов VCL для отображения очень больших наборов данных в сетке
Моё C++ CAD-приложение ведет журналы операций моделирования пользователя, чтобы их можно было не применять и не применять повторно. Любой конкретный проект может содержать всего несколько операций или может содержать сотни тысяч операций. У меня уже есть свои собственные структуры данных для управления этими данными способом, который эффективно использует память, и это работало хорошо. Но теперь я добавляю функцию, которая позволяет пользователю просматривать свои журналы операций в сетке. (Я использую Embarcadero RAD Studio 2010; все графические интерфейсы используют VCL.)
В настоящее время я использую компонент TDBGrid, чтобы показать пользователю данные операций в строках. Вот как у меня подключены мои компоненты:
TDBGrid.DataSource = TDataSource
TDataSource.DataSet = a TClientDataSet
TClientDataSet.ProviderName = TDataSetProvider
TDataSetProvider.DataSet = a ProjectDataSet
ProjectDataSet - это класс, производный от TDataSet.
Поскольку я извлекаю данные операций из своих собственных структур данных, а не из базы данных, я переопределил функции GetFieldData и GetRecord (и несколько других) в моем классе ProjectDataSet, чтобы он возвращал данные непосредственно из моих собственных структур данных (без выполнения любые запросы к базе данных). Это работает.
Чтобы минимизировать использование памяти при отображении большого количества операций, я установил свойство "FetchOnDemand" в своем TClientDataSet и установил "PacketRecords" равным 100. Таким образом, первоначально в сетке появляются только первые 100 операций. Как только пользователь прокручивает до конца сетки, следующие 100 операций автоматически выбираются TClientDataSet и отображаются в сетке.
Все это работает очень хорошо. Моя проблема в том, что когда пользователь прокручивает сетку, TClientDataSet продолжает получать все больше и больше записей, даже не выпуская их. Таким образом, если пользователь прокручивает страницу достаточно далеко в очень большом проекте, у меня заканчивается память.
Итак, мой вопрос: каков наилучший способ заставить этот графический интерфейс работать? По сути, я хочу, чтобы сетка вела себя как электронная таблица. Я хочу, чтобы пользователь мог прокручивать список операций вверх и вниз (или переходить к определенной строке), независимо от количества операций, и я не хочу, чтобы компоненты графического интерфейса сохраняли много памяти, пользователь не нуждается в неминуемой необходимости.
Я предполагаю, что TDBGrid (или некоторый другой компонент VCL) спроектирован так, чтобы он мог отображать произвольно большие наборы данных, выбирая только несколько записей за раз, так как это должно быть сделано?
Если мне нужно переосмыслить GUI, это нормально. Но было бы очень хорошо, если бы я мог использовать тот же графический интерфейс для отображения проектов с 10 операциями или проектов с 100000 операциями.
Благодарю.
1 ответ
Попробуйте VirtualTreeView его компонент Delphi, но он работает в C++ Builder. Вам придется перенести функцию заполнения данных в новую сетку.
VT очень быстр и очень прост в использовании.