Desactiver le CTRL+V d'un edit dans une MDIChild

Résolu
drexl Messages postés 56 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 22 juillet 2014 - 10 janv. 2012 à 14:15
drexl Messages postés 56 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 22 juillet 2014 - 12 janv. 2012 à 13:56
Bonjour a tous,

Je dois développer une application utilisant des form mdichild.
Je dois faire en sorte que mes LabelEdit soient formatés de manière a n'afficher que des nombres avec un certain nombre de chiffre après le decimalseparator ajustable selon le LabelEdit (ca c'est fait)

Seulement quand on fait CTRL+V, du texte s'affiche (suivant ce qu'il y a dans le clipboard)
J'ai cherche et trouve ceci
procedure TMDIScenario.LabeledEdit1KeyPress(Sender: TObject; var Key: Char);
begin
var
    Shift: TShiftState;
    KeyState: TKeyboardState;
begin
      GetKeyboardState(KeyState);
      Shift:=KeyboardStateToShiftState(KeyState);
      If (ssCtrl in Shift) and (key=#24) then // CTRL + X
        Key := #0;

      If (ssCtrl in Shift) and (key=#3) then // CTRL + C
        Key := #0;

      If (ssCtrl in Shift) and (key=#22) then // CTRL + V
        Key := #0;      
end;


Ce code fonctionne tres bien sur LabeledEdit d'une form normale mais pas sur ma mdichild

Quelqu'un saurait-il pourquoi ?

Par avance, merci

nb : Win7, delphi 2007.

10 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
10 janv. 2012 à 19:56
Ben il semblerait que la gestion des fenêtres MDI soit faite par l'OS donc Windows et non par Delphi ... puisqu'en cas de fenêtre MDI Delphi passe les messages à "DefMDIChildProc" qui est une fonction de User32.dll

      if FormStyle = fsMDIChild then WindowClass.lpfnWndProc := @DefMDIChildProc;
Donc à part intercepter traiter les messages qui t'intéresse et renvoyer les autres à la fonction initiale ... ça ne fonctionnera pas ... et du coup je suis pas certain que le code que je cite plus haut fonctionne ... il faudrait tester



[hr]@+Cirec
[hr]
3
drexl Messages postés 56 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 22 juillet 2014
10 janv. 2012 à 16:25
salut,
je n'avais pas vu cette source

j'arrive a contrôler le fait que l'utilisateur n'entre que des chiffres et le decimalseparator, et une seul fois le decimalseparator, ainsi que le nombre de chiffres après la virgule, le tout sur la MDIChild

mais mon soucis est de désactiver le CTRL+V sur un TEdit d'une MDIChild
Sur une form normale, le bout de code que j'ai mis plus haut, fonctionne mais pas sur ma mdichild

Le but de ma question est de savoir pourquoi la desactivation ne fonctionne pas sur la mdichild
0
drexl Messages postés 56 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 22 juillet 2014
11 janv. 2012 à 07:52
Merci de ta réponse,
Mais la ça dépasse le débutant que je suis.
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
11 janv. 2012 à 15:39
Je viens de tester mon code "cité plus haut" et il fonctionne dans une fenêtre MDI

ce code te permet de gerer tous les accès
modification, copier, coller ... etc

{
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)
eoAllowEditClpBrd: permet "d'éditer" le contenu du ClipBoard
eoAllowGetText: permet d'activer ou non la copie de Texte par message depuis une autre Application
eoAllowSetText: permet d'activer ou non le Collage de Texte par message depuis une autre Application
}

par défaut toutes les options sont actives (sauf eoAllowEditClpBrd) ce qui reproduit le comportement normal du TEdit:
  EditOptions := [eoAllowEdit, eoAllowContextMenu, eoAllowCopy, eoAllowPaste,
                   eoAllowCut, eoAllowUndo, eoAllowGetText, eoAllowSetText];

et si tu fais (par Ex.)
  Edit1.EditOptions := [eoAllowEdit];

l'Edit1 n'autorisera plus que la saisie clavier et rien d'autre

et si tu y ajoutes eoAllowEditClpBrd tu peux définir une procédure qui te permet de controler et de modifier le contenu du ClipBoard pour l'adapter avant de le coller puis il replace le texte d'origine (texte avant modification) dans le ClipBoard. (Voir Démo fournie avec le code)

Bien sur il faudra adapter le code pour TLabeledEdit mais ça ne devrait pas poser de problème ... en tous cas c'est la méthode à suivre elle fonctionne



[hr]@+Cirec
[hr]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
drexl Messages postés 56 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 22 juillet 2014
11 janv. 2012 à 16:10
merci.
m'en vais tester ça.
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
11 janv. 2012 à 16:24
Bonjour,

Il est à noter que depuis la sortie de Windows 95 (c'est pas d'hier !), Microsoft déconseille fortement l'utilisation du modèle MDI (deprecated). Il n'est plus soutenu et sera donc certainement source de bogues de plus en plus nombreux.

Il vaut mieux le savoir... :)
0
drexl Messages postés 56 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 22 juillet 2014
12 janv. 2012 à 10:17
0
drexl Messages postés 56 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 22 juillet 2014
12 janv. 2012 à 11:00
Merci Cirec,

Grace a tes infos et celles de DrWho ([url]http://www.developpez.net/forums/d836967/environnements-developpement/delphi/debutant/desactiver-copier-coller-tedit//url)
je me suis fais ce composant

unit Ext_LabeledEdit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, stdctrls, ExtCtrls;

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;

      TExt_LabeledEdit = class(TLabeledEdit)
      private
              { Private declarations }
              FNombre_de_Decimal : Integer;
              FEditOptions : TEditOptions;              
              FOnlyNumeric : Boolean;
              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
              { Public declarations }
              constructor Create(AOwner : TComponent); override;
      published
              { Déclarations publiées }
              //ajout de la propriété
              property Only_Numeric : Boolean  read FOnlyNumeric write FOnlyNumeric Default False;
              //ajout de la propriété Nombre_de_Decimal
              property Nombre_de_Decimal : Integer  read FNombre_de_Decimal write FNombre_de_Decimal default 2;
              Property EditOptions : TEditOptions Read FEditOptions Write FEditOptions default [eoAllowEdit, eoAllowContextMenu, eoAllowCopy, eoAllowPaste, eoAllowCut, eoAllowUndo];
  end;

  { --------------------------------- }

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MesComposants', [TExt_LabeledEdit]);
end;

constructor TExt_LabeledEdit.Create(AOwner: TComponent);
begin
      inherited;  
      FEditOptions := [eoAllowEdit, eoAllowContextMenu, eoAllowCopy, eoAllowPaste, eoAllowCut, eoAllowUndo];
end;

procedure TExt_LabeledEdit.WMChar(var Message: TWMChar);
begin
  if eoAllowEdit in FEditOptions Then
     Inherited;
end;
 
procedure TExt_LabeledEdit.WMContextMenu(var Message: TWMContextMenu);
begin
  if eoAllowContextMenu in FEditOptions Then
     Inherited;
end;
 
procedure TExt_LabeledEdit.WMCopy(var Message);
begin
  if eoAllowCopy in FEditOptions Then
     Inherited;
end;
 
procedure TExt_LabeledEdit.WMPaste(var Message);
begin
  if eoAllowPaste in FEditOptions Then
     Inherited;
end;
 
procedure TExt_LabeledEdit.WMCut(var Message);
begin
  if eoAllowCut in FEditOptions Then
     Inherited;
end;
 
procedure TExt_LabeledEdit.WMUndo(var Message);
begin
  if eoAllowUndo in FEditOptions Then
     Inherited;
end;

end.


la propriété
property Nombre_de_Decimal : Integer  read FNombre_de_Decimal write FNombre_de_Decimal default 2;

me sert pour le code suivant qui me permet d'avoir que des chiffres, le decimalseparator et le nombre de chiffre après est définit par la propriété "Nombre_de_Decimal": (le signe '-' n'est pas encore implemente)

Procedure Edit_With_Float1(Edit: TExt_LabeledEdit; Nombre_de_Decimal : Integer; var Key: Char);
begin
      if not (Key in '0'..'9', DecimalSeparator) then Key := #0
      else
          begin
                //si le point est deja present et qu'on appuie encore sur le point alors on ne fait rien
                if (Key = DecimalSeparator) and (Pos(Key, Edit.Text) > 0) then Key := #0 else Key := Key;
                //si la touche est un chiffre alors
                if (Key in ['0'..'9']) then
                begin
                      //si le point n'est pas encore entre alors la touche est acceptee
                      if pos(DecimalSeparator,Edit.Text)=0 then Key := Key;
                      //si le point est deja present alors
                      if (pos(DecimalSeparator,Edit.Text)>0) then
                      begin
                            //on verifie la position du curseur
                            //si le curseur est avant le '.' alors on accepte le chiffre
                            if (Edit.SelStart < pos(DecimalSeparator,Edit.Text)) then Key := Key
                            else
                                //sinon on verifie le nombre de decimal
                                if length(Edit.Text)-(Nombre_de_Decimal-1) > pos(DecimalSeparator,Edit.Text) then
                                    Key := #0 else Key := Key;
                      end;
                end;
                if (Key = #8) then Key := #8;
          end;
end;


saurais-tu m'indiquer une direction pour pouvoir mettre cette procédure directement dans le composant et que ,celle-ci soit effective directement dans l’éditeur de propriété, dans la propriété 'Text', lorsque la propriete 'Only_Numeric' est a 'True'?
(c'est du bonus : c'est juste pour aller plus loin et avoir un composant perso)
Par avance, merci
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
12 janv. 2012 à 13:24
pour info le code que donne DrWho vient aussi du lien que je t'ai donné plus haut ... vas voir ... mon lien date de 2006 et l'autre de 2009.

Il serait donc bien de laisser l'entête du code original avec les auteurs et les contributeurs.
Rien ne t'empêches d'y ajouter ton nom pour cette partie

pour la partie num regarde du coté de "ES_NUMBER"
{La ligne suivante limite les entrées aux nombres}
{et si tu ajoutes un "XPMan" aux uses un son retentira et une bulle s'affichera
pour informer l'utilisateur que seuls les nombres sont acceptés}
SetWindowLongA(Edit3.Handle,GWL_STYLE,GetWindowLongA(Edit3.Handle,GWL_STYLE) or ES_NUMBER);

et si tu veux l'inclure à ton composant il faut surcharger "CreateParams":
  protected
    procedure CreateParams(var Params: TCreateParams); override;

Mais si tu utilises une version récente de Delphi le travail est déjà fait (à partir de D2009 peut être avant)... le TEdit possède une propriété nommée "NumbersOnly"

[hr]@+Cirec
[hr]
0
drexl Messages postés 56 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 22 juillet 2014
12 janv. 2012 à 13:56
Effectivement tu es le premier posteur

Je travaille avec D2007 et je ne vois pas l'option NumberOnly

j'ai telecharge le fichier 'delphifr_CONTROLER-COPIER-COLLER-DANS-TEDIT___Page.zip'
et je ne trouve pas de reference a "ES_NUMBER" sur les fichiers "UOptions" et "UMain"
0
Rejoignez-nous