Lecture de fichier

trollnumber1 Messages postés 12 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 28 avril 2003 - 5 avril 2003 à 02:58
cs_Bestiol Messages postés 833 Date d'inscription dimanche 6 janvier 2002 Statut Membre Dernière intervention 3 novembre 2005 - 5 avril 2003 à 15:28
Troll 8-)
Bonjours ,

mon probleme est de lire le fichier que j'ai créé voici la procedure d'enregistrement que j'ai fait mais je ne sais pas comment faire pour la lecture.

merci beaucoup pour votre aide.

procedure TForm2.Enregistrer1Click(Sender: TObject);
type
TinfImage = Packed Record
Hint: String[25];
Left: Integer;
Top: Integer;
Taille: Integer;
end;

var
i : integer;
Edit : TImage;
fichier : TMemoryStream;
Fiche: TinfImage;
Fs: TFileStream;

begin
Fichier:= TMemoryStream.Create;
Fs:= TFileStream.Create(Filename,FmOpenWrite);
for i:=0 to ComponentCount - 1 do
if Components[i] is TImage then
begin
if i >222 then
begin
Edit:= TImage(Components[i]);
Edit.Picture.Bitmap.SaveToStream(Fichier);
end;
end;
Fs.CopyFrom(Fichier,0);
Fs.Free;
Fichier.Free;
end;

1 réponse

cs_Bestiol Messages postés 833 Date d'inscription dimanche 6 janvier 2002 Statut Membre Dernière intervention 3 novembre 2005 1
5 avril 2003 à 15:28
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. ]
0
Rejoignez-nous