* * * * * * * PROGRAMA: * FUN€ŽO..: * AUTOR...: * * * * * * calcu() * * * * * * * * * * * * * * CALC.PRG * CALCULADORA * ANDERSON CARDOSO SILVA * * * * * * * * * * * * * * * FUNCTION CALCu() #INCLUDE "INKEY.CH" #INCLUDE "MOUSE.CH" *------------------------*** COMANDO: "BOTAO" - VERSAO CALCULADORA *** POR....: ANDERSON CARDOSO SILVA *** DATA...: 09/01/96 #COMMAND @ <XYZlin>,<XYZcol> BOTAO <XYZnome> [SOMBRA <XYZcor>] [MENSAGEM <XYZmens>] [COM <XYZcor2>] [TECLA <XYtecla>]; => ; CBOTAO(<XYZlin>, <XYZcol>, <XYZnome>, <XYZcor>, <XYZmens>, <XYZcor2>, <XYtecla>) #COMMAND PRESSIONE <XYZopcao>; => ; <XYZopcao>:=CLEBOTAO(<XYZopcao>) MR:=ARRAY(4) aCBOTAOpars:={} PUBLIC aCBOTAOpars, nBUTTONS, RATO, MR IF MOUSEINIT(@nBUTTONS) RATO:=1 ELSE RATO:=0 ENDIF *--------------------------OLD=SETCOLOR() VELHO=SETCURSOR() SETCURSOR(0) SET SCOREBOARD OFF ZX=SAVESCREEN(00,00,24,79) N:=""; DEC:=3; XX:=40; YY:=10; CA=.T.; OLDXX:=XX; OLDYY:=YY; Z:=1; RES:=ARRAY(3); RES[1]:=""; RES[2]:=""; RES[3]:=""; OM:=0 PUBLIC N, RES, XX, YY, TEI, TEC, OLDXX, OLDYY, Z, OM // CARA BOXSHADOW(YY-2,XX-3,YY+12,XX+29,"W/B") DISPBOX(YY-2,XX-3,YY+12,XX+29,"ܲÜÛÛÜÛÛ","BG/B") PLAK(YY-1,XX-1,YY+1,XX+27,"B") //----SETCOLOR("N/W") *------DO WHILE CA=.T. @ YY+2,XX+8 BOTAO " &CE " SOMBRA "N+/B" @ YY+2,XX+19 BOTAO " &/ " SOMBRA "N+/B" @ YY+4,XX+24 BOTAO " &* " SOMBRA "N+/B" @ YY+6,XX+24 BOTAO " &- " SOMBRA "N+/B" * @ 14,71 SAY " " @ YY+8,XX+24 BOTAO " &+ " SOMBRA "N+/B" * @ 16,71 SAY " " * @ 18,71 SAY " " @ YY+10,XX+20 BOTAO " &= <Ù " SOMBRA "N+/B" * @ 20,70 SAY CHR(27)+"Ù" @ YY+8,XX-1 BOTAO " F5 " SOMBRA "N+/B" TECLA K_F5 @ YY+8,XX+5 SAY "Mov" COLOR "W+/B" @ YY+10,XX-1 BOTAO " &S " SOMBRA "N+/B" @ YY+10,XX+4 SAY "Sai" COLOR "W+/B" @ YY+4,XX+9 BOTAO " &7 " SOMBRA "N+/B"; @ YY+4 ,XX+14 BOTAO " SOMBRA "N+/B"; @ YY+4,XX+19 BOTAO " &9 " SOMBRA "N+/B" @ YY+6,XX+9 BOTAO " &4 " SOMBRA "N+/B"; @ YY+6 ,XX+14 BOTAO " SOMBRA "N+/B"; @ YY+6,XX+19 BOTAO " &6 " SOMBRA "N+/B" @ YY+8,XX+9 BOTAO " &1 " SOMBRA "N+/B"; @ YY+8 ,XX+14 BOTAO " SOMBRA "N+/B"; @ YY+8,XX+19 BOTAO " &3 " SOMBRA "N+/B" @ YY+10,XX+9 BOTAO " &0 " SOMBRA "N+/B"; @ YY+10,XX+14 BOTAO " SOMBRA "N+/B" @ YY+2,XX-1 BOTAO " F2 " SOMBRA "N+/B" TECLA K_F2; @ YY+2 ,XX+5 SAY "a" "W+/B"; @ YY+2 ,XX+6 SAY "ü" COLOR "R+/B" @ YY+4,XX-1 BOTAO " F3 " SOMBRA "N+/B" TECLA K_F3; @ YY+4 ,XX+5 SAY "û" "W+/B" @ YY+6,XX-1 BOTAO " F4 " SOMBRA "N+/B" TECLA K_F4; @ YY+6 ,XX+5 SAY "%" "W+/B" @ YY+2,XX+14 BOTAO " "+CHR(27)+" " SOMBRA "N+/B" TECLA K_BS PK2:=SAVESCREEN(YY-2,XX-3,YY+12,XX+29) *-------// KEYBOARD K_INS; TEC:=6 DO WHILE CA=.T. IF (OLDXX<>XX .OR. OLDYY<>YY) .OR. (OLDXX<>XX .AND. OLDYY<>YY) RESTSCREEN(00,00,24,79,ZX) BOXSHADOW(YY-2,XX-3,YY+12,XX+29,"W/B,N/GR") RESTSCREEN(YY-2,XX-3,YY+12,XX+29,PK2) @ YY+08,XX SAY "F5" COLOR "N/W" OLDXX:=XX; OLDYY:=YY ENDIF IF !EMPTY(RES[2]) @ YY,XX SAY IF(VALTYPE(RES[Z])="C", VAL(RES[Z]), RES[Z]) PICT "9999999999999999999999.9999" COLOR "N/GR" ELSE @ YY,XX SAY IF(VALTYPE(RES[1])="C", VAL(RES[1]), RES[1]) PICT "9999999999999999999999.9999" COLOR "N/GR" ENDIF PRESSIONE TEC //; IF VALTYPE(RES)="N"; RES=STR(RES); ENDIF IF Z=3 Z:=2 ENDIF IF TEC=6 .AND. EMPTY(RES[2]) EXIT &8 " &5 " &2 " &. " COLOR COLOR COLOR ENDIF DO CASE CASE TEC=9 RES[Z]:=RES[Z]+"7" CASE TEC=10 RES[Z]:=RES[Z]+"8" CASE TEC=11 RES[Z]:=RES[Z]+"9" CASE TEC=12 RES[Z]:=RES[Z]+"4" CASE TEC=13 RES[Z]:=RES[Z]+"5" CASE TEC=14 RES[Z]:=RES[Z]+"6" CASE TEC=15 RES[Z]:=RES[Z]+"1" CASE TEC=16 RES[Z]:=RES[Z]+"2" CASE TEC=17 RES[Z]:=RES[Z]+"3" CASE TEC=18 RES[Z]:=RES[Z]+"0" CASE TEC=19 RES[Z]:=RES[Z]+"." CASE TEC=1 RES[1]:="" RES[2]:="" RES[3]:="" Z:=1 // CE *----- HABILITACOES DA CALCULADORA CASE TEC=2 Z:=DIVIDE() OM:=1 CASE TEC=3 Z:=MULTIPLICA() OM:=2 CASE TEC=4 Z:=SUBTRAI() OM:=3 CASE TEC=5 Z:=SOMA() OM:=4 CASE TEC=20 Z:=EXPOENTE() OM:=5 CASE TEC=21 Z:=RAIZ() OM:=6 CASE TEC=22 Z:=PORCENTAGEM() OM:=7 *----CASE TEC=6 Z:=RESULT() CASE TEC=23 RES[Z]:=SUBSTR(RES[Z],1,LEN(RES[Z])-1) CASE TEC=7 MOVE() CASE TEC=8 SAICALC() ENDCASE * @ YY,XX SAY REPLI(" ",23) COLOR "N/GR" IF VALTYPE(RES[Z])="C" @ YY,XX SAY VAL(RES[Z]) PICT "9999999999999999999999.9999" COLOR "N/GR" ENDIF IF VALTYPE(RES[Z])="N" @ YY,XX SAY RES[Z] PICT "9999999999999999999999.9999" COLOR "N/GR" ENDIF EXIT ENDDO ENDDO RESTSCREEN(00,00,24,79,ZX); SETCURSOR(VELHO); SETCOLOR(OLD) RETURN FUNC SAICALC CA=.F.; RESTSCREEN(00,00,24,79,ZX) MOUSEOFF() RETURN (CA) FUNC MOVE @ YY+08,XX SAY "F5" COLOR "N*/W"; MM:={ {}, {}, {}, {} } PK2:=SAVESCREEN(YY-2,XX-3,YY+12,XX+29) AA=0 DO WHILE .T. AA:=INKEY() MOUSEREAD(MM) // LEFT, RIGHT, ROW, COL MOUSEON() OLDXX:=XX; OLDYY:=YY DO CASE CASE AA==K_UP YY-CASE AA==K_DOWN YY++ CASE AA==K_LEFT XX-CASE AA==K_RIGHT XX++ CASE MM[1]==.T. .OR. MM[2]==.T. IF MM[3]==YY-2 .AND. MM[4]>=XX-3 .AND. MM[4]<=XX+25 MPOSL:=MM[3]; MPOSC:=MM[4] DO WHILE MM[1]==.T. .OR. MM[2]==.T. MOUSEREAD(MM) IF MM[3]<MPOSL YY:=YY-(MPOSL-MM[3]) ELSEIF MM[3]>MPOSL YY:=YY+(MM[3]-MPOSL) ENDIF IF MM[4]<MPOSC XX:=XX-(MPOSC-MM[4]) ELSEIF MM[4]>MPOSC XX:=XX+(MM[4]-MPOSC) ENDIF IF MM[3]<>MPOSL .OR. MM[4]<>MPOSC .OR. MM[3]<>MPOSL .AND. MM[4]<>MPOSC IF (XX-3) <=0 ; XX:=3; ENDIF IF (XX+29)>=77; XX:=48; ENDIF IF (YY-2) <=0 ; YY:=2; ENDIF IF (YY+12)>=24; YY:=12; ENDIF RESTSCREEN(00,00,24,79,ZX) BOXSHADOW(YY-2,XX-3,YY+12,XX+29,"W/B") RESTSCREEN(YY-2,XX-3,YY+12,XX+29,PK2) MPOSL:=MM[3]; MPOSC:=MM[4] ENDIF ENDDO EXIT ENDIF ENDCASE IF (XX-3) <=0 ; XX=3; ENDIF IF (XX+29)>=77; XX=48; ENDIF IF (YY-2) <=0 ; YY=2; ENDIF IF (YY+12)>=24; YY=12; ENDIF IF XX<>OLDXX .OR. YY<>OLDYY RESTSCREEN(00,00,24,79,ZX) BOXSHADOW(YY-2,XX-3,YY+12,XX+29,"W/B") RESTSCREEN(YY-2,XX-3,YY+12,XX+29,PK2) ENDIF IF AA==K_F5 .OR. AA==K_ESC; @ YY+08,XX SAY "F5" COLOR "N/W"; EXIT; ENDIF ENDDO RESTSCREEN(00,00,24,79,ZX) BOXSHADOW(YY-2,XX-3,YY+12,XX+29,"W/B") RESTSCREEN(YY-2,XX-3,YY+12,XX+29,PK2) RETURN FUNC SOMA() IF Z=1 Z:=2 RETURN Z ENDIF IF Z=2 .AND. !EMPTY(RES[2]) RES[3]:=STR(VAL(RES[1])+VAL(RES[2])) // SOMA Z:=3 RES[1]:=RES[3] RES[2]:="" ELSE Z := 2 RETURN Z ENDIF RETURN Z FUNC SUBTRAI IF Z=1 Z:=2 RETURN Z ENDIF IF Z=2 .AND. !EMPTY(RES[2]) RES[3]:=STR(VAL(RES[1])-VAL(RES[2])) // SUBTRAI Z:=3 RES[1]:=RES[3] RES[2]:="" ELSE Z := 2 RETURN Z ENDIF RETURN Z FUNC MULTIPLICA IF Z=1 Z:=2 RETURN Z ENDIF IF Z=2 .AND. !EMPTY(RES[2]) RES[3]:=STR(VAL(RES[1])*VAL(RES[2])) // MULTIPLICA Z:=3 RES[1]:=RES[3] RES[2]:="" ELSE Z := 2 RETURN Z ENDIF RETURN Z FUNC DIVIDE IF Z=1 Z:=2 RETURN Z ENDIF IF Z=2 .AND. !EMPTY(RES[2]) RES[3]:=STR(VAL(RES[1])/VAL(RES[2])) // DIVIDE Z:=3 RES[1]:=RES[3] RES[2]:="" ELSE Z := 2 RETURN Z ENDIF RETURN Z FUNC EXPOENTE IF Z=1 Z:=2 RETURN Z ENDIF IF Z=2 .AND. !EMPTY(RES[2]) RES[3]:=STR(VAL(RES[1])**VAL(RES[2])) // EXPOENTE Z:=3 RES[1]:=RES[3] RES[2]:="" ELSE Z := 2 RETURN Z ENDIF RETURN Z FUNC RAIZ IF Z=1 Z:=2 RETURN Z ENDIF IF Z=2 .AND. !EMPTY(RES[2]) RES[3]:=STR(VAL(RES[1])**1/(VAL(RES[2]))) // RAIZ Z:=3 RES[1]:=RES[3] RES[2]:="" ELSE Z := 2 RETURN Z ENDIF RETURN Z FUNC PORCENTAGEM IF Z=1 Z:=2 RETURN Z ENDIF IF Z=2 .AND. !EMPTY(RES[2]) RES[3]:=STR(VAL(RES[1])*(VAL(RES[2])/100)) // PORCENTAGEM Z:=3 RES[1]:=RES[3] RES[2]:="" ELSE Z := 2 RETURN Z ENDIF RETURN Z FUNC RESULT IF Z=2 DO CASE CASE OM=1 RES[3]:=STR(VAL(RES[1])/VAL(RES[2])) // DIVIDE CASE OM=2 RES[3]:=STR(VAL(RES[1])*VAL(RES[2])) // MULTIPLICA CASE OM=3 RES[3]:=STR(VAL(RES[1])-VAL(RES[2])) // SUBTRAI CASE OM=4 RES[3]:=STR(VAL(RES[1])+VAL(RES[2])) // SOMA CASE OM=5 RES[3]:=STR(VAL(RES[1])**VAL(RES[2])) // EXPOENTE CASE OM=6 RES[3]:=STR(VAL(RES[1])**(1/(VAL(RES[2])))) // RAIZ CASE OM=7 RES[3]:=STR(VAL(RES[1])*(VAL(RES[2])/100)) // PORCENTAGEM ENDCASE Z:=3 RES[1]:=RES[3] RES[2]:="" ENDIF RETURN Z ******************************************************** FIM CALCULADORA FUNCTION BoxShadow( nTop, nLeft, nBottom, nRight, cCOLOR) LOCAL nShadTop LOCAL nShadLeft LOCAL nShadBottom LOCAL nShadRight nShadTop := nShadBottom := MIN( nBottom + 1, MAXROW() ) nShadLeft := nLeft + 2 nShadRight := MIN( nRight + 1, MAXCOL() ) // This paints the shadow region by replacing the actual screen color // attributes with " " (CHR(7), low intensity white on black) which // gives the illusion of a shadow RESTSCREEN( nShadTop, nShadLeft, nShadBottom, nShadRight, TRANSFORM( SAVESCREEN(nShadTop, nShadLeft, nShadBottom, nShadRight), REPLICATE("X ", nShadRight - nShadLeft + 1 ) ) ) nShadTop := nTop + 1 nShadLeft := nShadRight := MIN( nRight + 1, MAXCOL() ) nShadBottom := nBottom RESTSCREEN( nShadTop, nShadLeft, nShadBottom, nShadRight, TRANSFORM( SAVESCREEN(nShadTop, nShadLeft, nShadBottom, nShadRight), REPLICATE("X ", nShadBottom - nShadTop + 1 ) ) ) RESTSCREEN( nTop+1, nRight+2, nBottom+1, nRight+2, ; TRANSFORM( SAVESCREEN(nTop+1, nRight+2, nBottom+1, nRight+2), ; REPLICATE("X ", nBottom+1 - nTop + 1 ) ) ) SETCOLOR(cCOLOR) @ nTop, nLeft CLEA TO nBottom, nRight @ nTop, nLeft TO nBottom, nRight RETURN ( NIL ) FUNC PLAK(L1,C1,L2,C2,BAC) OLD=SETCOLOR(); SETCOLOR("N/W"); @ L1,C1 CLEA TO L2,C2 PC1="N+/"+BAC; PC2="R/"+BAC; PC3="R+/"+BAC @ L1,C1 SAY REPLI("Ü",C2-C1) COLOR PC1 @ L1,C2 SAY "Ü" COLOR PC2; Z=(L2-L1)-1 FOR Y=0 TO Z; @ L1+1+Y,C1 SAY "Û" COLOR PC1; NEXT FOR Y=0 TO Z; @ L1+1+Y,C2 SAY "Û" COLOR PC3; NEXT @ L2,C1 SAY REPLI("ß",(C2-C1)+1) COLOR PC3 @ L2,C1 SAY "ß" COLOR PC2; SETCOLOR(OLD) RETURN *** FUN€”ES DE BASE DO COMANDO "BOTAO" COM SUPORTE PARA MOUSE (V. CALC.) *** POR: ANDERSON CARDOSO SILVA **************** FUNC CBOTAO(MSLN,MSCN,MSNOME,MSCOR,MSMENSAGEM,MSCOR2,MSALT) MSOLDCOLOR:=SETCOLOR() IF EMPTY(MSCOR) MSBAC:=SUBSTR(MSOLDCOLOR,3,2) IF SUBSTR(MSBAC,2,1)="," MSBAC:=SUBSTR(MSBAC,1,1) ENDIF ; ; ; ; MSCOR:="N/"+MSBAC ENDIF IF (MSTECLA:=AT("&",MSNOME))>0 MSNOME:=SUBSTR(MSNOME,1,MSTECLA-1) + SUBSTR(MSNOME,MSTECLA+1) ENDIF @ MSLN,MSCN SAY MSNOME COLOR "N/W"// MESSA {||MENSA(MENSAGEM, COR2)} @ MSLN+1,MSCN+1 SAY REPLI("ß",LEN(MSNOME)) COLOR MSCOR; @ MSLN,MSCN+LEN(MSNOME) SAY "Ü" COLOR MSCOR AADD(aCBOTAOpars, {MSLN, MSCN, MSNOME, MSCOR, MSMENSAGEM, MSCOR2, MSTECLA, MSALT}) RETURN **************** FUNC CLEBOTAO(OPC) MSOLD:=SETCOLOR() FOR T=1 TO LEN(aCBOTAOpars) MSLN := aCBOTAOpars[T][1] MSCN := aCBOTAOpars[T][2] MSNOME := aCBOTAOpars[T][3] MSCOR := aCBOTAOpars[T][4] MSTECLA := aCBOTAOpars[T][7] @ MSLN,MSCN SAY MSNOME COLOR "N/W" IF !EMPTY(MSTECLA) MSATALHO:=SUBSTR(MSNOME,MSTECLA,1) * @ MSLN,MSCN+MSTECLA-1 SAY MSATALHO COLOR "R+/W" ENDIF NEXT IF EMPTY(OPC); OPC:=1; ENDIF CURS:=SETCURSOR(); SETCURSOR(0) // SETCOLOR("n/w, N*/w") R:=OPC; OLDR:=R; CURSOR:=0; MSLN:=aCBOTAOpars[R][1]; MSCN:=aCBOTAOpars[R][2]; MSNOME:=aCBOTAOpars[R][3]; MSTECLA:=aCBOTAOpars[R][7]; MSALT:=aCBOTAOpars[R][8] DO WHILE CURSOR<>27 .AND. CURSOR<>13 .AND. OLDR=R @ MSLN,MSCN SAY MSNOME COLOR "N/W" IF !EMPTY(MSTECLA) MSATALHO:=SUBSTR(MSNOME,MSTECLA,1) * @ MSLN,MSCN+MSTECLA-1 SAY MSATALHO COLOR "R+/W" ENDIF MSLN MSCN MSNOME MSCOR MSMENSAGEM MSCOR2 MSTECLA MSALT := := := := := := := := aCBOTAOpars[R][1] aCBOTAOpars[R][2] aCBOTAOpars[R][3] aCBOTAOpars[R][4] aCBOTAOpars[R][5] aCBOTAOpars[R][6] aCBOTAOpars[R][7] aCBOTAOpars[R][8] @ MSLN,MSCN SAY MSNOME COLOR "N*/W" IF EMPTY(MSCOR2); MSCOR2:="B/BG"; ENDIF IF !EMPTY(MSMENSAGEM) @ 24,10 SAY MSMENSAGEM+REPLI(" ",69-LEN(MSMENSAGEM)) COLOR MSCOR2 ENDIF DO WHILE CURSOR<>27 .AND. CURSOR<>13 .AND. OLDR=R CURSOR:=INKEY() // ******************** OLDR:=R IF CURSOR==4 .OR. CURSOR==24 IF R<LEN(aCBOTAOpars) R++ ELSEIF R==LEN(aCBOTAOpars) IF SET(_SET_WRAP) R:=1 ENDIF ENDIF ELSEIF CURSOR==19 .OR. CURSOR==5 IF R>1 R-ELSEIF R==1 IF SET(_SET_WRAP) R:=LEN(aCBOTAOpars) ENDIF ENDIF ENDIF *** TECLA ATALHO *** // EXPLICITA IF (ACHOU:=ASCAN(aCBOTAOpars, {|aBOTAO| UPPER(SUBSTR(aBOTAO[3],aBOTAO[7],1))==UPPER(CHR(CURSOR))})) > 0 R:=ACHOU ENDIF // IMPLICITA IF (ACHOU:=ASCAN(aCBOTAOpars, {|aBOTAO| aBOTAO[8]==CURSOR})) > 0 R:=ACHOU ENDIF *** SERVI€O DE MOUSE *** IF RATO=1 MOUSEON() MOUSEREAD(MR) IF (ACHOU:=ASCAN(aCBOTAOPARS, {|aBOTAO| MR[3]==aBOTAO[1] .AND. MR[4]>=aBOTAO[2] .AND. MR[4]<=(aBOTAO[2]+LEN(aBOTAO[3])) } )) > 0 IF MR[1]=.T. .OR. MR[2]=.T. CURSOR:=13; R:=ACHOU ENDIF * ELSE * IF MR[1]=.T. .OR. MR[2]=.T. * R:=0 * CURSOR:=27 * ENDIF ENDIF ENDIF IF OLDR<>R; EXIT; ENDIF ENDDO ENDDO *----@ MSLN,MSCN SAY MSNOME COLOR "N/W" MSLN := aCBOTAOpars[R][1] MSCN MSNOME MSCOR MSMENSAGEM MSCOR2 MSTECLA MSALT := := := := := := := aCBOTAOpars[R][2] aCBOTAOpars[R][3] aCBOTAOpars[R][4] aCBOTAOpars[R][5] aCBOTAOpars[R][6] aCBOTAOpars[R][7] aCBOTAOpars[R][8] @ MSLN,MSCN SAY MSNOME COLOR "N*/W" IF EMPTY(MSCOR2); MSCOR2:="B/BG"; ENDIF IF !EMPTY(MSMENSAGEM) @ 24,10 SAY MSMENSAGEM+REPLI(" ",69-LEN(MSMENSAGEM)) COLOR MSCOR2 ENDIF *-----* IF CURSOR==27 * R:=0 * SETCURSOR(CURS) * aBOTAOpars:={}; MR:={ {}, {}, {}, {}} * IF RATO=1; MOUSEOFF(); ENDIF * RETURN R * ENDIF B1=SAVESCREEN(MSLN,MSCN,MSLN+1,((MSCN+1)+LEN(MSNOME))) SETCOLOR(MSCOR) @ MSLN,MSCN CLEA TO MSLN+1,(MSCN+1)+LEN(MSNOME) @ MSLN,MSCN+1 SAY MSNOME COLOR "N*/W" //TONE(130,2) nKEYPAUSE := 0 nKEYPAUSE := INKEY(.1) IF nKEYPAUSE # 0 KEYBOARD CHR(nKEYPAUSE) ENDIF @ MSLN,MSCN CLEA TO MSLN+1,(MSCN+1)+LEN(MSNOME) RESTSCREEN(MSLN,MSCN,MSLN+1,((MSCN+1)+LEN(MSNOME)),B1) //TONE(130,1) SETCURSOR(CURS) aCBOTAOpars:={}; MR:={ {}, {}, {}, {} } IF RATO=1; MOUSEOFF(); ENDIF RETURN R