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 :

est il possible de serialiser un composant visuel ?


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 21
    Points : 16
    Points
    16
    Par défaut est il possible de serialiser un composant visuel ?
    Bonjour.
    J'aurai besoin de serialiser une stringgrid avec les valeurs de ses cellules pour pouvoir les recuperer.
    Il s'agit bien de serialiser l'objet ( pas d'enregistrer dans un fichier texte les valeurs et d'initialiser une stringGrid ).
    Si vous savez comment faire ?
    Merci d'avance.

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Salut,

    excuse ma question mais cela veut dire quoi "sérialiser" ?
    Neilos

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 21
    Points : 16
    Points
    16
    Par défaut que veut dire serialiser.
    Peut etre on ne dit pas serialiser un objet.

    La serialisation permet d'enregistrer sur disque des objets. Elle permet ainsi de conserver l'etat des objets entre deux executions d'un programme, ou d'echanger des objets entre programmes.

    Le probleme est que je ne sais pas si C++ peut le faire contrairement a Java qui le fait tres facilement.

    Donc dans mon cas, j'aurai besoin de conserver l'etat de ma stringgrid entre deux executions mais si j'enregistre les valeurs de mes cellules dans un fichier classique, ca ne marche pas parce que les valeurs sont un peu particulieres, c'est pour cela que j'ai pense enregistrer l'etat de ma Stringgrid avec l'espoir de pouvoir la recuperer avec les bonnes valeurs.
    Si tu as une idée. Elle est la bienvenue

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Oui voila comment je ferais,

    j'y irait à la bourrin si un fichier classique ne fonctionne pas. Tu crée ton propre de fichier de sauvegarde en utilisant les classes ifstream et ofstream (entête fstream.h).

    Ensuite tu parcours ton StringGrid et tu enregistre toi même et au format que tu veux tes données dans ton fichier.

    Voilà si tu as besoin d'un exemple plus précis indique moi quel type de données tu utilises et je pourrais t'en donner un.

    @+
    Neilos

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 21
    Points : 16
    Points
    16
    Par défaut WideString
    La stringgrid que j'utilise a l'air d'avoir des WideString comme type dans ses cellules (en fait cette stringgrid permet d'afficher les caracteres japonais, quand j'enregistre dans un fichier texte, tout se transforme en ????? ), je voudrais pouvoir garder l'unicode des cellules dans un fichier binaire.
    Si tu peux me donner un bout de code pour ecrire et lire dans un fichier des types widestring, tu pourrais peut etre me sauver mon projet qui a cause de cela tombe a l'eau.
    Merci.

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Salut voilà comment moi je fais pour stocker des données dans un fichier. Je te propose de stocker les caractères un a un.

    Voilà par exemple une routine qui te permet d'écrire une chaîne dans un fichier :

    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
     
     
    // Je ne respecte pas la séparation fichier .h et .cpp pour plus de lisibilité
    #include <fstream.h>
     
    // Ta fonction prend juste la chaîne en paramètre
    // et crée le fichier
    void write_in_file &#40; WideString string &#41;
    &#123;
       ifstream infile = new *ifstream &#40; "c&#58;\\test.dat", ios&#58;&#58;binary &#41;;
       int i; 
     
       for &#40;i = 1; i <= string.Length&#40;&#41;; i++&#41;
         infile->write&#40; &#40;char*&#41;& string&#91;i&#93;, sizeof &#40;wchar_t&#41; &#41;;   
     
      infile->close&#40;&#41;;
    &#125;
    Pour la lecture c'est en gros pareil avec la fonction read au lieu de write...
    Bon courage !
    Neilos

  7. #7
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 21
    Points : 16
    Points
    16
    Par défaut ok super
    Super ton code me permet maintenant de pouvoir lire les caracteres japonais dans mon fichier de sauvegarde ( grand pas en avant ) donc je devrais pouvoir les recuperer en lecture.
    (petite correction il faut faire ofstream pour enregistrer et non ifstream)
    Mais je ne sais pas comment lire et placer le resultat dans mon composant TEdit.
    Peux tu egalement me donner le bout de code pour lire ?
    Merci beaucoup

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Salut,

    oui c'était effectivement un ofstream et pas un ifstream...
    Justement tu va utiliser le ifstream.
    Par contre pour la lecture il va d'abord falloir modifier l'écriture.

    La fonction d'écriture :
    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
     
    void write_in_file &#40; WideString string &#41; 
    &#123; 
       ofstream *outfile = new ofstream &#40; "c&#58;\\test.dat", ios&#58;&#58;binary &#41;; 
       int i, size; 
     
       // Comme dans ton ficheir tu veux sauvegarder plusieurs chaines
       // de caractères à la suite il faut que tu stocke le nombre de caractères
       // et ensuite seulement la chaîne
       outfile->write&#40;&#40;char*&#41;& string.Length&#40;&#41;, sizeof &#40;int&#41; &#41;;
       for &#40;i = 1; i <= string.Length&#40;&#41;; i++&#41; 
         outfile->write&#40; &#40;char*&#41;& string&#91;i&#93;, sizeof &#40;wchar_t&#41; &#41;;    
     
      outfile->close&#40;&#41;; 
    &#125;
     
    // Ensuite pour récupérer la chaîne
    void readstring &#40; void &#41;
    &#123;
       ifstream *infile = new ifstream &#40; "c&#58;\\test.dat", ios&#58;&#58;binary &#41;;
       int length, i;
       infile->read&#40;&#40;char*&#41;& length, sizeof &#40;int&#41; &#41;;
       wchar_t *res = new wchar_t&#91;length&#93;;
     
       for &#40;i = 0; i < length; i++&#41;
          infile->read&#40;&#40;char*&#41;& res&#91;i&#93;, sizeof &#40;wchar_t&#41;;
     
       infile->close&#40;&#41;;
    &#125;
    Par contre comme je n'ai jamais utilisé le type WideString je ne sais pas comment recopier le tableau res dans une WideString.
    Un simple = suffirait peut être.

    Je n'ai pas le temps de tester ce que je viens d'écrire...aussi s'il y a des erreurs dans le code que je t'ai donné en exemple corrige les et poste la correction, pour les autres lecteurs....

    Merci d'avance....si tu as encore besoin d'aide demande !

    @+ et bon courage !
    Neilos

  9. #9
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 21
    Points : 16
    Points
    16
    Par défaut tout compile mais...
    j'utilise ton code. Je compile tout sans probleme mais a l'execution, il y a une erreur de std::badalloc.
    En deboguant je me suis apercu sur ces deux lignes un probleme sur length :
    infile->read((char*)& length, sizeof (int) );
    wchar_t *res = new wchar_t[length];

    mon fichier test ne fait que 6K mais la length generee avoisine les 814000000 .
    Peut etre c'est normal mais le programme plante a la ligne fonce.
    Si tu as une idee ?

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Salut,

    je pense que ce doit être une erreur de lecture de la taille de la chaîne de caractère. Execute la fonction de chargement pas à pas et regarde la valeur de length. Si elle est vraiment trop grand c'est qu'il y a une erreur de lecture.
    Par exemple il se peut que tu soit décalé en lecture par rapport à ce que tu écris : si par exemple du stocke TAILLE CARACTERE 1 CARACTERE 2

    et que tu lit CARACTERE 1 en le prenant pour TAILLE cela va créer des problèmes...

    Si tu ne trouve vraiment pas d'erreur envoie moi ton code d'écriture et de lecture par message privé. Je verrais si je trouve quelque chose qui ne tourne pas rond...

    @+
    Neilos

  11. #11
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 21
    Points : 16
    Points
    16
    Par défaut C'est presque resolu.
    Salut Neilos
    J'ai finalement trouve la solution pour ecrire et lire mes caracteres dans le fichier. Mais.... pour trouver la solution j'ai simplifie au maximun le programme pour faire les tests.
    Donc maintenant avec une longueur de WideString connu (en dur) tout marche. Ton idee de l'enregistrer avant est bonne mais la ligne :
    outfile->write((char*)& string.Length(), sizeof (int) );
    Ne compile pas.
    [C++ Erreur] Unit1.cpp(104): E2027 Doit prendre l'adresse d'un emplacement mémoire
    La je ne comprends pas ce qui se passe. Si tu as une idee.
    Merci.

    PS:le resolu est tout pres, merci.

  12. #12
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 21
    Points : 16
    Points
    16
    Par défaut Trouve
    En fait il faut creer un integer:
    int size = string.Length();
    outfile->write((char *) & size , sizeof (int) );
    et le tour est joué.

    Je peux avoir ma longueur enregistree et mes caracteres.
    Merci Neilos.

  13. #13
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Oui effectivement il faut créer un integer.
    Par contre peut être que si tu fait juste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    outfile->write&#40;&#40;char*&#41; string.Length&#40;&#41;, sizeof &#40;int&#41; &#41;;
    cela marchera peut être....mais je ne suis pas sûr.

    Bon courage pour la suite de ton projet
    Neilos

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

Discussions similaires

  1. [D6] Est-il possible de poser des bookmarks visuels ?
    Par Lung dans le forum Composants VCL
    Réponses: 2
    Dernier message: 17/05/2011, 14h43
  2. Réponses: 6
    Dernier message: 09/04/2010, 14h48
  3. Est il possible d'ajouter des composants WPF a un simple form?
    Par NoussaL dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 30/10/2008, 15h12
  4. [AJAX] Appel de méthode de composant via ajax, est-ce possible ?
    Par Shivaneth dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 06/03/2008, 11h43
  5. Utilisation de composant sans Form est elle possible
    Par Hypollite76 dans le forum Composants VCL
    Réponses: 26
    Dernier message: 01/12/2005, 13h07

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