Página 9 de 23

RMChart

Enviado: 12 Mai 2016 01:47
por JoséQuintas
Vamos fazer este gráfico sem usar RMChart pra ver quanto tempo demora?
grafico (2).png
Só vou mexer amanhã no final do dia, mas parece fácil.

RMChart

Enviado: 12 Mai 2016 14:08
por JoséQuintas
Como deve lembrar, a rotina do DOS imprimia um caractere por vez no gráfico.
Tive que alterar os cálculos, mas ainda não estão certos.

Vou ter que verificar como colocar um controle encima do outro, pra poder aparecer o zebrado de fundo.
E a cor gradiente, com várias tonalidades, também tenho que checar, é um recurso do Windows.

O primeiro rascunho, com cálculos errados. (capturei as mesmas cores do RMChart)
Não se engane, aí não tem nenhum SAY. Até alterei o fonte pra ficar um pouquinho diferente.
Já dá pra perceber que a questão é só ajustar cálculos e alguns detalhes.
Comparado com a briga pra fazer o RMChart funcionar.... rs
graficowvg.png

RMChart

Enviado: 12 Mai 2016 14:36
por JoséQuintas
No final, talvez os retângulos até simplifiquem os cálculos pra montar o gráfico.
Digamos que os retângulos serão a largura da tela / 12
O gráfico pode usar os retângulos de referência, então os internos seriam largura do retângulo / 3
E a posição, seria a mesma do retângulo + coluna
Isso descontando o espaço nas laterais.

Ainda não pensei quando misturar valor negativo e positivo.

Mas pra altura das barras, também simples: pegar o maior valor pra referência, multiplicar por 1.2 pra ter margem de reserva no gráfico.
A altura da barra pode ser calculada por: ValorMaximo / altura da tela * ValorDaColuna

Tanto faz calcular por linhas/colunas ou coordenadas, no Harbour 3.4 já aceita decimais.

RMChart

Enviado: 12 Mai 2016 17:08
por JoséQuintas
Não vai acreditar:
Problema parecido com o do RMChart.
Ao que parece, a janela da GTWVG não trata cada controle como deveria.

Ao montar a tela
wvg1.png
E ao mover a janela, os controles que deveriam ficar na frente ficam aparecendo/sumindo.
wvg2.png
Tudo indica que a janela console atualiza sempre tudo.
Na prática, deveria atualizar somente os controles dentro dela, e os controles dentro dela atualizarem os que estão dentro deles.

É provável que tenha atualização desativada, pra evitar algo como "sobrecarga" de atualizações de tela.

Isso pode ser uma boa notícia, porque se isso for resolvido, já resolve o activex também.

RMChart

Enviado: 12 Mai 2016 17:27
por asimoes
Valeu Quintas,

Se você poder contribuir algo mais simples que rmchart, facilita muito.

RMChart

Enviado: 14 Mai 2016 14:22
por JoséQuintas
Estou tentando achar uma fórmula legal pra não ficar mostrando números quebrados na lateral mas ainda não cheguei numa ideal.
Exemplo, para os números:

Código: Selecionar todos

 FOR nCont = 1 TO 12
      AAdd( oGrafico:aValues[ 1 ], 125 )
      AAdd( oGrafico:aValues[ 2 ], 240 )
      AAdd( oGrafico:aValues[ 3 ], 215 )
   NEXT
grafico1.png
mas para os números:

Código: Selecionar todos

   FOR nCont = 1 TO 12
      AAdd( oGrafico:aValues[ 1 ], 125 )
      AAdd( oGrafico:aValues[ 2 ], 240 )
      AAdd( oGrafico:aValues[ 3 ], 300 )
   NEXT
grafico2.png
Os parâmetros passados são estes:

Código: Selecionar todos

PROCEDURE Test

   LOCAL nCont, oGrafico

   SetMode(40,80)
   CLS

   oGrafico              := BarChart():New()
   oGrafico:cTxtTitle    := "TESTE DE GRAFICO 2016"
   oGrafico:aTxtBarList  := { "JANEIRO", "FEVEREIRO", "MARCO", "ABRIL", "MAIO", "JUNHO", "JULHO", "AGOSTO", "SETEMBRO", "OUTUBRO", "NOVEMBRO", "DEZEMBRO" }
   oGrafico:aTxtSubList  := { "ENTRADA", "SAIDA", "OUTRA" }
   oGrafico:aValues := { {}, {}, {} }
   FOR nCont = 1 TO 12
      AAdd( oGrafico:aValues[ 1 ], 125 )
      AAdd( oGrafico:aValues[ 2 ], 240 )
      AAdd( oGrafico:aValues[ 3 ], 300 )
   NEXT
   oGrafico:Show()
   Inkey(0)
   RETURN
Não queria ficar mostrando números muito "quebrados". nessa barra.
No segundo gráfico sobrou muito espaço.

Nota: no RMChart o próprio usuário define um valor, e sai "quebrado".

RMChart

Enviado: 14 Mai 2016 23:40
por JoséQuintas
Por enquanto, após muito trabalho tentando eliminar partes inúteis e que não tem nada a ver com o RMChart, cheguei a uma versão que....
que.... digamos que "funciona"..... tem o mesmo bug do demo completo.

coisa à toa... rs... 6 threads durante o uso do programa, e SETE threads ao fechar tudo, sendo necessário o gerenciador de tarefas pra fechar essas threads.
rmchart2.png
rmchart2.png (9.27 KiB) Exibido 9640 vezes
Ainda tentando reduzir mais.
Por exemplo... ao retirar a toolbar da tela, trava tudo.
Que raios tem a ver a toolbar com o restante?
Se tem a ver, porque -w3 -es2 não acusou o uso dessa variável em outro lugar?

Nota:
O demowvg faz uso intensivo de funções wvt* e wvg_* (com traço).
Sempre achei essas coisas esquisitas, e nunca usei.

RMChart

Enviado: 15 Mai 2016 11:34
por JoséQuintas
A toolbar é o único controle que causa a "pausa", impede que o dialog contendo o gráfico seja fechado.
E uma messagebox() não vinculada à janela permite que ela seja movida ou redimensionada.
Por enquanto foi o que deu.
Dá pra dizer que está melhor que o original, porque agora basta clicar no Ok, sem precisar do gerenciador de tarefas pra fechar a força.
gtwvggrafico.png

Código: Selecionar todos

#include "inkey.ch"
#include "setcurs.ch"
#include "hbgtinfo.ch"
#include "hbver.ch"
#define RMC_CTRLSTYLEFLAT          0
#define RMC_PIE_GRADIENT           52
#define RMC_FULL                   1
#define RMC_EXPLODE_NONE           0
#define RMC_VLABEL_ABSOLUTE        6
#define RMC_HATCHBRUSH_OFF         0

PROCEDURE Main()

   LOCAL oCrt, oTBar, oRMChart, oDA, oRegion, oChart, oCaption

   oCrt := WvgDialog():new( , , { 30, 30 }, { 800, 600 }, , .T. )
   oCrt:closable := .T.
   oCrt:create()

   oDA := oCrt:drawingArea

   oTBar := BuildWvgToolBar( oDA )

   oDA:resize := {|| ResizeDialog( oCrt, oTBar, oRMChart ) }

   oRMChart := WvgActiveXControl():New( oDA, , { 0, 0 }, { 100, 100 }, , .T. )
   hb_gtInfo( HB_GTI_WINTITLE, "RM Chart [ <F12> Attributes  <F11> Next Charts ]" )
   oRMChart:CLSID := "RMChart.RMChartX"
   oRMChart:create()
   oCrt:sendMessage( WIN_WM_SIZE, 0, 0 )
   oCrt:show()

   oRmChart:Font             := "Tahoma"
   oRmChart:RMCStyle         := RMC_CTRLSTYLEFLAT

   oRmChart:AddRegion()

   oRegion := oRmChart:Region( 1 )
   oRegion:Footer := hb_Version( HB_VERSION_URL_BASE )
   oRegion:AddCaption()

   oCaption := oRegion:Caption()
   oCaption:Titel     := "RMChart Demo"
   oCaption:FontSize  := 10
   oCaption:Bold      := .T.

   oRegion:AddGridlessSeries()

   oChart := oRegion:GridLessSeries
   oChart:SeriesStyle      := RMC_PIE_GRADIENT
   oChart:Alignment        := RMC_FULL
   oChart:Explodemode      := RMC_EXPLODE_NONE
   oChart:Lucent           := .F.
   oChart:ValueLabelOn     := RMC_VLABEL_ABSOLUTE
   oChart:HatchMode        := RMC_HATCHBRUSH_OFF
   oChart:StartAngle       := 0
   oChart:DataString       := "10*5*20*25"

   wapi_MessageBox( , "fechar Grafico", "Fechar Grafico", WIN_MB_ICONASTERISK )
   oCrt:Destroy()

   RETURN

STATIC FUNCTION ResizeDialog( oCrt, oTBar, oRMChart )

   LOCAL aCrt    := oCrt:currentSize()
   LOCAL aTBar   := oTBar:currentSize()

   LOCAL nT := aTBar[ 2 ]
   LOCAL nH := aCrt[ 2 ] - aTBar[ 2 ]

   oRMChart:setPosAndSize( { 0, nT }, { aCrt[ 1 ], nH }, .T. )

   RETURN 1

FUNCTION BuildWvgToolBar( oDA )

   LOCAL oTBar := WvgToolBar():new( oDA, , { 0, 0 }, { oDA:currentSize()[ 1 ], 30 }, , .T. )

   oTBar:style        := WVGTOOLBAR_STYLE_FLAT
   oTBar:borderStyle  := WVGFRAME_RECT
   oTBar:buttonWidth  := 40 // 28
   oTBar:buttonHeight := 26
   oTBar:imageWidth   := 26
   oTBar:imageHeight  := 24
   oTBar:showToolTips := .T.
   oTBar:create()
   RETURN oTBar

PROCEDURE hb_GTSYS()

   REQUEST HB_GT_WVG_DEFAULT
   REQUEST HB_GT_WGU

   RETURN
A título de curiosidade, existem cinco tipos de "tela" na GTWVG:
sem janela, que é o default, nenhuma janela até que ocorra alguma operação de tela.
WVG - a janela estilo console, que é a default após alguma alteração de tela, e que não tem controle total sobre componentes gráficos
WGU - a janela usada pra dialog, que não tem teclado/tela estilo console, portanto nem Inkey(0) tem
WVT - a janela dos controles WVT.
janela normal Windows - a janela usada para os controles WVG
Esse exemplo mistura "sem janela" com "WGU" e janela comum Windows, apesar de não parecer.

RMChart

Enviado: 15 Mai 2016 11:57
por JoséQuintas
Como é que eu sei dessas janelas, é de tanto ficar pesquisando os fontes:

Criação de wvgCrt:

Código: Selecionar todos

hb_gtReload( "WVG" )
criação de wvgDialog:

Código: Selecionar todos

hb_gtReload( "WGU" )
criação dos demais controles:

Código: Selecionar todos

   hWnd := wapi_CreateWindowEx( ;
      ::exStyle, ;
      ::className(), ;
      "", ;                              /* window name */
      ::style, ;
      aPosSz[ 1 ], aPosSz[ 2 ], ;
      aPosSz[ 3 ], aPosSz[ 4 ], ;
      ::oParent:hWnd, ;
      ::nID, ;                           /* hMenu       */
      NIL, ;                             /* hInstance   */
      NIL )                              /* lParam      */

RMChart

Enviado: 15 Mai 2016 12:50
por asimoes
Quintas,

Então temos duas situações com relação ao rmchart:

Usando a dll não temos o problema de mover e redimensionar a tela, mas não conseguimos resolver o problema da AddBarSeries, provavelmente com outros métodos.

Com activex

Temos o problema de movimento de tela

RMChart

Enviado: 15 Mai 2016 14:51
por JoséQuintas
Este último funciona 100%

RMChart

Enviado: 15 Mai 2016 18:55
por asimoes
Quintas,

Não dá pra entender esse parâmetro nFirstDataValue, diz que tem que ser o primeiro valor de um array de uma dimensão ???? já tentei vários e nada, inclusive aquele com typedef struct { CTYPE_DOUBLE nDouble[12] } DataStructD12
Isso só funciona com fivewin? que meleca.

The first element of an one-dimensional array, which holds the series data.
RMC_AddBarSeries function.
Add a bar chart series to a region of an existing chart

--------------------------------------------------------------------------------

Syntax
nResult (LONG) = RMC_AddBarSeries(
ByVal nCtrlId (LONG),
ByVal nRegion (LONG),
Optional ByRef nFirstDataValue (DOUBLE),
Optional ByVal nDataValuesCount (LONG),
Optional ByVal nType (LONG),
Optional ByVal nStyle (LONG),
Optional ByVal nIsLucent (LONG),
Optional Byval nColor (LONG),
Optional ByVal nIsHorizontal (LONG),
Optional ByVal nWhichDataAxis (LONG),
Optional ByVal nValueLabelOn (LONG),
Optional ByVal nPointsPerColumn (LONG),
Optional ByVal nHatchMode (LONG)
)


Parameter
nCtrlId (LONG)
Unique ID of the chart control, to which the series belongs.
nRegion (LONG)
Region to which the series belongs.
nFirstDataValue (DOUBLE)
The first element of an one-dimensional array, which holds the series data. If you want to add the data later with RMC_SetSeriesData(), simply pass 0.
Please note one anomaly: If the type of the series is RMC_FLOATINGBAR or RMC_FLOATINGBARGROUP, you must pass for each single bar a pair of two data values, where the first value holds the starting point of the bar and the second value holds the data which determines the length of the bar. Example: Imagine the data axis has a range from 1 to 10 and you want to draw a floating bar which starts at 2 and ends at 9. In this case you must pass the data pair 2,7 for this bar.

RMChart

Enviado: 15 Mai 2016 19:42
por asimoes
Agora eu não entendi mais nada, passei uma string pro campo, aceitou e fez uma barra maluca

aData[1]:="10.5"

oChart:AddBarSeries( ID_CHART, 1, aData[1], 5, RMC_BARSINGLE, RMC_BAR_FLAT_GRADIENT2, .F., 0, .F., 1, RMC_VLABEL_NONE, 1, RMC_HATCHBRUSH_OFF )
Screen Shot 05-15-16 at 07.41 PM.PNG

RMChart

Enviado: 15 Mai 2016 20:47
por JoséQuintas
Se pesquisar array double em C, os valores são armazenados na memória em sequencial.
Então a partir da posição do primeiro elemento já encontra todos.
O double deve ser composto de determinada quantidade de bytes, e talvez tenha gerado isso sem querer... rs

RMChart

Enviado: 16 Mai 2016 09:00
por asimoes
É pessoal,

Foi bola na trave usando dll sem o sData

A solução por enquanto é utilizando sData

Código: Selecionar todos

       sData:=""
       sData += "00003600|00004450|000051|000061|000071|00008-984833|00009412|00011Tahoma|100011|"
       sData += "100021|100035|100045|10005-5|10006-5|1000910|100101|100111|100131|100181|1002010|"
       sData += "10021100|1002211|100238|100331|100341|1003520|100378|100482|100491|10051-8388652|"
       sData += "10052-16777216|10053-657956|100541|100558|10056-16777216|10057-16777216|10060-"
       sData += "16777216|10061-16777216|10063-1|100651|10181 *** Gráfico Teste ***|10184Em Milhões de Reais|102010.00*10."
       sData += "00*20.00*30.00*40.00*50.00*60.00*70.00*80.00*90.00*100.00|110011|1100221|110035|"
       sData += "1100424|110051|110062|110071|110091|110121|110131|1101421|110152|110171|11019-16"
       sData += "776961|1102115|110221|110235|110261|11053"
       sData += "15*25*30*22*75"
       sData += "|120011|1200221|1200424|120062|120121|1201421|12019-65536|1202115|120221|120235|120261|12053"
       sData += "10*15*40*20*31"
       nWidth :=600  
       nHeight:=450  

RmChart22( "Grafico", sData, nWidth, nHeight )

[code]
#include "windows.ch"
#include "hwgui.ch"
#include "common.ch"
#include "guilib.ch"
#include "rmchart.ch"
#include "hbdyn.ch"

#define ID_CHART      1001
#define RMC_DEFAULT   0
#define RMC_PORTRAIT  1
#define RMC_LANDSCAPE 2


FUNCTION RmChart22( cTitulo, sData, nWidth, nHeight )

LOCAL nHandleDLL 

LOCAL oIcon    := HIcon():AddResource("ICON_A")


   hb_Default(@cTitulo, "Gráfico")
   
   nHandleDLL:=hb_LibLoad("rmchart.dll")

   oFont := HFont():Add( "Courier New", 9)

   nStyle := DS_CENTER + WS_SYSMENU + WS_VISIBLE
 
   INIT DIALOG oModDlg TITLE cTitulo ;
               ICON oIcon ;
               AT 0, 0 ;
               SIZE nWidth + 30, nHeight + 100 ;
               STYLE nStyle ;
               FONT oFont ;
               CLIPPER ;
               ON INIT { | oDlg | oDlg:nInitFocus := oSair, ViewChart(oDlg, nHandleDLL, sData) } 

      x1 := Int( oModDlg:nWidth/2 ) - 110
      
      y1 := Int( oModDlg:nHeight) - 70
      
      @ x1, y1       OWNERBUTTON oOk SIZE 100, 30 ;
                                 TEXT "Imprimir" COORDINATES 35, 0, 0, 0 ;
                                 FONT HFont():Add( "Arial", 0, -13,550 ) ;
                                 BITMAP "IMG\IOK.BMP" COORDINATES 5, 0, 0, 0 TRANSPARENT ;
                                 ON CLICK { || ChartPrint(nHandleDLL), oModDlg:lResult := .T. } ;
                                 TOOLTIP "Ir para a página selecionada." ;
                                 THEMED

      @ x1 + 115, y1 OWNERBUTTON oSair SIZE 100, 30 ;
                                 TEXT "RmChart" COORDINATES 35, 0, 0, 0 ;
                                 FONT HFont():Add( "Arial", 0, -13, 550 ) ;
                                 BITMAP "IMG\IEXIT.BMP" COORDINATES 5, 0, 0, 0 TRANSPARENT ;
                                 ON CLICK { || ViewChart(oModDlg, nHandleDLL, sData) } ;
                                 TOOLTIP "Abandonar a seleção." ;
                                 THEMED
   oModDlg:Activate(.F.) // .T. = NOMODAL, .F. ou () = MODAL

RETURN oModDlg

FUNCTION ViewChart(oDlg, nHandleDLL, sData)
   nRetVal:=hb_dynCall( { "RMC_CREATECHARTFROMFILE", nHandleDLL, hb_bitOr( HB_DYN_CTYPE_LONG , HB_DYN_CALLCONV_STDCALL ) }, oDlg:handle, ID_CHART, 10, 10, 0, sData)
   nRetVal:=hb_dynCall( { "RMC_DRAW", nHandleDLL, hb_bitOr( HB_DYN_CTYPE_LONG , HB_DYN_CALLCONV_STDCALL ) }, ID_CHART)
   nRetVal:=hb_dynCall( { "RMC_DRAW2CLIPBOARD", nHandleDLL, hb_bitOr( HB_DYN_CTYPE_LONG , HB_DYN_CALLCONV_STDCALL ) }, ID_CHART, RMC_BMP )
 
RETURN Nil
                     
FUNCTION ChartPrint(nHandleDLL)
   // Para imprimir:
   nRetVal:=hb_dynCall( { "RMC_DRAW2PRINTER", nHandleDLL, hb_bitOr( HB_DYN_CTYPE_LONG , HB_DYN_CALLCONV_STDCALL ) }, ID_CHART, RMC_LANDSCAPE, 10, 10, 250, 150, RMC_EMF )
RETURN nRetVal