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".
grafico.png

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