IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

[Lazarus] Problème pour l'utilisation des fichiers


Sujet :

Lazarus Pascal

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 22
    Points : 22
    Points
    22
    Par défaut [Lazarus] Problème pour l'utilisation des fichiers
    Bonjour, je viens d'apprendre à me servir des fichiers en mode custom program et quand j'essaie en mode application sa ne marche pas. Est ce que c'est que l'on peut pas utiliser les fichiers en mode application? Ou est ce que ce n'est pas la même primitive?
    voila mon programme tout simple, c'est pour tester:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    unit Unit2; 
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Buttons,
      StdCtrls;
     
    type
     
      { TForm2 }
     
      TForm2 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Edit2: TEdit;
        Label1: TLabel;
        Label2: TLabel;
        procedure Button1Click(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
      end; 
     
    var
      Form2: TForm2;
      f:text;
     
    implementation
     
    { TForm2 }
     
    procedure TForm2.Button1Click(Sender: TObject);
    begin
         assign(f , 'nom.txt');
         rewrite(f);
         writeln(f, edit1.text);
         writeln(f, edit2.text);
         Form2.showHint:=false;
    end;
     
    initialization
      {$I unit2.lrs}
     
    end.
    et le message d'erreur est : unit2.pas(38,26)Error: wrong number of parameters specified

    Merci d'avance.

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 410
    Points : 307
    Points
    307
    Par défaut
    Bonjour

    il faut utiliser assignfile(f , 'nom.txt');
    et tout va fonctionner.

    @+

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 946
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 946
    Points : 5 659
    Points
    5 659
    Par défaut
    Ho,

    +1 de Bernard B

    Et remarques importantes sur le code.

    1- Il faut fermer un fichier ouvert avant de quitter le programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm2.Button1Click(Sender: TObject);
    begin
      assign(f , 'nom.txt');
      rewrite(f);
      writeln(f, edit1.text);
      writeln(f, edit2.text);
     
      { ICI manque la fermeture du fichier }
     
      Form2.showHint:=false;
    end;
    2- Penser à indenter le code, ça rend la lecture plus facile, et c'est une habitude à prendre le plus vite possible.

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 22
    Points : 22
    Points
    22
    Par défaut
    Ok merci à tous les deux sa marche, sinon y a t-il un autre moyen pour passer une variable de unit1 à Unit2.
    (J'avais oublié le close pardon , sa fait quoi si je le met pas?)

  5. #5
    Membre actif Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Points : 261
    Points
    261
    Par défaut
    Bonsoir,
    Tous ce que tu écris dans un fichier est d’abord stocké dans un buffer,
    close permet de vider le buffer dans ton fichier.
    Sans close ton fichier ne contiendra rien, malgré que tu ais eu l’impression de l’avoir édité.
    + (buffer = mémoire tampon)

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 946
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 946
    Points : 5 659
    Points
    5 659
    Par défaut
    Hi,
    Citation Envoyé par Lulu_n10
    Ok merci à tous les deux sa marche, sinon y a t-il un autre moyen pour passer une variable de unit1 à Unit2.
    (J'avais oublié le close pardon , sa fait quoi si je le met pas?)
    Il risque d'être illisible ou corrompu.

    C'est une des règles à toujours respecter:

    - Si on ouvre un fichier, le fermer avant de sortir du programme

    - si on réserve de la mémoire, la libérer avant de sortir du programme

    etc

    Pour passer une variable de unit1 à Unit2, il y a deux solutions principales, une que j'appelle "propre", et donc l'autre devient "sale".

    1- la propre

    Dans l'unit1, tu as une variable x dont l'unit2 a besoin, pour la lire ou l'écrire

    Tu crées ta variable dans unit1, dans la partie implementation, et tu crées 2 procédures/fonctions publiques pour y accéder dans unit2, en admettant que ta variable soit de type integer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    unit unit1;
     
    interface
     
      procedure SetMaVariable(n : integer);
      function   GetMaVariable : integer;
     
    implementation
     
    var
      MaVariable : integer;
    ...
     
    procedure SetMaVariable(n : integer);
    begin
      MaVariable := n;
    end;
     
    function   GetMaVariable : integer;
    begin
      result := MaVariable;
    end;
    ...
    et dans unit2, tu manipules ta variable avec les accesseurs ainsi créés.



    2- la sale

    Dans l'unit1, tu as une variable x dont l'unit2 a besoin, pour la lire ou l'écrire

    Tu crées ta variable dans unit1, dans la partie interface, la rendant ainsi publique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    unit unit1;
     
    interface
     
    var
      MaVariable : integer;
     
    implementation
    ...
    et dans unit2, tu manipules ta variable directement.

    Je déconseille fortement cette deuxième méthode, mais enfin, elle existe.

  7. #7
    Membre habitué

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 192
    Points : 176
    Points
    176
    Par défaut
    Bonjour,

    au risque de répéter ce qui a été dit ..

    il m'est déja arrivé d'oublier close pour un fichier en sortie et le programme semblait fontionner.. mais le fichier en sortie n'était pas complet.

    si le buffer est assez gros le fichier peut même être vide. (par contre je ne sais pas si on a accède à la taille des buffers .. autre sujet..)

    close oblige le buffer à se vider dans le fichier avant sa fermeture.



    donc doivent être des réflexes

  8. #8
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Flush permet de forcer l'écriture du buffer sans fermer le fichier

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/04/2011, 18h31
  2. Réponses: 4
    Dernier message: 16/09/2010, 22h33
  3. Réponses: 0
    Dernier message: 22/07/2010, 09h34
  4. Réponses: 5
    Dernier message: 24/08/2009, 18h58
  5. Classe générique pour simplifier l'utilisation des fichiers
    Par Oprichnik dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 10
    Dernier message: 09/08/2007, 23h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo