JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Calculette Décimal/Hexa sous forme de Sub Mar 4 Juin 2013 - 0:45 | |
| J'ai revu ma petite calculette hexa pour la rendre indépendante, sous forme de sub, donc à joindre à n'importe quel programme. Seule contrainte: on passe en paramètre un numéro d'objet libre, la sub va utiliser ce numéro et les 25 numéros suivants. On passe également en paramètres les coordonnées x et y de l'emplacement désiré de la calculette sur le Form 0. La Sub (un peu longue, mais on n'a rien sans rien) inclut un sous-programme qui gère les événements 'appui de touches'. Avec ci-dessous un exemple sommaire d'utilisation: - Code:
-
Calcul_Hexa(100,50,70): ' calculette: objets 100 à 125, en position 50,70 END ' ======================================================= SUB Calcul_Hexa(P,x,y) ' calculette hexadécimal ou décimal ' Paramètres: P = 1er de 26 objets consécutifs de P à P+25, x,y = emplacement DIM_LOCAL n, xc, yc, yd, xd, ax$, wa%, lb: lb = 30 IF VARIABLE("Calcul_id")=0 ' Variables/labels globales: on n'a pas le choix, il faut gérer des événements. LABEL Calcul_click, Calcul_val: ' sous-programmes inclus DIM Calcul_id: Calcul_id = P DIM Calcul_valp, Calcul_ope DIM Cal_i%, Cal_hx%, Cal_x, Cal_y, Cal_vl, Cal_vi, Cal_va$, lab$(5,3) DATA "Calculatrice_data" DATA "D","E","F","hd","A","B","C"," /","7","8","9","x" DATA "4","5","6","-","1","2","3","+","C","0",CHR$(7),"=" ' on pointe sur les bons datas RESTORE: READ lab$(0,0) WHILE lab$(0,0)<>"Calculatrice_data": READ lab$(0,0): END_WHILE FORM P: TOP P,y: LEFT P,x: WIDTH P,160: HEIGHT P,290: BORDER_SMALL P COLOR P,255,164,128: ' HIDE P n = P + 1 LIST n: PARENT n,P: TOP n,0: WIDTH n,WIDTH(P)-16: HEIGHT n,25 COLOR n,200,200,200: FONT_NAME n,"Lucida Console": FONT_SIZE n,14 n = n + 1: yd = 30: xd = 5 FOR yc = 0 TO 5 FOR xc = 0 TO 3 PICTURE n: PARENT n,P: TOP n,yd+(lb+5)*yc: LEFT n,xd+(lb+5)*xc WIDTH n,lb: HEIGHT n,lb READ lab$(yc,xc) 2D_TARGET_IS n: COLOR n,128,128,128: 2D_FILL_COLOR 128,128,128 IF xc = 0 AND yc = 5 COLOR n,164,0,0: 2D_FILL_COLOR 164,0,0 ELSE IF xc = 3 AND yc = 0 COLOR n,0,128,0: 2D_FILL_COLOR 0,128,0 ELSE IF xc = 3 OR (xc=2 AND yc=5) COLOR n,80,80,80: 2D_FILL_COLOR 80,80,80 END_IF END_IF END_IF PRINT_TARGET_IS n FONT_COLOR n,255,255,255: FONT_SIZE n,18: FONT_BOLD n ax$ = lab$(yc,xc): wa% = TEXT_WIDTH(ax$,n) PRINT_LOCATE (lb-wa%)/2,0: PRINT lab$(yc,xc) 2D_PEN_WIDTH 3: 2D_LINE lb-2,1,lb-2,lb-2: 2D_POLY_TO 2,lb-2 ON_CLICK n, Calcul_click n = n + 1 NEXT xc NEXT yc HEIGHT P,272: CAPTION P, " - CALCULETTE -" ITEM_ADD P+1, STRING$(11," ")+"0" PRINT_TARGET_IS 0: 2D_TARGET_IS 0 END_IF Cal_hx% = 0: ' mode décimal implicite HIDE P+2: HIDE P+3: HIDE P+4: HIDE P+6: HIDE P+7: HIDE P+8 SHOW Calcul_id: TO_FOREGROUND Calcul_id EXIT_SUB Calcul_click: ' Sous-programme événement: appui sur une touche de la calculette Cal_i% = NUMBER_CLICK-(Calcul_id+2) Cal_y = INT(Cal_i%/4): Cal_x = Cal_i%-Cal_y*4 Cal_va$ = TRIM$(ITEM_READ$(Calcul_id+1,1)) IF Cal_hx% = 0 Cal_vi = VAL(Cal_va$) ELSE Cal_vi = HEX(Cal_va$) END_IF IF Cal_x < 3 ' touche valeur numérique 0 à 9 (décimal) ou 0 à F (hexa) IF Cal_y < 5 OR Cal_x = 1 IF Cal_hx% = 0 Cal_vl = VAL(lab$(Cal_y,Cal_x)) ELSE Cal_vl = HEX(lab$(Cal_y,Cal_x)) END_IF IF Cal_vi = 0 Cal_va$ = lab$(Cal_y,Cal_x) ELSE IF Cal_hx% = 0 Cal_i% = INSTR(Cal_va$,".") IF Cal_i% > 0 Cal_i% = 1+LEN(Cal_va$)-Cal_i% Cal_x = Cal_vi + Cal_vl/POWER(10,Cal_i%) ELSE Cal_x = Cal_vi*10+Cal_vl END_IF ELSE Cal_x = Cal_vi*16+Cal_vl END_IF IF Cal_x > 2147483647 THEN MESSAGE "Dépassement !": RETURN IF Cal_hx% = 0 Cal_va$ = STR$(Cal_x) ELSE Cal_va$ = HEX$(Cal_x) END_IF END_IF GOSUB Calcul_val ELSE IF Cal_x = 0: ' touche 'C' clear CLEAR Calcul_id+1 ITEM_ADD Calcul_id+1, STRING$(11," ")+"0" ELSE ' touche point décimal (= virgule, calcul décimal) Cal_va$ = Cal_va$ + ".": GOSUB Calcul_val END_IF END_IF ELSE ' Dernière colonne ' touche 0: bascule modes hex/dec ' touche 1: division 2: multiplication 3: soustraction 4: addition ' touche 5: égal, exécuter l'opération IF Cal_y = 0: ' Touche 'hd' bascule entre les modes Hexa et Décimal IF Cal_hx% = 0 SHOW Calcul_id+2: SHOW Calcul_id+3: SHOW Calcul_id+4 SHOW Calcul_id+6: SHOW Calcul_id+7: SHOW Calcul_id+8 HIDE Calcul_id+24: Cal_hx% = 1 CLEAR Calcul_id+1: Cal_va$ = HEX$(INT(Cal_vi)) CAPTION Calcul_id, " MODE HEXADÉCIMAL" ELSE HIDE Calcul_id+2: HIDE Calcul_id+3: HIDE Calcul_id+4 HIDE Calcul_id+6: HIDE Calcul_id+7: HIDE Calcul_id+8 SHOW Calcul_id+24: Cal_hx% = 0: ' mode décimal CLEAR Calcul_id+1: Cal_va$ = STR$(Cal_vi) CAPTION Calcul_id,"- MODE DÉCIMAL -" END_IF GOSUB Calcul_val ELSE IF Cal_y = 5: ' Touche '=': effectuer l'opération demandée IF Calcul_ope > 0 SELECT Calcul_ope CASE 1: Cal_vl = Calcul_valp/Cal_vi IF Cal_hx% = 1 THEN Cal_vl = INT(Cal_vl) CASE 2: Cal_vl = Calcul_valp*Cal_vi CASE 3: Cal_vl = Calcul_valp-Cal_vi CASE 4: Cal_vl = Calcul_valp+Cal_vi END_SELECT IF Cal_vl > 2147483647 THEN MESSAGE "Dépassement !": RETURN IF Cal_hx% = 0 Cal_va$ = STR$(Cal_vl) ELSE Cal_va$ = HEX$(Cal_vl) END_IF GOSUB Calcul_val Calcul_ope = 0 END_IF ELSE Calcul_ope = Cal_y Calcul_valp = Cal_vi Cal_va$ = "0": GOSUB Calcul_val END_IF END_IF END_IF RETURN Calcul_val: CLEAR Calcul_id+1: ' s/p affichage du résultat dans l'écran ITEM_ADD Calcul_id+1, RIGHT$(STRING$(11," ")+Cal_va$, 12) RETURN END_SUB
Maj du 5/6: ajout de la fonction calculette décimale, donc double fonction, avec conversions d'un système à l'autre. 6/6 un peu de nettoyage.
Dernière édition par JL35 le Jeu 6 Juin 2013 - 17:03, édité 3 fois | |
|
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 4 Juin 2013 - 0:55 | |
| Salut JL35, C'est très intéressant tout çà ! Je vais la placer dans mon bibbliolib... Si tu as des programmes indépendants ( *.exe ) que tu veuilles publier sur le site, n'hésites pas à en parler sur les Topic consacré au mag... Edit :J' essai de me faire à la numérotation bizarre no%=no%+1 et pour ce genre de sub qui renvoit plusieurs objets plus loin je fais ceci : - Code:
-
Sub ma_sub ( no%,......... no%=no%+1 : var_obj% = no% if var_obj%=0 .... ..... no%=no%+nbre_objet% else show var_obj%:'cas d'une fenêtre end_if
Dernière édition par ygeronimi le Mar 4 Juin 2013 - 1:05, édité 1 fois | |
|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Calculette Décimal/Hexa sous forme de Sub Mar 4 Juin 2013 - 1:04 | |
| Ca peut servir effectivement si on s'intéresse au binaire (comme tous les programmeurs ?). Sois sans crainte, je n'hésiterai pas à partager si j'ai des choses que je juge intéressantes à communiquer.
Edit on s'est croisés... Y'a un truc qui m'échappe dans ton code, tu fait no%=no%+1: var% = no%: if var% = 0... je ne vois pas bien comment var% peut être égal à zéro ?? du moins si no% n'est pas négatif au départ.
Bonne nuit ygeronimi, si tu es encore dans le coin... mais toi tu es un couche-tard ! | |
|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Calculette Décimal/Hexa sous forme de Sub Mer 5 Juin 2013 - 20:35 | |
| J'ai ajouté les fonctions de calculette en base 10 pour en faire un outil complet, donc calcul dans les deux bases, 10 et 16, et conversion de valeurs d'une base à l'autre. | |
|
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 5 Juin 2013 - 22:06 | |
| @ JL35,
tu as raison, j' ai écris çà vite fait, mais la deuxième ligne doit être après le "if" | |
|