Tu as oublié un petit truc, dans ta procédure !!
Je t'avais dit qu'il fallait écrire, à la fin du fichier, le nombre d'images créées !!! C'est important pour la lecture !
Tu peux le faire ainsi :
if Components[i] is TImage then
begin
Inc(count);
...
end; //celui de la boucle !
FS.Write(Count, SizeOf(integer));
FS.Free;
Bon, sinon, autant profiter que tu as mis ton code... Quand tu utilises des streams, un conseil, prend l'habitude de les utiliser dans un bloc Try...finally, pour être sûr qu'en cas d'erreur, les streams soient bien libérés !
Sinon, pourquoi fais-tu "if i > 222" ?! Je suppose que ce doit être relatif à l'organisation de ton prog, mais il faut penser que comme tu as fait ton code, le CopyFrom sera effectué même si i est inférieur à 222... Il faudrait peut-être déplacer le FS.CopyFrom(...) dans le begin...end de ta condition !
Enfin, il faut peut-être que ton record te serve à quelque chose ! Donc, après "Edit.Picture.Bitmap.SaveToStream(Fichier);", il faut que tu remplisses la structure :
"Fiche.Hint := Edit.Hint;
Fiche.Left := Edit.Left;
Fiche.Top := Edit.Top;
Fiche.Taille := Fichier.Size;"
D'ailleurs, fait bien attention de vider ton MemoryStream avant chaque sauvegarde d'images : "Fichier.Size := 0;", à placer juste devant "Edit.Picture.Bitmap.SaveToStream(Fichier)", par exemple.
Ce Record, il faut que tu le places dans ton fichier, avant l'image à laquelle il correspond :
"Edit.Picture.Bitmap.SaveToStream(Fichier);
... //Code d'au dessus !
end;
end;
FS.Write(Fiche, SizeOf(TinfImage)); //Nouvelle ligne !
Fs.CopyFrom(Fichier,0);"
Voilà !! Maintenant, on peut passer à l'ouverture !!
Avec le code d'au dessus, ton fichier de sauvegarde se présente donc ainsi :
_________________
| TinfImage 1 | //Le premier record placé
---------------------
| DONNEES |
| IMAGE 1 | //Le premier MemoryStream enregistré
|________________|
| TinfImage 2 | //Second...
---------------------
| DONNEES |
| IMAGE 2 | //Second...
'_ _ _ _ _ _ _ _ _ _ '
'_ _ _ _ _ _ _ _ _ _ '
'_ _ _ _ _ _ _ _ _ _ '
| TinfImage n | //nième...
---------------------
| DONNEES |
| IMAGE n | //nième...
|________________|
| COUNT n | //Nombre n d'images enregistrées
|________________|
Ca, c'est la structure de ton fichiers pour, tu l'auras deviné, n images enregistrées !
Ce shéma permet de comprendre très facilement comment lire le fichier dans ta procédure d'ouverture (je reprend les mêmes noms de variables que toi pour l'enregistrement):
1-Tu ouvres le fichier :
FS := TFileStream.Create(...);
2-Tu vas à la fin du fichier, moins la taille d'un integer :
FS.Seek(SizeOf(Integer), soFromEnd);
3-Tu lis le nombre d'images à lire :
FS.Read(Count, SizeOf(Integer));
4-Ensuite, tu utilises une boucle pour lire les images les unes à la suite des autres :
var Adresse: Integer;
Fiche : TinfImage;
Image : TImage;
...
Adresse := 0;
for i := 1 to Count Do
Begin
FS.Seek(Adresse, soFromBeginning);
FS.Read(Fiche, SizeOf(TinfImage));
Inc(Adresse, SizeOf(TinfImage));
FS.Seek(Adresse, soFromBeginning);
Fichier.CopyFrom(FS, Fiche.Taille);
Image := Timage.Create(Form2);
Image.visible := True;
Image.Parent := Form2;
Image.Picture.Bitmap.LoadFromStream(Fichier);
Image.top := Fiche.Top;
Image.Left := Fiche.Left;
Image.ShowHint := True;
Image.Hint := Fiche.Hint;
Image := nil;
Image.Free;
Inc(Adresse, Fiche.Taille);
Fichier.Size := 0;
end;
Fichier.Free;
FS.Free;
Je crois que ce code devrait faire l'affaire, et peut-être ton bonheur ?!!
Allez, bonne prog' !
[mailto:bestiol@cario.fr Bestiol. ]