Aller au contenu

N'autoriser que les char numeriques dans un Edit.


cedricpc

Messages recommandés

(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 :)

Lien vers le commentaire
Partager sur d’autres 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

Lien vers le commentaire
Partager sur d’autres 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 :/

Lien vers le commentaire
Partager sur d’autres 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 ?

Lien vers le commentaire
Partager sur d’autres 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 /

Lien vers le commentaire
Partager sur d’autres 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.

Lien vers le commentaire
Partager sur d’autres 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

Lien vers le commentaire
Partager sur d’autres 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.

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...