Página 18 de 23

RMChart

Enviado: 02 Jun 2016 07:38
por ANDRIL
José, Asimões e todos que participaram, Parabéns pelo Projeto!

Eu uso a GTWVG como lib gráfica, ela tem um "problema" quando exibe elementos como imagens, ou seja, se estiver exibindo a imagem e mudar o foco da janela, ao voltar some a imagem, com o gráfico acontece o mesmo? Conseguiram imprimir o gráfico gerado em PDF ou mesmo na impressora?
Ate+

RMChart

Enviado: 02 Jun 2016 08:09
por asimoes
Andril,

Eu iniciei o tópico obtive êxito para exibir o gráfico, mas quem desvendou os problemas e criou a classe para o rmChart foi o Quintas, sim, respondendo as suas perguntas:

Mostra o gráfico,

Não tem o problema de sumir a imagem.
Pode imprimir (impressora pdf, impressora jato de tinta)
Pode gerar um arquivo de imagem do gráfico (jpg, png, bmp, etc)
Pode fazer um clipboard do gráfico (imagem) e colar em qualquer outro aplicativo (word, excel, etc)

Maiores explicações deixo a cargo do Quintas para exemplificar o seu uso.

Nota: provavelmente fará parte da GTWVG em breve. Houve interesse do Pritpal Bedi

RMChart

Enviado: 02 Jun 2016 08:22
por Daniel
Uma má notícia, apesar de não impedir o uso:
A conversão de array de cores não dá erro, pareceu dar certo, mas não deu.
Reparem que as cores não são as mesmas.
Quintas eu também vi este erro e tentei arrumar o array mais não consegui.
Mais pode ser usado assim

Código: Selecionar todos

	aColors := {LightGreen, Yellow, Goldenrod, Crimson}
   aData   := { 40, 30, 60, 20 }
   CreateChart(GetFormHandle("Win_1"), ID_CHART,10,10,600,450,MidnightBlue,RMC_CTRLSTYLEIMAGE,0,"seasky.jpg","Tahoma", 0, 0 )
	AddRegion(ID_CHART,5,5,-5,-5,"",0)
	AddLegend(ID_CHART, 1,"Apples*Citrons*Bananas*Cherries",RMC_LEGEND_CUSTOM_CENTER,0,RMC_LEGENDNORECT,WHITE,8,0)
   AddGridlessSeries(ID_CHART,1, FDouble(aData), 4, FDouble(aColors), FTamanho(aColors), RMC_DONUT_GRADIENT,RMC_FULL,0,.F.,RMC_VLABEL_TWIN,RMC_HATCHBRUSH_OFF, 0)
   For x:= 1 To Len(aColors)
		SetSeriesColor(ID_CHART,1,1, aColors[x],x)
	Next x
	DrawChart(ID_CHART)

sobre as limitações são:
9 cores no modo automático,
6 gráfico por região,
15 em Series (pode ser que as cores fica limitada em 15 também) e
20 Instâncias abertas

RMChart

Enviado: 02 Jun 2016 11:18
por JoséQuintas
Resolvido com L2Bin()

Código: Selecionar todos

CREATE CLASS RmChart

   VAR    nHandle

   METHOD New()                            INLINE ::nHandle := hb_libLoad( "RMChart.dll" ), SELF
   METHOD Destroy()                        INLINE hb_libFree( ::nHandle )
   METHOD CreateChart( ... )               INLINE ::CallDllStd( "RMC_CREATECHART", ... )
   METHOD CreateChartOnDc( ... )           INLINE ::CallDllStd( "RMC_CREATECHARONDC", ... )
   METHOD AddBarSeries(a,b,c, ... )        INLINE ::CallDllStd( "RMC_ADDBARSERIES", a, b, ::ToDouble(c), ... )
   METHOD AddRegion( ... )                 INLINE ::CallDllStd( "RMC_ADDREGION", ... )
   METHOD AddCaption( ... )                INLINE ::CallDllStd( "RMC_ADDCAPTION", ... )
   METHOD AddDataAxis(a,b,c,d,e, ... )     INLINE ::CallDllStd( "RMC_ADDDATAAXIS", a, b, c, ::ToDecimal(d), ::ToDecimal(e), ... )
   METHOD AddGrid( ... )                   INLINE ::CallDllStd( "RMC_ADDGRID", ... )
   METHOD AddGridLessSeries(a,b,c,d,e,...) INLINE ::CallDllStd( "RMC_ADDGRIDLESSSERIES", a, b, ::ToDouble(c), d, ::ToSignedLong(e), ... )
   METHOD AddLabelAxis( ... )              INLINE ::CallDllStd( "RMC_ADDLABELAXIS", ... )
   METHOD AddLegend( ... )                 INLINE ::CallDllStd( "RMC_ADDLEGEND", ... )
   METHOD AddLineSeries( a,b,c, ... )      INLINE ::CallDllStd( "RMC_ADDLINESERIES", a, b, ::ToDouble(c), ... )
   METHOD CoText( ... )                    INLINE ::CallDllStd( "RMC_COTEXT", ... )
   METHOD DeleteChart( ... )               INLINE ::CallDllStd( "RMC_DELETECHART", ... )
   METHOD Draw( ... )                      INLINE ::CallDllStd( "RMC_DRAW", ... )
   METHOD Draw2Clipboard( ... )            INLINE ::CallDllStd( "RMC_DRAW2CLIPBOARD", ... )
   METHOD Draw2Printer( ... )              INLINE ::CallDllStd( "RMC_DRAW2PRINTER", ... )
   METHOD Draw2File( ... )                 INLINE ::CallDllStd( "RMC_DRAW2FILE", ... )
   METHOD Reset( ... )                     INLINE ::CallDllStd( "RMC_RESET", ... )
   METHOD SetWaterMark( ... )              INLINE ::CallDllStd( "RMC_SETWATERMARK", ... )
   METHOD WriteRMCFile( ... )              INLINE ::CallDllStd( "RMC_WRITERMCFILE", ... )
   METHOD CallDllStd( cName, ... )         INLINE hb_DynCall( { cName, ::nHandle, HB_DYN_CALLCONV_STDCALL }, ... )
   METHOD ToDecimal( xValue )              INLINE xValue + 1.01 - 1.01
   METHOD ToDouble( xValue )
   METHOD ToSignedLong( xValue )

   ENDCLASS

METHOD RMChart:ToDouble( xValue )

   LOCAL cDouble := "", oElement

   IF ValType( xValue ) == "N"
      RETURN xValue
   ENDIF
   FOR EACH oElement IN xValue
      cDouble += FToC( oElement )
   NEXT

   RETURN cDouble

METHOD RMChart:ToSignedLong( xValue )

   LOCAL cLong := "", oElement

   IF ValType( xValue ) == "N"
      RETURN xValue
   ENDIF
   FOR EACH oElement IN xValue
      cLong += L2Bin( oElement )
   NEXT
   RETURN cLong

RMChart

Enviado: 02 Jun 2016 11:57
por JoséQuintas
A janela da GTWVG é sempre coberta por texto, não dá pra fazer o gráfico direto nela.
Tem que usar um controle intermediário.

No teste usei um controle daqueles que eu criei, pra colocar na janela da gtwvg, era o que estava "na mão".
Não testei com outro tipo de controle ainda.
Tem ainda alguns detalhes pra descobrir no re-uso ou várias janelas (simultâneas ou não).
Um teste rápido foi este, com multithread:

Código: Selecionar todos

#include "inkey.ch"

PROCEDURE Main

   hb_ThreadStart( { || tstRmChart() } )
   hb_ThreadStart( { || tstRmChart() } )
   hb_ThreadWaitForAll()
   RETURN
Como a IDChart é a mesma, ao mostrar o gráfico numa janela, desaparece o gráfico da outra.
E deu GPF no final, na hora de encerrar.
test.png
É como eu disse antes:
Dá a impressão que o RMChart lembra do uso, provavelmente uma área onde ele armazena os dados.
Ao contrário de outras DLLs, hb_LibFree() parece não ser suficiente.
Algumas informações são passadas como ponteiro: posição de memória
Precisa cuidado em não deixar a DLL presa a essas posições de memória, ou gera GPF.

Por enquanto foram testes.
Ajudaram:

RMChart:Reset() limpa os dados sem apagar o gráfico
RMChart:DeleteChart( id ) limpa tudo

RMChart

Enviado: 02 Jun 2016 18:29
por JoséQuintas
Uma coisa importante nos exemplos do VB, e nas declarações de DLL que mencionei:
Os parâmetros opcionais, são opcionais para o VB, não para a DLL.
Quando se declara no VB que o parâmetro é opcional numérico, automaticamente o VB acrescenta ZERO se não for informado.
Então tem este detalhe a mais na hora de aproveitar fontes VB6.
Uma opção é detalhar os parâmetros na classe, e testar o valor default de cada um.

O arquivo rmchart.ch não existe no rmchart.
Cada um que existe foi criado por alguém.
O programa exemplo em VB6 usa declarações que não existem no rmchart.ch, mas existem no fonte VB.

Dicas pra quem precisar de algum gráfico que não tem no fonte que foi criado pra Harbour:

Código: Selecionar todos

' Custom Objects
Enum COType
    RMC_CO_TEXT = 1
    RMC_CO_BOX = 2
    RMC_CO_CIRCLE = 3
    RMC_CO_LINE = 4
    RMC_CO_IMAGE = 5
    RMC_CO_SYMBOL = 6
    RMC_CO_POLYGON = 7
End Enum
Isso se trata de #define, apenas agrupado por tipo de uso

Código: Selecionar todos

Declare Function RMC_AddDataAxis Lib "RMCHART.DLL" Alias "RMC_ADDDATAAXIS" ( _
                            ByVal nCtrlId As Long, _
                            ByVal nRegion As Long, _
                            Optional ByVal nAlignment As DAxisAlignment, _
                            Optional ByVal nMinValue As Double, _
                            Optional ByVal nMaxValue As Double, _
                            Optional ByVal nTickCount As Long, _
                            Optional ByVal nFontSize As Long, _
                            Optional ByVal nTextColor As RMC_Colors, _
                            Optional ByVal nLineColor As RMC_Colors, _
                            Optional ByVal nLinestyle As AxisLineStyle, _
                            Optional ByVal nDecimalDigits As Long, _
                            Optional ByVal sUnit As String, _
                            Optional ByVal sText As String, _
                            Optional ByVal sLabels As String, _
                            Optional ByRef nLabelAlignment As Long _
                            ) As RMCError
Aqui um detalhe importante que esqueci, por isso alguns GPFs, : opcional, significa opcional pro fonte Visual Basic.
Singifica que o fonte VB pode conter RMC_AddDataAxis( 1, 2 )
Se fizer isso no Harbour, é GPF, porque pra DLL não é opcional.

Opções:
- Alterar a classe, colocar cada parâmetro desses, e atribuir valor default.
- Alterar a chamada ao método, acrescentando o que faltar.

Não precisa se preocupar com isso, mas precisa lembrar disso.
Pra todos os exemplos/gráficos até agora, isso não tinha feito falta.
Agora é que apareceu um exemplo que não preenche todos os parâmetros.

RMChart

Enviado: 02 Jun 2016 18:36
por JoséQuintas
Se for se preocupar com tudo isso agora, serão meses de digitação.

Fora as opções usadas até agora, tem as que não foram usadas.
Pra quem quer mais opções..... rs

Código: Selecionar todos

#require hbct.hbc
#include "hbclass.ch"
#include "hbdyn.ch"

CREATE CLASS RmChart

   VAR    nHandle

   METHOD New()                            INLINE ::nHandle := hb_libLoad( "RMChart.dll" ), SELF
   METHOD Destroy()                        INLINE hb_libFree( ::nHandle )
   METHOD AddBarSeries(a,b,c, ... )        INLINE ::CallDllStd( "RMC_ADDBARSERIES", a, b, ::ToDouble(c), ... )
   METHOD AddRegion( ... )                 INLINE ::CallDllStd( "RMC_ADDREGION", ... )
   METHOD AddCaption( ... )                INLINE ::CallDllStd( "RMC_ADDCAPTION", ... )
   METHOD AddDataAxis(a,b,c,d,e, ... )     INLINE ::CallDllStd( "RMC_ADDDATAAXIS", a, b, c, ::ToDecimal(d), ::ToDecimal(e), ... )
   METHOD AddGrid( ... )                   INLINE ::CallDllStd( "RMC_ADDGRID", ... )
   METHOD AddGridLessSeries(a,b,c,d,e,...) INLINE ::CallDllStd( "RMC_ADDGRIDLESSSERIES", a, b, ::ToDouble(c), d, ::ToSignedLong(e), ... )
   METHOD AddHightLowSeries(a,b,c,...)     INLINE ::CallDllStd( "RMC_ADDHIGHTLOWSERIES", a, b, ::ToDouble(c), ... )
   METHOD AddLabelAxis( ... )              INLINE ::CallDllStd( "RMC_ADDLABELAXIS", ... )
   METHOD AddLegend( ... )                 INLINE ::CallDllStd( "RMC_ADDLEGEND", ... )
   METHOD AddLineSeries( a,b,c, ... )      INLINE ::CallDllStd( "RMC_ADDLINESERIES", a, b, ::ToDouble(c), ... )
   METHOD AddToolTips( ... )               INLINE ::CallDllStd( "RMC_ADDTOOLTIPS", ... )
   METHOD AddVolumeBarSeries(a,b,c,...)    INLINE ::CallDllStd( "RMC_ADDVOLUMEBARSERIES", a, b, ::ToDouble(c), ... )
   METHOD AddXAxis(a,b,c,d,e,...)          INLINE ::CallDllStd( "RMC_ADDXAXIS", a, b, c, ::ToDouble(d), ::ToDouble(e), ... )
   METHOD AddXSeries(a,b,c,d,e,...)        INLINE ::CallDllStd( "RMC_ADDXSERIES", a, b, ::ToDouble(c), d, ::ToDouble(e), ... )
   METHOD AddYAxis(a,b,c,d,e,...)          INLINE ::CallDllStd( "RMC_ADDYAXIS", a, b, c, ::ToDouble(d), ::ToDouble(e), ... )
   METHOD AddYSeries(a,b,c,d,e,...)        INLINE ::CallDllStd( "RMC_ADDYSERIES", a, b, ::ToDouble(c), d, ::ToDouble(e), ... )
   METHOD CalcAverage(a,b,c,d,...)         INLINE ::CallDllStd( "RMC_CALCAVERAGE", a, b, c, ::ToDouble(d), ... )
   METHOD CalcTrend(a,b,c,d,e,... )        INLINE ::CallDllStd( "RMC_CALLTREND", a, b, c, ::ToDouble(d), ::ToDouble(e), ... )
   METHOD CoBox( ... )                     INLINE ::CallDllStd( "RMC_COBOX", ... )
   METHOD CoCircle( ... )                  INLINE ::CallDllStd( "RMC_COCIRCLE", ... )
   METHOD CoDash( ... )                    INLINE ::CallDllStd( "RMC_CODASH", ... )
   METHOD CoDelete( ... )                  INLINE ::CallDllStd( "RMC_CODELETE", ... )
   METHOD CoImage( ... )                   INLINE ::CallDllStd( "RMC_COIMAGE", ... )
   METHOD CoLine( a, b, c, d, ... )        INLINE ::CallDllStd( "RMC_COLINE", a, b, ::ToSignedLong( c ), ::ToSignedLong( d ), ... )
   METHOD CoPolygon( ... )                 INLINE ::CallDllStd( "RMC_COPOLYGON", ... )
   METHOD CoSymbol( ... )                  INLINE ::CallDllStd( "RMC_COSYMBOL", ... )
   METHOD CoText( ... )                    INLINE ::CallDllStd( "RMC_COTEXT", ... )
   METHOD CoVisible( ... )                 INLINE ::CallDllStd( "RMC_COVISIBLE", ... )
   METHOD CreateChart( ... )               INLINE ::CallDllStd( "RMC_CREATECHART", ... )
   /* METHOD CreateChartOnDc( ... )           INLINE ::CallDllStd( "RMC_CREATECHARONDC", ... )  // uncomment if you know what you are doing */
   METHOD DeleteChart( ... )               INLINE ::CallDllStd( "RMC_DELETECHART", ... )
   METHOD Draw( ... )                      INLINE ::CallDllStd( "RMC_DRAW", ... )
   METHOD Draw2Clipboard( ... )            INLINE ::CallDllStd( "RMC_DRAW2CLIPBOARD", ... )
   METHOD Draw2Printer( ... )              INLINE ::CallDllStd( "RMC_DRAW2PRINTER", ... )
   METHOD Draw2File( ... )                 INLINE ::CallDllStd( "RMC_DRAW2FILE", ... )
   METHOD GetChartSizeFromFile( ... )      INLINE ::CallDllStd( "RMC_GETCHARTSIZEFROMFILE", ... )
   METHOD GetCtrlHeight( ... )             INLINE ::CallDllStd( "RMC_GETCTRLHEIGHT", ... )
   METHOD GetCtrlWidth( ... )              INLINE ::CallDllStd( "RMC_GETCTRLWIDTH", ... )
   METHOD GetData( ... )                   INLINE ::CallDllStd( "RMC_GETDATA", ... )
   METHOD GetDataCount( ... )              INLINE ::CallDllStd( "RMC_GRETDATACOUNT", ... )
   METHOD GetDataLocation( ... )           INLINE ::CallDllStd( "RMC_GETDATALOCATION", ... )
   METHOD GetDataLocationXY( ... )         INLINE ::CallDllStd( "RMC_GETDATALOCATIONXY", ... )
   METHOD GetGridLocation( ... )           INLINE ::CallDllStd( "RMC_GETGRIDLOCATION", ... )
   METHOD GetHighPart( ... )               INLINE ::CallDllStd( "RMC_GETHIGHPART", ... )
   METHOD GetImageSizeFromFile( ... )      INLINE ::CallDllStd( "RMC_GETIMAGESIZEFROMFILE", ... )
   METHOD GetInfo( ... )                   INLINE ::CallDllStd( "RMC_GETINFO", ... )
   METHOD GetInfoXY( ... )                 INLINE ::CallDllStd( "RMC_GETINFOXY", ... )
   METHOD GeTLowPart( ... )                INLINE ::CallDllStd( "RMC_GETLOWPART", ... )
   METHOD GetSeriesDataRange( ... )        INLINE ::CallDllStd( "RMC_GETSERIESDATARANGE", ... )
   METHOD GetVersion( ... )                INLINE ::CallDllStd( "RMC_GETVERSION", ... )
   METHOD Magnifier( ... )                 INLINE ::CallDllStd( "RMC_MAGNIFIER", ... )
   METHOD Paint( ... )                     INLINE ::CallDllStd( "RMC_PAINT", ... )
   METHOD Reset( ... )                     INLINE ::CallDllStd( "RMC_RESET", ... )
   METHOD Rnd( ... )                       INLINE ::CallDllStd( "RMC_RND", ... )
   METHOD SetCaptionText( ... )            INLINE ::CallDllStd( "RMC_SETCAPTIONTEXT", ... )
   METHOD SetCaptionBGColor( ... )         INLINE ::CallDllStd( "RMC_SETCAPTIONBGCOLOR", ... )
   METHOD SetCaptionTextColor( ... )       INLINE ::CallDllStd( "RMC_SETCAPTIONTEXTCOLOR", ... )
   METHOD SetCaptionFontBold( ... )        INLINE ::CallDllStd( "RMC_SETCAPTIONFONTBOLD", ... )
   METHOD SetCaptionFontSize( ... )        INLINE ::CallDllStd( "RMC_SETCAPTIONFONTSIZE", ... )
   METHOD SetCtrlBGColor( ... )            INLINE ::CallDllStd( "RMC_SETCTRLBGCOLOR", ... )
   METHOD SetCtrlBGImage( ... )            INLINE ::CallDllStd( "RMC_SETCTRLBGIMAGE", ... )
   METHOD SetCtrlFont( ... )               INLINE ::CallDllStd( "RMC_SETCTRLFONT", ... )
   METHOD SetCtrlSize( ... )               INLINE ::CallDllStd( "RMC_SETCTRLSIZE", ... )
   METHOD SetCtrlStyle( ... )              INLINE ::CallDllStd( "RMC_SETCTRLSTYLE", ... )
   METHOD SetCustomTooltipText( ... )      INLINE ::CallDllStd( "RMC_SETCUSTOMTOOLTIPTEXT", ... )
   METHOD SetDataXAlignment( ... )         INLINE ::CallDllStd( "RMC_SETDATAXALIGNMENT", ... )
   METHOD SetDaXDecimalDigits( ... )       INLINE ::CallDllStd( "RMC_SETDAXDECIMALDIGITS", ... )
   METHOD SetDaXFontSize( ... )            INLINE ::CallDllStd( "RMC_SETDAXFONTSIZE", ... )
   METHOD SetDaXLineColor( ... )           INLINE ::CallDllStd( "RMC_SETDAXLINECOLOR", ... )
   METHOD SetDaXLineStyle( ... )           INLINE ::CallDllStd( "RMC_SETDAXLINESTLE", ... )
   METHOD SetDaXMaxValue( ... )            INLINE ::CallDllStd( "RMC_SETDAXMAXVALUE", ... )
   METHOD SetDaXMinValue( ... )            INLINE ::CallDllStd( "RMC_SETDAXMINVALUE", ... )
   METHOD SetDaXText( ... )                INLINE ::CallDllStd( "RMC_SETDAXTEXT", ... )
   METHOD SetDaXTextColor( ... )           INLINE ::CallDllStd( "RMC_SETDAXTEXTCOLOR", ... )
   METHOD SetDaXTickCount( ... )           INLINE ::CallDllStd( "RMC_SETDAXTICKCOLOR", ... )
   METHOD SetDaXUnit( ... )                INLINE ::CallDllStd( "RMC_SETDAXUNIT", ... )
   METHOD SetGridBGColor( ... )            INLINE ::CallDllStd( "RMC_SETGRIDBGCOLOR", ... )
   METHOD SetGridBIColor( ... )            INLINE ::CallDllStd( "RMC_SETGRIDBICOLOR", ... )
   METHOD SetGridGradient( ... )           INLINE ::CallDllStd( "RMC_SETGRIDGRADIENT", ... )
   METHOD SetGridMargin( ... )             INLINE ::CallDllStd( "RMC_SETGRIDMARGIN", ... )
   METHOD SetHelpIngGrid( ... )            INLINE ::CallDllStd( "RMC_SETHELPINGGRID", ... )
   METHOD SetLAXAlignment( ... )           INLINE ::CallDllStd( "RMC_SETLAXALIGNMENT", ... )
   METHOD SetLAXCount( ... )               INLINE ::CallDllStd( "RMC_SETLAXCOUNT", ... )
   METHOD SetLAXFontSize( ... )            INLINE ::CallDllStd( "RMC_SETLAXFONTSIZE", ... )
   METHOD SetAXLabelAlignment( ... )       INLINE ::CallDllStd( "RMC_SETAXLABELALIGNMENT", ... )
   METHOD SetAXLabels( ... )               INLINE ::CallDllStd( "RMC_SETAXLABELS", ... )
   METHOD SetAXLabelsFile( ... )           INLINE ::CallDllStd( "RMC_SETAXLABELSFILE", ... )
   METHOD SetAxLabelsRange( ... )          INLINE ::CallDllStd( "RMC_SETAXLABELSRANGE", ... )
   METHOD SetAXLineColor( ... )            INLINE ::CallDllStd( "RMC_SETAXLINECOLOR", ... )
   METHOD SetAXLineStyle( ... )            INLINE ::CallDllStd( "RMC_SETAXLINESTYLE", ... )
   METHOD SetLAXText( ... )                INLINE ::CallDllStd( "RMC_SETLAXTEXT", ... )
   METHOD SetLAXTickCount( ... )           INLINE ::CallDllStd( "RMC_SETLAXTICKCOUNT", ... )
   METHOD SetLegendAlignment( ... )        INLINE ::CallDllStd( "RMC_SETLEGENDALIGNMENT", ... )
   METHOD SetLegendBGColor( ... )          INLINE ::CallDllStd( "RMC_SETLEGENDBGCOLOR", ... )
   METHOD SetLegendFontBold( ... )         INLINE ::CallDllStd( "RMC_SETLEGENDFONTBOLD", ... )
   METHOD SetLegendFontSize( ... )         INLINE ::CallDllStd( "RMC_SETLEGENDFONTSIZE", ... )
   METHOD SetLegendHide( ... )             INLINE ::CallDllStd( "RMC_SETLEGENDHIDE", ... )
   METHOD SetLegendStyle( ... )            INLINE ::CallDllStd( "RMC_SETLEGENDSTYLE", ... )
   METHOD SetLegendText( ... )             INLINE ::CallDllStd( "RMC_SETLEGENDTEXT", ... )
   METHOD SetLegendTextColor( ... )        INLINE ::CallDllStd( "RMC_SETLEGENDTEXTCOLOR", ... )
   METHOD SetMouseClick( ... )             INLINE ::CallDllStd( "RMC_SETMOUSECLICK", ... )
   METHOD SetRegionFooter( ... )           INLINE ::CallDllStd( "RMC_SETREGIONFOOTER", ... )
   METHOD SetRegionMargin( ... )           INLINE ::CallDllStd( "RMC_SETREGIONMARGIN", ... )
   METHOD SetRegionBorder( ... )           INLINE ::CallDllStd( "RMC_SETREGIONBORDER", ... )
   METHOD SetRMCFile( ... )                INLINE ::CallDllStd( "RMC_SETRMCFILE", ... )
   METHOD SetSeriesColor( ... )            INLINE ::CallDllStd( "RMC_SETSERIESCOLOR", ... )
   METHOD SetSeriesExplodeMode( ... )      INLINE ::CallDllStd( "RMC_SETSERIESEXPLODEMODE", ... )
   METHOD SetSeriesStartAngle( ... )       INLINE ::CallDllStd( "RMC_SETSERIESSTARTANGLE", ... )
   METHOD SetSeriesData( ... )             INLINE ::CallDllStd( "RMC_SETSERIESDATA", ... )
   METHOD SetSeriesDataFile( ... )         INLINE ::CallDllStd( "RMC_SETSERIESDATAFILE", ... )
   METHOD SetSeriesDataRange( ... )        INLINE ::CallDllStd( "RMC_SETSERIESDATARANGE", ... )
   METHOD SetSeriesSingleData( ... )       INLINE ::CallDllStd( "RMC_SETSERIESSINGLEDATA", ... )
   METHOD SetSeriesDataAxis( ... )         INLINE ::CallDllStd( "RMC_SETSERIESDATAAXIS", ... )
   METHOD SetSeriesHarchMode( ... )        INLINE ::CallDllStd( "RMC_SETSERIESHARCHMODE", ... )
   METHOD SetSeriesHide( ... )             INLINE ::CallDllStd( "RMC_SETSERIESHIDE", ... )
   METHOD SetSeriesHightLowColor( ... )    INLINE ::CallDllStd( "RMC_SETSERIESHIGHLOWCOLOR", ... )
   METHOD SetSeriesLineStyle( ... )        INLINE ::CallDllStd( "RMC_SETSERIESLINESTYLE", ... )
   METHOD SetSeriesLucent( ... )           INLINE ::CallDllStd( "RMC_SETSERIESLUCENT", ... )
   METHOD SetSeriesPPColumn( ... )         INLINE ::CallDllStd( "RMC_SETSERIESPPCOUMN", ... )
   METHOD SetSeriesPPColumnArray( ... )    INLINE ::CallDllStd( "RMC_SETSERIESPPCOLUMNARRAY", ... )
   METHOD SetSeriesVertical( ... )         INLINE ::CallDllStd( "RMC_SETSERIESVERTICAL", ... )
   METHOD SetSeriesStyle( ... )            INLINE ::CallDllStd( "RMC_SETSERIESSTYLE", ... )
   METHOD SetSeriesSymbol( ... )           INLINE ::CallDllStd( "RMC_SETSERIESSYMBOL", ... )
   METHOD SetSeriesValueLabel( ... )       INLINE ::CallDllStd( "RMC_SETSERIESVALUELABEL", ... )
   METHOD SetSeriesXAxis( ... )            INLINE ::CallDllStd( "RMC_SETSERIESXAXIS", ... )
   METHOD SetSeriesYAxis( ... )            INLINE ::CallDllStd( "RMC_SETSERIESYAXIS", ... )
   METHOD SetSingleBarColors( ... )        INLINE ::CallDllStd( "RMC_SETSINGLEBARCOLORS", ... )
   METHOD SetTooltipWidth( ... )           INLINE ::CallDllStd( "RMC_SETTOOLTIPWIDTH", ... )
   METHOD SetWaterMark( ... )              INLINE ::CallDllStd( "RMC_SETWATERMARK", ... )
   METHOD SetXAXAlignment( ... )           INLINE ::CallDllStd( "RMC_SETXYALIGNMENT", ... )
   METHOD SetYAXAlignment( ... )           INLINE ::CallDllStd( "RMC_SETYAXALIGNMENT", ... )
   METHOD SetXAXDecimalDigits( ... )       INLINE ::CallDllStd( "RMC_SETXAXDECIMALDIGITS", ... )
   METHOD SetYAXDecimalDigits( ... )       INLINE ::CallDllStd( "RMC_SETYAXDECIMALDIGITS", ... )
   METHOD SetXAXFontSize( ... )            INLINE ::CallDllStd( "RMC_SETXAXFONTSIZE", ... )
   METHOD SetYAXFontSize( ... )            INLINE ::CallDllStd( "RMC_SETYAXFONTSIZE", ... )
   METHOD SetXAXLabels( ... )              INLINE ::CallDllStd( "RMC_SETXAXLABELS", ... )
   METHOD SetYAXLabels( ... )              INLINE ::CallDllStd( "RMC_SETYAXLABELS", ... )
   METHOD SetXAXLabelAlignment( ... )      INLINE ::CallDllStd( "RMC_SETXAXLABELALIGNMENT", ... )
   METHOD SetYAXLabelAlignment( ... )      INLINE ::CallDllStd( "RMC_SETYAXLABELALIGNMENT", ... )
   METHOD SetXAXLineColor( ... )           INLINE ::CallDllStd( "RMC_SETXAXLINECOLOR", ... )
   METHOD SetYAXLineCOlor( ... )           INLINE ::CallDllStd( "RMC_SETYAXLINECOLOR", ... )
   METHOD SetXAXLineStyle( ... )           INLINE ::CallDllStd( "RMC_SETXAXLINESTYLE", ... )
   METHOD SetYAXLineStyle( ... )           INLINE ::CallDllStd( "RMC_SETYAXLINESTYLE", ... )
   METHOD SetXAXMaxValue( ... )            INLINE ::CallDllStd( "RMC_SETXAXMAXVALUE", ... )
   METHOD SetYAXMaxValue( ... )            INLINE ::CallDllStd( "RMC_SETYAXMAXVALUE", ... )
   METHOD SetXAXMinValue( ... )            INLINE ::CallDllStd( "RMC_SETXAXMINVALUE", ... )
   METHOD SetYAXMinValue( ... )            INLINE ::CallDllStd( "RMC_SETYAXMINVALUE", ... )
   METHOD SetXAXText( ... )                INLINE ::CallDllStd( "RMC_SETXAXTEXT", ... )
   METHOD SetYAXText( ... )                INLINE ::CallDllStd( "RMC_SETYAXTEXT", ... )
   METHOD SetXAXTextColor( ... )           INLINE ::CallDllStd( "RMC_SETXAXTEXTCOLOR", ... )
   METHOD SetYAXTextColor( ... )           INLINE ::CallDllStd( "RMC_SETYAXTEXTCOLOR", ... )
   METHOD SetXAXTickCount( ... )           INLINE ::CallDllStd( "RMC_SETXAXTICKCOUNT", ... )
   METHOD SetYAXTickCount( ... )           INLINE ::CallDllStd( "RMC_SETYAXTICKCOUNT", ... )
   METHOD SetXAXUnit( ... )                INLINE ::CallDllStd( "RMC_SETXAXUNIT", ... )
   METHOD SetYAXUnit( ... )                INLINE ::CallDllStd( "RMC_SETYAXUNIT", ... )
   METHOD ShowTooltips( ... )              INLINE ::CallDllStd( "RMC_SHOWTOOLTIPS", ... )
   METHOD WriteRMCFile( ... )              INLINE ::CallDllStd( "RMC_WRITERMCFILE", ... )
   METHOD Zoom( ... )                      INLINE ::CallDllStd( "RMC_ZOOM", ... )
   METHOD CallDllStd( cName, ... )         INLINE hb_DynCall( { cName, ::nHandle, HB_DYN_CALLCONV_STDCALL }, ... )
   METHOD ToDecimal( xValue )              INLINE xValue + 1.01 - 1.01
   METHOD ToDouble( xValue )
   METHOD ToSignedLong( xValue )

   ENDCLASS

METHOD RMChart:ToDouble( xValue )

   LOCAL cDouble := "", oElement

   DO CASE
   CASE ValType( xValue ) == "N"
      RETURN xValue
   CASE ValType( xValue ) == "A"
      FOR EACH oElement IN xValue
         cDouble += FToC( oElement )
      NEXT
   OTHERWISE
      RETURN 0
   ENDCASE
   RETURN cDouble

METHOD RMChart:ToSignedLong( xValue )

   LOCAL cLong := "", oElement

   DO CASE
   CASE ValType( xValue ) == "N"
      RETURN xValue
   CASE ValType( xValue ) == "A"
      FOR EACH oElement IN xValue
         cLong += L2Bin( oElement )
      NEXT
   OTHERWISE
      RETURN 0
   ENDIF
   RETURN cLong

RMChart

Enviado: 02 Jun 2016 21:31
por asimoes
Quintas

:-Y

RMChart

Enviado: 02 Jun 2016 22:45
por JoséQuintas
Naquele fonte de VB6 tem tudo.
Está na pasta VB6_DLL, é o arquivo rmchartvb.bas
Ele contém todos os #defines (sintaxe VB, não Harbour), e as declarações pra DLL (também sintaxe VB, igual postado acima).

Já atualizei o CH com todas as declarações a mais que encontrei.
E na classe apenas acrescentei os outros métodos, sem as conversões.

Como deu pra ver, é muuuuita coisa, vai longe isso.
Melhor deixar pra quando for usar um gráfico diferente.

Fui mexer em algumas aqui, e parou de funcionar... rs
O que seria pra melhorar, estragou, então não acrescentei validação adicional.

Agora meu programa de teste contém um PROMPT pra selecionar cada gráfico.

Tem uma diferença quanto aos gráficos originais:
Os originais tem tamanho fixo em pixels e, por exemplo, legendas numa determinada posição em pixels.
Como aqui as imagens são redimensionadas conforme a janela, esses ítens fixos ficam em posição diferente do original.
Por exemplo a legenda da média neste gráfico.
teste.png

RMChart

Enviado: 02 Jun 2016 22:53
por JoséQuintas
Parece este outro, parece exemplo inútil... mas não é.
O outro mostra a opção de uma coluna em VERMELHO.
De repente, destacar aonde houve prejuízo.

Justamente pelo outro usar um detalhe diferente é que exigiu uma conversão que faltava.
teste2.png

Agora é só alegria.
Quando tem GPF, é porque falta algum parâmetro ou alguma conversão.

RMChart

Enviado: 02 Jun 2016 23:00
por JoséQuintas
Esqueci de avisar:

Comentei a linha do CreateChartOnDc()
É porque os exemplos em VB6 vém com ele.
Melhor assim, porque vai dar erro, e vamos lembrar que é pra alterar pra CreateChart().

RMChart

Enviado: 03 Jun 2016 00:30
por fladimir
Parabéns galera... vendo a empolgação de vcs da gosto...

resolvi entrar na dança... baixei a dll e a ocx..

baixei o exemplo do Quintas testrmchart

ele roda beleza...

MAS se coloco ele no meu sistema console (tive q acrescentar o meu HBP as linhas abaixo) e chamo o TSTRMCHART percebo q roda aparece e some muito rapidamente o gráfico mesmo se chamo via Thread.

Outra dúvida pq o o OCX? Não seria só ter a dll na pasta? Não tinha dado tive q registrar o OCX para aparentemente funcionar (pelo q entendi)

Código: Selecionar todos

*.prg
hbwin.hbc

#--------------- Necessario RMChart
gtwvg.hbc
hbct.hbc
hbmisc.hbc
#--------------------------

-lxhb
-lhbct
-lhbtip
-lhbwin
-lhbxpp 
-lhbhpdf
-lhbcomm
-lhbzebra
-llibhpdf
-lpng

-llibmysql
-lhbmysql

RMChart

Enviado: 03 Jun 2016 01:52
por fladimir
No Xailer foi de boa... deu certo...

RMChart

Enviado: 03 Jun 2016 08:56
por JoséQuintas
O uso da OCX não deu muito certo na GTWVG.
Tudo que fizemos por aqui foi usar a DLL. Usando a DLL não precisa de mais nada.

Não entendi no final das contas o que está usando no aplicativo, é console ou gtwvg?

Código: Selecionar todos

PROCEDURE Main
   SetMode( 25, 80 )
   CLS
   ? "Ola mundo"
   Inkey(0)
   RETURN
Console:

Código: Selecionar todos

hbmk2 test.prg
gtwvg:

Código: Selecionar todos

hbmk2 test.prg gtwvg.hbc
Sendo que, se retirar o Inkey(0), a tela console ainda aparece após finalizar o programa, mas se for gtwvg a tela some.
Console usa a própria janela de console, enquanto gtwvg usa uma janela windows que é encerrada no final.
Por isso o inkey(0), pra ter uma pausa ao mostrar a janela. (isso considerando que trata-se apenas deste fonte).

Da mesma forma, se for mostrar gráfico:

Código: Selecionar todos

PROCEDURE Main
   SetMode( 25, 80 )
   CLS
   ? "Ola mundo"
   MostraGrafico()
   Inkey(0)  // ---------> precisa pausa
   RETURN

RMChart

Enviado: 03 Jun 2016 09:55
por JoséQuintas
Atualizei o arquivo de exemplos e deixei mais simples.

http://www.jpatecnologia.com.br/arquivo ... mchart.zip

Como já embuti no aplicativo, o nome do arquivo da classe mudou pra ze_rmchart.prg
Deixo toda minha biblioteca como ze_* pra em ordem alfabética ficar no final da lista.

Trata-se apenas de um prompt e um retângulo pro gráfico.
Só escolher o gráfico e teclar ENTER.
Tela comum da GTWVG, só o retângulo pro gráfico.

Código: Selecionar todos

FUNCTION Main()

   LOCAL oRmChart, oCrt1, nOpc := 1, nTemp

   SetMode(40,100)
   SET WRAP ON
   SetColor( "W/B" )
   CLS
   oRmChart := RMChart():New()
   oCrt1 := TstRectangle():New( , , { 0, -20 }, { -MaxRow() - 1, -MaxCol() + 19 } )
   oCrt1:Create()

   DO WHILE .T.
      @ 0, 0 SAY ""
      @ Row() + 1, 1 PROMPT " Single Bars (10)"
      @ Row() + 1, 1 PROMPT " Grouped Bars (1)"
      @ Row() + 1, 1 PROMPT " Four Regions (2) "
      @ Row() + 1, 1 PROMPT " Pyramid (3) "
      @ Row() + 1, 1 PROMPT " Single Bars (4) "
      @ Row() + 1, 1 PROMPT " Donut (5) "
      @ Row() + 1, 1 PROMPT " Stacked Bars (6) "
      @ Row() + 1, 1 PROMPT " Grouped Bars (7) "
      @ Row() + 1, 1 PROMPT " Single Bars (8) "
      @ Row() + 1, 1 PROMPT " Pie (9) "
      MENU TO nOpc
      nTemp := 1
      DO CASE
      CASE LastKey() == K_ESC ; EXIT
      CASE nOpc == nTemp++ ; Graphic10( oCrt1, oRMChart, 1 )
      CASE nOpc == nTemp++ ; Graphic1(  oCrt1, oRMChart, 1 )
      CASE nOpc == nTemp++ ; Graphic2(  oCrt1, oRMChart, 1 )
      CASE nOpc == nTemp++ ; Graphic3(  oCrt1, oRMChart, 1 )
      CASE nOpc == nTemp++ ; Graphic4(  oCrt1, oRmChart, 1 )
      CASE nOpc == nTemp++ ; Graphic5(  oCrt1, oRmChart, 1 )
      CASE nOpc == nTemp++ ; Graphic6(  oCrt1, oRmChart, 1 )
      CASE nOpc == nTemp++ ; Graphic7(  oCrt1, oRmChart, 1 )
      CASE nOpc == nTemp++ ; Graphic8(  oCrt1, oRmChart, 1 )
      CASE nOpc == nTemp++ ; Graphic9(  oCrt1, oRMChart, 1 )
      CASE nOpc == nTemp // dummy
      ENDCASE
   ENDDO

   RETURN NIL
Reduzi a janela antes do print-screen. O post já tem bastante gráfico.... rs
tela.png