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

C++Builder Discussion :

complication avec un TStringList


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 59
    Par défaut complication avec un TStringList
    bonjour a tous,
    je viens de créer un projet qui permet d'insérer le contenu d'un fichier dans un composant et puis par la suite parcourir ce fichier pour faire des tests et d'extraire des données. pour ce là, j'ai opté pour un composant TStringList. jusque là tout fonctionnait normalement jusqu'à ce que j'intègre dans ce composant un fichier de grande taille qui contient plus de 5000 lignes ( 4951 lignes pour etre exacte). cette perturbation a provoquer un dysfonctionnement de tous ce qui la suit comme instructions.

    ce que je voudrais savoir c'est existe il un moyen pour faire des extensions sur la taille d'un composant TStringList ou encore comment je peut modifier mon code avec autre composant sans pour autant tout refaire.

    voilà la partie du code que je veut traiter:
    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
     
    ...
    TStringList *Fichier = new TStringList;
    ....
    void __fastcall TForm1::ButtonClick(TObject *Sender)
    {
    ....
    AnsiString N = Filepath + Filename;
    if(FileExists(N))
        {
        Fichier->LoadFromFile(N);
        for(Line = 0; Line < Fichier->Count; Line++)
            {
            if(Fichier->Strings[Line] == "object");
                {
                ExtractValues();
                }
            }
        }
    }
    ....

  2. #2
    Membre Expert
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Par défaut
    Citation Envoyé par scoubi32006 Voir le message
    plus de 5000 lignes ( 4951 lignes pour être exacte)
    LOL : Expression à ajouter dans le bêtiser.

    5000 lignes (voire plus !), c’est rien du tout pour un TStringList, je ne sais pas la limite supérieure mais ce composant supporte des fichiers énormes comme le petit bloc-notes (Notepad).

    Votre erreur vient d’ailleurs.

    À bientôt
    Gilles


  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 59
    Par défaut
    pour le bêtisier c'est si drôle que ça !!!
    parce que mon problème actuel est que j'ai 4951 est que sa ne marche pas !!!!
    et pour les 5000 lignes c'est pour qu'au cas où j'ai un autre document plus grand de taille de 5000 lignes lignes ou plus !!!!
    donc a mon avis c'est pas drôle !!!

    pour le message d'erreur il m'indique de c'est bien le problème de capacité en nombre de ligne !! alors que pour un autre contenu moins long, mon travail fonctionne parfaitement.

    voici le code d'erreur que j'ai

    le projet.exe a provoqué une classe d'exception EStringListError avec le message ' Indice de liste hors limites(4951)'.
    merci.

  4. #4
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152

  5. #5
    say
    say est déconnecté
    Membre Expert
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Par défaut
    non le message n'indique pas que vous dépassez le nombre de lignes mais plutot que vous accèdez à une ligne qui n'existe pas, c'est un dépassement d'indice

    Si vous avez 4951 lignes le dernier indice est 4950...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(Line = 0; Line < Fichier->Count-1; Line++)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 59
    Par défaut
    merci !!!!

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Un traitement ligne par ligne sera plus simple :

    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
     
    for(int j = 0; j < Fichier->Count; j++)
        {
        N = Fichier->Strings[j];
        if(N == "object")
            {
            //S'il y a quelque chose à faire en réponse à ...
            }
        else
            {
            if(N.Pos("..."))
                {
                //Donc en réponse à "..." ...
                }
            else
                {
                if(N.Pos("..."))
                    {
                    //Donc en réponse à "..." ...
                    }
                //...
                }
            }
        }
    Par contre ce serait bien de savoir dans quel but parce qu'on peut se trouver devant une situation où l'on ne pourrait que difficilement procéder de la sorte. Je pense en particulier à un mécansime qui instancierait quelque chose à chaque "object"... (quelque chose ne relevant pas forcément de la VCL)... objets dont les propriétés seraient ensuite initialisées avec des valeurs à extraire en aval...

    A plus !

  8. #8
    Membre Expert
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Par défaut
    Citation Envoyé par scoubi32006 Voir le message
    pour le bêtisier c'est si drôle que ça !!!
    parce que mon problème actuel est que j'ai 4951 est que sa ne marche pas !!!!
    et pour les 5000 lignes c'est pour qu'au cas où j'ai un autre document plus grand de taille de 5000 lignes lignes ou plus !!!!
    donc a mon avis c'est pas drôle !!!
    Eh ! Oui, c'est drôle !

    Apparemment vous ne voulez pas admettre que 4951 est inférieur à 5000, or vous annoncez plus que 5000.

    Donc c’est drôle. En tout cas pour moi.

    Et drôle également, ce fait que vous insistiez.

    Cela dit, vous irez loin, dire n’importe quoi rapporte énormément dans cette société.

    Continuez ! Vous tenez le bon bout.

    À bientôt
    Gilles

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 59
    Par défaut
    Bonjour a tous,
    bien que j'ai testé toutes les solutions que vous m'aviez donné j'ai pas pus résoudre mon problème.
    voici mon code après quelques modifications
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
    {
     
    Memo1->Lines->Clear();
    AnsiString N = Filepath + Filename;
    if(FileExists(N))
        {
        Fichier->LoadFromFile(N);
        for(Line = 0; Line < Fichier->Count-1; Line++)
            {
            if(Fichier->Strings[Line] == "object");
                {
                ExtractValues();
                }
            }
        }
    }
    //-------------
     
    void __fastcall TForm1::ExtractValues()
    {
    int moy=0;
     
     
    int tait=0;
     
    int nb=0;
     
     
     
    Line=0;
    Line++;
    for(int j = 0; j < Fichier->Count-1; j++)
     
        {
        AnsiString N = Fichier->Strings[j];
        //N = N.UpperCase(); //pour lever l'ambiguité 'x' ou 'Y'
     
                tai=0;
            if(N.Pos("TLabel") != 0)
                {
                N = Fichier->Strings[j+5];
                ExtractValue(N);
                tait=tait+tai;
     
                nb++;
     
                moy=tait/nb;
     
                }
     
     
     
        Memo1->Lines->Add("tait");
        Memo1->Lines->Add(tait);
        Memo1->Lines->Add("nb");
        Memo1->Lines->Add(nb);
        Memo1->Lines->Add("moy");
        Memo1->Lines->Add(moy);
     
     }
     
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::ExtractValue(AnsiString N)
    {
     
     
    int p = N.Pos("=");
    if(p != 0)
        {
        p=p+3;
     
        N = N.SubString(p,N.Length()-p+3);
     
        tai=N.Length()-1;
     
     
     
        }
    }
    et dans la PJ que voilà, c'est le fichier que je veut lire.

    que dois je corriger pour avoir un code qui fonctionne merci.
    Fichiers attachés Fichiers attachés

  10. #10
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Memo1->Lines->Add("tait");
    Memo1->Lines->Add(tait);
    Memo1->Lines->Add("nb");
    Memo1->Lines->Add(nb);
    Memo1->Lines->Add("moy");
    Memo1->Lines->Add(moy);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Memo1->Lines->Add("tait");
    Memo1->Lines->Add( IntToStr(tait) );
    Memo1->Lines->Add("nb");
    Memo1->Lines->Add( IntToStr(nb) );
    Memo1->Lines->Add("moy");
    Memo1->Lines->Add( IntToStr(moy));
    A plus !

  11. #11
    Membre confirmé Avatar de Poilou
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 59
    Par défaut
    Bonjour,

    Je comprends pas trop votre bout de code mais ce que je vois c'est :

    - Une boucle sur le nombre de ligne du fichier
    pour la boucle for, il faut mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(Line = 0; Line < Fichier->Count; Line++)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(Line = 0; Line <= Fichier->Count-1; Line++)
    - si la valeur d'une ligne est égale à "object" on refait une boucle sur le nombre de ligne du fichier. c'est toujours le même fichier ?

    - la ou ça bloque, à mon avis, c'est sur cette ligne car arrivé à 4 lignes de la fin, on va dépasser les limites du tableau.

    Pour éviter l'erreur, il faut faire un test si (j+5) < Fichier->Count

    Cordialement,

    Fabrice

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

Discussions similaires

  1. [D2006] Pb avec 1 TStringList volatile
    Par qi130 dans le forum Langage
    Réponses: 5
    Dernier message: 09/06/2010, 01h53
  2. [XL-2003] Complications avec SendKeys
    Par drakkar_agfa dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/04/2009, 17h47
  3. Probleme avec une TStringList
    Par davos56 dans le forum Delphi
    Réponses: 10
    Dernier message: 12/04/2007, 11h03
  4. Probleme avec tstringlist
    Par petitprince dans le forum Delphi
    Réponses: 23
    Dernier message: 10/08/2006, 22h59
  5. Comment bien gerer la mémoire avec les TStringList?
    Par david_chardonnet dans le forum Langage
    Réponses: 5
    Dernier message: 18/06/2003, 09h57

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