Ensemble de données TDataSet et collection d'objets

Bertrand Goetzmann

Basé sur la classe TDataSet pour les composants ensemble de données, le composant TObjectDataSet, sert de conteneur d'objets en gérant des objets de même type au lieu d'enregistrements tout en offrant la persistance des objets dans un fichier.
L'intérêt d'un tel composant est de pouvoir utiliser normalement tous les contrôles orientés données de Delphi pour manipuler et modifier des objets au lieu d'enregistrements, tout comme on le ferait avec le composant TTable par exemple.

- Titre : Ensemble de données TDataSet et collection d'objets

- Auteur : Bertrand Goetzmann

- Parution : 2 mai 2005

- Mise à jour : 2 mai 2005

- Licence : Copyright ® 2005 Bertrand Goetzmann, ObjectEverywhere. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- 1. Ressources

- 2. Détails

1 - Ressources

Le fichier zip comporte le composant TObjectDataSet ainsi qu'un projet de démonstration pour Delphi 5.

L'article original

2 - Détails

Voici la marche à suivre pour utiliser le composant TObjectDataSet avec Delphi 5 :
1 - Installer la bibliothèque de paquet PObjectDataSet.bpl à partir de la page 'Paquets' de la boîte de dialogue 'Options de projet'; le composant TObjectDataSet est alors placé dans la page 'AccèsBD' de la palette d'outils de Delphi.

2 - Déposer le composant TObjectDataSet sur une nouvelle fiche et affecter un nom de classe dans la propriété ObjectClass du composant; à l'exécution le composant vérifiera qu'il existe bien une classe de ce nom recensée dans l'application par l'instruction RegisterClass ou RegisterClasses de l'unité Classes.
Cette classe doit obligatoirement être dérivée de la classe TPersistent ou de l'une de ses classes descendantes, et surcharger la méthode virtuelle Assign. L'implémentation de Assign doit définir comment assigner un objet du même type, en faisant intervenir en particulier les propriétés publiées qui sont utilisées avec les contrôles orientés données.

En effet, à l'exécution, le composant TObjectDataSet analyse la classe grâce à RTTI pour créer les champs correspondants aux propriétés publiées; TObjectDataSet reconnaît les propriétés de type String (le champ créé est de type TStringField avec une taille de 255 caractères), entier et flottant. De la sorte, les contrôles orientés données connectés à l'ensemble de données peuvent utiliser les noms des propriétés pour la propriété DataField.
D'autre part pour bénéficier du support de la persistance des objets contenus dans une instance de TObjectDataSet avec un fichier, à l'aide des méthodes SaveToFile et LoadFromFile, la classe de base doit être TComponent.

3 - Il ne reste plus qu'à déposer sur la fiche un composant TDataSource, pour le relier au composant TObjectDataSet, et des composants orientés données eux-mêmes connectés au TDataSource. Comme précisé plus haut, la propriété DataField d'un composant orienté données doit être le nom d'une propriété publiée de la classe gérée par l'objet TObjectDataSet.

Le composant TObjectDataSet offre aussi un accès orienté objet à ses éléments par un ensemble de méthodes dont voici la description :

property ObjectData[const Index: Integer]: TObject; default ;

ObjectData est une propriété tableau qui, en lecture, permet d'obtenir l'objet d'indice Index, et, en écriture affecte l'entrée d'indice Index avec un nouvel objet (une vérification de type est effectuée); comme le composant possède toutes les instances qu'on lui ajoute, les objets sont libérés automatiquement, soit lorsqu'un objet est remplacé par un autre, soit lorsque le composant est libéré de la mémoire.
Si le composant TObjectDataSet de nom ObjODS gère des instances de la classe TTest, on accèdera au premier élément avec une instruction du type :

ObjTest := ObjODS[0] as TTest; // ObjTest de type TTest

procedure Insert(Index: Integer; const Obj: TObject);

Cette procédure permet d'insérer un objet TTest à l'indice Index; une vérification de type est effectuée.

function Add(Obj: TObject): Integer;

Cette fonction ajoute un objet TTest à la fin de la liste des objets et renvoie l'index auquel l'objet est placé.

procedure Delete(Index: Integer);

Supprime l'objet d'indice Index. L'objet de type TTest est libéré de la mémoire.

procedure LoadFromFile(const FileName: String);

Cette procédure et la suivante gère la sérialisation des objets du composant dans un fichier. Pour en bénéficier, la classe TTest doit être dérivée de TComponent ou de l'une de ses classes descendantes.

procedure SaveToFile(const FileName: String);