Olá!
Tem um livro antigo, "111 funções do Clipper" de Ramalho. Vem alguns gráficos para CONSOLE.
Vou ver se encontro aqui o PRG.
http://www.pctoledo.com.br/forum/viewtopic.php?f=5&t=14031#p81699GRAFHOR2()
INKEY(0)
PRIVATE M[12,2]
M[1,1]=100
M[2,1]=200
M[3,1]=300
M[4,1]=400
M[5,1]=250
M[6,1]=335
M[7,1]=050
M[8,1]=220
M[9,1]=360
M[10,1]=390
M[11,1]=215
M[12,1]=280
M[1,2]="JAN"
M[2,2]="FEV"
M[3,2]="MAR"
M[4,2]="ABR"
M[5,2]="MAI"
M[6,2]="JUN"
M[7,2]="JUL"
M[8,2]="AGO"
M[9,2]="SET"
M[10,2]="OUT"
M[11,2]="NOV"
M[12,2]="DEZ"
GRAFV2(M,.T.,"EVOLUCAO MENSAL DE VENDAS","EM MILHARES DE PECAS",;
"MEGATRON ASSESSORIA E TREINAMENTO")
inkey(0)
ASIZE(M,6)
GRAFV2(M,.F.,"EVOLUCAO SEMESTRAL DE VENDAS","EM MILHARES DE PECAS",;
"REGIAO DE SAO PAULO")
inkey(0)
ASIZE(M,3)
GRAFV2(M,.T.,"EVOLUCAO TRIMESTRAL DE VENDAS","EM MILHARES DE PECAS",;
"REGIAO DE SAO PAULO")
INKEY(0)
PRIVATE M[12,2]
M[1,1]=100
M[2,1]=200
M[3,1]=300
M[4,1]=400
M[5,1]=250
M[6,1]=335
M[7,1]=050
M[8,1]=220
M[9,1]=360
M[10,1]=390
M[11,1]=215
M[12,1]=280
M[1,2]="JAN"
M[2,2]="FEV"
M[3,2]="MAR"
M[4,2]="ABR"
M[5,2]="MAI"
M[6,2]="JUN"
M[7,2]="JUL"
M[8,2]="AGO"
M[9,2]="SET"
M[10,2]="OUT"
M[11,2]="NOV"
M[12,2]="DEZ"
GRAFV1(M,.T.,"EVOLUCAO MENSAL DE VENDAS","EM MILHARES DE PECAS",;
"MEGATRON ASSESSORIA E TREINAMENTO")
inkey(0)
ASIZE(M,6)
GRAFV1(M,,"EVOLUCAO SEMESTRAL DE VENDAS","EM MILHARES DE PECAS",;
"REGIAO DE SAO PAULO")
inkey(0)
ASIZE(M,3)
GRAFV1(M,.T.,"EVOLUCAO TRIMESTRAL DE VENDAS","EM MILHARES DE PECAS",;
"REGIAO DE SAO PAULO")
INKEY(0)
GRAFHOR1()
INKEY(0)
GRAFHOR1("RECEITA","RECEITA DA FILIAL SAO PAULO")
******************************************************************
FUNCTION GRAFV1(V,MOSTRAVAL,TITULO1,TITULO2,TITULO3)
SAVE SCREEN TO TGV1
CLEAR
MOSTRAVAL=IF(MOSTRAVAL=NIL,.F.,.T.)
TAM=LEN(V) ; LARG:= 60/TAM //IF(TAM<=7,7,5)
M1={CHR(240),CHR(177),CHR(178),CHR(219),CHR(220),CHR(221), ;
CHR(240),CHR(197),CHR(206),"*" ,"X" ,"+"}
PORC:= T:=0
FOR I = 1 TO TAM
PORC=IF( PORC <= V[I,1],V[I,1],PORC)
NEXT
ESCALA = PORC / 5
PORC1=PORC
NUM:= NUM1:= NUM2:=0
FOR NUM= 1 TO 21 STEP 4
@ NUM,0 SAY STR(PORC,4)
PORC = PORC - ESCALA
NEXT
FOR I = 1 TO 20
@ I,5 SAY CHR(179)
NEXT
@ I,5 SAY CHR(192) + REPL(CHR(196),72)
T=6-LARG
FOR I = 1 TO TAM
@ 22,T+LARG+1 SAY LEFT(V[I,2],LARG)
POS =INT(V[I,1]*20/PORC1) ; BAR=20-POS+1
FOR J=20 TO BAR STEP-1
@ J,T+LARG+1 SAY REPL(M1[I],LARG)
NEXT
IF MOSTRAVAL=.T.
@ BAR,T+LARG+(LARG/2) SAY STR(V[I,1],3)
ENDIF
T=T+ LARG+1
NEXT
IF TITULO1<>NIL
POSINI=(80-LEN(TITULO1))/2
@ 23,POSINI SAY TITULO1
ENDIF
IF TITULO2<>NIL
POSINI=(80-LEN(TITULO2))/2
@ 24,POSINI SAY TITULO2
ENDIF
IF TITULO3<>NIL
POSINI=(80-LEN(TITULO3))/2
@ 0,POSINI SAY TITULO3
ENDIF
INKEY(0)
RESTORE SCREEN FROM TGV1
***************************************************
FUNCTION GRAFV2(V,MOSTRAVAL,TITULO1,TITULO2,TITULO3)
SAVE SCREEN TO TGV2
CLEAR
SET DEVICE TO PRINTER
TAM=LEN(V) ; PRIVATE BAR[TAM,3] ; LARG:= 60/TAM
M1={"*","X","+","@","#","$","^","|","\",":","/",">"}
PORC:=0 ; T=6-LARG
FOR I = 1 TO TAM
PORC=IF( PORC <= V[I,1],V[I,1],PORC)
NEXT
ESCALA = PORC / 5
PORC1=PORC
NUM:= NUM1:= NUM2:=0
@ PROW(),0 SAY "|"+REPL("-",78)+"|"
@ PROW()+1,0 SAY "|"
POSINI=(79-LEN(TITULO1))/2
@ PROW(),POSINI SAY TRIM(TITULO1)
@ PROW(),79 SAY "|"
@ PROW()+1,0 SAY "|"
@ PROW(),79 SAY "|"
FOR I = 1 TO TAM
POS =INT(V[I,1]*20/PORC1) ; BAR[I,1]=23-POS+1
BAR[I,2]=IF(I=1,8,BAR[I-1,2]+LARG+1)
NEXT
FOR I = PROW() TO 23
DO CASE
CASE PROW()=4
LINHA="|"+STR(PORC,4) +" |"
PORC=PORC-ESCALA
CASE PROW()=8
LINHA="|"+STR(PORC,4)+" |"
PORC=+PORC-ESCALA
CASE PROW()=12
LINHA="|"+STR(PORC,4)+" |"
PORC=+PORC-ESCALA
CASE PROW()=16
LINHA="|"+STR(PORC,4)+" |"
PORC=PORC-ESCALA
CASE PROW()=20
LINHA="|"+STR(PORC,4)+" |"
PORC=PORC-ESCALA
CASE PROW()=24
LINHA="|"+STR(PORC,4)+" |"
PORC=PORC-ESCALA
OTHERWISE
LINHA="| |"
ENDCASE
LINHA=LINHA+SPACE(72)+"|"
FOR J= 1 TO TAM
IF BAR[J,1]<=PROW()
LINHA=STUFF(LINHA,BAR[J,2],LARG+1,REPL(M1[J],LARG)+" ")
IF BAR[J,3]=NIL .AND. MOSTRAVAL =.T.
LINHA=STUFF(LINHA,BAR[J,2],4,STR(V[J,1],4))
BAR[J,3]=.F.
ENDIF
ENDIF
NEXT
@ PROW(),0 SAY LINHA
@ PROW()+1,0 SAY ""
NEXT
@ PROW(),0 SAY "| 0 "+REPL("-",73)+"|"
@ PROW()+1,0 SAY "|"
FOR I = 1 TO TAM
@ PROW(),BAR[I,2] SAY LEFT(V[I,2],LARG)
NEXT
@ PROW(),79 SAY "|"
@ PROW()+1,0 SAY "|"
@ PROW(),79 SAY "|"
IF TITULO2<>NIL
POSINI=(80-LEN(TITULO2))/2
@ PROW()+1,0 SAY "|"
@ PROW(),POSINI SAY TRIM(TITULO2)
@ PROW(),79 SAY "|"
ENDIF
IF TITULO3<>NIL
POSINI=(80-LEN(TITULO3))/2
@ PROW()+1,0 SAY "|"
@ PROW(),POSINI SAY TRIM(TITULO3)
@ PROW(),79 SAY "|"
ENDIF
@ PROW()+1,0 SAY "|"+REPL("-",78)+"|"
RESTORE SCREEN FROM TGV2
EJECT
SET DEVICE TO SCREEN
****
****
****
******************************************************
FUNCTION GRAFHOR1(ARQUIVO,TITULO)
IF ARQUIVO=NIL
ARQ="GRAFBAR.DBF"
ELSE
ARQ=ARQUIVO+".DBF"
ENDIF
IF TITULO=NIL
TITULO="PRESSIONE AS SETAS SUPERIOR E INFERIOR PARA VER MAIS"
ENDIF
SAVE SCREEN TO GRH1
CLEAR
IF FILE("&ARQ")
USE (ARQ)
ELSE
@ 23,10 SAY "ARQUIVO DE PARAMETROS NAO ENCONTRADO"
INKEY(2)
RETURN NIL
ENDIF
MAIOR=VALOR
MENOR=VALOR
TAMMAX=65
MEIO=TAMMAX/2+10
tamanho=lastrec()
PRIVATE M[2,TAMANHO] ,G[TAMANHO]
for i = 1 to tamanho
MAIOR=MAX(MAIOR,VALOR)
MENOR=MIN(MENOR,VALOR)
m[1,I]=legenda
m[2,I]=valor
SKIP
NEXT
MEDIA=MAIOR-MENOR
FOR I = 1 TO TAMANHO
M[1,I]=LEFT(M[1,I],7)+" "+REPL( cHR(176),(M[2,I]-MENOR)/MEDIA*TAMMAX+1 )+;
STR(M[2,I],4)
NEXT
@ 09,0 TO 19,79
@ 20 ,9 SAY CHR(24)
@ ROW(),MEIO SAY CHR(24)
@ ROW(),75 SAY CHR(24)
@ 21 ,5 SAY MENOR PICT '99999'
@ 21 ,MEIO-3 SAY MEDIA PICT '99999'
@ 21 ,TAMMAX+5 SAY MAIOR PICT '99999'
@ 22 ,0 TO 24,79 DOUBLE
POSINI=(80-LEN(TITULO))/2
@ 23,POSINI SAY TITULO
* Retire os astericos das linhas abaixo se quiser mostrar o grafico
* na cor branca e azul e sem mostrar o cursor da funcao achoice()
*CORANTIG=SETCOLOR()
*SETCOLOR("W/B,W/B")
A=ACHOICE(10,01,18,78,M[1],,,9,8)
*SET COLOR TO &CORANTIG
RESTORE SCREEN FROM GRH1
FUNCTION GRAFHOR2(ARQUIVO,TITULO,CENTRALIZA)
IF ARQUIVO=NIL
ARQ="GRAFBAR.DBF"
ELSE
ARQ=ARQUIVO+".DBF"
ENDIF
IF TITULO=NIL
TITULO="TESTE DE GRAFICO"
ENDIF
IF CENTRALIZA=NIL
CENTRALIZA=.T.
ENDIF
SAVE SCREEN TO GRH2
IF FILE("&ARQ")
USE (ARQ)
ELSE
@ 23,10 SAY "ARQUIVO DE PARAMETROS NAO ENCONTRADO"
INKEY(2)
restore screen from grh2
release grh2
RETURN NIL
ENDIF
QTD=LASTREC()
IF QTD>58
@ 23,10 SAY "MAIS DE 58 ELEMENTOS NAO PODEM SER EXIBIDOS.."
INKEY(2)
RESTORE SCREEN FROM GRH2
RETURN NIL
ENDIF
MAIOR=VALOR
MENOR=VALOR
TAMMAX=65
MEIO=TAMMAX/2+10
DO WHILE .NOT. EOF()
MAIOR=MAX(MAIOR,VALOR)
MENOR=MIN(MENOR,VALOR)
SKIP
ENDDO
MEDIA=MAIOR-MENOR
GOTO TOP
IF QTD<58 .AND. CENTRALIZA
LININI=(66-(QTD+8))/2-1
ELSE
LININI=1
ENDIF
SET DEVICE TO PRINTER
@ LININI,0 SAY " "
@ PROW()+1,0 SAY "|"+REPL("-",78)+"|"
@ PROW()+1,0 SAY "|"
@ PROW(),79 SAY "|"
DO WHILE .NOT. EOF()
LINHA="|"+LEFT(LEGENDA,7)+" "+REPL("*",(VALOR-MENOR)/MEDIA*TAMMAX+1 )+;
STR(VALOR,4)
LINHA+=REPL(" ",79-LEN(LINHA))+"|"
@ PROW()+1,0 SAY LINHA
SKIP
ENDDO
@ PROW()+1,0 SAY "|"+REPL("-",78)+"|"
@ PROW(),9 SAY "^"
@ PROW(),MEIO SAY "^"
@ PROW(),75 SAY "^"
@ PROW()+1,0 SAY "|"
@ PROW(),5 SAY MENOR PICT '99999'
@ PROW(),MEIO-3 SAY MEDIA PICT '99999'
@ PROW(),TAMMAX+5 SAY MAIOR PICT '99999'
@ PROW(),79 SAY "|"
@ PROW()+1,0 SAY "|"
@ PROW(),79 SAY "|"
@ PROW()+1,0 SAY "|"
POSINI=(79-LEN(TITULO))/2
@ PROW(),POSINI SAY TRIM(TITULO)
@ PROW(),79 SAY "|"
@ PROW()+1,0 SAY "|"+REPL("-",78)+"|"
EJECT
SET DEVICE TO SCREEN
RESTORE SCREEN FROM GRH2
RELEASE GRH2
RETURN NIL
Saudações,
Itamar M. Lins Jr.