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

Composants VCL Delphi Discussion :

[TRichEdit] Problème de chargement


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de djeckelle
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2004
    Messages : 87
    Par défaut [TRichEdit] Problème de chargement
    Bonjour à tous ,

    Il y a quelque temps j'ai demandé comment accroître la capacité de mon TricheEdit et j'ai eu la réponse très brillante de Lung
    SendMessage(RichEdit1.Handle, EM_EXLIMITTEXT, 0, $7FFFFFF0);
    Ceci fonctionne très bien dans 95% des cas de mes fichiers.

    Mais aujourd'hui j'ai des fichiers d'1,4 Mo qui contiennent environ 1500 lignes toutes similaires :

    [:ZP:O:U:A:ZW:01]
    _IM=6
    _IP=A
    _IV=0
    _RU=USD

    [NECES]
    Q:Z:1:1:1:3P:01=Q ~ E ~ D
    Q:Z:1:1:2:3P:01=Q ~ E ~ D
    Q:Z:1:1:3:3P:01=Q ~ E ~ D
    Q:Z:1:1:4:3P:01=Q ~ E ~ D
    Q:Z:1:1:5:3P:01=Q ~ E ~ D
    Q:Z:1:1:6:3P:01=Q ~ E ~ F

    Mon richedit met presque 60 mn à se charger pour ces fichiers.

    Par contre j'ai d'autres fichiers qui font plus de 10Mo et pour lequels je n'ai aucun soucis......

    Avez vous une idée?


    Bonne et heurese année à tous

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Pense à Lines.BeginUpdate et Lines.EndUpdate ...
    Comment les charges-tu ?
    Le RichEdit est obligatoire ? Besoin de Formattage (Gras, Italique, ...)
    Pourquoi pas un TMemo et essayer aussi d'agrandir sa capacité (32Mo normalement)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre confirmé Avatar de djeckelle
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2004
    Messages : 87
    Par défaut
    Salut,

    J'ai besoin d'un TRichEdit car j'ai effectivement de la mise en forme de ligne.

    Pour le chargement :
    Mon fichier est récupéré via un service RPC sur un serveur Unix....je n'ai pas droit au ftp

    J'ai donc une méthode qui appelle une DLL qui me permet d'appeller la fonction RPC du serveur, et qui charge le fichier dans une stringlist.

    Ensuite pour charger mon fichier dans le RichEdit, j'ai une boucle qui parcours la stringlist ligne à ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
          redtFichier.clear;
          for icpt := 0 to lstFichier.Count - 1 do
          begin
            redtFichier.Lines.Append(lstFichier.Strings[icpt]);
            ggeProgression.Progress := icpt;
          end;
    Il n'y a rien de bien sorcier, je ne pensais pas être bloqué pour si peu

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Salut,

    J'ai besoin d'un TRichEdit car j'ai effectivement de la mise en forme de ligne.
    ...
    J'ai donc une méthode qui ... et qui charge le fichier dans une stringlist.

    Ensuite pour charger mon fichier dans le RichEdit, j'ai une boucle qui parcours la stringlist ligne à ligne.
    ... si je comprends bien le "qui charge le fichier dans une stringlist" tu charges le PlainText du fichier avec tous ses paramètres de formattage rtf dans la StringList et ensuite t'as toute une usine à gaz pour décrypter le formattage et restituer la mise en forme de tes lignes.

    Suggestion : charges le fichier dans un MemoryStream et ensuite remplaces l'usine à gaz en question par RichEdit1.Lines.LoadFromStream(monStream); cela devrait être plus rapide.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #5
    Membre confirmé Avatar de djeckelle
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2004
    Messages : 87
    Par défaut
    …tu charges le PlainText du fichier avec tous ses paramètres de formatage rtf dans la StringList et ensuite t'as toute une usine à gaz pour décrypter le formatage et restituer la mise en forme de tes lignes.
    Non, non, non rassure toi Gilbert je n'ai pas fait une usine à gaz comme ça.

    Le fichier de base n'a pas de formatage, c'est un fichier de donnée, par contre une fois qu'il est affiché, l'utilisateur peut effectuer une recherche et les lignes correspondant sont affichées surlignées. On affiche également en rouge les lignes qui ne contiennent pas les bons champs.

    Par contre j'ai appliqué Lines.BeginUpdate et Lines.EndUpdate je gagne un peu de temps mais ce n'est pas le summum...de 64 mn je passe à 35mn.

    J'ai creusé un peu plus, mon fichier contient 142000 lignes, le richedit se charge ligne à ligne...c'est normal que ce soit un peu long, mais le plus étrange est que c'est très rapide au début et au fur et à mesure le temps de traitement d'une ligne ralenti beaucoup.

    J'ai vu dans l'aide Delphi que l'on pouvait chargé un Stream ou un fichier...mais je n'ai pas de fichier physique pour alimenté le MemoryStream. Mon fichier est récupéré via une focntion d'une DLL dans un buffer (Widestring) à partir d'un serveur Unix. (Je ne peux pas changer ce processus, il m'est imposait).

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Re-Salut,

    Donc la lenteur du chargement ne provient pas de la mise en forme puisque celle-ci est déclenchée par l'utilisateur.


    J'ai creusé un peu plus, mon fichier contient 142000 lignes, le richedit se charge ligne à ligne...c'est normal que ce soit un peu long, mais le plus étrange est que c'est très rapide au début et au fur et à mesure le temps de traitement d'une ligne ralenti beaucoup.
    ... c'est normal car avec du Update et du redtFichier.Lines.Append(lstFichier.Strings[icpt]); dans une boucle cela raffraîchit l'affichage à chaque tour de boucle et plus on ajoute des lignes à la fin du RichEdit plus ça ralentit.
    C'est comme si tu demandais à un coursier de poser une pierre de plus à la fin d'une ligne droite formée par une série de pierres qui s'allonge chaque fois que tu lui demandes de recommencer : la durée du trajet s'allonge chaque fois !
    En plus ta boucle est aussi ralentie à chaque tour de boucle par le raffraichissement d'un progressBar (vu le ggeProgression.Progress := icpt; )


    Essaye donc de remplacer ta boucle par une assignation en une seule ligne avec redtFichier.Lines.Assign(lstFichier);
    ... j'avais remarqué qu'avec assign le chargement d'un RichEdit est plus rapide qu'avec Add et qu'avec Append.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

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

Discussions similaires

  1. Problème de chargement d'un TRichEdit
    Par djeckelle dans le forum Composants VCL
    Réponses: 3
    Dernier message: 18/12/2007, 09h56
  2. [OC][ASE]Problème de chargement de pilote ODBC
    Par Joce dans le forum Sybase
    Réponses: 10
    Dernier message: 06/01/2006, 09h08
  3. [SQL*Loader] Problème de chargement de nombres
    Par sebduth dans le forum Oracle
    Réponses: 10
    Dernier message: 18/11/2005, 10h07
  4. Adaptation d'un code TMemo vers TRichEdit : problème de ScrollBars
    Par Droïde Système7 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 21/01/2005, 15h06
  5. Problème de chargement de police de caractères
    Par Laurent Gomila dans le forum Windows
    Réponses: 4
    Dernier message: 19/08/2004, 16h11

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