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 :

[RichEdit] Est-il possible d'afficher le numéro des lignes ?


Sujet :

Composants VCL Delphi

  1. #1
    Invité
    Invité(e)
    Par défaut [RichEdit] Création d'un éditeur de code source à partir d'un RichEdit
    Bonjours,
    je suis actuellement en train de développer un éditeur de code source en Delphi. J'ai choisis pour ça d'utiliser le composant "RichEdit".
    Je me heurte aujourd'hui à un problème :
    est-il possible d'afficher le numéro des lignes du rich-edit?
    En effet, on envisage mal un éditeur de code sans le numéro des lignes...
    Je n'ai rien trouvé à se sujet sur internet, qqn aurait-il la solution à mon problème?
    Dernière modification par Invité ; 17/04/2008 à 17h58.

  2. #2
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Je ne crois pas que se soit possible. Le RichEdit est fait pour saisir du RTF. Donc du texte avec des retours à la ligne automatique, remis en page en fonction de la largeur du composant...

    Pour faire un éditeur de code source, pourquoi ne pas utiliser SynEdit ? Il est fait exactement pour ça et gère tout : numéro de ligne, coloration syntaxique...

  3. #3
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Citation Envoyé par Franck SORIANO Voir le message
    Pour faire un éditeur de code source, pourquoi ne pas utiliser SynEdit ? Il est fait exactement pour ça et gère tout : numéro de ligne, coloration syntaxique...
    +1 à 100% tout est fait par le composant

  4. #4
    Invité
    Invité(e)
    Par défaut
    Merci pour votre suggestion, mais en fait ce projet est dans le cadre de mon bts, je dois réaliser un éditeur de code. Je ne pense pas que le jury aprécirai si j'utilisai un composant tout fait

  5. #5
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut

    Citation Envoyé par darnold Voir le message
    je dois réaliser un éditeur de code. Je ne pense pas que le jury aprécirai si j'utilisai un composant tout fait
    inspire toi donc de ce composant, pour voir comment il gère la numérotation des lignes, la coloration syntaxique, etc. pour pouvoir créer le tien. ce sera très instructif, et pas pour autant gagné d'avance

  6. #6
    Invité
    Invité(e)
    Par défaut
    C'est pas bête, mais comment trouver le code de ce composant? La documentation fourni ne m'aide pas trop!
    Faute de trouver, j'envisage une solution :
    placer une liste d'environ 1/2 cm de large à gauche de ma richEdit, contenant les numéro de ligne en face des ligne, et qui serait mise à jour automatiquement avec la position du scroolbar du richEdit.
    En tt cas merci pour vos conseils!

  7. #7
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    les sources des composant synedit sont disponibles dans le répertoire "SynEdit\source". autre solution, si tu as bien configuré les chemins, dans l'EDI tu fait Ctrl+clic gauche sur une classe de la bibliothèque SynEdit et ca ouvrira le fichier source dans lequel cette classe est déclarée. ou encore, menu contextuel sur le nom de la classe puis choisir l'option "chercher la déclaration".

  8. #8
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Citation Envoyé par darnold Voir le message
    Merci pour votre suggestion, mais en fait ce projet est dans le cadre de mon bts, je dois réaliser un éditeur de code. Je ne pense pas que le jury aprécirai si j'utilisai un composant tout fait
    En BTS on te demande de réaliser un éditeur de code qui fasse la coloration syntaxique !

    Ca m'a l'air bien compliqué. Je connais beaucoup de développeur diplômé qui ne sont pas capable d'en faire autant.

    Tu es sûr que tu ne cherche pas à en faire trop ? Si c'est le cas, fait attention du temps où je faisais mes études, les profs n'appréciaient pas vraiment qu'on en fasse plus que ce qui était demandé. Dans ces cas, si tu avais le malheur d'avoir la moindre imperfection dans ce qui était demandé, tu te faisais démolir en flèche : "vous êtes vraiment bizarre, vous perdez du temps à faire des choses qu'on ne vous demande pas (et donc qui ne vous rapportera rien), alors qu'il y a des non conformités dans ce qui vous est demandé".

  9. #9
    Invité
    Invité(e)
    Par défaut
    Le BTS il m'impose de faire 5 projets de développement, pour en présenter oralement un seul, choisis par un jury. C'est nous qui choisisons nos projets, et j'ai choisi ça car c'est original et que c'est le genre de truc que les jury de ce BTS aimes bien parrait-il.
    Pour ce qui est la coloration syntaxique, c'est pas si compliqué que sa qd on se penche vraiment sur la question!
    De toute manière je ne vais pas changer de projet maintenant que j'y ai passé plusieurs dixaines d'heures ! Mais merci qd même pour les conseils, tout est bon à prendre ! Ne pas en faire trops, mais faire bien ce qu'on doit faire. C'est noté

  10. #10
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Dans ce cas c'est différent. Si tu es libre de définir ton propre sujet, autant en choisir un qui te permettes d'en mettre plein la vue au jury . Le tout c'est que tu sois motivé et que tu t'en sentes capable.

    Dans l'exemple dont je parlais, c'étais pour des sujets de TPs parfaitement définits par les profs (et pas dans le cadre d'un BTS non plus).

    Pour ce qui est la coloration syntaxique, c'est pas si compliqué que sa qd on se penche vraiment sur la question!
    Comme on dit : "rien n'est compliqué quand on sait comment faire !".

    Dans ton cas, le plus compliqué à mon avis ce n'est pas la coloration syntaxique en elle même, c'est de synchroniser la coloration du RichEdit, en même temps que la saisie du code.
    J'ai déjà vu des projets de ce type, le résultat n'est pas toujours très concluant.

    Bon courage.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Dans ton cas, le plus compliqué à mon avis ce n'est pas la coloration syntaxique en elle même, c'est de synchroniser la coloration du RichEdit, en même temps que la saisie du code.
    Je confirme !
    Et je te confirme également que mon résultat pr l'instant n'est pas très performant en terme de rapidité, surtout lorsque j'ouvre un gros fichier avec tout plein de code à l'interieur à coloriser
    Normalement je pense qu'il faudrai être un peu calé dans la théorie des langages pour pouvoir faire un éditeur digne de se nom! (ce qui n'est pas mon cas tu l'aura deviné )

  12. #12
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Tu peux consulter ce post de notre ami Sub0

    A+

  13. #13
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Normalement je pense qu'il faudrai être un peu calé dans la théorie des langages pour pouvoir faire un éditeur digne de se nom! (ce qui n'est pas mon cas tu l'aura deviné )
    Non pas vraiment, l'essentiel c'est du traitement de texte. Quel type d'algorithme est-ce que tu utilises pour faire la coloration syntaxique ?

    A mon avis, le problème pour avoir de bonnes performances c'est le RichEdit. L'idéal serait plutôt d'écrire ton propre composant qui dessine lui même le texte à l'écran. Comme ça tu peux le faire en temps réel sans problèmes perfs. Mais ça nécessite encore plus de travail.

    Mais bon, pour un projet de BTS, je pense que tu dois pouvoir te contenter d'un truc qui fonctionne à peu près bien sur une cinquentaine de lignes de codes.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Tu peux consulter ce post de notre ami Sub0
    Cool cet algo, mais malheuresement il ne gère que le problème le plus simple : la coloration mot clé par mot clé. La ou c'est plus chaud c'est qd on rentre dans les histoire de commentaires multilignes, de chaine de caractères, etc...

    Pour l'algo moi j'ai pris créé une classe "langage", qui a des méthode auquelles on passe des chaines de caractère et sa nous indique si c'est un mot clé, un commentaire, etc.
    Ensuite dans le richedit je gère ligne par ligne au fur et à meusure de la frappe, et je regarde à quoi correspond ce qui est en train d'être tappé en appelant ces méthodes. Aprés c'est un simple imbriquement de "if else" qui me gère tout sa. Et c'est gagné

  15. #15
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Cool cet algo, mais malheuresement il ne gère que le problème le plus simple : la coloration mot clé par mot clé. La ou c'est plus chaud c'est qd on rentre dans les histoire de commentaires multilignes, de chaine de caractères, etc...
    Tant mieux si ça te plait. Moi je ne trouve pas que ce soit une bonne façon de procéder. D'abord parce que comme tu l'as dit, ça permet uniquement de mettre en couleur certains mots clés, ensuite parce que d'un point de vu performance, tu passe ton temps à tester plusieurs fois le même caractère dans le code source...

    Pour l'algo moi j'ai pris créé une classe "langage", qui a des méthode auquelles on passe des chaines de caractère et sa nous indique si c'est un mot clé, un commentaire, etc.
    C'est un bon début. Mais comment est-ce que tu découpe tes chaînes de caractères en entrée ? En fait, il faudrait que ta classe "langage" fasse elle même le découpage.

    Pour traiter ce genre de problème, il te faut un parser (c'est ta classe langage). C'est à dire, une classe à qui tu donnes le code source complet, puis que tu vas utiliser pour lire le code, élément par élément.

    Ca se traite avec un automate d'états finis, qui va te découper le code en symboles terminaux :
    - Je viens de lire un identificateur "if", c'est un mot clé du langage.
    - Je viens de lire un identificateur "blabla", ce n'est pas un mot clé du langage.
    - Je viens de lire un commentaire multi-ligne "{ dfgjh fkjgshf kgdsfkgsdk}".
    - Je viens de lire un blanc.
    - Je viens de lire un symbole.
    - Je viens de lire une chaine de caractères.
    - Je viens de lire un retour à la ligne.
    - Je suis à la fin du fichier.

    D'un côté, tu lis le code source séquenciellement avec le parser, et de l'autre, tu ré-ecris les symboles trouvés dans le RichEdit avec la couleur et le style qui va bien.

    Aucunes questions à se poser, chaque caractères du code source est lu une et une seule fois ! Pas besoin de if-then-else...

    Après tu repositionnes le curseur dans le RichEdit à la position ou il se trouvait avant le formatage.

    Ensuite dans le richedit je gère ligne par ligne au fur et à meusure de la frappe, et je regarde à quoi correspond ce qui est en train d'être tappé en appelant ces méthodes.
    Attention, il est fréquent qu'on utilise les commentaires pour désactiver des blocs entier de code.
    Si tu travaille ligne par ligne comme tu le dis, ta coloration sera fausse si du code est mis en commentaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    { On neutralise ce truc jusqu'à nouvel ordre.
       i := i * 3; // Petit commentaire.
    }
      i := i + 1;

  16. #16
    Invité
    Invité(e)
    Par défaut
    Ca se traite avec un automate d'états finis, qui va te découper le code en symboles terminaux
    Effectivement on m'avais déjà parlé de sa... en fait qd je parlais de théorie des langage je pensais à ça. Le problème c'est que je n'y connais rien à cet histoire d'automate et que je n'y comprend pas grand chose, que je n'ai plus que 2 semaine pour terminer ce projet et que j'ai déjà trops avancé l'algorithme de coloration "à ma manière" pour avoir le courage de le reprendre...

    Après tu repositionnes le curseur dans le RichEdit à la position ou il se trouvait avant le formatage.
    Si je comprend bien ton histoire, tu effectue la coloration sur l'intégralité du code à chaque saisie?... je ne suis pas sûr de comprendre ce que tu m'explique. Parce que si c'est le cas, moi je me contente de regarder le "mot courant" aprés chaque saisie, ce qui est plus rapide je pense non?

    Si tu travaille ligne par ligne comme tu le dis
    En fait j'ai di ça pour résumer, mais dans la réalité je travaille à plusieurs niveau differents, du plus "large" au moins "large" :
    1/ est ce que la saisie en cour se trouve dans un commentaire? si oui, on active le format "commentaire" et on sort de l'algo, si non je continu l'algo
    2/ est ce que la saisie en cour se trouve dans une chaine de caractère? si oui, idem, sinon je continu l'algo
    3/ idem, je regarde si je suis dans une directive préprocesseur ( #blablabla )
    4/ si on était dans aucun des cas précédent, je regarde si c'est un mot clé.

    En fait je part du plus global au plus restreint, ce qui fait qu'en réalité durant la saisie je ne fait pas trops de calculs.

    Là ou je suis moins performant, c'est pour colorier une grosse portion de code (par exemple après l'ouverture d'un fichier) parsque pour ça j'ai voulu réutiliser mon algorithme précédent, et du coups ma démarche consiste tout simplement à faire parcourir à mon curseur la totalité du code du début à la fin, exactement comme si on le saisisait à la main.

    Sauf que du coups j'ai effectivement des choses qui sont testé plusieurs fois. C'est la que l'histoire des automates est surement plus interessante que ma "bidouille"...

  17. #17
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Si je comprend bien ton histoire, tu effectue la coloration sur l'intégralité du code à chaque saisie?
    Oui c'est exactement ça.
    Imagine le cas suivant :
    - Tu tappes ton code, tu fait la coloration syntaxique.
    - Tu remonte sur la première ligne et tu ajoutes une ouverture de commentaire. Du coup, la totalité du code se trouve à l'intérieur du commentaire. Il faut bien refaire la coloration du tout.

    Autre cas, tu déplaces simplement le curseur. Il faut bien que tu remontes voir ce qui se trouve avant pour savoir si tu n'es pas à l'intérieur d'un commentaire...

    On peut certainement trouver des règles pour élaguer et accélérer le traitement en ne traitant pas tout à chaque fois. Cependant il faut être sûr de soit.

    En fait j'ai di ça pour résumer, mais dans la réalité je travaille à plusieurs niveau differents, du plus "large" au moins "large" :
    1/ est ce que la saisie en cour se trouve dans un commentaire? si oui, on active le format "commentaire" et on sort de l'algo, si non je continu l'algo
    2/ est ce que la saisie en cour se trouve dans une chaine de caractère? si oui, idem, sinon je continu l'algo
    3/ idem, je regarde si je suis dans une directive préprocesseur ( #blablabla )
    4/ si on était dans aucun des cas précédent, je regarde si c'est un mot clé.
    C'est justement le début d'un automate d'états fini.

    Au début je suis dans l'état rien du tout :
    - Je lit le premier caractère, c'est une lettre. C'est donc le début d'un identificateur. Je passe dans l'état "Lecture d'un identificateur".
    - Le premier caractère est un ', c'est le début d'une chaîne de caractères, je passe dans l'état chaîne de caractères.

    Si je suis dans l'état "lecture d'un identificateur" :
    Je lit un caractère :
    - Tant que c'est un chiffre, une lettre ou un '_', je continu à lire.
    - Lorsque je suis sur autre chose, j'ai trouvé la fin de l'identificateur. Mon automatique repasse dans l'état du début et fournit l'identificateur trouvé en sortie.

    Ce principe permet de traiter le fichie source complète en ne lisant chaque caractère qu'une et une seule fois.
    Après il existe différentes façons de le coder, if-then-else imbriquer, case-of, matrices état/transition...
    Il existe aussi des outils qui génère les parser automatiquements.

    Mais ce que tu as fait est déjà un bon début. Tu n'as plus qu'à continuer. Pour ce qui est des perfs, avec un RichEdit, il ne faut de toute façon pas s'attendre à quelque chose de mirobolant.

  18. #18
    Invité
    Invité(e)
    Par défaut
    Oki ben sa à l'air simpa tout sa, domage qu'on ne m'ai pas expliqué sa avant sa m'aurai simplifié la vie. C'est pas grave maintenant je vais continuer à ma manière. Merci en tout cas pour toutes ces précision c'est cool de prendre du temps pr expliquer tout sa ! Surtout à minuit 16
    Thx

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

Discussions similaires

  1. Afficher les numéros des lignes dans l'éditeur
    Par hammag dans le forum Sql Developer
    Réponses: 5
    Dernier message: 02/04/2024, 09h45
  2. Réponses: 9
    Dernier message: 05/02/2015, 13h58
  3. [8.5]Afficher le numéro des lignes
    Par Invité dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 30/04/2007, 12h24
  4. [W3C] Est-il possible d'afficher un div par dessus une applet ?
    Par drinkmilk dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 23/02/2005, 10h22
  5. Réponses: 3
    Dernier message: 29/07/2003, 09h38

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