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 :

[D2010] Intercepter le WM_PASTE dans un TRichEdit


Sujet :

Composants VCL Delphi

  1. #1
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 681
    Points : 7 112
    Points
    7 112
    Par défaut [D2010] Intercepter le WM_PASTE dans un TRichEdit
    Comment intercepter le WM_PASTE dans un TRichEdit ?

    J'ai essayé de passer par une WindowProc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.RichEditProc(var Msg: TMessage);
    begin
       if Msg.Msg = WM_PASTE then
       begin
          if IsClipboardFormatAvailable(CF_UNICODETEXT) then
          begin
             Label1.Caption := ClipBoard.AsText;
             Exit;
          end;
       end;
     
       _OldRichEditProc(Msg);
    end;
    Mais, il n'entre même pas dans le premier if, comme si ce message n'était utilisé.

    J'ai essayé d'utiliser un TApplicationEvents. Mais, le message WM_PASTE ne passe jamais.
    J'ai essayé de traquer tous les messages qui passent pour essayer de deviner lequel serait le bon.
    J'obtiens : 15, 275, 675, 513, 514, 512, 280.
    Si je converti en hexadécimal et que je cherche dans l'unité Messages, ça donne : WM_PAINT, WM_TIMER, WM_MOUSELEAVE, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE.
    Le seul qui n'a pas de correspondance, c'est le 280 (donc 118 en hexadécimal). Ce lien (http://social.msdn.microsoft.com/for...9-f5a0ed0d2e0a) a l'air de dire que ce serait WM_SYSTIMER.
    Donc, je ne vois rien qui ressemblerait à un WM_PASTE.

    Comment faire ?


  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 710
    Points : 25 593
    Points
    25 593
    Par défaut
    WM_PASTE ne concerner les controles mono-lignes ou alors multi-ligne simple comme le TMemo

    Le RichEdit est un TCustomEdit dans la hiérarchie Delphi mais l'est-il vraiment dans la hiérarchie Windows, il est tout de même gérer par une DLL spécifique, à mon avis ce n'est pas un "edit control" au sans Windows du terme

    le RichEdit gère le formattage lors du copier-coller comme WordPad, il doit gérer tout ça en interne via EM_PASTESPECIAL

  3. #3
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 681
    Points : 7 112
    Points
    7 112
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    le RichEdit gère le formattage lors du copier-coller comme WordPad, il doit gérer tout ça en interne via EM_PASTESPECIAL
    J'ai regardé pour voir si je voyais passer EM_PASTESPECIAL, mais apparement non.

    Citation Envoyé par ShaiLeTroll Voir le message
    il doit gérer tout ça en interne
    Ca veut dire que c'est pas possible, alors ?

    Le but était de capturer le texte collé dans un RichEdit, avant qu'il ne soit collé, pour supprimer les éventuels caractères parasites, quand la copie est faite dans une page web ou office.

  4. #4
    Membre habitué
    Inscrit en
    Juillet 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2007
    Messages : 113
    Points : 170
    Points
    170
    Par défaut
    Sur le soft que je maintiens on a ajouté une action standard (TEditPaste) sur la form mère, les ctrl+v passent par son OnExecute et sur les RichEdit nous avons redéfinis les PopupMenu. De cette manière nous gérons nous même les copier coller en utilisant un TClipboard

  5. #5
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 681
    Points : 7 112
    Points
    7 112
    Par défaut
    Citation Envoyé par tenpigs Voir le message
    Sur le soft que je maintiens on a ajouté une action standard (TEditPaste) sur la form mère, les ctrl+v passent par son OnExecute et sur les RichEdit nous avons redéfinis les PopupMenu. De cette manière nous gérons nous même les copier coller en utilisant un TClipboard
    Très bonne idée !
    Effectivement, un TAction avec un raccourci [Ctrl+V] dans un TPopupMenu associé au RichEdit, fonctionne bien.
    C'est mieux que ce que j'essayais d'imaginer avec un TAtom et un WM_HOTKEY.

    Avec ta solution, j'arrive bien a intercepter l'action de coller, et à modifier le contenu du presse-papier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.Coller1Click(Sender: TObject);
    var
       sz: String;
    begin
       if IsClipboardFormatAvailable(CF_UNICODETEXT) then
       begin
          sz := ClipBoard.AsText;
          CopierDansPressePapier(sz + 'TEST');
       end;
     
       SendMessage(GetFocus, WM_PASTE, 0, 0);
    end;

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

Discussions similaires

  1. colorier ligne dans un TRichEdit
    Par didi59650 dans le forum Composants VCL
    Réponses: 7
    Dernier message: 14/04/2006, 14h10
  2. Touche Delete dans un TRichEdit
    Par Griswold dans le forum Composants VCL
    Réponses: 2
    Dernier message: 21/12/2005, 00h44
  3. Autocompletion de mot dans un trichedit
    Par mteirek_m dans le forum Composants VCL
    Réponses: 3
    Dernier message: 01/06/2005, 21h22
  4. Position d'une ScrollBar dans un TRichEdit (ou TMemo)
    Par Troll dans le forum C++Builder
    Réponses: 9
    Dernier message: 24/02/2005, 16h18
  5. Comment avoir des marges dans un TRichEdit ?
    Par nomdutilisateur dans le forum Composants VCL
    Réponses: 5
    Dernier message: 25/06/2004, 10h57

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