IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

ne taper que des chiffres dans un Tedit


Sujet :

Delphi

  1. #1
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut ne taper que des chiffres dans un Tedit
    salut,

    j'essaye de faire un truc simple et encore une fois j'ai un resultat plus que bizarre, le but est tout con, ne pouvoir rentrer que des chiffres dans un Tedit, si un autre caractere est rentré alors le champ est vidé (j'ai essayé de virer que le dernier caractere mais j'ai pas reussi, pas grave).

    je pensais que le + simple etait de definir un ensemble.

    j'ai donc essayé ceci apres la clause use :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type
    	Tchiffre = '0'..'9';
    	Tchiffre2 = set of '0'..'9';
    	Tchiffre3 = 0..9;
    mais a chaque fois j'ai une erreur quand je fais le test dans la condition, j'ai donc essayé ceci dans la procedure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	var Tchiffre4: set of '0'..'9';
    et ce coup ci plus de plantage .... mais une chose tres bizarre
    ca me BLOQUE TOUS les caracteres + chiffres sauf ces 3 la : 3-4-5

    voici toute la procedure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.EditNbBoucleChange(Sender: TObject);
    	var StCar:Char;
    	var Tchiffre4: set of '0'..'9';
    	var inNbCar:Integer;
    begin
    	if length(EditNbBoucle.Text) = 0 then exit;
    	inNbCar := length(EditNbBoucle.Text);
    	StCar := EditNbBoucle.Text[inNbCar];
    	if not(StCar in Tchiffre4) then EditNbBoucle.Text := '';
    	//if not(StCar in Tchiffre4) then EditNbBoucle.Text := copy(1,inNbCar); 
    end;
    si vous avez une idée sur ce probleme de blocage bizarre des autres chiffres ...

    merci

  2. #2
    Membre habitué Avatar de avogadro
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    http://delphi.developpez.com/faq/?pa...propri#numbers

    Il suffit de remplacer tout autre caractère par le caractères nul dans l'événement OnKeyPress du TEdit, exception fait pour le séparateur décimal (DecimalSeparator), la touche retour (VK_BACK) et la touche supprimer (VK_DELETE).

    procedure TMyForm.MyEditKeyPress(Sender: TObject; var Key: Char);
    begin
    if not (Key in ['0'..'9', DecimalSeparator, Chr(VK_BACK), Chr(VK_DELETE)]) then
    Key := #0;
    if Key = DecimalSeparator then
    if Pos(DecimalSeparator, MyEdit.Text) <> 0 then
    Key := #0;
    end;

  3. #3
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    merci mais j'attendais surtout un debut d'explication a ma question qui portait sur le probleme que j'ai rencontré en utilisant l'ensemble et la condition : if not(StCar in Tchiffre4) .... j'ai peut etre mal formulé le titre du sujet.

  4. #4
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 911
    Points : 6 032
    Points
    6 032
    Par défaut
    et avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Const Tchiffre4: set of '0'..'9';
    ?

  5. #5
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Ah là là, ça ne va pas du tout ça !

    Tu as déclaré une variable de type set of '0'..'9'. Ta variable peut donc contenir un ensemble de caractères (jusqu'à 255) prenant une valeur entre '0' et '9'.
    Lorsque tu appelles ta procédure, la variable est crée sur la pile, et contient une valeur aléatoire. En fait, pas vraiment aléatoire, puisqu'elle dépend de ce qui s'est passé avant, la pile étant modifiée par les appels aux différentes procédures.
    Tu attaques donc ta procédure EditNbBoucleChange et ta variable Tchiffre4 est remplie aléatoirement. Dans ton cas, elle est tout bêtement remplie avec la valeur ['3', '4', '5']. Elle aurait très bien pu contenir ['1', '6'] et ta procédure aurait jeté les autres caractères.

    La programmation, ce n'est pas du hasard. Quand on ne sait pas, on cherche dans son cours. Il ne suffit pas d'essayer pour voir ce qui se passe

    L'opérateur in permet de tester l'inclusion d'un élément dans un ensemble. Pas dans un type ensemble, déclaré avec set of.
    Dans la déclaration suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var Characters: set of Char
    Characters est un ensemble, il peut contenir une valeur de type ensemble, notée [A..B] ou [A, B, C] ou un mélange des deux.
    set of Char est un type ensemble

    Et A..B est un intervalle. Ce n'est pas un ensemble, il ne faut pas confondre avec les ensembles même si les notations sont proches.

    Donc forcément, vos déclarations fantaisistes essayées ne pouvaient pas fonctionner.

    Mais dans la déclaration telle que je viens de la faire, Characters peut contenir un ensemble de caractères quelconque. Il n'a pas été initialisé.
    On peut à présent écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Characters := ['A'..'Z', 'a'..'z']
    Là, Characters est un ensemble correspondant aux lettres de l'alphabet.

    Pour en revenir au problème de départ : le but est de tester si un caractère est un chiffre, autrement dit s'il appartient à l'ensemble des caractères représentants un chiffre. Il s'agit bien de tester la présence d'un élément au sein d'un ensemble.

    Cet élément, c'est StCar, et cet ensemble, c'est ['0'..'9']. On peut utiliser l'opérateur in, ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if not (StCar in ['0'..'9']) then ...
    Tout simplement... Il serait temps d'aller ouvrir un cours de Pascal

    @++

  6. #6
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    je crois que j'ai tout melangé, les enumerations, les intervalles, et les ensembles ...
    evidemment car le bouquin explique tout a la suite

    merci pour ces bonnes explications !


    ------------
    donc si j'ai bien compris le probleme, quand le compilateur declare une variable, il definit exactement l'espace qu'elle doit prendre en memoire mais ne nettoye pas ce que cet espace contenait precedemment en mettant tous les bits a 0 ... c'est trouve ca stupide mais ca doit avoir une justification logique ?

Discussions similaires

  1. saisir rien que des chiffres dans un Tedit
    Par trop2pb dans le forum Delphi
    Réponses: 5
    Dernier message: 27/07/2006, 13h46
  2. Que des chiffres dans un JTextField
    Par hammag dans le forum Composants
    Réponses: 4
    Dernier message: 15/05/2006, 17h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo