Insertion dans un fichier sequentiel [Résolu]

roironm - 4 oct. 2012 à 22:08 - Dernière réponse :  roironm
- 5 oct. 2012 à 19:43
Salut à tous,

J'ai un problème pour enregistrer mon recorde dans un fichier sequentiel. Il n'y a que le dernier enregistrement. voici mon code

type
TEmploye = record
Nom,
Prenom: string[100];
Salaire: string[10];
Homme: boolean; { vrai: homme, faux: femme }
end;
{important car c'est la déclaration du type de fichier seq de type TPersonne}
TEmpFich = file of TEmploye;
(...)
var
fmPrinc: TfmPrinc;
const
fichierTest : String = 'C:\employeTest.txt';
(...)
procedure remplirListe;
var
fichier : TEmpFich;
emp : TEmploye;
begin
{si pas de fichier on se casse}
if not FileExists(fichierTest) then Exit;
{vide la liste pour éviter les doublons}
fmPrinc.lstEmploye.Clear;
AssignFile(fichier,fichierTest);
Reset(fichier);{pour lire le fichier}
Seek(fichier,0);{pour se plasser au début du fichier}
while not Eof(fichier) do
begin
Read(fichier,emp);
fmPrinc.lstEmploye.Items.Add(affEmployer(emp));
end;{while}
end;

(...)

procedure enregistrer(e : TEmploye); {ajouter l'employé dans le fichier sequentielle}
var
fichier : TEmpFich;
begin
AssignFile(fichier,fichierTest);
if FileExists(fichierTest) then
Reset(fichier)
else
Rewrite(fichier);

Truncate(fichier);
Write(fichier, e);

CloseFile(fichier);
end;

(...)

je m'explique. j'ai une liste d'employé dans laquelle je peux ajouter des employés ce qui lance la procedure enregistrer. Au démarage et à chaque modif je lance la procedure remplirListe.

Mais lorsque je relance l'appli, je n'ai que le dernier enregistrment... ou sont passés les autres???

merci pour votre aide.
javascript:void(0);
Afficher la suite 

12 réponses

Répondre au sujet
korgis 411 Messages postés samedi 17 mai 2003Date d'inscription 16 mars 2018 Dernière intervention - 5 oct. 2012 à 19:12
+3
Utile
Là c'est faux :
Seek(fichier,Seek(fichier,FileSize(fichier));


Essaye un truc comme ça :
procedure enregistrer(e : TEmploye); {ajouter l'employé dans le fichier sequentielle}
var
  fichier : TEmpFich;
begin
  AssignFile(fichier, fichierTest);
  if FileExists(fichierTest) then
    Reset(fichier)
  else
    Rewrite(fichier);

  Seek(fichier, FileSize(fichier));
  Write(fichier, e);

  CloseFile(fichier);
end;


Et ATTENTION, n'oublie pas de refermer le fichier ici :
procedure remplirListe;
var
  fichier : TEmpFich;
  emp : TEmploye;
begin
  {si pas de fichier on se casse}
  if not FileExists(fichierTest) then Exit;
  {vide la liste pour éviter les doublons}
  fmPrinc.lstEmploye.Clear;
  AssignFile(fichier,fichierTest);
  Reset(fichier);{pour lire le fichier}
  Seek(fichier,0);{pour se plasser au début du fichier}
  while not Eof(fichier) do
  begin
    Read(fichier,emp);
    fmPrinc.lstEmploye.Items.Add(affEmployer(emp));
  end;{while}
  CloseFile(fichier); // <- OUBLI !!!!!!!!!!!!!!!!
end;


Ça devrait aller mieux...
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de korgis
cs_yanb 260 Messages postés lundi 27 octobre 2003Date d'inscription 4 mars 2016 Dernière intervention - 5 oct. 2012 à 09:22
0
Utile
Salut,
et en supprimant Truncate(fichier); ça donne quoi ?
@+
Commenter la réponse de cs_yanb
0
Utile
C'est pareil toujour le meme problème


javascript:void(0);
Commenter la réponse de roironm
cs_yanb 260 Messages postés lundi 27 octobre 2003Date d'inscription 4 mars 2016 Dernière intervention - 5 oct. 2012 à 10:30
0
Utile
Oups
Remplace Truncate(fichier); par
Seek(fichier,FileSize(fichier));
@+
Commenter la réponse de cs_yanb
0
Utile
Impossible de compiler

[Erreur] uEmploye.pas(125): Types incompatibles

quesaqo le problème

merci de ton aide
Commenter la réponse de roironm
cs_yanb 260 Messages postés lundi 27 octobre 2003Date d'inscription 4 mars 2016 Dernière intervention - 5 oct. 2012 à 14:50
0
Utile
Ben pourtant c'est juste le repositionnement à la fin du fichier
Seek(fichier,FileSize(fichier));

alors que Truncate supprime tous ce qui est derrière la position en cours...
Donc tu n'avais que le dernier enregistrement effectivement.
Type incompatibles sur qu'elle instruction ?
Commenter la réponse de cs_yanb
0
Utile
L'erreur de compile est sur la ligne du seek(fichier, filesize(fichier))

Je suis un peu perdu

Merci de ton aide


javascript:void(0);
Commenter la réponse de roironm
0
Utile
j'utilise delphi6


javascript:void(0);
Commenter la réponse de roironm
korgis 411 Messages postés samedi 17 mai 2003Date d'inscription 16 mars 2018 Dernière intervention - 5 oct. 2012 à 18:02
0
Utile
Salut,

je confirme les dires de yanb. J'ai même testé, des fois que ça marcherait plus...
Ça marche.

//Truncate(fichier);
  Seek(fichier, FileSize(fichier));
  Write(fichier, e);


L'erreur doit se situer ailleurs, dans une autre partie du code, mais pas dans celle que tu nous présente.

Attention. Quand tu postes du code, n'oublie pas d'utiliser la mise en page de la box, en haut à droite, troisième icone à partir de la droite, Delphi.
Ça sera de suite beaucoup plus lisible.
Commenter la réponse de korgis
0
Utile
Merci pour l'info.

Je poste mon code en entier.

C'est ma première appli delphi

unit uEmploye;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
    TEmploye = record
    Nom,
    Prenom: string[100];
    Salaire: string[10];
    Homme: boolean; { vrai: homme, faux: femme }
  end;
  {important car c'est la déclaration du type de fichier seq de type TPersonne}
  TEmpFich = file of TEmploye;

  TfmPrinc = class(TForm)
    lstEmploye: TListBox;
    Label1: TLabel;
    edNom: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    edPrenom: TEdit;
    edSalaire: TEdit;
    btnAjouter: TButton;
    btnSupprimer: TButton;
    btnQuit: TButton;
    btnModifier: TButton;
    procedure btnQuitClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure edNomChange(Sender: TObject);
    procedure edPrenomChange(Sender: TObject);
    procedure edSalaireChange(Sender: TObject);
    procedure btnAjouterClick(Sender: TObject);
    procedure btnSupprimerClick(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;



var
  fmPrinc: TfmPrinc;
const
 fichierTest : String = 'C:\employeTest.txt';
implementation

{$R *.dfm}

function affEmployer(e : TEmploye) : String;
begin
   result := e.Nom;
end;

procedure remplirListe;
var
  fichier : TEmpFich;
  emp : TEmploye;
begin
  {si pas de fichier on se casse}
  if not FileExists(fichierTest) then Exit;
  {vide la liste pour éviter les doublons}
  fmPrinc.lstEmploye.Clear;
  AssignFile(fichier,fichierTest);
  Reset(fichier);{pour lire le fichier}
  Seek(fichier,0);{pour se plasser au début du fichier}
  while not Eof(fichier) do
  begin
    Read(fichier,emp);
    fmPrinc.lstEmploye.Items.Add(affEmployer(emp));
  end;{while}
end;

procedure gestionBtnAjout;
begin
   if (fmPrinc.edPrenom.Text '') or (fmPrinc.edPrenom.Text '') or (fmPrinc.edSalaire.Text = '') then
     fmPrinc.btnAjouter.Enabled := False
   else
     fmPrinc.btnAjouter.Enabled := True;
end;

procedure gestionBtnSupp;
begin
   {if fmPrinc.lstEmploye.ItemIndex < 0 then
    fmPrinc.btnSupprimer.Enabled := False
   else
    fmPrinc.btnSupprimer.Enabled := True}
end;

procedure gestionBouton;
begin
  gestionBtnAjout;
  gestionBtnSupp;
end;

procedure viderChamp;
begin
  fmPrinc.edNom.Text := '';
  fmPrinc.edPrenom.Text := '';
  fmPrinc.edSalaire.Text := '';
end;

procedure TfmPrinc.btnQuitClick(Sender: TObject);
begin
 Close;
end;

procedure TfmPrinc.FormCreate(Sender: TObject);
begin
   gestionBouton;
   remplirListe;
end;

procedure enregistrer(e : TEmploye); {ajouter l'employé dans le fichier sequentielle}
var
  fichier : TEmpFich;
begin
  AssignFile(fichier,fichierTest);
  if not FileExists(fichierTest) then Exit;
  Rewrite(fichier);
  Seek(fichier,Seek(fichier,FileSize(fichier));
  Truncate(fichier);
  Write(fichier, e);

  CloseFile(fichier);
end;

procedure TfmPrinc.btnAjouterClick(Sender: TObject);
var
  emp : TEmploye;
begin
  emp.Nom := edNom.Text;
  emp.Prenom := edPrenom.Text;
  emp.Salaire := edSalaire.Text;
  //lstEmploye.Items.Add(affEmployer(emp));
  enregistrer(emp);
  remplirListe;
  viderChamp;
  gestionBouton;
end;

procedure supprimer(nom : String); {supprimer l'employer du fichier sequ}
begin
  ShowMessage('l''employé ' + nom + ' a été supprimer');
end;

procedure TfmPrinc.btnSupprimerClick(Sender: TObject);
begin
  supprimer(lstEmploye.Items.Strings[lstEmploye.ItemIndex]);
  lstEmploye.Items.Delete(lstEmploye.ItemIndex);
end;

{###############################################}

procedure TfmPrinc.edNomChange(Sender: TObject);
begin
   gestionBouton
end;

procedure TfmPrinc.edPrenomChange(Sender: TObject);
begin
  gestionBouton
end;

procedure TfmPrinc.edSalaireChange(Sender: TObject);
begin
  gestionBouton
end;

end.



javascript:void(0);
Commenter la réponse de roironm
0
Utile
Je test tout de suite.

Merci
Commenter la réponse de roironm
0
Utile
Merci korgis ça marche du feu de dieu.



javascript:void(0);
Commenter la réponse de roironm

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.