IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Téléchargé 16 fois
Vote des utilisateurs
0 
0 
Détails
Licence : Non renseignée
Mise en ligne le 11 avril 2025
Plate-forme : Windows
Langue : Français
Référencé dans
Navigation

TSyntaxMemo un mémo à coloration syntaxique très simple (VCL)

Un composant qui permet la coloration syntaxique dans un descendant de TCustomMemo.
TSyntaxMemo permet de distinguer de manière paramétrable les mise en forme de :
•Des mots-clés comme par exemple "Begin", "End" etc.
•Des caractères spéciaux comme ";" , "=" etc.
•Des commentaires mono ou multi-lignes symbole de délimitation paramétrable.
•Des nombres entiers en représentation décimale, hexadécimal, octal, binaire. Préfixe non paramétrable.

D’autre part TSyntaxMemo permet de gérer :
•La taille des tabulations.
•Des marges gauche et droite (imperfection pour la marge droite)
•Le numéro de la première ligne affichée.
•Le numéro de ligne courante. (possibilité de gérer des signets)
•Les évènements OnVScroll (scrolling vertical) et OnMouseWheel.
•Des caractères entre quotes (chaînes par exemple) mono ou multi-lignes, le symbole de délimitation étant paramétrable
•Des nombres réels en virgule fixe ou flottante (avec une petite imperfection peu gênante)

Il reste quelques petites imperfections que je n’ai pas (encore) réussi à éliminer mais le fonctionnement est globalement satisfaisant compte tenu du fait que ce n’est pas un traitement de texte et que je n’ai pas la prétention d’offrir un éditeur aussi sophistiqué que Notepad++ ou l’EDI de Delphi.
D’autant plus que tout ça tiens dans une seule unité de 550 lignes / 17 Ko.
Avatar de Andnotor
Rédacteur/Modérateur https://www.developpez.com
Le 11/04/2025 à 12:57
Citation Envoyé par AbeBar27 Voir le message
OK, mais quel est l'avantage ? Dans les ancêtres, Loaded fait de l'initialisation.
Et bien par exemple créer le contrôle dynamiquement, ce qu'a voulu faire rMist2024. Loaded n'est pas appelé dans ce cas.
Loaded permet de prendre des mesures en fonction de ce qui est lu dans le dfm et n'a pas d'autre vocation.

Citation Envoyé par AbeBar27 Voir le message
Les méthodes Loaded et CreateWnd sont toutes deux protected et virtual du coup ça me semblait équivalent de surcharger l'une ou l'autre.
Du tout ! Loaded est appelé une seule fois au chargement, CreateWnd est appelé à chaque changement de handle (qui peuvent par exemple survenir sur RecreateWnd).

Citation Envoyé par AbeBar27 Voir le message
Le code est-il plus efficace (compact, rapide...) si on surcharge CreateWnd pluôt que Loaded ?
Non mais tu prends le risque de perdre les réglages si le handle change puisqu'ils sont associés à un handle devenu invalide.
Avatar de AbeBar27
Membre habitué https://www.developpez.com
Le 09/04/2025 à 21:51
Bonjour,

Je vous propose un nouvel élément à utiliser : TSyntaxMemo un mémo à coloration syntaxique très simple (VCL)

Un composant qui permet la coloration syntaxique dans un descendant de TCustomMemo.

TSyntaxMemo permet de distinguer de manière paramétrable les mise en forme de :



Des mots-clés comme par exemple "Begin", "End" etc.



Des caractères spéciaux comme ";" , "=" etc.



Des commentaires mono ou multi-lignes symbole de délimitation paramétrable.



Des nombres entiers en représentation décimale, hexadécimal, octal, binaire. Préfixe non paramétrable.



D’autre part TSyntaxMemo permet de gérer :



La taille des tabulations.



Des marges gauche et droite (imperfection pour la marge droite)



Le numéro de la première ligne affichée.



Le numéro de ligne courante.



Les évènements OnVScroll (scrolling vertical) et OnMouseWheel.

Il reste quelques petites imperfections que je n’ai pas (encore) réussi à éliminer mais le fonctionnement est globalement satisfaisant compte tenu du fait que ce n’est pas un traitement de texte et que je n’ai pas la prétention d’offrir un éditeur aussi sophistiqué que Notepad++ ou l’EDI de Delphi.

D’autant plus que tout ça tiens dans une seule unité de 550 lignes / 17 Ko.

Des nombres réels en virgule fixe ou flottante (avec une petite imperfection peu gênante)



Des caractères entre quotes (chaînes par exemple) mono ou multi-lignes, le symbole de délimitation étant paramétrable

Qu'en pensez-vous ?
Avatar de ALWEBER
Membre émérite https://www.developpez.com
Le 10/04/2025 à 14:28
J'ai voulu tester sur Delphi XE11 mais j'ai un petit probleme avec la propriété Color
Avatar de AbeBar27
Membre habitué https://www.developpez.com
Le 10/04/2025 à 15:08
Citation Envoyé par ALWEBER Voir le message
J'ai voulu tester sur Delphi XE11 mais j'ai un petit probleme avec la propriété Color
Quel est le problème ? S'agit-il de la propriété Color du SyntaxMemo ?
Il est bien possible que la version XE11 ne gère pas les symboles de couleur tels que clAntiqueWhite...
Avatar de AbeBar27
Membre habitué https://www.developpez.com
Le 11/04/2025 à 10:07
Citation Envoyé par rMist2024 Voir le message
Bonjour,
J'ai fait un simple test pour créer le contrôle sans installation, le programme entre en boucle infinie:
Code : Sélectionner tout
1
2
3
4
5
6
7
8
var
 SyntaxMemo: TSyntaxMemo;
begin
     SyntaxMemo:= TSyntaxMemo.Create(Self);
     SyntaxMemo.Parent := self;
     SyntaxMemo.Align := alClient;
     SyntaxMemo.Text := 'test'
end;
Désolé une erreur de ma part, j'ai mis dans les sources une mauvaise version des fichiers dans lesquels il manquait la ligne :
kEndText := kSeparateurs+[#10]+kKeyChars;
dans le constructeur TSyntaxMemo.Create.
Du coup, kEndText est vide quand on créé un nouveau composant, ce qui fait entrer dans une boucle sans infine à la fin de la méthode TexteSuivant.
Ca devrait mieux marcher maintenant.
Avatar de AbeBar27
Membre habitué https://www.developpez.com
Le 11/04/2025 à 10:32
Citation Envoyé par SergioMaster Voir le message
Bonjour,

Testé avec D12.2

Pour moi plusieurs points sont à soulever.
il manque le bpl, donc impossible de tester directement le projet,
Le Bpl se trouve dans le fichier zip, répertoire Bpl.

Tout ce qui est initialisation me fait tiquer
A mon avis, il devrait être possible d'en faire des propriétés du composant.
C'est mon choix de ne pas en faire des propriétés. Une grammaire n'a pas besoin d'être changée fréquemment.

enfin, seules les {} sont considérées comme commentaires (cf image plus haut)
adieu les formes comme // un commentaire ou (* un autre commentaire *), quid des /// un commentaire de documentation
Non non... On peut très bien avoir des commentaires // un commentaire
On peu même choisir le caractère et s'il faut ou non le doubler comme ; uncommentaire de fichier .ini

Du coup, comme il n'est que VCL l'utilisation de bibliothèque déjà existante comme SynEdit, ne serait-ce pas, quelque part, réinventer une roue en bois pleine alors que l'on a la possibilité d'un truc plus complet (selon mes souvenirs)?
Je connais Synedit, mais comme je le dis en introduction dans ma doc :
J’ai essayé plusieurs composants (SynEdit, PlusMemo, TextEditor…) qui sont assez complets et performants mais que je trouve un peu lourd de mise en oeuvre.
Il me semble que c'est plus simple non ???
Avatar de Andnotor
Rédacteur/Modérateur https://www.developpez.com
Le 11/04/2025 à 10:55
Loaded n'est appelé que si lecture depuis le dfm pour traiter les données stockées, ce n'est pas fait pour de l'initialisation. Ce qui figure dans cette méthode doit être réparti entre le constructeur d'une part et une surcharge de CreateWnd pour ce qui nécessite un handle (tabulations, couleurs).

Sinon ça fonctionne mais ces constantes modifiables...
Procéder ainsi limite aussi la mise en évidence à un seul langage par application. Pas possible par exemple de comparer Delphi et du C.
A la place des classes dérivées de TPersistent pour des réglages par l'inspecteur d'objets.

Et il ne faut pas qu'un commentaire multilignes ait plus de FStartOffset lignes masquées sinon c'est cuit.

Le but est-il de supporter des versions antérieures à XE7 ? Sinon un parser à base d'expressions régulières simplifierait grandement le code.
Avatar de AbeBar27
Membre habitué https://www.developpez.com
Le 11/04/2025 à 12:32
Citation Envoyé par Andnotor Voir le message
Loaded n'est appelé que si lecture depuis le dfm pour traiter les données stockées, ce n'est pas fait pour de l'initialisation. Ce qui figure dans cette méthode doit être réparti entre le constructeur d'une part et une surcharge de CreateWnd pour ce qui nécessite un handle (tabulations, couleurs).
OK, mais quel est l'avantage ? Dans les ancêtres, Loaded fait de l'initialisation. Les méthodes Loaded et CreateWnd sont toutes deux protected et virtual du coup ça me semblait équivalent de surcharger l'une ou l'autre.
Le code est-il plus efficace (compact, rapide...) si on surcharge CreateWnd pluôt que Loaded ?

Sinon ça fonctionne mais ces constantes modifiables...
Procéder ainsi limite aussi la mise en évidence à un seul langage par application. Pas possible par exemple de comparer Delphi et du C.
A la place des classes dérivées de TPersistent pour des réglages par l'inspecteur d'objets.
J'ai bien insisté sur le fait que c'est un composant simple. Il existe d'excellents éditeurs gratuits qui sont multi-langages comme Notepad++
(Quand j'étais en âge de conduire j'aurais aimé que mes parents m'offre une moto. Mais j'aurais voulu pouvoir faire de la route, du trial, du cross...
Finalement ils m'ont offert un vélomoteur... Je m'en suis contenté)


Et il ne faut pas qu'un commentaire multilignes ait plus de FStartOffset lignes masquées sinon c'est cuit.
FStartOffset est fait pour ça et paramétrable. Il suffit de l'augmenter en fonction de la hauteur du mémo de manière à ce que les lignes affichées soient correctement analysées.

Le but est-il de supporter des versions antérieures à XE7 ? Sinon un parser à base d'expressions régulières simplifierait grandement le code.
Non, ce n'était pas le but. En fait je voulais au départ un truc très simple pour afficher des fichiers de configuration qui ne comportent que 4 mots-clés, 2 caractères spéciaux etc. (ce qui est définis par défaut)
Par contre, merci de m'indiquer une méthode potentiellement plus efficace, je vais regarder ça.
Avatar de AbeBar27
Membre habitué https://www.developpez.com
Le 11/04/2025 à 13:19
Citation Envoyé par Andnotor Voir le message
Et bien par exemple créer le contrôle dynamiquement, ce qu'a voulu faire rMist2024. Loaded n'est pas appelé dans ce cas.
Loaded permet de prendre des mesures en fonction de ce qui est lu dans le dfm et n'a pas d'autre vocation.

Du tout ! Loaded est appelé une seule fois au chargement, CreateWnd est appelé à chaque changement de handle (qui peuvent par exemple survenir sur RecreateWnd).

Non mais tu prends le risque de perdre les réglages si le handle change puisqu'ils sont associés à un handle devenu invalide.
Compris, je vais tester cette modification. Merci, j'ai appris quelque chose d'important.
En l'état actuel, les initialisations dans Loaded ne devraient pas être affectées par un changement de handle.
Le problème rencontré par rMist2024 était lié à une erreur de ma part : j'avais copier une mauvaise version des sources dans laquelle une ligne manquait dans le constructeur.
J'ai corrigé.
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.