GB3- Une calculatrice ++ en gambas
Rédigé par spheris
Aucun commentaire
Classé dans : accessoire, gambas 3, Logiciels, mathematique

Bonjour,
Valaquarus nous propose ici une calculatrice en gambas3.
La version téléchargeable originale fonctionne avec gambas 3.15 ou supérieur.
Pour utiliser cette application sous gambas 3.14.3 ou inférieur, téléchargez le fichier source ici .
Merci à Philippe pour cette appli.
Le code de l'application ici :
' Gambas class file PRIVATE i AS INTEGER '<---------------------------------------------- indice du tableau de valeurs PRIVATE fValeur AS NEW Float[] '<------------------------------------ tableau de float, de taille indéfinie PRIVATE signe AS STRING '<------------------------------------------ signe des opérations PRIVATE iVirgule AS INTEGER '<------------------------------------- pour suivre la virgule PRIVATE bChiffre AS BOOLEAN '<------------------------------------- drapeau boolean indiquant qu'un chiffre est rentré PRIVATE iPosVirgule AS INTEGER '<---------------------------------- position de la virgule dans le mot PRIVATE iLongMot AS INTEGER '<------------------------------------- longeur du mot PRIVATE iNextCharPos AS INTEGER '<---------------------------------- position du prochain caractère '<------------------------------------------------------------------- création d'un Group pour les chiffres nommé Chiffres '<------------------------------------------------------------------- création d'un Group pour les opérations nommé Signes PUBLIC SUB btnClose_Click() ME.Close() END PUBLIC SUB Form_Open() i = 0 '<---------------------------------------------------------- initialisation diverse iVirgule = 0 END PUBLIC SUB btnEffacer_Click() tbAffichage.Text = String.Mid(tbAffichage.Text, 1, -1) ' tbAffichage.Text = String.Left(tbAffichage.Text, -1) ' Print "-text-"; tbAffichage.Text iLongMot -= 1 IF iLongMot > 0 THEN Insertion() ELSE RETURN IF iPosVirgule = iLongMot THEN iVirgule = 0 END PUBLIC SUB Insertion() fValeur.Add(Val(tbAffichage.Text), i) '<------------------------ récupération de la valeur affichée posVirgule(tbAffichage) '<------------------------------------- position de la virgule dans le mot bChiffre = TRUE '<------------------------------------------- drapeau levé ' Print i; "-insert- "; fValeur[i] END PUBLIC SUB Chiffres_Click() '<------------------------------------- évènement _Click() pour le Group Chiffres IF LAST.text = "." OR LAST.text = "," THEN iVirgule += 1 '<------- une seule virgule possible IF iVirgule > 1 THEN RETURN ELSE tbAffichage.Text &= LAST.text '<------------------------------- concaténation dans textbox1 Insertion() '<------------------------------------------------- insertion de la valeur dans tableau ' bChiffre = True '<------------------------------------------- drapeau levé ENDIF END PUBLIC SUB Signes_Click() '<---------------------------------------- évènement _Click() pour le Group Signes IF bChiffre = TRUE THEN INC i ELSE RETURN SELECT CASE LAST.Text '<---------------------------------------- en fonction du dernier texte des signes CASE ELSE fValeur.Add(fValeur[i - 1], i) '<--------------------------- on récupère la deuxième valeur (inc i au début) signe = LAST.Text '<---------------------------------------- on récupère signe pour l'évènement btnEgal_Click() tbAffichage.Clear bChiffre = FALSE END SELECT END PUBLIC SUB btnEgal_Click() '<---------------------------------------- évènement _Click() lors de l'appui sur "=" IF signe <> "" THEN INC i ELSE RETURN SELECT CASE signe '<---------------------------------------------- les opérations à faire en fonction du signe cliqué CASE "+" fValeur.Add(fValeur[i - 2] + fValeur[i - 1], i) CASE "-" fValeur.Add(fValeur[i - 2] - fValeur[i - 1], i) CASE "/" IF fValeur[i - 1] <> 0 THEN fValeur.Add(fValeur[i - 2] / fValeur[i - 1], i) ELSE RETURN '<-- pas de division par zéro CASE "*" fValeur.Add(fValeur[i - 2] * fValeur[i - 1], i) END SELECT tbAffichage.text = Str$(fValeur[i]) '<-------------------------- localisation Europa Insertion() '<---------------------------------------------------- insertion de la valeur dans le tableau signe = "" '<---------------------------------------------------- pour empêcher de revenir sans passer par un autre signe iVirgule = 0 ' Print i; " -égal- "; fValeur[i] END PUBLIC SUB Form_KeyPress() '<---------------------------------------- saisie clavier DIM vText AS VARIANT DIM cChiffres AS String[] = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ","] DIM cSignes AS String[] = ["+", "-", "*", "/"] vText = Key.Text '<---------------------------------------------- touche pressée IF vText MATCH "." THEN vText = Replace(vText, ".", ",") '<------- localisation Europa IF cChiffres.Exist(vText) THEN LAST.text = vText Chiffres_Click() ENDIF IF cSignes.Exist(vText) THEN LAST.text = vText Signes_Click() ENDIF ME.Text = "Calculatrice ++" '<---------------------------------- pour ne pas afficher vText dans le titre du formulaire IF key.Code = key.Return OR key.Code = key.Enter THEN btnEgal_Click() IF key.code = Key.Esc THEN btnCancel_Click() IF Key.Code = Key.Backspace OR Key.Code = Key.Delete THEN btnEffacer_Click() END PUBLIC SUB posVirgule(monObjet AS OBJECT) SELECT CASE System.Language CASE "en_US.UTF-8" iPosVirgule = String.RInStr(monObjet.Text, ".", 0) iNextCharPos = iPosVirgule + 1 iLongMot = String.Len(monObjet.Text) CASE ELSE '<----------------------------------------------------------- pour Europa iPosVirgule = String.RInStr(monObjet.Text, ",", 0) '<------------------ pour déterminer la position de la virgule iNextCharPos = iPosVirgule + 1 '<----------------------------------- position du prochain caractère iLongMot = String.Len(monObjet.Text) '<----------------------------- longeur du mot END SELECT ' Print iPosVirgule; " ~ "; iLongMot END PUBLIC SUB btnCancel_Click() tbAffichage.Clear i = 0 iVirgule = 0 fValeur.Clear bChiffre = FALSE END