Bonjour,
tout est dans le titre. Quelqu'un connait-il un bon composant permettant la saisie de nombre (entier, réel). Je cherche pas un truc compliqué, juste pouvoir saisir des nombre !
Merci d'avance
JS
Bonjour,
tout est dans le titre. Quelqu'un connait-il un bon composant permettant la saisie de nombre (entier, réel). Je cherche pas un truc compliqué, juste pouvoir saisir des nombre !
Merci d'avance
JS
Salut,
j'aillais te proposer un bête TEdit avec sa propriété NumbersOnly basculée à True sauf que je viens de tester, par acquis de conscience et que... ça ne fonctionne pas !
Pourtant il me semblait avoir repéré cette propriété et l'avoir trouvée sympathique mais ce soir, makache bonno et walou, je peux saisir n'importe quoi dans l'Edit.
Ou alors ça fonctionne mieux en 1.6 ?
Bonsoir
@JP
je viens de tester Edit avec la version 1.6 RC2 et ça a bien fonctionné!!
merci
Bonjour
Avec la 1.6 Stable sous Linux, la propriété NumbersOnly semble sans effet.
Vous étiez sous d'autres systèmes, je suppose ?
Salut,
Confirmé, en ce qui me concerne :
Testé à l'instant dans deux machines virtuelles le même environnement (Laz 1.6rc1 et non, je ne migrerai pas tant que ça sera aussi merdique) : dans XP ça fonctionne tip-top et dans Debian 32bits tu peux saisir n'importe quoi dans le TEdit...
Bonjour,
Pourquoi ne pas utiliser TSpinEdit et TFloatSpinEdit du volet Misc ? Ils permettent à la fois l'usage de la souris et celui du clavier.
Bonjour!
J'ai oublié de préciser que j'utilise W7 32Avec la 1.6 Stable sous Linux, la propriété NumbersOnly semble sans effet.
Vous étiez sous d'autres systèmes, je suppose ?
Bonjour,
Le premier objectif de Lazarus est de faire fonctionner le même code d'une manière similaire avec divers OS ; le second est d'imiter au mieux Delphi afin que le code écrit pour ce dernier soit en grande partie réutilisable. Le problème est que ces deux objectifs ne sont pas toujours conciliables facilement.
Ici, la propriété NumbersOnly est une propriété que connaissent bien Delphi et Windows pour son TEdit natif. Malheureusement, ce n'est pas le cas des autres OS.
Si l'on décortique le code source en remontant les appels, on obtient ceci (Lazarus 1.6 sous Windows 10 64 bits) :
- NumbersOnly est une propriété publiée de TCustomEdit dans TEdit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 TEdit = class(TCustomEdit) public property AutoSelected; published property Action; property Align; // d'autres propriétés publiées... property NumbersOnly; // idem... end;
- NumbersOnly est une propriété créée par TCustomEdit :
La méthode intéressante est celle qui fixe la valeur du champ interne :
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 TCustomEdit = class(TWinControl) private // ... FNumbersOnly: Boolean; // ... protected // ... function GetNumbersOnly: Boolean; virtual; // ... procedure SetNumbersOnly(Value: Boolean); virtual; // ... public // ... property NumbersOnly: Boolean read GetNumbersOnly write SetNumbersOnly default false; // ... end;
On voit qu'elle fait correctement son travail en changeant le champ privé FNumberOnly si nécessaire puis en appelant la routine de l'OS via son Widget.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 procedure TCustomEdit.SetNumbersOnly(Value: Boolean); begin if FNumbersOnly <> Value then begin FNumbersOnly := Value; if HandleAllocated then TWSCustomEditClass(WidgetSetClass).SetNumbersOnly(Self, Value); end; end;
Et c'est là que réside le problème final : les autres OS ne connaissent pas nativement cette fonctionnalité .
On trouve donc le code suivant pour le widget Windows :
définie par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part class procedure SetNumbersOnly(const ACustomEdit: TCustomEdit; NewNumbersOnly: Boolean); virtual;
... donc, une méthode vide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 class procedure TWSCustomEdit.SetNumbersOnly(const ACustomEdit: TCustomEdit; NewNumbersOnly: Boolean); begin end;
Parallèlement, des paramètres sont créés pour activer ou désactiver des comportements. Ces derniers sont gérés par l'OS :
Pour Windows, ça fonctionne, mais seulement pour les chiffres (c'est bien Windows qui affiche le message de refus, pas Lazarus ni Free Pascal).
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 procedure TCustomEdit.CreateParams(var Params: TCreateParams); const AlignmentStyle: array[TAlignment] of DWord = ( { taLeftJustify } ES_LEFT, { taRightJustify } ES_RIGHT, { taCenter } ES_CENTER ); begin inherited CreateParams(Params); Params.Style := Params.Style or ES_AUTOHSCROLL or AlignmentStyle[Alignment]; if ReadOnly then Params.Style := Params.Style or ES_READONLY; if NumbersOnly then Params.Style := Params.Style or ES_NUMBER; if not HideSelection then Params.Style := Params.Style or ES_NOHIDESEL; end;
La seule véritable solution serait de simuler le fonctionnement avec les autres OS, mais ce n'est pas une mince affaire si l'on doit interférer avec eux... Si l'un de vous se sent de le faire, qu'il propose un patch au Bugtracker .
A terme, il faudra sans doute que Free Pascal et Lazarus prennent plus d'autonomie vis-à-vis de Delphi. On peut aussi imaginer au moins un avertissement du compilateur.
En attendant, la solution réaliste sera d'employer TSpinEdit et TFloatSpinEdit qui sont dédiés à la saisie des nombres. Après tout, c'est ce qui était recherché initialement, non ?
Je pense que je vais m'en remettre aux TSPinEdit.
J'aurais préférer autre chose, mais bon...
JS
Bonjour cette unité pourras peut-être t'aider elle fait partie de mes petits composants : http://www.developpez.net/forums/d15...ants-pl_beanz/ que je mettrai à jour dès que je disposerai de plus de temps libre.
bz_numedit.pas
A+
Le Maskedit n'est pas utilisable pour cela à mon sens.
Merci BeanzMaster, je vais regarder cela dés que possible.
A+
JS
Salut,
J'ai fait un test et MaskEdit est tout à fait adapté à la saisie d'un nombre. Il suffit de créer un masque en renseignant la propriété EditMask
avec, par exemple, 999999999.99;1;_. (On peut augmenter le nombre de chiffres significatifs si on le désire en ajoutant des 9, changer le caractère de masque en changeant _, etc). Un éditeur de propriétés permet les tests.
Avec la documentation Delphi, on trouve d'autres éléments intégrables au masque, mais je ne les ai pas testés avec Lazarus.
Cordialement,
Gilles
Bonjour ! Qu'est-ce qui est attendu au juste de ce composant ? Parce que si c'est juste pour s'assurer qu'un nombre a été saisi, on peut le faire facilement, non ?
Par exemple comme ça :
Ou plutôt comme ça :
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 uses RegExpr; procedure TForm1.Edit1EditingDone(Sender: TObject); var expr: string; begin expr := Format( '^%s(%s|%s)$', [ '-?', '\.\d+', '\d+(\.\d+)?' ] ); if not ExecRegExpr(expr, Edit1.Text) then begin ShowMessage('Saisie invalide. Vous devez saisir un nombre.'); Edit1.Text := ''; end; end;
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 function IsNumber(const s: string): boolean; var expr: string; begin expr := Format( '^%s(%s|%s)$', [ '-?', '\.\d+', '\d+(\.\d+)?' ] ); result := ExecRegExpr(expr, s); end; procedure TForm1.Edit1EditingDone(Sender: TObject); begin if not IsNumber(Edit1.Text) then begin ShowMessage('Saisie invalide. Vous devez saisir un nombre.'); Edit1.Text := ''; end; end;
Bonjour,
Je ne trouve pas très propre l'utilisation du MaskEdit. Je m'explique, si je prends un masque comme 999.99 et que la personne tape 2, à l'affichage ça donne : "2__.__", j'aurais préférer le résultat " 2.00", et si, pour forcer les 0 à la fin, je mets le masque "999.00", j'obtiens une exception si on ne tape que 2 !
Ce n'est pas qu'une question de tests de la saisie, c'est aussi une question d'esthétique. J'ai jamais compris (et ce depuis Delphi) qu'il n'y ait pas des composants natifs de saisie de nombre !
Bonjour,
2 petites remarques :
1- En cas de saisie invalide, tout est effacé donc l'utilisateur ne peut pas savoir où il s'est trompé ; je verrais plutôt
En plus, si c'était un long nombre il va lui falloir tout retaper...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 procedure TForm1.Edit1EditingDone(Sender: TObject); begin if not IsNumber(Edit1.Text) then begin ShowMessage('Saisie invalide. Vous devez saisir un nombre.'); //Edit1.Text := ''; Edit1.SetFocus; Edit1.SelStart := Length(Edit1.Text); Edit1.SelLength := 0; // avec AutoSelect à False sinon le curseur reste à gauche... end; end;
2- Il faudrait rajouter le "+" dans la regexpr autorisant les caractères valides, même s'il n'est habituellement pas saisi, car on ne sait jamais : puisqu'on peut saisir le "-" il faut pouvoir saisir le "+", àmha.
Je ne vais pas tripoter la regexpr, je risque de tout casser
En faisant une recherche sur le forum anglophone j'ai trouvé ces composants, mais d'après la discussion que j'ai lue ils ne sont pas utilisables avec les versions récentes de Lazarus (je n'ai pas vérifié).
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager