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

 Delphi Discussion :

Désactiver copier/coller dans un Tedit


Sujet :

Delphi

  1. #1
    Membre régulier
    Désactiver copier/coller dans un Tedit
    Salut
    mes amis comment faire pour désactiver copier /coller dans un Tedit.
    Et merci

  2. #2
    Futur Membre du Club
    Salut

    Je ne sais pas si c'est possible, en tout cas j'en ai pas entendu parler.
    Sinon tu peux peut être utiliser l'événement OnChange du Tedit.
    Par exemple si t'as une variable qui mémorise la valeur actuelle du Tedit :

    Tu initialises cette variable avec la valeur du Tedit.
    Puis dans l'événement OnChange, tu compares la longueur de la variable avec la nouvelle valeur du Tedit.
    Si il y a une différence de nombre de caractère supérieure à 1, alors il y a eu un "copier coller".
    Et tu peux remplacer la valeur du Tedit par ta variable pour revenir a l'état précédent comme si il n'y avait pas eu de "copier coller".
    Si la différence n'était que de 1, là tu écrases la valeur de la variable par la nouvelle valeur du Tedit.

    En espérant ne pas t'avoir embrouillé xD

    Ça fait peut être un peu bidouille par rapport a une solution magique qui interdirait le copier coller, mais si ça peut t'aider quand même

  3. #3
    Membre éprouvé
    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
    unit unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, stdctrls;
     
    type
      { TEdit overclass ---------------------------- }
     
      TEditOption  = (eoAllowEdit, eoAllowContextMenu, eoAllowCopy, eoAllowPaste, eoAllowCut, eoAllowUndo);
    {
    eoAllowEdit : permet d'activer ou non la saisie au clavier
    eoAllowContextMenu : permet d'activer ou non le menu contextuel par defaut
    eoAllowCopy : permet d'activer ou non le raccourcis CTRL+C (copier)
    eoAllowPaste: permet d'activer ou non le raccourcis CTRL+V (coller)
    eoAllowCut : permet d'activer ou non le raccourcis CTRL+X (couper)
    eoAllowUndo: permet d'activer ou non le raccourcis CTRL+Z (annuler)
    }
      TEditOptions = set of TEditOption;
     
      TEdit = Class(StdCtrls.TEdit)
      private
        FEditOptions : TEditOptions;
        procedure WMChar(var Message: TWMChar); message WM_CHAR;
        procedure WMContextMenu(var Message: TWMContextMenu); message WM_CONTEXTMENU;
        procedure WMPaste(var Message); message WM_PASTE;
        procedure WMCopy(var Message); message WM_COPY;
        procedure WMCut(var Message); message WM_CUT;
        procedure WMUndo(var Message); message WM_UNDO;
      public
        constructor Create(AOwner : TComponent); override;
        Property EditOptions : TEditOptions
                 Read FEditOptions
                 Write FEditOptions
                 default [eoAllowEdit, eoAllowContextMenu, eoAllowCopy, eoAllowPaste, eoAllowCut, eoAllowUndo];
      end;
     
      { --------------------------------- }
     
      TForm1 = class(TForm)
        Edit1: TEdit;
        Edit2: TEdit;
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    { TEdit overclass }
     
    constructor TEdit.Create(AOwner : TComponent);
    begin
      inherited create(AOwner);
      FEditOptions := [eoAllowEdit, eoAllowContextMenu, eoAllowCopy, eoAllowPaste, eoAllowCut, eoAllowUndo];
    end;
     
    procedure TEdit.WMChar(var Message: TWMChar);
    begin
      if eoAllowEdit in FEditOptions Then
         Inherited;
    end;
     
    procedure TEdit.WMContextMenu(var Message: TWMContextMenu);
    begin
      if eoAllowContextMenu in FEditOptions Then
         Inherited;
    end;
     
    procedure TEdit.WMCopy(var Message);
    begin
      if eoAllowCopy in FEditOptions Then
         Inherited;
    end;
     
    procedure TEdit.WMPaste(var Message);
    begin
      if eoAllowPaste in FEditOptions Then
         Inherited;
    end;
     
    procedure TEdit.WMCut(var Message);
    begin
      if eoAllowCut in FEditOptions Then
         Inherited;
    end;
     
    procedure TEdit.WMUndo(var Message);
    begin
      if eoAllowUndo in FEditOptions Then
         Inherited;
    end;
     
     
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      // toute les options sont désactivées, impossible donc de modifier le contenus de Edit2
      Edit2.EditOptions := [];
    end;
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  4. #4
    Membre éprouvé
    Bonjour à toutes et à tous,

    @ youhibadelphi, faut voir ce que tu fais avec ton Tedit, si tu as déjà ton texte écrit par défaut ou si tu l'ajoutes après quoi qu'il en soit, tu peux envisager de placer ton Tedit sur un Tpanel avec les mêmes dimensions et mettre la propriété enabled à false du Tpanel (propriété enabled du Tedit reste à true) comme cela le texte du Tedit apparaîtra normalement mais impossible de le sélectionner donc de le copier.

    @+,

    Cincap

  5. #5
    Membre régulier
    Salut seb_homme_parfait
    Merci pour ta participation mais je crois de ta solution nécessite un peu plus de condition, je crois q'il y a des codes a ajouter pour désactivé copier/coller dans les Tedit.
    Merci.

  6. #6
    Membre régulier
    Salut Dr.Who
    Merci j'ai bien copié le code.
    Merci beaucoup.

  7. #7
    Membre régulier
    Salut cincap
    Tout ce que je veux c'est interdire l'utilisateur de copier et de coller dans les edit, je crois que le code de notre ami Dr.Who est la bonne solution.
    Merci pour ta remarque.

  8. #8
    Membre éprouvé
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Edit1.editOptions := Edit1.editOptions - [eoallowCut, eoallowCopy, eoallowPaste, eoallowContextMenu];


    cela empêche toute action de Copier, Coller, Couper, ou d'appel du menu contextuel dans l'edit.

    note que comme l'option est intégrée à la classe TEdit, chaque TEdit peut avoir un comportement différent.

    ce qui est intéressant avec cette approche, c'est qu'on peu l'adapter pour n'importe quel composant utilisant les messages système.
    on peut imaginer toute sorte de blocage/déblocage d'action.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  9. #9
    Membre régulier
    Salut Dr.Who
    Merci beaucoup pour ton aide.
    Vraiment ce que je trouve dans ce forum n'existe pas dans les ouvrages que j'ai entre les mains.

  10. #10
    Membre éprouvé
    les ouvrages sont toujours, pour la plupart, des guides condensé.

    difficile de faire de l'experimentation dans un livre...

    ou alors, il faudrait ecrire "la Bible du code exotique et des méthodes de gnou"

    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  11. #11
    Membre régulier
    Salut mon ami
    J’ai essayé dans code dans un petit exemple ça marche bien mais j’ai trouvé des difficulté pour l’adapter avec mon projet, je crois que c’est un problème avec les déclarations, mais je bosse actuellement pour réussir cette adaptation.
    J’ai une idée dans la cervelle :
    Comment faire pour désactiver la touche ctrl et la touche v dans l'edit par exemple pour annuler toute opération coller ? en fin est il possible?
    Merci

  12. #12
    Membre éprouvé
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Edit1.editOptions := Edit1.editOptions - [eoallowCut, eoallowCopy, eoallowPaste, eoallowContextMenu];
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  13. #13
    Membre régulier
    Salut Dr.Who
    Oui j'ai ajouté ton code mais après mais le projet ne se compile pas à cause erreurs suivantes:
    Identificateur non déclaré pour
    EditOptions, eoallowCut, eoallowCopy, eoallowPaste, eoallowContextMenu

  14. #14
    Membre éprouvé
    Bonjour à toutes et à tous,

    @ Youhibadelphi, as tu bien recopié son code, car cela fonctionne :

    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
     
    unit unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, stdctrls;
     
    type
      { TEdit overclass ---------------------------- }
     
      TEditOption  = (eoAllowEdit, eoAllowContextMenu, eoAllowCopy, eoAllowPaste, eoAllowCut, eoAllowUndo);
    {
    eoAllowEdit : permet d'activer ou non la saisie au clavier
    eoAllowContextMenu : permet d'activer ou non le menu contextuel par defaut
    eoAllowCopy : permet d'activer ou non le raccourcis CTRL+C (copier)
    eoAllowPaste: permet d'activer ou non le raccourcis CTRL+V (coller)
    eoAllowCut : permet d'activer ou non le raccourcis CTRL+X (couper)
    eoAllowUndo: permet d'activer ou non le raccourcis CTRL+Z (annuler)
    }
      TEditOptions = set of TEditOption;
     
      TEdit = Class(StdCtrls.TEdit)
      private
        FEditOptions : TEditOptions;
        procedure WMChar(var Message: TWMChar); message WM_CHAR;
        procedure WMContextMenu(var Message: TWMContextMenu); message WM_CONTEXTMENU;
        procedure WMPaste(var Message); message WM_PASTE;
        procedure WMCopy(var Message); message WM_COPY;
        procedure WMCut(var Message); message WM_CUT;
        procedure WMUndo(var Message); message WM_UNDO;
      public
        constructor Create(AOwner : TComponent); override;
        Property EditOptions : TEditOptions
                 Read FEditOptions
                 Write FEditOptions
                 default [eoAllowEdit, eoAllowContextMenu, eoAllowCopy, eoAllowPaste, eoAllowCut, eoAllowUndo];
      end;
     
      { --------------------------------- }
     
      TForm1 = class(TForm)
        Edit1: TEdit;
          procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    { TEdit overclass }
     
    constructor TEdit.Create(AOwner : TComponent);
    begin
      inherited create(AOwner);
      FEditOptions := [eoAllowEdit, eoAllowContextMenu, eoAllowCopy, eoAllowPaste, eoAllowCut, eoAllowUndo];
    end;
     
    procedure TEdit.WMChar(var Message: TWMChar);
    begin
      if eoAllowEdit in FEditOptions Then
         Inherited;
    end;
     
    procedure TEdit.WMContextMenu(var Message: TWMContextMenu);
    begin
      if eoAllowContextMenu in FEditOptions Then
         Inherited;
    end;
     
    procedure TEdit.WMCopy(var Message);
    begin
      if eoAllowCopy in FEditOptions Then
         Inherited;
    end;
     
    procedure TEdit.WMPaste(var Message);
    begin
      if eoAllowPaste in FEditOptions Then
         Inherited;
    end;
     
    procedure TEdit.WMCut(var Message);
    begin
      if eoAllowCut in FEditOptions Then
         Inherited;
    end;
     
    procedure TEdit.WMUndo(var Message);
    begin
      if eoAllowUndo in FEditOptions Then
         Inherited;
    end;


    Utilisation :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      // toute les options sont désactivées, impossible donc de modifier le contenus de Edit1
      Edit1.EditOptions := [];
     
    end;


    ou :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     
    Edit1.editOptions := Edit1.editOptions - [eoallowCut, eoallowCopy, eoallowPaste, eoallowContextMenu];
    end;


    @+,

    Cincap

  15. #15
    Membre régulier
    salut
    oui j'ai bien copris la solution mais j'ai posé une autre question
    comment faire pour bloquer les touches ctrl+v?
    merci

  16. #16
    Membre éprouvé
    en supprimant les options
    eoallowCut, -> CTRL+X
    eoallowCopy, -> CTRL+C
    eoallowPaste -> CTRL+V
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  17. #17
    Membre éprouvé
    Bonjour à toutes et à tous,

    @ Youhibadelphi, je répondais à ton post du 21/11/2009 à 16H39 :


    Oui j'ai ajouté ton code mais après mais le projet ne se compile pas à cause erreurs suivantes:
    Identificateur non déclaré pour
    EditOptions, eoallowCut, eoallowCopy, eoallowPaste, eoallowContextMenu
    Quant à mon dernier post, il y avait deux utilisations de cette excellente solution de Dr. Who, dont la 1ère répondait à ta demande :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      // toute les options sont désactivées, impossible donc de modifier le contenus de Edit1
      Edit1.EditOptions := [];
     end;


    @+,

    Cincap

  18. #18
    Membre régulier
    Salut cincap et Dr.Who
    Et merci pour votre aide
    J’ai essayé un astuce, et ça bien marché, j'ai changé le raccourci ctrl+v, et j'ai lié le menu du clic droit de la souris avec popumenu.
    Merci encore mille fois pour votre aide.

  19. #19
    Nouveau membre du Club
    popumenu
    salut youhibadelphi

    voila j'aimerai bien connaitre la solution dont tu as changé le ctrl+v avec le menu contextuel de la sourie en utilisant le composant popumenu ?
    merci de m'exliquer en détail simple car j'ai amais utiliser le composant Popumenu.

  20. #20
    Membre régulier
    Salut
    nn2009
    Oui c'est simple tu ajoute un Popumenu1 a ton projet puis dans la propriété de l'edit par exemple tu ajoute Popumenu1 a la propriété Popumenu de l'edit.
    Voila.