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] Comment désactiver la sélection ? [Archives]


Sujet :

Composants VCL Delphi

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Points : 546
    Points
    546
    Par défaut [TRichEdit] Comment désactiver la sélection ?
    Slt,

    J'ai un RichEdit auquelle j'applique quelque traitement au fur et a mesure de son OnChange

    c'est en fait un genre de coloration syntaxique

    pour effectuer les changement de couleur sur le texte,

    je selectionne ce que je veux par un Selstar, sellength
    ensuite, je modifie les selattribute

    mon probleme est visuel, en faisant cela, je vois la selection (inversion de couleur bleu), j'aimerai ne pas la voir

    comment la desactiver ?

    merci

  2. #2
    Membre habitué Avatar de .:morgoth:.
    Profil pro
    Inscrit en
    Février 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 124
    Points : 132
    Points
    132
    Par défaut
    Une fois que tu as terminé toutes les actions que tu veux faire (chgmt de police, couleurs...) tu n'as qu'a repasser la propriété SelStart a -1 pour effacer la sélection non?

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Points : 546
    Points
    546
    Par défaut
    ca je le fais deja, le truc c'est que du coup, la selection fais un clignotement

    j'aimerai ne pas voir la selection, ou bloquer le raffraichissement du richedit, jusqu'à la fin de mon traitement

  4. #4
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Exemple avec, tous les "e" sont mis en rouge pendant l'édition :
    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
    Procedure TForm1.RichEdit1Change(Sender: TObject);
    Var
      x: Integer;
      st: String;
    Begin
      RichEdit1.DoubleBuffered := False;
      st := RichEdit1.Text;
      If (st = '') Then Exit;
      For x := 1 To Length(st) Do
        If (st[x] = 'e') Then
        With RichEdit1 Do Begin
          SelStart := x - 1;
          SelLength := 1;
          SelAttributes.Color := clRed;
          SelStart := x;
          SelAttributes.Color := clBlack;
        End;
      RichEdit1.SelStart := Length(st);
    End;
    Perso, je te conseil d'utiliser un composant plus approprié pour l'édition avec coloration syntaxique -> synedit
    à+
    De retour parmis vous après 10 ans!!

  5. #5
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par Sub0
    Perso, je te conseil d'utiliser un composant plus approprié pour l'édition avec coloration syntaxique -> synedit
    +1
    Tu arriveras difficilement à tes fins si tu utilises le RichEdit. Un composant pour comme SynEdit te facilitera grandement la tâche.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Points : 546
    Points
    546
    Par défaut
    ben disons que avec SynEdit , si j'ai bien compris, on peu pas modifier la liste des mots a coloriser en cours de fonctionnement et moi, ca change tt les 5 minutes et ca depend de l'utilisateur, donc je ne sais pas avant quel seront les mots a coloriser.

    @Sub0 : a kk chose pret c'est ca que je fais mais quand les mots sont long, on voit la selection clignoter

    en gros, ya juste ca que je n'ai pas : RichEdit1.DoubleBuffered := False;
    ca fais quoi ?

  7. #7
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    DoubleBuffered +

    Voici le code pour locker l'affichage du focus:
    RichEdit1.Perform(Messages.WM_USER + 63, WParam(True), LParam(False));

    Et pour le délocker :
    RichEdit1.Perform(Messages.WM_USER + 63, WParam(False), LParam(False));

    Voici une démo complète !
    Les mots "test", "color" et "select" possèdent leur propre police...
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    Unit Unit1;
    Interface
    Uses Windows, Classes, Forms, Graphics, Messages, Controls,
         SysUtils, StdCtrls, ExtCtrls, ComCtrls;
     
    Type
      TForm1 = Class(TForm)
        RichEdit1: TRichEdit;
        Button1: TButton;
        Procedure FormCreate(Sender: TObject);
        Procedure RichEdit1Change(Sender: TObject);
        Procedure Button1Click(Sender: TObject);
      End;
     
    Var
      Form1: TForm1;
     
    {----------------------------------------------------------------}
    {                       }Implementation{                         }
    {----------------------------------------------------------------}
    {$R *.DFM}
     
    Type
      TSyntax = Record
        Mot: ShortString;
        Color: TColor;
        Style: TFontStyles;
        Size: Integer;
        Name: TFontName;
      End;
     
    Var
      ASyntax: Array Of TSyntax;
     
    {----------------------------------------------------------------}
    Procedure AddSyntax(AMot:ShortString; AColor:TColor;
      AStyle:TFontStyles; ASize:Integer; AName:TFontName);
    Begin
      SetLength(ASyntax, High(ASyntax) + 2);
      With ASyntax[High(ASyntax)] Do
      Begin
        Mot := AMot;
        Color := AColor;
        Style := AStyle;
        Size := ASize;
        Name := AName;
      End;
    End;
     
    {----------------------------------------------------------------}
    Procedure TForm1.FormCreate(Sender: TObject);
    Begin
      RichEdit1.DoubleBuffered := False;
      AddSyntax('test', clRed, [fsBold], 10, 'Lucida console');
      AddSyntax('color', clBlue, [fsItalic, fsBold], 12, 'Terminal');
      AddSyntax('select', clGreen, [fsUnderline], 14, 'Verdana');
    End;
     
    {----------------------------------------------------------------}
    Procedure TForm1.RichEdit1Change(Sender: TObject);
    Var
      x, i, p, s: Integer;
      st: String;
    Begin
      st := RichEdit1.Text;
      If (st = '') Then Exit;
      RichEdit1.Perform(Messages.WM_USER + 63, WParam(True), LParam(False));
      s := RichEdit1.SelStart;
      x := 1;
      Repeat
        With RichEdit1, SelAttributes Do
        Begin
          For i := 0 To High(ASyntax) Do
          Begin
            p := Pos(ASyntax[i].Mot, Copy(st, x, Length(ASyntax[i].Mot)));
            If (p = 1) Then
            Begin
              SelStart := x - 1;
              SelLength := Length(ASyntax[i].Mot);
              Color := ASyntax[i].Color;
              Style := ASyntax[i].Style;
              Size := ASyntax[i].Size;
              Name := ASyntax[i].Name;
              SelLength := 0;
              SelStart := s;
              x := x + Length(ASyntax[i].Mot);
              Break;
            End;
          End;
          If (p = 0) And (x <= Length(st)) Then
          Begin
            SelStart := x - 1;
            SelLength := 1;
            Color := Font.Color;
            Style := Font.Style;
            Size := Font.Size;
            Name := Font.Name;
            SelLength := 0;
            SelStart := s;
            x := x + 1;
          End;
        End;
      Until (x > Length(st));
      RichEdit1.Perform(Messages.WM_USER + 63, WParam(False), LParam(False));
    End;
     
    {----------------------------------------------------------------}
    Procedure TForm1.Button1Click(Sender: TObject);
    Begin
      ASyntax[0].Mot := 'nouveau'; // Remplace "test"
    End;
     
    {----------------------------------------------------------------}
    End.
    L'action du bouton te permettra de voir comment changer le mot d'une syntaxe...
    Ce qu'il faut que tu saches, c'est que plus ton texte à traîter est long, plus le traitement sera long (logique).
    Il faut donc ne traîter que la ligne en cours d'édition...
    A toi de trouver comment le faire (je ne vais pas tout te donner non plus) ^^
    Bon courage, à+

    De retour parmis vous après 10 ans!!

  8. #8
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Points : 546
    Points
    546
    Par défaut
    Je te remerci, je vais tester ca !

    Ce qu'il faut que tu saches, c'est que plus ton texte à traîter est long, plus le traitement sera long (logique).
    Il faut donc ne traîter que la ligne en cours d'édition...
    A toi de trouver comment le faire (je ne vais pas tout te donner non plus) ^^
    Bon courage, à+
    Lol, t'inquiete pas, je viens pas sous traiter le code que je veux ici,
    mon compo est bien avancé et je ne traite que le mot qui est en cours de modif

    je te remerci pour ces infos !

  9. #9
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Points : 546
    Points
    546
    Par défaut
    Ca marche nickel merci !

    comment tu as trouvé ca ?

    en cas, jvais voir pour faire de meme avec le curseur, ne pas le voir se deplacer lors de la modif du selstart

  10. #10
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    J'ai trouvé ce code sur le forum, à l'occasion du développement d'une interface graphique pour un tchat :
    http://sub0.developpez.com/delphi/rxdiag.zip

    J'avais essayé aussi avec LockWindowUpdate()...
    D'ailleurs, je crois que tu peux remplacer RichEdit1.Perform() par cette fonction :
    • Pour locker l'affichage : LockWindowUpdate(RichEdit1.Handle);
    • Pour délocker : LockWindowUpdate(0);

    Sinon, reste la possibilité d'essayer de locker l'affichage avec ceci :
    • Pour locker l'affichage : RichEdit1.Enabled := False;
    • Pour délocker : RichEdit1.Enabled := True; ActiveControl := RichEdit1;

    Je te conseille d'utiliser la dernière solution si elle fonctionne, à+

    De retour parmis vous après 10 ans!!

  11. #11
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Chez moi ceci fonctionne très bien : http://sub0.developpez.com/delphi/syntax.zip
    • Pour locker l'affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RichEdit1.Enabled := False;
    • Pour délocker :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    RichEdit1.Enabled := True;
    ActiveControl := RichEdit1;
    SetCursorPos(Mouse.CursorPos.X - 1, Mouse.CursorPos.Y);
    SetCursorPos(Mouse.CursorPos.X + 1, Mouse.CursorPos.Y);
    De retour parmis vous après 10 ans!!

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    J'ai implémenté un éditeur de fichier INI (en utilisant un tRichEdit) qui colore sections, clés, valeurs et commentaires en cours de frappe ... seul petit hic c'est lors de l'ouverture du fichier, il faut tout peindre d'un coup vu que le fichier n'est pas sauvé au format RTF ... sinon le reste fonctionne bien ... c cool :-)

  13. #13
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Points : 546
    Points
    546
    Par défaut
    moi j'en ai fais un composant qui me permet de modifier en tant reel la liste des mots a coloriser

    tu as plusieurs couleurs toi ?

    ca m'interresserai de voir ton code (si possible)

    mon mail : jbdemonte@insidefr.com

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

Discussions similaires

  1. Comment désactiver le curseur du TRichEdit
    Par Ardely dans le forum Delphi
    Réponses: 10
    Dernier message: 18/03/2007, 16h48
  2. [TRichEdit] Comment modifier le style d'une sélection ?
    Par PpPool dans le forum Composants VCL
    Réponses: 2
    Dernier message: 15/11/2005, 10h16
  3. [Warning] comment désactiver un Warning précis?
    Par bigboomshakala dans le forum MFC
    Réponses: 5
    Dernier message: 01/06/2004, 16h07
  4. Réponses: 8
    Dernier message: 24/07/2003, 10h45
  5. Comment désactiver Ctrl+Alt+Del sous Windows XP
    Par ETOKA dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 04/06/2003, 13h34

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