Question

Mon application C ++ CAD conserve les journaux des opérations de modélisation de l'utilisateur afin qu'ils puissent être non appliqués et réappliqués. Tout projet particulier peut ne contenir que quelques opérations ou il peut contenir des centaines de milliers d'opérations. J'ai déjà mes propres structures de données en place pour gérer ces données d'une manière qui est économe en mémoire, ce qui a bien fonctionné. Mais maintenant, j'ajoute une fonctionnalité qui permet à l'utilisateur d'inspecter ses journaux de fonctionnement dans une grille. (J'utilise Embarcadero Rad Studio 2010; toutes les GUIS utilisent VCL.)

Actuellement, j'utilise un composant TDBGrid pour afficher à l'utilisateur les données de fonctionnement en lignes. Voici comment j'ai connecté mes composants:

Tdbgrid.datasource = un tdatasource

Tdatasource.dataset = a tclientdataset

TclientDataset.providername = a tdatasetprovider

Tdatasetprovider.dataset = a projectDataset

Un projectDataset est une classe I dérivée de TDATASET.

Parce que je tire les données d'opération de mes propres structures de données et non d'une base de données, j'ai remplacé les fonctions getFieldData et GetRecord (et plusieurs autres) dans ma classe ProjectDataset afin qu'il renvoie les données directement à partir de mes propres structures de données (sans faire Toutes les requêtes de base de données). Cela marche.

Afin de minimiser l'utilisation de la mémoire lors de l'affichage de nombreuses opérations, j'ai défini la propriété `` fetchondemand '' dans mon TClientDataset et j'ai défini les `` packetrecords '' à 100. Donc, initialement, seules les 100 premières opérations apparaissent dans la grille. Une fois que l'utilisateur fait défiler vers le bas de la grille, les 100 opérations suivantes sont automatiquement récupérées par le TClientDataset et affichées dans la grille.

Tout cela fonctionne très bien. Mon problème est que lorsque l'utilisateur défile dans la grille, le TClientDataset continue de récupérer de plus en plus d'enregistrements sans jamais en libérer. Donc, si l'utilisateur défile suffisamment loin dans un très grand projet, je finis par manquer de mémoire.

Donc, ma question est: quelle est la meilleure façon de faire fonctionner cette interface graphique? Essentiellement, je veux que la grille se comporte comme une feuille de calcul. Je veux que l'utilisateur puisse faire défiler de haut en bas à travers la liste des opérations (ou sauter vers une ligne spécifique), quel que soit le nombre d'opérations, et je ne veux pas que les composants GUI gardent beaucoup de choses en mémoire qui L'utilisateur n'a pas besoin imminemment.

Je suppose que le TDBGRID (ou un autre composant VCL) est conçu pour être capable d'afficher des ensembles de données arbitrairement grands en récupérant seulement quelques enregistrements à la fois, alors comment est-ce que cela signifie?

Si j'ai besoin de repenser l'interface graphique, c'est bien. Mais ce serait vraiment bien si je pouvais utiliser la même interface graphique pour afficher des projets à 10 opérations ou 100 000 projets d'opération.

Merci.

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top