Filtrer la saisie valide d'un nombre entier, flottant, signé ou non, dans un tedit

Description

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;

Codes Sources

A voir également

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.