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 :

Charger une liste de mots


Sujet :

C++Builder

  1. #1
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 28
    Points : 6
    Points
    6
    Par défaut Charger une liste de mots
    Bonsoir,


    Voilà, mon problème est que je voudrais charger une liste de mots sur plusieurs colonnes.
    Je m'explique, je dispose d'une feuille de calcul excel avec deux colonnes. Dans chaque colonne il y a un mot sur chaque ligne, sachant que sur une même ligne les deux mots correspondent (par exemple l'un est la traduction de l'autre dans une autre langue).

    Charger la feuille de calcul à partir d'une OpenDialog y'a aucun soucis, mon problème c'est comment recopier le contenu de chaque cellule d'excel dans chaque cellule de la StringGrid... Sachant que je copie le contenu de mon fichier dans une StringList...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if(this->OpenDialog1->Execute()==true)
    {
      AnsiString nomfichier;
      nomfichier=OpenDialog1->FileName;
      TStringList *list=new TStringList;  //Creation de la StringList
      list->LoadFromFile(nomfichier);
     
    ... //remplissage de la StringGrid
     
    delete list;   //effacer le contenu de la StringList
    };
    Mon problème est donc le remplissage de la StringGrid... Si quelqu'un à une idée, helpppppppppppppppp SVP

    a tout hasard j'avais tenté ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        for (int rowint=0;StringGrid1->RowCount;rowint++)
        {
          for (int colint=0;StringGrid1->ColCount ;colint++)
          {
             StringGrid1->Cells[rowint][colint]=list->Strings[0];
             list->Delete(0);
          }
        }
    mais sans grand succès...

  2. #2
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    Déjà tu t'y prends mal.

    Excell n'est pas un format Texte.
    Ce que tu peux faire c'est exporter ton ficher excell en CSV et charger ton CSV, c'est très facile à faire et ça prend quelques minutes.

  3. #3
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 28
    Points : 6
    Points
    6
    Par défaut
    euhhhh oui je veux bien mais encore faut-il que je sache ce que c'est que ce format et comment effectuer la conversion *.xls -> *.csv, puis ensuite remplir ma StringGrid avec ce fichier :s

    Ca serait pas plus simple d'utiliser un fichier texte à la base ? Parce que mon fichier excel est obtenu à partir de l'enregistrement d'une StrinGrid... je l'enregistre et je veux la recharger après

  4. #4
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Salut,
    un fichier CSV (comat separated value) est, en gros, un fichier texte où les valeurs sont séparés par des ';' ou ',' pour les colonnes et tu as autant de lignes que ta feuille excel. (de base c'est ';')
    Si tu veux, excel peut directement te l'enregistrer, au lieu de rajouter l'extension ".xls" tu mets ".csv"
    Voila et en fait tu charges ton fichier comme un fichier texte et ensuite tu le décriptes.
    Un conseil: dans un premier temps enregitre le en ".csv" et réouvre le avec le bloc notes, tu verras ce que tu chargeras, cela sera plus facile à décripter.

  5. #5
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 28
    Points : 6
    Points
    6
    Par défaut
    ouki merci, bon je viens d'essayer d'enregistrer une liste en csv avec excel, sa marche nickel, j'ai vu ce que cela donnai exactement avec le bloc note, pour y décrypter je ne sais pas trop comment je vais faire mais bon on va bien trouver (me semble qu'il y a un topic la dessus ou un tuto)...

    le seul hic dans tout ça c'est que ma liste de mot n'est pas créée avec excel mais avec un StringGrid... l''enregistrer avec la boite de dialogue sous l'extension csv c bien beau mais sa ne me donne pas un véritable fichier csv...

    pour faire simple, je rentre des mots dans un TStringGrid, deux colonnes, x lignes. Ensuite je veux enregistrer cette liste de mots dans un fichier pour pouvoir le recharger ultérieurement dans un autre TStringGrid...

    Excuser moi si je suis lourd mais je débute dans le domaine donc j'ai quelque petits soucis...

  6. #6
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    Je vais essayer de répondre correctement sans savoir ce qu'est un StringGrid, mais a priori je suppose qu'il s'agit d'un tableau graphique de string.

    Un fichier CSV est un fichier séparé par des commas ';' ou ','
    CSV = Comma Separated Values

    L'utilité d'un CSV est que chaque ligne peut-être l'équivalent d'un record dans une db ou d'une ligne d'un tableau excell, et que chaque colonne est un attribut.

    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    1;Mr;Toto;Rue developpez;charleroi
    2;Mr;sWirtel;Rue Linux;charleroi
    Ce que tu vois est le contenu d'un fichier CSV.
    Si tu veux le lire, tu peux employer une TStringList de la manière suivante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    TStringList *list (new TStringList());
    list->LoadFromFile(FILENAME);
    for( int i = 0, count = list->Count; i < count; ++i) {
        // Ici tu dois séparer chaque colonne les un des autres.
        // pour voir simple, essaye de regarder du côté la propriété CommaText.
        // splitter chaque ligne pour obtenir chaque colonne.
        // avec une colonne tu fais ce que tu veux.
    }
    pour écrire,
    tu sauvegardes simplement tes champs de ta structure dans un fichier et tu les sépares tous avec un ';' ou un ',' ensuite tu finis ton record avec un '\n'

  7. #7
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 28
    Points : 6
    Points
    6
    Par défaut
    re salut tout le monde

    je suis toujours avec mon problème pour charger ma liste de mots... bon je pense avoir trouvé pour enregistrer un TStringGrid au format CSV, voici ce que cela donne :

    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
     
    if (this->SaveDialog1->Execute() == true)
    {
            AnsiString NomSave;
     
            NomSave = this->SaveDialog1->FileName;
            TStringList *StrGrd = new TStringList();
            for (int i=0;i<StringGrid1->RowCount;i++)
            {
                    AnsiString Texte;
                    for (int j=1;j<StringGrid1->ColCount;j++)
                    {
                            if (j > 1)
                            Texte += ";";
                            Texte += StringGrid1->Cells[j][i];
                    }
                    StrGrd->Add(Texte);
            }
    StrGrd->SaveToFile(NomSave);
    delete StrGrd;
    }
    Voilà ce que cela donne :
    Français;Anglais
    bonjour;hello
    manger;to eat
    Il y a quand même un hic... a la fin de chaque ligne je n'arrive pas à mettre un "\n". Pourtant, lorsqu'à l'aide de la boite de dialogue j'enregistre mon fichier au format CSV puis que je l'ouvre avec excel, je retrouve bel et bien ma liste de mot rangé dans les ligne et colonnes comme il se doit !

    Dois-je y laisser comme ceci et faire le travail inverse pour recharger ce fichier dans un autre TStringGrid ou bien mettre a tout prix un "\n" pour détecter la fin de ligne ?? si oui comment faire ?

    Merci pour votre aide !

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    perso, je fais de l'export vers CSV, je vois pas l'intéret du retour à la ligne

  9. #9
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 28
    Points : 6
    Points
    6
    Par défaut
    Bon tout ce ci ne me dis pas comment rajouter mon "\n" à la fin d'une ligne... et si quelqu'un aurait une petite idée pour justement faire le travail inverse, cad lire le fichier pour le remettre dans un StringGrid... (Mon prof ne savait même pas que la TStringGrid existait...)

    Bref, toujours en rapport avec cette fameuse StringGrid, avez vous une idée pour réinitialiser son état lors de la fermeture de la Form ??? Si vous voulez, j'ouvre une fenêtre sur laquelle il y a ma StringGrid avec une seule ligne, au fur et a mesure que l'utilisateur entre un mot, cela incrémente le nb de lignes... le problème est qu'a la fermeture de la fenêtre la StringGrid reste en mémoire donc reste intacte tant que le programme n'est pas quitté... Je voudrais donc réinitialiser cette Grid (à la fermeture de la fenêtre) pour pouvoir créer une autre liste...

    Avec mon cllègue on a essayé pas mal de truc, avec la fonction Clear(), la fonction delete, le fait de remplir les cellule à ""

    Merci d'avance !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1° : StringGrid1->Cells=Clear(); //marche pas !
    2° : Clear(StringGrid1->Cells); //marche pas non plus !
    3° : delete StringGrid1; //marche mais bon c'est violent comme méthode car plus de StringGrid :|
    4° : StringGrid1->items->Clear(); //une stringgrid n'a pas d'items :s
    5° : StringGrid1->Cells=""; //marche pas non plus...
    Helppppppp, on commence a désepérer :s, j'ai l'impression de faire de la m***e ...

  10. #10
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir,

    De toutes façons pour vider les cellules, je pense qu'il n'y a pas d'autres solution que de parcourir toutes les lignes et les colonnes a l'aide de boucles telles que celles déja dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (int i=0;i<StringGrid1->RowCount;i++)
    //et
    for (int j=1;j<StringGrid1->ColCount;j++)
    puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    StringGrid1->Cells[i][j] = "";
    ou qqchose dans le genre.
    Pour le nombre de ligne, il suffit de réaffecter a RowCount la valeur initiale avant le chargement....non ?

    @ +

  11. #11
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Si le fichier est formaté comme tu l'as montré :

    Français;Anglais
    bonjour;hello
    manger;to eat
    Dans ce cas tu peux t'inspirer de ceci :

    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
    AnsiString A;
    if(OpenDialog1->Execute())
        {
        TStringList *Fichier = new TStringList;
        Fichier->LoadFromFile(OpenDialog1->FileName);
        int row = StringGrid1->FixedRows;
        int fixed_cols = StringGrid1->FixedCols;
        StringGrid1->RowCount = Fichier->Count + row;
        int n;
        while(Fichier->Count > 0)
            {
            A = Fichier->Strings[0];
            n = A.Pos(";");
            StringGrid1->Cells[fixed_cols][row] = A.SubString(1, n - 1);
            StringGrid1->Cells[fixed_cols + 1][row] = A.SubString(n + 1, A.Length());
            Fichier->Delete(0);
            row++;
            }
        delete Fichier;
        }
    La StringList se vide graduellement au fil du remplissage de la StringGrid.

    A plus !

  12. #12
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 28
    Points : 6
    Points
    6
    Par défaut
    Whaouuuu nickel les mecs ! Ca marche du tonner !!!! Merci bcp !!!


    Par contre j'ai un autre pti soucis, bon ça ne doit pas être grand chose mais c'est chiant...
    En gros je souhaite que les deux première ligne de ma grille soit fixe et déjà écrite lorsque l'utilisateur ouvre la fenêtre contenant la StringGrid. Jusque là pas de problème, j'utilse ce code pour préécrire Français et Anglais dans la Grid :

    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
     
    void __fastcall Tcreationlist::StringGrid1DrawCell(TObject *Sender,
          int ACol, int ARow, TRect &Rect, TGridDrawState State)
    {
    if (ACol == 1 && ARow == 0)
    {
            AnsiString s = StringGrid1->Cells[1][0];
            //StringGrid1->Canvas->Brush->Color = clSilver;
            StringGrid1->Canvas->FillRect(Rect);
            StringGrid1->Canvas->TextOut((Rect.Right + Rect.Left - StringGrid1->Canvas->TextWidth(s)) / 2, (Rect.Top + Rect.Bottom - StringGrid1->Canvas->TextHeight(s)) / 2, s);
    }
     
    if (ACol == 2 && ARow == 0)
    {
            AnsiString s = StringGrid1->Cells[2][0];
            //StringGrid1->Canvas->Brush->Color = clSilver;
            StringGrid1->Canvas->FillRect(Rect);
            StringGrid1->Canvas->TextOut((Rect.Right + Rect.Left - StringGrid1->Canvas->TextWidth(s)) / 2, (Rect.Top + Rect.Bottom - StringGrid1->Canvas->TextHeight(s)) / 2, s);
     
    }
     
    StringGrid1->Cells[2][0]="Anglais";
    StringGrid1->Cells[1][0]="Français";
     
    }
    Effectivement cela fonctionne, mais il y a bug :s, en gros quand j'ouvre la fenêtre j'ai un boutton qui n'est plus la (je suis obligé de déplacer légèrement la fenêtre pour le faire réapparaitre) et les deux case préécrite clignote sans arrêt.
    Si j'enlève ce code, je n'ai plus ce problème... j'ai pas réussi a trouvé l'erreur :s, si vous avez une idée...

  13. #13
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Salut,
    Je pense que ton problème vient de l'évènement que tu as choisi. Cette action est faites à chaque rafraichissement de la StringGrid. Vu que tu n'as besoin d'écrire une fois pour toute, je te conseil de prendre un évènement du genre OnCreate, par exemple à la création de ta Form (ta StringGrid étant dessus).

    Pour la disparition de ton bouton, je ne vois pas trop pourquoi, mais il est possible que le rafraichissement diminué, ce problème soit résolu.

  14. #14
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 28
    Points : 6
    Points
    6
    Par défaut
    nickel mec ! merci, tout était lié au problème de rafraichissement ! Y compris la disparaition du boutton !

    Bon il me reste d'autre petit hic ou des trucs que je ne sais pas faire mais pour le moment je vais chercher tout seul de mon côté... bein oui si ça tombe tout cuit du ciel c'est pas drôle ^^

    Encore merci

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

Discussions similaires

  1. Charger une liste dynamiquement avec AJAX
    Par macra dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 20/10/2006, 21h39
  2. Réponses: 6
    Dernier message: 16/05/2006, 16h17
  3. [Regex][Avis] Méthode de suppression d'une liste de mots
    Par manal dans le forum Collection et Stream
    Réponses: 22
    Dernier message: 15/10/2005, 00h39
  4. Réponses: 4
    Dernier message: 14/10/2003, 08h58

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