Jump to content

N'autoriser que les char numeriques dans un Edit.


Recommended Posts

(Voir un peu plus bas la question.)

Pour mon premier programme en pascal, j'essaye de faire sous delphi une calculette pour calculer les lois d'electricite... P=UI pour le moment et une fois celle la faite, je passerai a d'autre. Mais le probleme, c'est que je n'arrive pas a multiplier le contenu de deux Edit... Voici le code que j'ai pour le moment :

01: unit Unit1;
02:
03: interface
04:
05: uses
06:  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
07:   Dialogs, StdCtrls;
08:
09: type
10:   TForm1 = class(TForm)
11:     Edit1: TEdit;
12:     Edit2: TEdit;
13:     Edit3: TEdit;
14:     Button1: TButton;
15:     Label1: TLabel;
16:     procedure Button1Click(Sender: TObject);
17:   private
18:     { Déclarations privées }
19:   public
20:     { Déclarations publiques }
21:   end;
22:
23: var
24:   Form1: TForm1;
25:   u,i: TCaption;
26:   p: integer;
27: implementation
28: 
29: {$R *.dfm}
30:
31: procedure TForm1.Button1Click(Sender: TObject);
32: begin
33:  u:=Edit1.Text;
34:  i:=Edit2.Text;
35:  p:=u*i;
36: Edit3.Text:=p;
37: 
38: end;
39:
40: end.

Mais quand je l'execute, j'ai cette erreur :

[Erreur] Unit1.pas(35): Opérateur non applicable à ce type d'opérande

[Erreur] Unit1.pas(36): Types incompatibles : 'String' et 'Integer'

[Erreur fatale] Project1.dpr(5): Impossible de compiler l'unité utilisée 'Unit1.pas'

La derniere est normal... Mais comment rendre compatible u et i pour pouvoir les multiplier ?

C'est mon tout premier programme et j'ai pas de bouquin pour m'aider...

Merci par avance :)

Link to comment
Share on other sites

C'est ici que ca plante :

31: procedure TForm1.Button1Click(Sender: TObject);
32: begin
33:  u:=Edit1.Text;
34:  i:=Edit2.Text;
35:  p:=u*i;               <== PLANTAGE
36: Edit3.Text:=p;
37: 
38: end;

car u et i sont de type TCaption

et p de type integer;

il te faut d'abord transformer les string en integer

Voila 2 méthodes utiles :

Val ( x, s, error ); 
Procédure qui convertit la chaîne de caractère de nom s en un nombre (Integer ou Real) x et renvoie un code erreur error (de type integer) qui est égale à 0 si la conversion est possible. 

Str ( x, s ); 
Procédure qui convertit le nombre (Integer ou Real) x en chaîne de caractère de nom s. 

donc ton code :

u:=Edit1.Text;
i:=Edit2.Text;
Val (x, u, error_x);
Val (y, i, error_y);
p := x * y;
str (p, result);
Edit3.Text:=result;

à tester...

et il faut penser à rajouter le test sur les variables error_x et error_y

dans le cas où la chaine n'est pas un nombre

et à type les variables x, y et result

Link to comment
Share on other sites

Bon il fallait aussi declarer d'autre variable et tu as inverser l'ordre dans val :pleure:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   Edit2: TEdit;
   Edit3: TEdit;
   Button1: TButton;
   Label1: TLabel;
   Label2: TLabel;
   Label3: TLabel;
   procedure Button1Click(Sender: TObject);
 private
   { Déclarations privées }
 public
   { Déclarations publiques }
 end;

var
 Form1: TForm1;
 ux,ix,p: TCaption;
 px,u,i,errux,errix: Integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
 begin
   ux:=Edit1.Text;
   ix:=Edit2.Text;
   Val (ux, u, errux);
   Val (ix, i, errix);
   px:=u*i;
   Str (px, p);
   Edit3.Text:=p;
 end;
end.

Celui-ci marche. Par contre, enfaite, il faut qu'il accepte les nombres relatif... J'ai essaye de mettre Real a la place d'integer dans la declaration de variable, mais Val n'accepte pas le format :/

Link to comment
Share on other sites

J'ai trouvé !

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   Edit2: TEdit;
   Edit3: TEdit;
   Button1: TButton;
   Label1: TLabel;
   Label2: TLabel;
   Label3: TLabel;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Déclarations privées }
 public
   { Déclarations publiques }
 end;

var
 Form1: TForm1;
 ux,ix,px: TCaption;
 p,u,i: Real;
 errux,errix,errpx: Integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
 begin
   ux:=Edit1.Text;
   ix:=Edit2.Text;
   Val (ux, u, errux);
   Val (ix, i, errix);
   p:=u*i;
   Str (p, px);
   Edit3.Text:=px;
 end;

procedure TForm1.Button2Click(Sender: TObject);
 begin
   ux:=Edit1.Text;
   px:=Edit3.Text;
   Val (ux, u, errux);
   Val (px, p, errpx);
   i:=p/u;
   Str (i, ix);
   Edit2.Text:=ix;
 end;

end.

Par contre, j'aimerai pouvoir arrondir le resultat x chiffre(s) après la virgule, mais je ne trouve pas... Vous avez une idée svp ?

Link to comment
Share on other sites

J'ai tenter de faire I=P/U mais avec le / il me mets

[Erreur] Unit1.pas(52): Types incompatibles : 'Integer' et 'Extended'

(ligne 52 : i:=p/u;)

C'est pas comme ca les division ?

comme tu as pu voir, le / renvoie un résultat réel

si tu veux en résultat entier,

soit tu arrondis le résultat,

soit tu utilises DIV à la place de /

Link to comment
Share on other sites

Ah j'ai trouvé ! Ca viens du Str l'affichage scientifique... faut mettre

Str (i:0:3, ix);

par exemple...

Mais y'a un trucs que je pige pas trop... C'est le Str (i:width:decimals, ix);

Ca sers a quoi le Width ?

Str ( <variable_en_entree>:<nombre de caracteres à mettre devant>:<nombre de chiffre que doit contenir la variable en sortie>, <variable_en_sortie>)

Tu peux faire des tests pour voir les différents résultats.

Link to comment
Share on other sites

La, j'aimerai bien pouvoir mettre que des caracteres numerique dans un edit, si une lettre est presse, rien ne se passe...

(j'entend par numerique : 1 2 3 4 5 6 7 8 9 0 . , - + (mais pas / * par contre))

C'est fesable en pascal ? Merci par avance

Link to comment
Share on other sites

Ok merci beaucoup ca marche :incline:

Encore une petite question toujours en rapport plus ou moins...

Quand on fait un click droit sur l'edit y'a coller... Et bien si des lettres etait copier, elle vont venir... Donc voila la question, quel est l'evenemets qui gere ca ? J'essayerai de me debrouiller pour enlever les lettres...

Merci par avance

Link to comment
Share on other sites

Bon j'ai trouver plus au moins la solution en remplacent l'evenement du menu contextuelle (et celui du ctrl+c) par :

procedure TForm1.Coller1Click(Sender: TObject);
 begin
   j:= 1;
   Edit1.PastefromClipboard;
   edt:=Edit1.Text;
   for k:=1 to length(edt) do
     if (edt[k] in ['0'..'9', DecimalSeparator]) then
       begin
         edt1:=edt1+edt[k];
         j:=j+1;
       end;
   Edit1.Text:=edt1;
 end;

appeler par un popupmenu avec une ligne nomme Coller...

Mais le problème quand je colle pour le première fois du texte dedans, il filtre bien les caracteres, mais lors du deuxieme coller, il a une reaction bizarre... Si vous pouvez tester et me dire d'ou ca viens svp ?

Merci par avance.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...