Página 2 de 23
RMChart
Enviado: 04 Mai 2016 19:09
por JoséQuintas
Em todo caso....
Vai ser trabalhoso, mas aqui tem tudo que precisa.
http://kb.elipse.com.br/pt-br/questions ... art+no+E3.
O detalhe importante é que pra usar precisa de uma hDC e não hWnd.
Não é uma janela Windows, e sim uma área pra desenho.
Se pegar o projeto em VB, tem todas as declarações, até imitada por algumas declarações Harbour.
Só como exemplo:
Código: Selecionar todos
Declare Function RMCvb_WriteRMCFile Lib "RMCHART.DLL" Alias "RMCVB_WRITERMCFILE" ( _
ByVal nCtrlId As Long, _
ByRef sFileName As String _
) As RMCError
que seria meio que equivalente com: (usando a definição padrão do Harbour)
Código: Selecionar todos
nError := CallDll32( "RMCVB_WRITERMCFILE", "RMCHART.DLL", nCtlId, sFileName )
Isso sem considerar conversões de tipos de variável, caso seja necessário.
A lista de funções é grande.
RMChart
Enviado: 04 Mai 2016 19:43
por asimoes
Quintas,
Usando a Dll, eu já consegui resultado, o problema é com activex da hwgui, por dll dá um trabalho extra, tem que usar do designer do rmchart para definir o gráfico que se quer mostrar, exportar as variáveis e depois fazer as substituições na variável sData
Com activex podemos usar os objetos e métodos diretamente sem a necessidade da dll. Provavelmente vou usar a dll mesmo, porque o sistema está feito em harbour/gtwvt
ex.:
Código: Selecionar todos
sData += "00003600|00004450|000051|000061|000074|00008-2|00009412|00010"
sData += "seasky.jpg"
sData += "|00011"
sData += "Arial" //fonte
sData += "|100011|100035|100045|10005-5|10006-5|1000911|100101|100111|100131|100181|100"
sData += "200|10021100|1002211|100238|100331|100341|"
sData += "10035" //Indice que indica o total de barras
sData += "10" //10 = Total de barras
sData += "|100378|100481|100491|10051-1677"
sData += "6961|10052-256|10053-2|100541|100558|10056-103|10057-103|100582|10060-256|10061-"
sData += "103|100626|10063-1|100651|10187"
sData += "Label 1*Label 2*Label 3*Label 4*Label 5*Label 6*Label 7*Label 8*Label 9*Label 10"
sData += "|110011|11"
sData += "0021|110031|110043|110053|11006-1|110081|110091|110121|110131|11014-1|110171|110"
sData += "2111|110221|110235|110281|11053"
sData += "15*70*40*60*30*20*8*35*5*97" //Valores das séries
nWidth :=600
nHeight:=450
ENDCASE
RmChart( "Teste RmChart" , sData, nWidth, nHeight )
RMChart
Enviado: 04 Mai 2016 20:16
por JoséQuintas
Tem a OCX instalada?
Roda o demowvg pra ver se o gráfico aparece.
RMChart
Enviado: 04 Mai 2016 20:23
por JoséQuintas
Uma dúvida, que deve ser de todos:
Se isso é grátis, e é tão bom, porque não se encontra em lugar nenhum?
Tá mais fácil desenvolver do que encontrar pra baixar.
RMChart
Enviado: 04 Mai 2016 21:25
por JoséQuintas
Assim serve?
Sem LIB nenhuma, puro console.
Só alterei minha rotina que usava letra "O", pra usar estas cores { "GR/GR", "BR/BR", "BG/BG" }, assim ficou colorido e sem letra "O".
RMChart
Enviado: 05 Mai 2016 07:45
por asimoes
Quintas,
A ocx está instalada e com a minigui funciona, agora eu gostei do seu exemplo!, mostra pra gente como fez.
RMChart
Enviado: 05 Mai 2016 11:43
por JoséQuintas
É bem artesanal, literalmente uma letra por vez, a letra "O".
Depois vou separar o restante da rotina, aqui só o desenho do gráfico.
Código: Selecionar todos
// desenha titulo e legenda das linhas e comparacoes
Cls()
@ 2, 0 SAY Padc( "COMPARATIVO MES A MES", 80 )
FOR nContResumo = 1 TO nQtContas
@ 3, nContResumo * 20 SAY "OO" COLOR acCores[ nContResumo ]
@ Row(), Col() + 1 SAY acResumo[ nContResumo ]
NEXT
@ 4, 12 TO nAlturaGrafico + 3, 12
@ nAlturaGrafico + 4, 12 TO nAlturaGrafico + 4, 12 + Len( acTitulo ) * 4 + 2
// desenha o grafico
FOR nContAltura = 1 TO nAlturaGrafico
IF Mod( 19 - nContAltura, 3 ) == 0
@ 3 + nContAltura, 0 SAY mValLin * ( nAlturaGrafico + 1 - nContAltura ) PICTURE "9999999999"
ENDIF
FOR nContMes = 1 TO Len( acTitulo )
FOR nContResumo = 1 TO nQtContas
IF anValor[ nContResumo ][ nContMes ] >= mValLin * ( nAlturaGrafico + 1 - nContAltura )
@ 3 + nContAltura, 10 + nContMes * 4 + nContResumo - 1 SAY "O" COLOR acCores[ nContResumo ] // aqui desenha
ENDIF
NEXT
NEXT
NEXT
// legenda das colunas
@ nAlturaGrafico + 6, 0 SAY "MESES->"
FOR nContMes = 1 TO Len( acTitulo )
@ iif( Mod( nContMes, 2 ) == 0, nAlturaGrafico + 5, nAlturaGrafico + 6 ), 10 + nContMes * 4 - 1 SAY acTitulo[ nContMes ]
NEXT
Nota: Como usei array, vai ser fácil transformar em uma rotina genérica, aliás, era essa a idéia.
acResumo: Nome de cada "comparação"
nQtContas: Tamanho do array acResumo
acTitulo: Nome de cada coluna
nQtMeses: Tamanho do array Titulo (qtde. colunas)
anValor[ nQtContas ] [ nQtMeses ]: Valores
** alterei os traços "-----" pra @ TO depois da postagem
RMChart
Enviado: 05 Mai 2016 12:01
por JoséQuintas
É praticamente o mesmo do anterior.
Acho que pareceu diferente porque tem muitas coiunas, e tem comparações.
Mas o princípio é o mesmo.
É o bom e velho estilo DOS... com mais linhas x colunas... rs
Em Windows a vantagem vai ser didivir por pixels, e escolher milhões de cores, mas pode ser do mesmo jeito.
RMChart
Enviado: 06 Mai 2016 17:39
por JoséQuintas
Com activex podemos usar os objetos e métodos diretamente sem a necessidade da dll. Provavelmente vou usar a dll mesmo, porque o sistema está feito em harbour/gtwvt
Voltar atrás nisto. Aonde usa pelos objetos/métodos?
O problema do mschart é que ele é pago $$$
Nisto também. Pode ser oficialmente grátis, então o problema deixa de ser esse.
RMChart
Enviado: 06 Mai 2016 17:57
por asimoes
Quintas,
Usando ocx, esse exemplo tá na minigui, veja que não preciso usar o sData
Código: Selecionar todos
oActiveX := TActiveX():New( ThisWindow.Name, 'RMChart.RMChartX' , 0 , 0 , ;
GetProperty(ThisWindow.Name, "width") - 2 * GetBorderWidth() , ;
GetProperty(ThisWindow.Name, "height") - 2 * GetBorderHeight() - ;
GetTitleHeight() )
oChart := oActiveX:Load()
nVersion := oChart:RMCVersion
oChart:RMCStyle := RMC_CTRLSTYLEFLAT // pode ser alterado, consultar documentação do rmchart
oChart:RMCUserWatermark := 'Texto de Fundo - Opcional'
oChart:AddRegion()
WITH OBJECT oChart:Region( 1 )
:Footer = 'RMChart version' + Str(nVersion/100, 5, 2)
:AddCaption()
WITH OBJECT :Caption()
:Titel := 'Gráfico Teste'
:FontSize := 10
:Bold := .T.
END
:AddGridlessSeries()
WITH OBJECT :GridLessSeries
:SeriesStyle := RMC_PIE_GRADIENT
:Alignment := RMC_FULL
:Explodemode := RMC_EXPLODE_NONE
:Lucent := .F.
:ValueLabelOn := RMC_VLABEL_ABSOLUTE
:HatchMode := RMC_HATCHBRUSH_OFF
:StartAngle := 0
:DataString := '30*15*40*35'
END
END
oChart:Draw()
RMChart
Enviado: 06 Mai 2016 19:14
por JoséQuintas
A GTWVG tem a activex.prg, que pelo nome deveria ser pra isso.
Não sei se dá pra isolar essa rotina de activex da minigui, se for o caso.
Se é que entendi direito.
Parece que no activex as rotinas são numeradas, e existe uma tabela dessas referências.
O que o Harbour (a rotina de activex) faz é justamente carregar a tabela e fazer o relacionamento.
E isso através da atl.dll do Windows.
Seria estranho o Harbour não ter nada pra algo tão útil.
De repente dá pra copiar essa rotina.
RMChart
Enviado: 06 Mai 2016 19:18
por asimoes
Esse exemplo da minigui fica nesta pasta:
D:\MiniGUI\SAMPLES\Advanced\RMChart
Eu tentei utilizar o código da minigui com a hwgui mas dá um monte de erro e dependências que eu desisti, melhor criar uma solução usando a própria minigui
RMChart
Enviado: 06 Mai 2016 19:20
por JoséQuintas
Boas e más notícias.
Boa: O Harbour tem isso.
Má: Não faço idéia de como usar.
Faz parte da hbwin
RMChart
Enviado: 06 Mai 2016 19:22
por JoséQuintas
E no changelog:
2009-08-23 11:58 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/contrib/hbwin/axcore.c
* added automatic activex initialization to __AXDOVERB().
__AXGETCONTROL()/hb_oleAxControlNew() also make automatic
initialization so it's not necessary to explicitly call
WIN_AXINIT()/hb_oleAxInit()
É como eu digo. Ao invés de centralizar no Harbour... tudo se espalha.
RMChart
Enviado: 06 Mai 2016 19:29
por asimoes
Pois é Quintas,
Activex na Minigui/HMG tem vários exemplos
Activex na hwgui nem tanto
Harbour também tem poucos exemplos.
E nenhuma das 3 são compatíveis