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

MFC Discussion :

CRichEditCtrl rtf chargé tronqué


Sujet :

MFC

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 28
    Par défaut CRichEditCtrl rtf chargé tronqué
    Bonjour

    Dans mon application, j'ai un CRichEditCtrl pour afficher le contenu d'un fichier RTF.

    Pour le charger, j'utilise le StreamInCallback.

    Ceci fonctionne parfaitement, sauf si le fichier est trop long.

    Par exemple si j'ai un fichier de 40000 caracteres (en rtf avec un source de 100000 octets) , seuls les 33000 premiers caractères sont affichés.

    En debug, au bout d'un certain nombre d'appels, le streamincallback n'est plus rappelé.

    J'ai fait le test avec des exemples d'utilisation du CRichEditCtrl et le résultat est le même.

    Le problème ne semble pas venir de mon RTF car celui-ci fonctionne parfaitement dans Word ou wordpad.

    Faut il faire une manipulation spéciale pour les fichiers de grosse taille ?

    Merci

  2. #2
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Tu passes directement de ton fichier au CRichEditCtrl, ou tu passes par un buffer intermédiaire genre CString ou TCHAR ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 28
    Par défaut
    Je passe directement par le fichier avec la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReadFile(hFile,pbBuff,cb,&bytesRead,NULL);

  4. #4
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Colle-moi ton code stp que je regarde en détail tout ça.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 28
    Par défaut
    Voici un exemple réduit.

    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
     
    BOOL LoadRTFFile(HWND hEdit, char * pFileName)
    {
        if(!pFileName)
            return FALSE;
     
        HANDLE hFile;
        EDITSTREAM es;
     
        // ouvrir un fichier prêt pour la lecture
     
        hFile = CreateFile(pFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL, 0);
     
        if(hFile==INVALID_HANDLE_VALUE)
            return FALSE;
     
        es.dwCookie = (DWORD)hFile;
        es.pfnCallback = StreamInCallback;
        es.dwError = 0;
        SendMessage(hEdit, EM_STREAMIN, SF_RTF, (LPARAM)&es);
        SendMessage(hEdit, EM_SETMODIFY, 1, 0);
     
        // ferme le fichier
        CloseHandle(hFile);
        return TRUE;
    }
     
    DWORD CALLBACK StreamInCallback(DWORD dwCookie, LPBYTE lpBuf, LONG cb, LONG * pcb)
    {
        ReadFile((HANDLE)dwCookie, lpBuf, cb, (DWORD*)pcb, NULL);
        return 0;
    }

  6. #6
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Au lieu de :
    SendMessage(hEdit, EM_STREAMIN, SF_RTF, (LPARAM)&es);
    Essaye :
    (CRichEdit *)hEdit->StreamIn(SF_RTF, es);
    perso j'y crois moyen à l'envoi de message au CRichEdit quand il s'agit d'être synchrone ...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 28
    Par défaut
    Même resultat, cela n'a rien changé.

    Ce qui est étrange, je passe bien plusieurs fois dans le callback stream in
    mais pas suffisament, cela s'arrete avant la fin du fichier.

  8. #8
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Trace les tailles des blocs de bytes passés en paramètre de ta méthode callback. Normalement après chaque ReadFile (sauf le dernier) tu devrais avoir *pcb == cb.
    De plus je t'invite à récupérer les retours de cette même fonction et éventuellement faire aussi appel à GetLastError.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 28
    Par défaut
    Chose interessante, si je met le format SF_TEXT, tout le contenu de mon fichier est chargé (bien sur le RTF n'est pas pris en compte).

    As tu déjà fait le test avec un fichier RTF d'une trentaine de pages bien remplies ?

    Concernant le chargement des blocs, sur mon fichier qui fait 125451 octets, je passe 20 fois dans mon streamin callback sans aucune erreur ce qui fait un volume de 81840 octets.

  10. #10
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Ton fichier ne serait-il pas en Unicode par hasard ?

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 28
    Par défaut
    Les fichiers peuvent venir de différentes sources, je ne maitrise pas leur origine.
    mais mon fichier d'exemple n'est pas unicode.

    En revanche mon programme est compilé en unicode.

    Faut il faire quelque chose de particulier pour les fichiers unicode ?

    PS : le richedit ne veut pas de mon fichier même avec un copier coller, le contenu est tronqué exactement au même endroit.

  12. #12
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Le RTF est un format en ASCII, en clair il ne peut pas être en Unicode. Par contre il peut contenir du texte en Unicode (pas les balises elle-mêmes), pour lequel 1 caractère Unicode pourra être représenté par plusieurs caractères ASCII.

    En partant de ce constat, assure-toi que ton CRichEdit ne reçoit pas un flux RTF qui serait malheureusement codé en Unicode !

    Pour en revenir à ton histoire de fichier, c'est à se demander si ton fichier n'est pas pourri ... si tu as moyen de me l'envoyer je peux regarder si ça fait le même pb chez moi.

    Question subsidiaire : quelle version du CRichEdit utilises-tu ?

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 28
    Par défaut
    Ceci le fait avec n'importe quel fichier rtf volumineux.

    Pour être sur que cela ne venait pas de mon fichier de test, j'ai généré un lorem ipsum de 65000 caracteres sur le site suivant :

    http://www.docmemo.com/divers/lorem.php

    j'ai copié le contenu de ce texte dans word et j'ai enregistré en RTF

    Lorsque je charge ce rtf dans mon application, seuls les 32000 premiers caracteres s'affichent.

    Pour information, j'utilise le RichEdit20W dans une application compilée en unicode.

    Merci de ton aide.

  14. #14
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Donc tu as bien un problème avec Unicode.
    Remplace :
    - CreateFile par CreateFileA
    - ReadFile par ReadFileA

    Le problème devrait être réglé.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 28
    Par défaut
    Alors non rien à voir.

    En faisant quelques tests, je me suis rendu compte qu'on ne pouvait même pas ajouter des caractères à la suite du texte avec le clavier.

    J'ai donc pensé à une limitation en nombre de caractères.

    Et par défaut la limite est de 0x7FFF soit 32000 caracteres.

    J'ai envoyé le message EM_EXLIMITTEXT avec la quantité de caractères désirés (128 000 par exemple) et tout est rentré dans l'ordre.

    Merci quand même pour le temps passé et les conseils.

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

Discussions similaires

  1. [Jasper 3.0.1]Texte tronqué dans les RTF
    Par maloups dans le forum Jasper
    Réponses: 2
    Dernier message: 13/11/2008, 17h52
  2. Reports9i texte tronqué sur sortie RTF
    Par bellig dans le forum Reports
    Réponses: 0
    Dernier message: 14/04/2008, 13h59
  3. [MS-SQL2000] Requete tronquée
    Par Righetto Dominique dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/06/2003, 17h59
  4. convertir rtf en html
    Par busard dans le forum Langage
    Réponses: 2
    Dernier message: 08/02/2003, 12h08
  5. Algorithme de conversion de RTF vers HTML
    Par youtch dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 10/09/2002, 12h35

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