Posted October 20, 200420 yr (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 :) Edited October 22, 200420 yr by cedricpc
October 20, 200420 yr 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 Edited October 20, 200420 yr by mogwai93
October 20, 200420 yr Author Bon il fallait aussi declarer d'autre variable et tu as inverser l'ordre dans val 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 :/
October 20, 200420 yr Author 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 ?
October 20, 200420 yr Author 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 ?
October 20, 200420 yr Author 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 ?
October 20, 200420 yr 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 /
October 20, 200420 yr 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.
October 20, 200420 yr Author Bah j'ai essaye, mais je vois rien de special ! La j'ai un autre probleme... Dans l'aide de Delphi y'a marque dans EditFormat : Syntaxe Delphi : propertyEditFormat:String; Mais je dois y mettre ou ca ? Ca va modifier tout les Edit ?
October 22, 200420 yr Author 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
October 23, 200420 yr J'ai trouvé pour ton pb de chiffre dans un champ edit: http://delphi.developpez.com/faq/?page=compopropri#numbers sinon d'autres infos utiles : http://delphi.developpez.com/faq/ http://delphi.developpez.com/faq/?page=typ...re#formaterreel (formattage d'un nombre réel)
October 23, 200420 yr Author Ok merci beaucoup ca marche 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
October 24, 200420 yr Author 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.
Archived
This topic is now archived and is closed to further replies.