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,
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 ?
Bonjour,
Pourquoi ne pas utiliser TSpinEdit et TFloatSpinEdit du volet Misc ? Ils permettent à la fois l'usage de la souris et celui du clavier.
Partager