2012-02-23 6 views
0

My C++ CAD 응용 프로그램은 적용되지 않고 다시 적용될 수 있도록 사용자의 모델링 작업에 대한 로그를 유지 관리합니다. 특정 프로젝트에는 몇 가지 작업 만 포함될 수도 있고 수십만 개의 작업이 포함될 수도 있습니다. 이미 메모리 효율적인 방식으로이 데이터를 관리 할 수있는 자체 데이터 구조를 갖추고 있습니다. 하지만 이제는 사용자가 작업 로그를 눈금으로 검사 할 수있는 기능을 추가하고 있습니다. (저는 Embarcadero RAD Studio 2010을 사용하고 있으며, 모든 GUI는 VCL을 사용합니다.)VCL 구성 요소를 사용하여 그리드에 매우 큰 데이터 세트 표시

현재 TDBGrid 구성 요소를 사용하여 작업 데이터를 행으로 표시하고 있습니다.

TDBGrid.DataSource는 TDataSource를 =

TClientDataSet의

TClientDataSet.ProviderName은으로 TDataSetProvider를 = TDataSource.DataSet =

TDataSetProvider.DataSet = 여기에 내 구성 요소가 연결 한 방법이다 a ProjectDataSet

ProjectDataSet은 TDataSet에서 파생 된 클래스입니다. 난 내 자신의 데이터 구조에서가 아닌 데이터베이스에서 운전 데이터를 당겨하고 있기 때문에 직접 데이터를 반환하도록

, 내 ProjectDataSet 클래스의 GetFieldData 및 GetRecord 기능 (그리고 몇 가지 다른 사람을) 재정의 내 자신의 데이터 구조 (데이터베이스 쿼리를 수행하지 않고). 이 작동합니다.

많은 작업을 표시 할 때 메모리 사용을 최소화하기 위해 TClientDataSet에 'FetchOnDemand'속성을 설정하고 'PacketRecords'를 100으로 설정했습니다. 따라서 처음에는 처음 100 개의 작업 만 눈금에 나타납니다. 사용자가 그리드의 맨 아래로 스크롤하면 다음 100 개의 작업이 TClientDataSet에 의해 자동으로 페치되고 그리드에 표시됩니다.

이 모든 것이 매우 잘 작동합니다. 내 문제는 사용자가 그리드를 스크롤 할 때 TClientDataSet이 아무런 데이터도 공개하지 않고 점점 더 많은 레코드를 가져 오는 것입니다. 따라서 사용자가 매우 큰 프로젝트에서 충분히 멀리 아래로 스크롤하면 결국에는 메모리가 부족합니다.

내 질문은 :이 GUI를 작동시키는 가장 좋은 방법은 무엇입니까? 본질적으로 그리드를 스프레드 시트처럼 작동시키고 싶습니다. 얼마나 많은 작업이 있건 상관없이 사용자가 작업 목록 (또는 특정 행으로 이동)을 위아래로 스크롤 할 수있게하고 GUI 구성 요소가 메모리에 많은 양을 저장하지 않도록하고 싶습니다. 사용자는 절실히 필요하지 않습니다.

TDBGrid (또는 다른 VCL 구성 요소)는 한 번에 몇 개의 레코드 만 가져 와서 임의로 큰 데이터 세트를 표시 할 수 있도록 설계되었으므로 어떻게해야합니까?

GUI를 재고해야한다면 괜찮습니다. 그러나 동일한 GUI를 사용하여 10 개의 운영 프로젝트 또는 10 만 개의 운영 프로젝트를 표시 할 수 있다면 정말 좋을 것입니다.

감사합니다.

+1

다음 데이터 패킷을 추가하기 전에 수동으로 CD를 지우면 어떻게됩니까? – vavan

+0

예, 작동 할 수도 있습니다. 나는 그것을 줄 것이다. 그래도 해킹 된 것 같아. 내가 정말로 찾고있는 것은 그것을 할 수있는 * 올바른 방법입니다. VCL은 그리드에서 임의로 큰 데이터 세트를 보여줄 수 있도록 설계되었으며, 이것이 작동하는 방식을 알고 싶습니다. 당신의 도움을 주셔서 감사합니다. –

+0

결과를 다시보고하십시오. 실제로 나는 그것을 할 "올바른"방법이없고 CDS와 TDataSet 전체가 꽤 밑줄이다는 것을 두려워합니다. – vavan

답변

1

VirtualTreeView는 Delphi 구성 요소를 사용하지만 C++ Builder에서 작동합니다. 새로운 그리드에 데이터 채우기 기능을 포팅해야합니다.

VT는 매우 빠르고 사용하기가 쉽습니다.

+0

이것은 매우 유망 해 보입니다. 추천 해 주셔서 감사합니다. 나는 이제 막 두 달 동안 나라를 떠나려고하고있어 잠시 동안이 문제를 해결할 수는 없지만 기회를 얻 자마자 어떻게되는지 알려 드리겠습니다. –