Imposé taille a edit

promenneur77 Messages postés 16 Date d'inscription lundi 25 août 2003 Statut Membre Dernière intervention 4 mai 2008 - 4 mai 2008 à 11:24
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 4 mai 2008 à 22:05
bonjour,


je voudrait imposé 4 caractere dans un edit, j'ai reussi a bloquer a 4 caractere mais pas reussi a en obliger 4.
deplus je n'arrive pas non plus a impossé que des chiffres.
si moin de 4 caractere dans edit je souhaite que lorsque l'on clic sur le bouton ca ne face rien et que cela me dise ex: pas 4 chifre

11 réponses

ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
4 mai 2008 à 11:57
Tu peux utiliser un :
TMaskEdit
en modifiant sa propriété "EditMask"

@+
Nico { http://www.ni69.info }
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
4 mai 2008 à 12:00
Quelques infos en passant sur les valeurs possibles pour EditMask:

http://www.docuxplorer.com/webhelp/Field_Definition_Manager/Edit_Masks.htm

@+
Nico { http://www.ni69.info }
0
Rematrix Messages postés 115 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 16 juillet 2008
4 mai 2008 à 12:12
TEditmask pas trés réussie a mon avis, tros de bug, faire ces propres contrôles c'est mieux.

Matrix
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
4 mai 2008 à 12:16
quels genre de bugs ?

j'ai jamais eu de problèmes avec!!!

 
@+
Cirec

<hr siz="" />
0

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

Posez votre question
promenneur77 Messages postés 16 Date d'inscription lundi 25 août 2003 Statut Membre Dernière intervention 4 mai 2008
4 mai 2008 à 12:28
je vous remerci mais j'ai reussi

avec :

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  inherited;
  if not (Key in ['0'..'9',Chr(VK_DELETE),Chr(VK_BACK)]) then
    Key:=#0;
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  if Length(Edit1.Text)<Edit1.MaxLength then
  begin
    ShowMessage('Il faut 4 chiffres');


  end;


end;
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
4 mai 2008 à 12:32
ouai et si l'utilisateur fait un coller ??????
pourquoi vous posez des questions si c'est pour ne pas écouter les réponses
 
@+
Cirec

<hr siz="" />
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
4 mai 2008 à 12:59
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  inherited; // ?????! pas d'inherited dans un gestionnaire d'evenement!
  if not (Key in ['0'..'9',Chr(VK_DELETE),Chr(VK_BACK)]) then
    Key:=#0;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in ['0'..'9',#8]) then
    Key:=#0;
end;

mais le mieux est de faire :

Unit Unit1;

interface

uses ...;

type
  TEdit = class(StdCtrls.TEdit)
  private
    fTextAlign   : TAlignment;
    fOnlyNumbers : boolean;
    procedure SetOnlyNumbers(val : boolean);
    procedure SetTextAlign(val : TAlignment);
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  public
    constructor Create(AOwner: TComponent); override;
  published
    property OnlyNumbers  : boolean    read fOnlyNumbers write SetOnlyNumbers;
    property TextAlignment: TAlignment read fTextAlign   write SetTextAlign;
  end;

  TForm1 = class(TForm)
  ....
  end;

var
  Form1 : TForm1;

implementation

constructor TEdit.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  fOnlyNumbers := false;
  fTextAlign   := taLeftJustify;
end;

procedure TEdit.CreateParams(var Params: TCreateParams);
const
  Alignments : array[TAlignment] of Word = (ES_LEFT, ES_RIGHT, ES_CENTER);
begin
  inherited CreateParams(Params);
  Params.Style := Params.Style or Alignments[TextAlignment];
  if fOnlyNumbers then
     Params.Style := Params.Style or ES_NUMBER;
end;

procedure TEdit.SetOnlyNumbers(val: boolean);
begin
  if fOnlyNumbers <> val then begin
     fOnlyNumbers := val;
     RecreateWnd;
  end;
end;

procedure TEdit.SetTextAlign(val : TAlignment);
begin
  if fTextAlign <> val then
  begin
     fTextAlign := val;
     RecreateWnd;
  end;
end;

et dans le OnCreate de la fiche :

EditX.OnlyNumber := true;
EditX.TextAlignement := taRight;
EditX.MaxLength := 4;

puis dans le OnChange de l'edit :

procedure TForm1.EditXOnChange(Sender: TObject);
var L : integer;
const
  EdtCol : array[boolean] of tcolor = (clRed, clBlue);
begin
  L := Length(EditX.Text);  EditX.Font.Color :EdtCol[L 4];

  // ou encore :
  {
   L := IntToStrDef(EditX.Text, 0);
   EditX.Font.Color := EdtCol[(L >= 1000) and (L < 10000)];
  }
end;

<hr size="2" width="100%" />
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
4 mai 2008 à 16:03
essaye et tu verras

et si tu y ajoutes un TXPManifest tu auras en prime un petit message si tu essayes d'entrer autre chose qu'un entier

Mais tu peux aussi le faire plus simplement (sans les Alignements) comme ceci :

      SetWindowLong(Edit1.Handle, GWL_STYLE, GetWindowLong(Edit1.Handle, GWL_STYLE) or ES_NUMBER);

 
@+
Cirec

<hr siz="" />
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
4 mai 2008 à 19:34
en quoi c'est mieux ?!

pfff ... la question ne se pose même pas.

mais j'explique quand même :

C'est mieux car tout les Edit on deux nouvelles propriétée qui permet d'aligner le texte ou d'accepter uniquement des entiers et ce parfaitement compatible avec le systeme windows.

partager un gestionnaire d'evenement c'est bien, mais a force c'est un peu relou.
sans parler des inconvegniants.
et s'embeter a repeter des dizaines de fois des SetWindowLong ...

overclassing power!

on peu egalement le deplacer dans une unité qu'on mettra aprés StdCtrls dans les uses ...
chpouf.

et puis bon, appeler des fonctions etc, c'est bien, mais c'est quand même mieux d'apprendre et connaitre cette technique d'overclassing on the fly, non ?

<hr size="2" width="100%" />
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
4 mai 2008 à 19:57
foxi :


  if not (Key in ['0'..'9',
Chr(VK_DELETE),Chr(VK_BACK)]) then
    Key:=#0;
.....
  if not (Key in ['0'..'9',
#8]) then
    Key:=#0;

le #8 remplace donc
Chr(VK_DELETE) et Chr(VK_BACK) ?? T'en a d'autres comme ça ?
/soif
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
4 mai 2008 à 22:05
@foxi:
on peu egalement le deplacer dans une unité qu'on mettra aprés StdCtrls dans les uses ...
chpouf.

touché !

cantador
0
Rejoignez-nous