Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Calculatrice Dim 24 Mar 2019 - 11:26 | |
| Bonjour à tous ! Le code de cette calculatrice est destiné à être intégré à l’éditeur EliP mais peut-être utilisé de manière autonome ou dans un quelconque autre programme. Elle n’est qu’en version de prototype, mais fonctionnelle. Elle me permet de vérifier l’absence de conflit quand elle est intégrée au sein d’EliP. Elle s’utilise avec le clavier et/ou la souris. Elle fonctionne aussi parfaitement en tactile sur ma tablette Windows10. Elle n’utilise aucun TIMER, aucune boucle WHILE ou REPEAT pour scanner les touches clavier. Seuls les évènements ON_KEY_DOWN pour le clavier et ON_CLICK pour la souris sont utilisés. Je continue la recherche de bugs. N’hésitez pas de me faire parvenir vos idées et remarques. Bonne journée dominicale ! - Code:
-
LABEL Calculatrice,Calculatrice_Saisie_clavier,Calculatrice_Saisie_Souris
DIM Calculatrice_Souris%,Calculatrice_Clavier%,Code_Touche%,Calc_Espace20%,Calc_Espace14% DIM i%,j% DIM Operation%, memoire, nombre_affiche, chaine_saisie$, erreur
Form_Calculatrice()
ON_KEY_DOWN 600,Calculatrice_Saisie_clavier FOR i% = 610 TO 633 ON_CLICK i%,Calculatrice_Saisie_Souris NEXT i% END ' ------------------------------------------------------------------------------ FNC Calculer(m,o%,n) IF o%=1 RESULT m+n END_IF IF o%=2 RESULT m-n END_IF IF o%=3 RESULT m*n END_IF IF o%=4 RESULT m/n END_IF END_FNC ' ------------------------------------------------------------------------------ SUB Calcul() SELECT Code_Touche% ' Retour arrière CASE 8 IF LEN(chaine_saisie$)=0 chaine_saisie$="" ELSE chaine_saisie$ = LEFT$(chaine_saisie$,LEN(chaine_saisie$)-1) END_IF afficher_chaine(chaine_saisie$) ' touche "C" CASE 67 readd_char_saisie() operation% = 1 Memoire = 0 afficher_chaine(chaine_saisie$) ' touche "0" CASE 96 add_char_saisie("0") afficher_chaine(chaine_saisie$) ' touche "1" CASE 97 add_char_saisie("1") afficher_chaine(chaine_saisie$) ' touche "2" CASE 98 add_char_saisie("2") afficher_chaine(chaine_saisie$) ' touche "3" CASE 99 add_char_saisie("3") afficher_chaine(chaine_saisie$) ' touche "4" CASE 100 add_char_saisie("4") afficher_chaine(chaine_saisie$) ' touche "5" CASE 101 add_char_saisie("5") afficher_chaine(chaine_saisie$) ' touche "6" CASE 102 add_char_saisie("6") afficher_chaine(chaine_saisie$) ' touche "7" CASE 103 add_char_saisie("7") afficher_chaine(chaine_saisie$) ' touche "8" CASE 104 add_char_saisie("8") afficher_chaine(chaine_saisie$) ' touche "9" CASE 105 add_char_saisie("9") afficher_chaine(chaine_saisie$) ' touche"." CASE 110 add_char_saisie(".") IF left$(chaine_saisie$,1) = "." chaine_saisie$ = "0" + chaine_saisie$ END_IF afficher_chaine(chaine_saisie$) ' touche "+" CASE 107 touche_de_calcul() operation% = 1 ' touche "-" CASE 109 touche_de_calcul() operation% = 2
' touche "*" CASE 106 touche_de_calcul() operation% = 3
' touche "/" CASE 111 touche_de_calcul() operation% = 4
' touche "=" CASE 13 IF preconditions() = 1 THEN reset_error() : EXIT_SUB nombre_affiche = calculer(memoire,operation%,nombre_affiche) afficher(nombre_affiche) chaine_saisie$ = "" memoire = 0 operation% = 1
' touche "%" CASE 192 IF operation% = 1 or operation% = 2 nombre_affiche = memoire * nombre_affiche/100 else nombre_affiche = nombre_affiche/100 END_IF afficher(nombre_affiche) chaine_saisie$ = ""
' touche "racine carrée" CASE 300 IF nombre_affiche < 0 THEN reset_error() : EXIT_SUB nombre_affiche = sqr(nombre_affiche) afficher(nombre_affiche) chaine_saisie$ = ""
' touche "x²" CASE 301 IF preconditions() = 1 THEN reset_error() : EXIT_SUB nombre_affiche = nombre_affiche * nombre_affiche afficher(nombre_affiche) chaine_saisie$ = "" ' touche "1/x" CASE 302 IF preconditions() = 1 THEN reset_error() : EXIT_SUB IF nombre_affiche = 0 then reset_error() : EXIT_SUB nombre_affiche = 1 / nombre_affiche afficher(nombre_affiche) chaine_saisie$ = ""
' touche "CE" CASE 303 chaine_saisie$ = "" afficher_chaine(chaine_saisie$)
' touche "+/-" CASE 304 nombre_affiche = (-1)* nombre_affiche afficher(nombre_affiche) chaine_saisie$ = "" END_SELECT END_SUB ' ------------------------------------------------------------------------------ FNC preconditions() RESULT 0 IF operation% = 4 AND nombre_affiche = 0 THEN RESULT 1 IF memoire > POWER(10,127) THEN RESULT 1 IF memoire < POWER(0.1,127) AND memoire > 0 THEN RESULT 1 IF memoire > POWER(0.1,127)*(-1) AND memoire < 0 THEN RESULT 1 IF memoire < POWER(10,127)*(-1) THEN RESULT 1 IF nombre_affiche > POWER(10,127) THEN RESULT 1 IF nombre_affiche < POWER(0.1,127) AND nombre_affiche > 0 THEN RESULT 1 IF nombre_affiche > POWER(0.1,127)*(-1) AND nombre_affiche < 0 THEN RESULT 1 IF nombre_affiche < POWER(10,127)*(-1) THEN RESULT 1 END_FNC ' ------------------------------------------------------------------------------ SUB readd_char_saisie() chaine_saisie$ = "" nombre_affiche = 0 END_SUB ' ------------------------------------------------------------------------------ SUB touche_de_calcul() IF nombre_affiche <> 0 IF preconditions() = 1 THEN reset_error() : EXIT_SUB memoire = calculer(memoire,operation%,nombre_affiche) readd_char_saisie() afficher(memoire) END_IF END_SUB ' ------------------------------------------------------------------------------ SUB reset_error() Memoire = 0 operation%=1 nombre_affiche = 0 chaine_saisie$="" afficher_chaine(":-( fatal ERROR") END_SUB ' ------------------------------------------------------------------------------ SUB add_char_saisie(char$) chaine_saisie$=chaine_saisie$+char$ ' interdiction de mettre 2 virgules dans le nombre saisi IF NUMERIC(chaine_saisie$)= 0 chaine_saisie$ = LEFT$(chaine_saisie$,LEN(chaine_saisie$)-1) END_IF
' suppression du zéro non significatif en tête du nombre saisi IF LEN(chaine_saisie$)=2 AND LEFT$(chaine_saisie$,1)="0" AND MID$(chaine_saisie$,2,1)<>"." chaine_saisie$ = RIGHT$(chaine_saisie$,1) END_IF
' limitation du nombre de chiffres à la saisie IF LEN(chaine_saisie$)>12 THEN chaine_saisie$=LEFT$(chaine_saisie$,12) ' mise à jour du nombre_affiche nombre_affiche = VAL(chaine_saisie$) END_SUB ' ------------------------------------------------------------------------------ SUB afficher(n) DIM_LOCAL chaine$ chaine$=STR$(n) IF LEN(chaine$)>12 FONT_SIZE 601,14 j% = (220-TEXT_WIDTH(chaine$,601))/Calc_Espace14% ELSE FONT_SIZE 601,20 j% = (220-TEXT_WIDTH(chaine$,601))/Calc_Espace20% END_IF chaine$ = STRING$(j%," ")+ chaine$ CAPTION 601,chaine$ END_SUB ' ------------------------------------------------------------------------------ SUB afficher_chaine(chaine$) DIM_LOCAL chaine_finale$ chaine_finale$ = chaine$ IF chaine_finale$ = "" THEN chaine_finale$ = "0" IF LEN(chaine_finale$)>12 FONT_SIZE 601,14 j% = (220-TEXT_WIDTH(chaine_finale$,601))/Calc_Espace14% ELSE FONT_SIZE 601,20 j% = (220-TEXT_WIDTH(chaine_finale$,601))/Calc_Espace20% END_IF chaine_finale$ = STRING$(j%," ")+ chaine_finale$ CAPTION 601,chaine_finale$ END_SUB ' ------------------------------------------------------------------------------ Calculatrice_Saisie_Souris: Calculatrice_Souris%=NUMBER_CLICK IF Calculatrice_Souris% = 610 THEN Code_Touche%= 192 :' % IF Calculatrice_Souris% = 611 THEN Code_Touche%= 300 :' Racine carrée IF Calculatrice_Souris% = 612 THEN Code_Touche%= 301 :' Carré IF Calculatrice_Souris% = 613 THEN Code_Touche%= 302 :' 1/x IF Calculatrice_Souris% = 614 THEN Code_Touche%= 303 :' CE IF Calculatrice_Souris% = 615 THEN Code_Touche%= 67 :' C IF Calculatrice_Souris% = 616 THEN Code_Touche%= 8 :' Retour arrière IF Calculatrice_Souris% = 617 THEN Code_Touche%= 111 :' / IF Calculatrice_Souris% = 618 THEN Code_Touche%= 103 :' 7 IF Calculatrice_Souris% = 619 THEN Code_Touche%= 104 :' 8 IF Calculatrice_Souris% = 620 THEN Code_Touche%= 105 :' 9 IF Calculatrice_Souris% = 621 THEN Code_Touche%= 106 :' * IF Calculatrice_Souris% = 622 THEN Code_Touche%= 100 :' 4 IF Calculatrice_Souris% = 623 THEN Code_Touche%= 101 :' 5 IF Calculatrice_Souris% = 624 THEN Code_Touche%= 102 :' 6 IF Calculatrice_Souris% = 625 THEN Code_Touche%= 109 :' - IF Calculatrice_Souris% = 626 THEN Code_Touche%= 97 :' 1 IF Calculatrice_Souris% = 627 THEN Code_Touche%= 98 :' 2 IF Calculatrice_Souris% = 628 THEN Code_Touche%= 99 :' 3 IF Calculatrice_Souris% = 629 THEN Code_Touche%= 107 :' + IF Calculatrice_Souris% = 630 THEN Code_Touche%= 304 :' +/- IF Calculatrice_Souris% = 631 THEN Code_Touche%= 96 :' 0 IF Calculatrice_Souris% = 632 THEN Code_Touche%= 110 :' . IF Calculatrice_Souris% = 633 THEN Code_Touche%= 13 :' = Calcul() RETURN ' ------------------------------------------------------------------------------ Calculatrice_Saisie_clavier: Code_Touche% = KEY_DOWN_CODE IF Code_Touche% = 48 THEN Code_Touche% = 96 :' touche " 0à " IF Code_Touche% = 49 THEN Code_Touche% = 97 :' touche " 1& " IF Code_Touche% = 50 THEN Code_Touche% = 98 :' touche " 2é " IF Code_Touche% = 51 THEN Code_Touche% = 99 :' touche " 3" " IF Code_Touche% = 52 THEN Code_Touche% = 100 :' touche " 4' " IF Code_Touche% = 53 THEN Code_Touche% = 101 :' touche " 5( " IF Code_Touche% = 54 THEN Code_Touche% = 102 :' touche " 6- " IF Code_Touche% = 55 THEN Code_Touche% = 103 :' touche " 7è " IF Code_Touche% = 56 THEN Code_Touche% = 104 :' touche " 8_ " IF Code_Touche% = 57 THEN Code_Touche% = 105 :' touche " 9ç " IF Code_Touche% = 187 THEN Code_Touche% = 107 :' touche " += " IF Code_Touche% = 191 THEN Code_Touche% = 111 :' touche " :/ " IF Code_Touche% = 187 THEN Code_Touche% = 106 :' touche " *µ " ' voir scancode de touche "-" ' lorsque le clavier n'a pas de pavé numérique ' => pb de discrimination entre - et 6 quand la touche Maj est verrouillée Calcul() RETURN ' ------------------------------------------------------------------------------ SUB Panel_Bouton_Calculatrice(x%) COMMAND_TARGET_IS 0 PANEL 360 WIDTH 360,265 HEIGHT 360,29 TOP 360,x% LEFT 360,WIDTH_CLIENT(0)-270 COLOR 360,250,250,250 FONT_SIZE 360,8 COMMAND_TARGET_IS 360 PICTURE 361 WIDTH 361,256 HEIGHT 361,21 TOP 361,4 LEFT 361,4 COLOR 361,240,240,240 END_SUB ' ------------------------------------------------------------------------------ Calculatrice: HIDE 600 SHOW 600 RETURN ' ------------------------------------------------------------------------------ SUB Form_Calculatrice()
DIM_LOCAL i%,l%,c% COMMAND_TARGET_IS 0 FORM 600 BORDER_SMALL 600 WIDTH 600,281 HEIGHT 600,358 LEFT 600,(SCREEN_X-WIDTH(600))/2 TOP 600,(SCREEN_Y-HEIGHT(600))/2 COLOR 600,250,250,250 COMMAND_TARGET_IS 600 FONT_SIZE 600,10
ALPHA 601 TOP 601,20 LEFT 601,20 FONT_SIZE 601,20
ALPHA 602 TOP 602,4 LEFT 602,4 FONT_SIZE 602,14
Calc_Espace20% = TEXT_WIDTH(" ",601) Calc_Espace14% = TEXT_WIDTH(" ",602) Memoire = 0 chaine_saisie$="0" operation%=1 nombre_affiche = 0 afficher_chaine(chaine_saisie$) c%=4 l%=60 FOR i% = 610 TO 633 PICTURE i% HEIGHT i%,40 WIDTH i%,62 COLOR i%,220,220,220 TOP i%,l% LEFT i%,c% c%=c%+65 IF c% > 250 THEN l%=l%+43 : c%=4 NEXT i%
PRINT_TARGET_IS 610 2D_TARGET_IS 610 2D_FILL_COLOR 220,220,220 FONT_SIZE 610,14 PRINT_LOCATE 20,8 PRINT "%"
PRINT_TARGET_IS 611 2D_TARGET_IS 611 2D_PEN_COLOR 0,0,0 2D_LINE 20,18,24,18 2D_LINE 20,18,24,19 2D_LINE 22,18,28,27 2D_LINE 23,18,29,27 2D_LINE 36,11,27,27 2D_LINE 37,11,28,27 PRINT_TARGET_IS 612 2D_TARGET_IS 612 2D_FILL_COLOR 220,220,220 FONT_SIZE 612,14 PRINT_LOCATE 22,8 PRINT "x²"
PRINT_TARGET_IS 613 2D_TARGET_IS 613 2D_FILL_COLOR 220,220,220 FONT_SIZE 613,14 PRINT_LOCATE 17,8 PRINT "1/x"
PRINT_TARGET_IS 614 2D_TARGET_IS 614 2D_FILL_COLOR 220,220,220 FONT_SIZE 614,14 PRINT_LOCATE 20,8 PRINT "CE"
PRINT_TARGET_IS 615 2D_TARGET_IS 615 2D_FILL_COLOR 220,220,220 FONT_SIZE 615,14 PRINT_LOCATE 25,8 PRINT "C"
PRINT_TARGET_IS 616 2D_TARGET_IS 616 2D_PEN_COLOR 0,0,0 2D_LINE 27,12,19,20 2D_LINE 20,20,28,28 2D_LINE 27,13,41,13 2D_LINE 28,12,42,12 2D_LINE 27,26,41,26 2D_LINE 28,27,42,27 2D_LINE 40,13,40,27 2D_LINE 41,12,41,28 2D_LINE 27,13,20,20 2D_LINE 28,13,20,21 2D_LINE 21,19,29,27 2D_LiNE 21,20,28,27 2D_LINE 29,16,37,24 2D_LINE 30,16,38,24 2D_LINE 36,16,28,24 2D_LINE 37,16,29,24 PRINT_TARGET_IS 617 2D_TARGET_IS 617 2D_PEN_COLOR 0,0,0 2D_LINE 25,20,37,20 2D_LINE 25,21,37,21 2D_LINE 30,15,32,15 2D_LINE 30,16,32,16 2D_LINE 30,25,32,25 2D_LINE 30,26,32,26
PRINT_TARGET_IS 618 2D_TARGET_IS 618 2D_FILL_COLOR 220,220,220 FONT_SIZE 618,16 PRINT_LOCATE 25,7 PRINT "7"
PRINT_TARGET_IS 619 2D_TARGET_IS 619 2D_FILL_COLOR 220,220,220 FONT_SIZE 619,16 PRINT_LOCATE 25,7 PRINT "8"
PRINT_TARGET_IS 620 2D_TARGET_IS 620 2D_FILL_COLOR 220,220,220 FONT_SIZE 620,16 PRINT_LOCATE 25,7 PRINT "9"
PRINT_TARGET_IS 621 2D_TARGET_IS 621 2D_PEN_COLOR 0,0,0 2D_LINE 27,15,37,25 2D_LINE 28,15,38,25 2D_LINE 29,15,39,25 2D_LINE 36,15,26,25 2D_LINE 37,15,27,25 2D_LINE 38,15,28,25 PRINT_TARGET_IS 622 2D_TARGET_IS 622 2D_FILL_COLOR 220,220,220 FONT_SIZE 622,16 PRINT_LOCATE 25,7 PRINT "4"
PRINT_TARGET_IS 623 2D_TARGET_IS 623 2D_FILL_COLOR 220,220,220 FONT_SIZE 623,16 PRINT_LOCATE 25,7 PRINT "5"
PRINT_TARGET_IS 624 2D_TARGET_IS 624 2D_FILL_COLOR 220,220,220 FONT_SIZE 624,16 PRINT_LOCATE 25,7 PRINT "6"
PRINT_TARGET_IS 625 2D_TARGET_IS 625 2D_FILL_COLOR 220,220,220 2D_PEN_COLOR 0,0,0 2D_LINE 25,20,37,20 2D_LINE 25,21,37,21
PRINT_TARGET_IS 626 2D_TARGET_IS 626 2D_FILL_COLOR 220,220,220 FONT_SIZE 626,16 PRINT_LOCATE 25,7 PRINT "1"
PRINT_TARGET_IS 627 2D_TARGET_IS 627 2D_FILL_COLOR 220,220,220 FONT_SIZE 627,16 PRINT_LOCATE 25,7 PRINT "2"
PRINT_TARGET_IS 628 2D_TARGET_IS 628 2D_FILL_COLOR 220,220,220 FONT_SIZE 628,16 PRINT_LOCATE 25,7 PRINT "3"
PRINT_TARGET_IS 629 2D_TARGET_IS 629 2D_FILL_COLOR 220,220,220 FONT_SIZE 629,14 PRINT_LOCATE 25,8 PRINT "+"
PRINT_TARGET_IS 630 2D_TARGET_IS 630 2D_PEN_COLOR 0,0,0 2D_LINE 30,12,30,24 2D_LINE 31,12,31,24 2D_lINE 25,17,37,17 2D_LINE 25,18,37,18 2D_LINE 25,26,37,26 2D_LINE 25,27,37,27
PRINT_TARGET_IS 631 2D_TARGET_IS 631 2D_FILL_COLOR 220,220,220 FONT_SIZE 631,16 PRINT_LOCATE 25,7 PRINT "0"
PRINT_TARGET_IS 632 2D_TARGET_IS 632 2D_FILL_COLOR 220,220,220 FONT_SIZE 632,16 PRINT_LOCATE 25,7 PRINT ","
PRINT_TARGET_IS 633 2D_TARGET_IS 633 2D_FILL_COLOR 220,220,220 FONT_SIZE 633,14 PRINT_LOCATE 25,8 PRINT "=" END_SUB | |
|