Insertion dans un fichier sequentiel [Résolu]

Signaler
-
 roironm -
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);

12 réponses

Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
16
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...
Messages postés
258
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
6 octobre 2020
8
Salut,
et en supprimant Truncate(fichier); ça donne quoi ?
@+
C'est pareil toujour le meme problème


javascript:void(0);
Messages postés
258
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
6 octobre 2020
8
Oups
Remplace Truncate(fichier); par
Seek(fichier,FileSize(fichier));
@+
Impossible de compiler

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

quesaqo le problème

merci de ton aide
Messages postés
258
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
6 octobre 2020
8
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 ?
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);
j'utilise delphi6


javascript:void(0);
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
16
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.
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);
Je test tout de suite.

Merci
Merci korgis ça marche du feu de dieu.



javascript:void(0);