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

 Delphi Discussion :

Fichier texte et Stringgrid


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 17
    Points : 13
    Points
    13
    Par défaut Fichier texte et Stringgrid
    Bonjour,

    J'aimerais pouvoir remplir un stringgrid avec des infos venant d'un fichier texte. Ce fichier est remplis par des informations données par l'utilisateur.

    Je définit où ce trouve le fichier, je l'ouvre et fais un boucle pour le lire complétement. Les données qui devrait se trouvé dans les différentes colonne sont séparée par des ; il me manque quelque chose et je tourne en rond. voici les commande que je pense devoir utilisée, mais je suis un peu perdu... pouvez-vous m'aiguiller?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     StChemin        := ExtractFilePath(Application.ExeName);
     StFichier        := StChemin + 'job.txt';
     AssignFile (FichierText,StFichier);
     
     while not eof(FichierText) do
        begin
            Readln(FichierText,StLigne);
            copy (StLigne,;);
            LstBx.Items.Add(StLigne);
        End;
    Merci

  2. #2
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Salut

    Je pense que l'erreur vient de la ligne Pour utiliser la fonction Copy, il faut donner un nombre de caractères a copier. Pour savoir combien de caracteres il faut copier pour arriver a un ";", utilise la fonction Pos.

    Voici une manière plus simple je pense, à base de StringList :

    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
    var Fichier, Ligne : TStringList;
        i ,j : integer;
     
    ...
     
      Fichier:=TStringList.Create;
      Fichier.LoadFromFile(ExtractFilePath(Application.ExeName)+'job.txt';
      Ligne:=TStringList.Create;
      Ligne.Delimiter:=';';
     
      for i:=0 to Fichier.Count-1 do
      begin
        Ligne.DelimitedText:=Fichier[i];
     
        for j:=0 to Ligne.Count-1 do
          StringGrid1.Cells[j,i]:=Ligne[j];
      end;
     
      Ligne.Free;
      Fichier.Free;
    Bonne chance

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 71
    Points : 102
    Points
    102
    Par défaut
    Salut,
    juste un, deux petit truc en plus...
    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
    var
        Ligne, Fichier  : TStringList;
        I, J            : Integer;
    begin
        Ligne := TStringList.Create;
        Fichier := TStringList.Create;
        try
            Fichier.LoadFromFile(ExtractFilePath(Application.ExeName)+'Job.txt');
            Ligne.Delimiter := ';';
            Ligne.StrictDelimiter := True;//Pour le caractère espace
            for I := 0 to Fichier.Count - 1 do
            begin
                Ligne.DelimitedText := Fichier.Strings[I];
                for J := 0 to Ligne.Count - 1 do
                    StringGrid1.Cells[J,I] := Ligne.Strings[J];
            end;
        finally
            Ligne.Free;
            Fichier.Free;
        end;
    end;
    @+

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 694
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    Juste un petit truc... en moins
    Chaque ligne (ou colonne) d'une grille est accessible à travers une TStringList.

    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
    var
      F :TStringList;
      i: Integer;
     
    begin
      F := TStringList.Create;
     
      try
        F.LoadFromFile(ExtractFilePath(Application.ExeName)+'Job.txt');
        StringGrid1.RowCount := F.Count;
     
        for i := 0 to F.Count -1 do
          with StringGrid1.Rows[i] do
          begin
            Delimiter       := ';';
            StrictDelimiter := TRUE; //Pour le caractère espace si les chaînes ne sont pas entre guillemets !
            DelimitedText   := F[i];
          end;
      finally
        F.Free;
      end;
    end;

  5. #5
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par nuxtay Voir le message
    Salut,
    juste un, deux petit truc en plus...
    @+
    Citation Envoyé par Andnotor Voir le message
    Juste un petit truc... en moins
    Chaque ligne (ou colonne) d'une grille est accessible à travers une TStringList.
    Merci a vous deux d'avoir amélioré mon code
    En général je met le Try Finally, mais la j'ai oublié ^^

    Merci pour ta technique AndNotOr, je connaissais pas ...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 71
    Points : 102
    Points
    102
    Par défaut
    Bien sûr, pourquoi pas pensé...
    Super Andnotor, maintenant c'est le Top...
    @+

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Juste un petit truc... en moins
    Chaque ligne (ou colonne) d'une grille est accessible à travers une TStringList.

    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
    var
      F :TStringList;
      i: Integer;
     
    begin
      F := TStringList.Create;
     
      try
        F.LoadFromFile(ExtractFilePath(Application.ExeName)+'Job.txt');
        StringGrid1.RowCount := F.Count;
     
        for i := 0 to F.Count -1 do
          with StringGrid1.Rows[i] do
          begin
            Delimiter       := ';';
            StrictDelimiter := TRUE; //Pour le caractère espace si les chaînes ne sont pas entre guillemets !
            DelimitedText   := F[i];
          end;
      finally
        F.Free;
      end;
    end;
    Merci pour vos réponses.

    J'ai encore quelques questions:

    StrictDelimiter := TRUE -> n'est pas connu dans ma version. Je suis en Delphi 6

    Je ne vois rien dans mon Stringgrid. Pourtant les datas son bien luent.

    J'ai rajouté un ShowMessage(F[i]); et je les voyent. Y a-t-il un paramètre du stringgrid a modifier?

    Voici ma procédure:

    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
    Procedure TFArch.FormActivate(Sender: TObject);
    var
      F :TStringList;
      i: Integer;
     
    begin
     
     F := TStringList.Create;
     
      try
        F.LoadFromFile(ExtractFilePath(Application.ExeName)+'Job.txt');
        StringGrid1.RowCount := F.Count;
     
        for i := 0 to F.Count -1 do
          begin
            StringGrid1.Rows[i].Delimiter       := ';';
            StringGrid1.Rows[i].DelimitedText   := F[i];
            ShowMessage(F[i]);
          end;
      finally
        F.Free;
      end;

    Voici le contenu de mon fichier texte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Job1;Ma description;C:\;C:\dest1;C:\LiveBackup Cache\

    The Ditch

  8. #8
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Cela devrait pourtant.
    Question bête (au cas où): tu as bien 5 colonnes définies dans ton StringGrid (propriété ColCount) ?

    A près il faut voir si les espaces sont interprétés comme délimiteur en l'absence du paramètre StrictDelimiter.

    @+

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    Oui le colcount est a 5.

    j'ai aussi dans les options mis goEditing a True

    The Ditch

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Sans StrictDelimiteur les espaces vont effectivement parasisté l'affaire

    ExtractsStrings peut-être utilisé pour découper une chaine, un paramètre de retour acceptant une TStrings peut être ensuite assignés à Rows[]

    Sinon, Explode via un array of string (TStringDynArray) permet aussi de découper sans risque de caractère parasite !

    Possible que DelimitedText pose problème, j'ai un vieux code ou j'utilisais Text + StringReplace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    F := TStringList.Create;
     
      try
        F.LoadFromFile(ExtractFilePath(Application.ExeName)+'Job.txt');
        StringGrid1.RowCount := F.Count;
     
        for i := 0 to F.Count -1 do
           StringGrid1.Rows[i].Text   := StringReplace(F[i], ';', #10, [rfReplaceAll, rfIgnoreCase]);;
     
      finally
        F.Free;
      end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  11. #11
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    J'ai trouvé, j'ai mes données.

    J'ai supprimer le StringGrid et remis un autre. J'ai du modifié un paramètre quelques part mais où??

    Quoiqu'il en soit, j'ai mes données.

    Il me reste un soucis de delimiter, il me prend les espace comme delimiter

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 71
    Points : 102
    Points
    102
    Par défaut
    Salut,
    pour les espaces on peut aussi modifier le séparateur et le mettre entre guillemet...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    StringGrid1.Rows[i].DelimitedText := '"'+
        StringReplace(F[I],StringGrid1.Rows[i].Delimiter,
        '"'+StringGrid1.Rows[i].Delimiter+'"',[rfReplaceAll])+'"';
    @+

  13. #13
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par The Ditch Voir le message
    J'ai supprimer le StringGrid et remis un autre. J'ai du modifié un paramètre quelques part mais où??
    DefaultDrawing à False ? Quelque chose comme ça qui parasite le rendu.

    Citation Envoyé par The Ditch Voir le message
    Il me reste un soucis de delimiter, il me prend les espace comme delimiter
    Soit tu utilises la variante de ShaiLeTroll qui substitue le séparateur par un saut de ligne, ou bien tu mets des guillemets autour des chaines contenant des espaces dans ton fichier .txt.

    @+

  14. #14
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 17
    Points : 13
    Points
    13
    Par défaut [RESOLU] Fichier texte et Stringgrid
    Bonjour

    Voici comment j'ai solutionné mon pb:

    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
         begin
     if OpenDialog1.Execute then
        begin
          AssignFile (Ftext, OpenDialog1.FileName);
          reset (ftext);
          cptrow := 1;
     
          while not eof (ftext) do
            begin
              readln(ftext,ligne);
              ligne := ligne + ';';
              cptcol := 0;
              mot  := '';
              for i := 1 to length(ligne) do
                if ligne[i] <> ';' then mot := mot + ligne [i]
                  else
                    begin
                      if cptcol < 5 then StringGrid1.Cells[cptcol,cptrow] := mot;
                      mot := '';
                      inc(cptcol);
                    end;
               inc(cptrow);
               if cptrow >= StringGrid1.RowCount then StringGrid1.RowCount := cptrow +1;
            end;
     
     
          closefile(ftext);
     
        end;
    end;
    Merci à tous,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. C++ Builder 6 : Fichier Texte vers StringGrid
    Par fredy954 dans le forum C++
    Réponses: 1
    Dernier message: 06/04/2011, 14h45
  2. Réponses: 1
    Dernier message: 12/02/2003, 09h36
  3. [VB6] Ecrire/Modifier/Effacer ds un fichier text-4 Chs/Lg
    Par Jonathan_Korvitch dans le forum VB 6 et antérieur
    Réponses: 18
    Dernier message: 24/12/2002, 18h54
  4. Importer des fichiers textes délimités
    Par Invité dans le forum Outils
    Réponses: 2
    Dernier message: 23/09/2002, 13h56
  5. Instruction pour créer un fichier text ???
    Par Soulsurfer dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 11h17

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