Fonction à appeler dans l'évènement OnKeyPress de ou des Edits.
Comment n'admettre que la saisie de chiffres dans mon Edit ?
La question revient souvent sur le forum...
J'ai donc un peu remanié mon code afin d'en faire un fonction polyvalente.
Attention, cette fonction ne teste pas un éventuel dépassement de capacité selon le type du nombre attendu. Mais c'est une évolution à envisager.
Elle se limite à filtrer au moment de la saisie les caractères admis et ceux qui ne le sont pas, selon que le nombre attendu est un entier, un flottant, qu'il est signé ou non.
Le caractère '-', s'il est autorisé, ne sera admis qu'au début.
Le séparateur décimal, s'il est autorisé, ne pourra pas se répéter. Il est toléré au début ou à la fin de la saisie.
Le 3ème paramètre peut être négligé si l'on ne veut filtrer qu'un entier positif.
Dans le code de démonstration, j'aurais pu regrouper les évènements OnKeyPress des Edits, mais j'ai laissé comme ça pour plus de clarté.
Vous trouverez également 2 ou 3 bricoles, comme le changement de focus d'un Edit à l'autre avec les flèches de direction, la touche Enter, etc...
N'hésitez pas à me signaler toute défaillance :( ou amélioration à apporter :)
Bonne prog' :p
Source / Exemple :
type
TTypeOfNumber = (INT_NOSIGN, INT_SIGN, FLOAT_NOSIGN, FLOAT_SIGN);
function NumberIsValid(Sender: TObject; K: Char;
const TN: TTypeOfNumber = INT_NOSIGN): Char;
const
Valid = #13, '0'..'9';
Signe = ['-'];
var
Ok: Boolean;
function IsNotYet: Boolean;
begin
Result := True;
if ((K = DecimalSeparator) or (K = '-')) and (Pos(K, TEdit(Sender).Text) > 0) then
Result := False;
end;
function Is1st: Boolean;
begin
Result := True;
if (K = '-') and (TEdit(Sender).SelStart <> 0) then
Result := False;
end;
begin
Result := #0;
Ok := False;
if not (Sender is TEdit) then Exit;
case TN of
INT_NOSIGN : Ok := (K in Valid);
INT_SIGN : Ok := (K in Valid + Signe) and IsNotYet and Is1st;
FLOAT_NOSIGN: Ok := (K in Valid + [DecimalSeparator]) and IsNotYet;
FLOAT_SIGN : Ok := (K in Valid + Signe + [DecimalSeparator]) and IsNotYet and Is1st;
end;
if Ok then Result := K;
end;
{ Exemple d'utilisation }
procedure TForm1.edIntNoSignedKeyPress(Sender: TObject; var Key: Char);
begin
//Key := NumberIsValid(Sender, Key, INT_NOSIGN); // les 2 lignes donnent...
Key := NumberIsValid(Sender, Key); // ...le même résultat
end;
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.