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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    21
    D�tails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 21
    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 : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par d�faut
    Salut,

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

  3. #3
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    21
    D�tails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 21
    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 : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    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.

    @+

  5. #5
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    21
    D�tails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 21
    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 : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    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 ( WideString string )
    {
       ifstream infile = new *ifstream ( "c:\\test.dat", ios::binary );
       int i; 
     
       for (i = 1; i <= string.Length(); i++)
         infile->write( (char*)& string[i], sizeof (wchar_t) );   
     
      infile->close();
    }
    Pour la lecture c'est en gros pareil avec la fonction read au lieu de write...
    Bon courage !

  7. #7
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    21
    D�tails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 21
    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 : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    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 ( WideString string ) 
    { 
       ofstream *outfile = new ofstream ( "c:\\test.dat", ios::binary ); 
       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((char*)& string.Length(), sizeof (int) );
       for (i = 1; i <= string.Length(); i++) 
         outfile->write( (char*)& string[i], sizeof (wchar_t) );    
     
      outfile->close(); 
    }
     
    // Ensuite pour récupérer la chaîne
    void readstring ( void )
    {
       ifstream *infile = new ifstream ( "c:\\test.dat", ios::binary );
       int length, i;
       infile->read((char*)& length, sizeof (int) );
       wchar_t *res = new wchar_t[length];
     
       for (i = 0; i < length; i++)
          infile->read((char*)& res[i], sizeof (wchar_t);
     
       infile->close();
    }
    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 !

  9. #9
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    21
    D�tails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 21
    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 : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    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...

    @+

  11. #11
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    21
    D�tails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 21
    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 averti
    Inscrit en
    Mars 2004
    Messages
    21
    D�tails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 21
    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 : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    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((char*) string.Length(), sizeof (int) );
    cela marchera peut �tre....mais je ne suis pas s�r.

    Bon courage pour la suite de ton projet

+ 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, 13h43
  2. R�ponses: 6
    Dernier message: 09/04/2010, 13h48
  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, 14h12
  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, 10h43
  5. Utilisation de composant sans Form est elle possible
    Par Hypollite76 dans le forum Composants VCL
    R�ponses: 26
    Dernier message: 01/12/2005, 12h07

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