Andalarius
Messages postés2Date d'inscriptiondimanche 22 mai 2005StatutMembreDernière intervention29 juillet 2005
-
29 juil. 2005 à 16:23
Andalarius
Messages postés2Date d'inscriptiondimanche 22 mai 2005StatutMembreDernière intervention29 juillet 2005
-
29 juil. 2005 à 21:49
Bonjour à tous,
Voici ma situation : Je désire écrire les objets complexes (contenant différents objets eux-mêmes ou des listes d'objets) dans un fichier binaire.
Comme plusieurs d'entre-vous le savez déjà, il existe de plusieurs façons d'écrire dans un fichier binaire. Delphi étant très axé "components writing" (tel que dans un .DFM) et que mes objets ne sont pas des composants, j'ai cherché sur google, les newsgroup, les forums (incluant celui-ci) et l'aide de Delphi pour un moyen détourné.
Dans l'aide de Delphi, j'ai trouvé un exemple qui utilise les méthodes :
WriteComponentResFile
et
ReadComponentResFile
L'exemple crée une classe container contenant l'objet dans une property publié (published - seuls les property published sont streamer).
Puis l'exemple crée une autre classe appelé : TStreamableClass qui va publié le conteneur. Ces classes sont enregistrés ( RegisterClasses() ) afin que le RTTI (Run Time Type Information) puisse les reconnaître et les traitées.
L'exemple fonctionne très bien et les attributs membres de type integer et string sont écrits et lus. Cependant, si j'ajoute un objet dans la classe TContainer, en prenant soin de placer la property dans la section published et enregistrer la classe et cette classe hérite de TPersistent (pour qu'elle soit streamer) et les property de cette classe dans la section published.... l'objet n'est pas lu. Je ne sais pas si l'objet est écrit ou non.
Voici l'exemple de l'aide de Delphi que j'ai modifié (3 units):
{Dans la form. ajouté un bouton et ajouté dans l'event OnClick la procédure ci-dessous}
procedure TContainedClass.SetSomeData(Value: Integer);
begin
{ Placer un point d'arrêt ici et remarquer comment les données reviennent dans le flux. }
FSomeData := Value;
end;
procedure TContainedClass.SetSomeTest(Value: Ttest);
begin
FSomeTest := Value;
end;
function Ttest.ReadValue1: string;
begin
Result := fValue;
end;
function Ttest.ReadValue2: integer;
begin
Result := sValue;
end;
procedure Ttest.WriteValue1(const Value: string);
begin
fValue := Value;
end;
procedure Ttest.WriteValue2(const Value: integer);
begin
sValue := Value;
end;
end.
Ma question est la suivante : est-ce qu'il est possible d'écrire et de lire l'objet de la classe TTest selon cette méthode ?
Je ne peux pas utilisé les TCollections et TCollectionItem car dans mon programme principal (pas cet exemple), les objets contiennent une liste d'objets différents.
J'aimerais pouvoir éviter d'écrire chaque objet individuellement en créant des nouvelles fonctions de streaming, spécifiant la taille des string, integer et autre avant.... à cause de la complexité du programme principal.
Andalarius
Messages postés2Date d'inscriptiondimanche 22 mai 2005StatutMembreDernière intervention29 juillet 2005 29 juil. 2005 à 21:49
Ok, je me suis mal expliqué.
Est-ce qu'il est possible de lire la classe test APRÈS que l'objet container est été streamer dans le fichier. Faire la lecture de l'objet après le
ReadComponentResFile