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

C++Builder Discussion :

Désactiver copier/couper/coller d'un TMemo


Sujet :

C++Builder

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 27
    Par défaut Désactiver copier/couper/coller d'un TMemo
    Bonjour à tous,

    J'aimerai désactiver les fonctions de Copier/Couper et Coller d'un TMemo, (que j'utilise pour faire de l'affichage seulement).

    J'ai trouvé des bout des de solutions sur des sites anglais, à savoir intercepter les messages windows WM_COPY, WM_CUT. mais je bloque sur l'implémentation


    Je vous remercie d'avance de votre aide

  2. #2
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Tous les contrôles de la VCL possèdent une méthode WindowProc que tu peux rediriger pour capter ces messages.

    Pour un exemple regarde mon blogue: http://www.optimatek.com/2010/03/tex...une-liste-vide

  3. #3
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Est-ce que l'utilisateur dois pouvoir écrire dans le Memo, ou il s'agit uniquement d'un affichage pour ton programme?

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 27
    Par défaut
    Merci pour vos réponses rapides,
    Non l'utilisateur ne doit pas écrire dans la zone, c'est purement de l'affichage.

    Crayon,

    Ton exemple correspond à ce que je veux faire. Par contre j'ai un soucis à la compilation. La ligne suivante me génère une erreur du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Classes::TWndMethod OldListViewProc;
    TWndMethod n'est pas un membre de Classes
    J'avoue que sa dépasse (encore ) mes compétences! Que veux dire ce mot "Classes"?

  5. #5
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Si c'est pour de l'affichage, pourquoi utiliser un Memo???
    Utilise un composant qui ne permet pas à l'utilisateur de faire des copier/coller pour afficher tes informations...
    Sinon tu met la propriété Enabled à false, ce qui rendra l'accès au texte du Memo impossible à l'utilisateur...

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 27
    Par défaut
    J'utilise un Memo, pour gérer l'affichage de façon plus facile... Le texte que j'affiche peut faire 2 mots jusqu'à une 20 lignes (dans ce cas le schroll est bien pratique).

    Le fait de mettre enable à false, m'affiche les text en "gris"... Et doit certainement me désactiver la schroll bar..

    sat83, Peut être une autre idée de composant qui pourrai être utilisé?

    La solution de Crayon me semblait bien!!! Je suis preneur pour tout autre idée..

    En tout cas, merci!

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    Salut

    Tiens voilà , deux événements

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void __fastcall TForm1::Memo1ContextPopup(TObject *Sender,
       TPoint &MousePos, bool &Handled)
    {
    keybd_event(VK_ESCAPE,0,1,0); //touche enfoncé
    keybd_event(VK_ESCAPE,0,2,0); //touche relevé
    // SetCursorPos(int,int);    // éventuellement deplacer le curseur
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Memo1Enter(TObject *Sender)
    {
    Memo1->ReadOnly=true; // ou définis le sur le oncreate de la form
    }
    On simule la pression d echap pour refermer le menu contextuel

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 048
    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 048
    Par défaut
    ReadOnly ?

    EDIT : Grillé par Sedni !

    J'utilisais parfois un StaticText, mais pour 20 lignes, cela peut être génant !

    Sinon pour reprendre la proposition de Sedni, il y a Handled qui est conçu pour cela, très pratique lorsque l'on veut fournir un menu personnalisé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void __fastcall TForm1::Memo1ContextPopup(TObject *Sender,
       TPoint &MousePos, bool &Handled)
    {
      Handled = true;
    }
    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

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    Parcontre j arrive encore à faire une selection et utiliser ctrl+c

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    Voilà çà fonctionne enfin , pas de clic droit , ni de selection + raccourcis clavier

    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
    void __fastcall TForm1::Memo1ContextPopup(TObject *Sender, TPoint &MousePos, bool &Handled)
    {
    Handled = true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Memo1Enter(TObject *Sender)
    {
    Memo1->ReadOnly=true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Memo1KeyPress(TObject *Sender, char &Key)
    {
    OpenClipboard(NULL);
    EmptyClipboard();
    }

  11. #11
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Si tu es intéressé à utiliser ma méthode, alors la voici. Par contre, il va falloir la jumelé à d'autre mentionné plus haut si tu désires empêcher l’apparition du menu avec un clique droit. Si tu veux empêcher l'édition il va falloir mettre la propriété ReadOnly à true.

    Dans le .h il faut ajouter ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        void __fastcall MemoWndProc(Messages::TMessage &Message);
        TWndMethod OldMemoProc;
    Voici le .cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
    {
        OldMemoProc = Memo1->WindowProc;
        Memo1->WindowProc = MemoWndProc;
    }
     
    void __fastcall TForm1::MemoWndProc(Messages::TMessage &Message)
    {
        if(Message.Msg == WM_COPY || Message.Msg == WM_CUT || Message.Msg == WM_PASTE)
        {
            return;
        }
        OldMemoProc(Message);
    }
    Peut-être que tu veux aussi le message WM_CLEAR.

  12. #12
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    sat83, Peut être une autre idée de composant qui pourrai être utilisé?
    A voir selon ton usage, mais on peut par exemple imaginer:
    -Une TListBox
    -Un TLabel dans un TScrollBox

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 27
    Par défaut
    Bonsoir,

    Je suis arrivé à une solution qui marche très bien, je clos le sujet, en vous remerciant tous...

    remus08

  14. #14
    Membre du Club
    Homme Profil pro
    Concepteur Electronique
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Concepteur Electronique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Par défaut Simplicité,...Efficacité :)
    Bonjour,

    La réponse au problème aurait été profitable à beaucoup...

    Je travaille en Delphi mais je rencontre un problème similaire, à savoir que je souhaite employer les facilités d'un TMemo mais juste en affichage. Hors, même avec ReadOnly à true, les touches fléchées que j'intercepte par ailleurs provoquent une sélection dans le texte... pire en combiné avec Shift (surbrillance). J'ai dans l'idée que l'on peut faire la même chose en C++.

    Une solution simple à ajouter à la propriété ReadOnly qui n’empêche pas la sélection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
         key := 0;
    end;
    Pour Delphi en tout cas...

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

Discussions similaires

  1. Menu édition: copier, couper, coller..
    Par rudhf dans le forum Windows Forms
    Réponses: 9
    Dernier message: 02/06/2007, 19h47
  2. [VB6] copier,couper,coller un texte
    Par guizmoh dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 27/03/2006, 22h05
  3. [Word] Problème de copier/couper/coller suivant les versions
    Par SkYsO dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 07/12/2005, 21h11
  4. [VB6] Interception des évènement Copier/Couper/Coller
    Par youtch dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 18/10/2002, 17h09

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