Página 19 de 23

RMChart

Enviado: 03 Jun 2016 14:10
por fladimir
no sistema q quero testar é CONSOLE, mas coloquei as linhas abaixo pq ao inserir o codigo do teste no meu sistema verifiquei a necessidade, mas se tiver como somente CONSOLE neste caso especifico prefiro...

Analisando a função q gera o gráfico ela faz chamada a propriedade handle q no console desconheço como passar esta informação, daí o motivo da dúvida.

Como fazer somente console?

RMChart

Enviado: 03 Jun 2016 14:51
por JoséQuintas
De qualquer jeito vai precisar da janela Windows para o gráfico.
Mas... porque não usar GTWVG de uma vez?
Só acrescentar gtwvg.hbc na compilação.
E uma rotina de erros que não desapareça junto com a janela.

RMChart

Enviado: 03 Jun 2016 15:15
por fladimir
Então eu adicionei pra testar e compilou normal e não mostrou nada...

Ai pra desencargo peguei teu exemplo (projeto baixado) e rodei o C.BAT e acusou falta de 2 defines...

#define WIN_WM_SIZE 5
#define EVENT_UNHANDLED 1

Ai depois passou... MAS SE EU COMPILO AKI O TEU EXEMPLO/PROJETO ele aparece o menu MAS não aparecem os gráficos...

Acredito q possa ser algo relativo a eu usar o harbour 3.2 pois pelo q vi tem questões do WVG q foram melhoradas/corrigidas/implementadas no ultimo harbour 3.4

Será q seria isto José?

RMChart

Enviado: 03 Jun 2016 15:16
por fladimir
Para não ter q baixar o Source do 3.4 e recompilar alguém teria um link de um já pronto pra MinGW (uso o TDM-GCC)

RMChart

Enviado: 03 Jun 2016 16:02
por JoséQuintas
Você tem razão, no Harbour 3.2 não está funcionando justamente o retângulo.

Aproveitando:
Acompanhou a dificuldade em deixar os parâmetros compatíveis com rmchart? numéricos double, decimal, long
Pode ser comparado com as mudanças que o Viktor fez na GTWVG.
Enquanto no Harbour 3.4 os parâmetros/retornos da API Windows são compatíveis com Harbour, no Harbour 3.2 não.

Mas pelo que entendi o ASimões está usando Harbour 3.2.
Talvez ele tenha usado alguma coisa já existente e não o tstRetangle.

RMChart

Enviado: 03 Jun 2016 16:19
por asimoes
Quintas,

Eu uso o 3.4 com mingw

RMChart

Enviado: 03 Jun 2016 16:39
por JoséQuintas
Vi em algum post seu algo sobre Harbour 3.2, por isso me confundi.

Fladimir, deixer passar algo: disse da falta de uma definição SIZE/RESIZE 5.
O último que postei é mais simples, contém todos os gráficos, até outros novos, mas mostra um de cada vez.
E deixei só o fonte do Rectangle, pra não encher de coisas.

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

ou se preferir, agora está aqui, na pasta rmchart.

https://github.com/JoseQuintas/AllInOne

RMChart

Enviado: 03 Jun 2016 16:52
por fladimir
Vlw vou testar... se não der vou tirar um tempinho pra migrar pro 3.4

[]´s

RMChart

Enviado: 03 Jun 2016 19:05
por JoséQuintas
Não sei se dá pra usar GTWVW no 3.2, pelo menos pro gráfico.

Janelas Windows disponíveis no Harbour:

- GTWVG
- GTWVT (faz parte da GTWVG)
- GTWGU (faz parte da GTWVG)
- GTWVW - no Harbour 3.2 fica em extras

Curiosidade, a criação dos controles da GTWVG

Harbour 3.2: Wvg_CreateWindowEx()
Harbour 3.4: wapi_CreateWindowEx()

Não é problema no Harbour ou na GTWVG.
A GTWVG do 3.2 está funcionando pra tudo que tem na GTWVG.
Eu é que comecei a testar coisas adicionais, e as alterações na GTWVG do 3.4 permitem.

RMChart

Enviado: 04 Jun 2016 21:27
por fladimir
Deu certo aki... migrei para harbour 3.4 (tive q mudar alguns nomes de funções como hb_sendmail() virou tip_mailsend(), HB_OEMTOANSI virou WIN_OEMTOANSI... coisas do tipo...

tb no meu HBP mudei as chamadas das libs q antes fazia:

Código: Selecionar todos

-lhbct
para

Código: Selecionar todos

hbct.hbc
Enfim foi isto... ai gerou o exemplo e deu certo...

Obrigado galera.

RMChart

Enviado: 05 Jun 2016 00:58
por JoséQuintas
Nem queiram saber o que acabei de fazer.... e está funcionando...
Feito por quem não conhece linguagem C, e apenas está "fuçando" nessa área...
trackbar.png
Seleção de gráficos do RMChart através do trackbar !!!! (também chamado de slider).
Não, não existe esse controle na GTWVG!!!
Sim, é só movimentar esse controle deslizante e os gráficos vão sendo trocados conforme a posição do controle deslizante.

Quem conhece dessas coisas diz que não dá pra fazer...
Como não conheço... foi.... rs

É só teste, não é um fonte final, mas o módulo principal ficou assim:

Código: Selecionar todos

FUNCTION TstRmChart()

   LOCAL oRmChart, oCrt1, oControl

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

   oControl := TstTrackbar():New()
   oControl:Create( , , { -1, -1 }, { -2, -90 }, , .F. )
   oControl:SetValues( 1, 1, 10 )
   oControl:Show()
   oControl:bChanged := { | nOpc | MoStraGrafico( nOpc, oCrt1, oRmChart ) }
   Inkey(0)
   RETURN NIL

RMChart

Enviado: 05 Jun 2016 12:08
por fladimir
Kkkkk q louco... parabéns Zé...

Agora colocando mais tempeiro no feijão... fuçando nas minhas pastas eu lembrava q tinha algo de RMChart e achei um PRG (acho q é HWGUI não verifiquei) q cria o gráfico a partir da Dll tb e com 1 método q não vi na classe chamando CreateChartFromFile... ai pensei (não testei ainda vou fazer na sequencia) se usarmos o RMDesigner lá tem pra copiar o código fonte do gráfico de várias formas e 1 delas se assemelha muito a forma utilizada no código abaixo... Se possível analisem e deem vossas opiniões pra ver se é isso mesmo o raciocínio ou viajei...

[]´s

Código: Selecionar todos

#include "windows.ch"
#include "guilib.ch"
#include "hbdyn.ch"

#define ID_CHART 5001
#define ID_CHART2 5002

Function Main

 hDll:= hb_LibLoad("rmchart.dll")

 PREPARE FONT oFont NAME "Times New Roman" WIDTH 0 HEIGHT -17 CHARSET 4

 INIT WINDOW oMainWindow MAIN MDI TITLE "Example RMCHART";
  AT 0,0 SIZE 1300,650 ;
  FONT oFont 

   MENU OF oMainWindow
    MENU TITLE "Charts"
      MENUITEM "Charts"                 ID 1100 ACTION Chart()
    ENDMENU
   ENDMENU

 oMainWindow:activate()
 
   hb_LibFree( hDll )

Return nil

function chart

  cLabel1 := "Coluna 1"
  cLabel2 := "Coluna 2"
  cLabel3 := "Coluna 3"
  cLabel4 := "Coluna 4"
  cLabel5 := "Coluna 5"

  sTemp1 := "00003600|00004450|000051|000061|00008-984833|00009310|00011Tahoma|100011|100035|100045|";
      +"10005-5|10006-5|1000911|100101|100111|100131|100181|100200|10021100|1002211|100238|100331|";
      +"100341|100355|100378|100481|100491|10051-16776961|10052-256|10053-1|100541|100558|";
      +"10056-16777216|10057-16777216|10060-16777216|10061-16777216|100626|10181This is the chart's caption|";
      +"10187Label 1*Label 2*Label 3*Label 4*Label 5|110011|110021|110031|110043|110053|11006-1|";
      +"110091|110131|11014-1|110171|1102111|110221|110235|1105350*70*40*60*30"
  nSize1X := VAL( SUBS( sTemp1, AT("00003",sTemp1)+5 , 3 ) )
  nSize1Y := VAL( SUBS( sTemp1, AT("00004",sTemp1)+5 , 3 ) )

  sTemp1 := STRTRAN( sTemp1, "Label 1", cLabel1 )
  sTemp1 := STRTRAN( sTemp1, "Label 2", cLabel2 )
  sTemp1 := STRTRAN( sTemp1, "Label 3", cLabel3 )
  sTemp1 := STRTRAN( sTemp1, "Label 4", cLabel4 )
  sTemp1 := STRTRAN( sTemp1, "Label 5", cLabel5 )

  sTemp2 := "00003650|00004450|000051|000061|000071|00008-6697831|00009412|00011Tahoma|100011";
      + "|1000310|1000410|10005-5|10006-5|1000910|100101|100111|100121|100131|100181|1002";
      + "00|100217|1002215|100238|100272|100331|100341|100358|100378|100411|100482|100492";
      + "|10051-6751336|10052-15132304|10053-983041|100541|100558|10056-16777077|10057-16";
      + "777077|100586|10060-16777077|10061-1468806|100622|10180data source: www.federalr";
      + "eserve.gov + www.ecb.int|10181Prime Rates in USA und Euroland|10183 %|101871999*";
      + "2000*2001*2002*2003*2004*2005*2006|110011|1100221|110035|1100434|110052|110063|1";
      + "10073|1100970|1101312|110171|11019-16744448|1102115|110221|1102396|110262|110521";
      + "2|110534.75*4.75*4.75*4.75*4.75*5*5*5.25*5.25*5.25*5.5*5.5*5.5*5.75*6*6*6.5*6.5*";
      + "6.5*6.5*6.5*6.5*6.5*6.5*5.5*5.5*5*4.5*4*3.75*3.75*3.5*3*2.5*2*1.75*1.75*1.75*1.7";
      + "5*1.75*1.75*1.75*1.75*1.75*1.75*1.75*1.25*1.25*1.25*1.25*1.25*1.25*1.25*1*1*1*1*";
      + "1*1*1*1*1*1*1*1*1*1*1.25*1.5*1.75*2*2.25*2.25*2.5*2.75*2.75*3*3.25*3.25*3.5*3.75";
      + "*3.75*4*4.25*4.5*4.5*4.75*4.75*5*5.25*5.25*5.25*5.25*5.25*5.25*5.25|120011|12002";
      + "21|120035|1200434|120052|120063|120073|1200950|1201312|120171|12019-2448096|1202";
      + "115|120221|1202396|120262|1205212|120533*3*3*2.5*2.5*2.5*2.5*2.5*2.5*2.5*3*3*3*3";
      + ".25*3.5*3.75*3.75*4.25*4.25*4.5*4.5*4.75*4.75*4.75*4.75*4.75*4.75*4.75*4.5*4.5*4";
      + ".5*4.25*3.75*3.75*3.25*3.25*3.25*3.25*3.25*3.25*3.25*3.25*3.25*3.25*3.25*3.25*3.";
      + "25*2.75*2.75*2.75*2.5*2.5*2.5*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*";
      + "2*2*2*2*2*2.25*2.25*2.25*2.5*2.5*2.5*2.75*2.75*3*3*3.25*3.25*3.5|010011|010054|0";
      + "100721|01014-16744448|010222|01024216*287|01025109*109|010272|010283|010012|0100";
      + "51|01010295|01011102|010191|01026USA (Federal Funds Rate)|010013|010054|0100721|";
      + "01014-10496|010222|01024260*287|01025192*192|010272|010283|010014|010051|0101029";
      + "5|01011185|010191|01026Euroland (Prime Rate)"
  nSize2X := VAL( SUBS( sTemp2, AT("00003",sTemp2)+5 , 3 ) )
  nSize2Y := VAL( SUBS( sTemp2, AT("00004",sTemp2)+5 , 3 ) )


 INIT WINDOW oFormChart1 MDICHILD ;
     TITLE "teste 1" ;
     STYLE WS_VISIBLE + WS_OVERLAPPEDWINDOW;
     AT 0,0;
     SIZE nSize1X+20,nSize1Y+30;
     FONT oFont;
     ON INIT {|o| initForm_Chart1(o) };

 oFormChart1:Activate(.T.)


 INIT WINDOW oFormChart2 MDICHILD ;
     TITLE "teste 2" ;
     STYLE WS_VISIBLE + WS_OVERLAPPEDWINDOW;
     AT nSize2X,0;
     SIZE nSize2X+20,nSize2Y+30;
     FONT oFont;
     ON INIT {|o| initForm_Chart2(o) };
     ON EXIT {|o| exitForm_Chart2(o) }

 oFormChart2:Activate(.T.)

return .T.

function initForm_Chart1(o)
  nRetVal := HB_DYNCALL( {"RMC_CREATECHARTFROMFILE", hDll, HB_DYN_CALLCONV_STDCALL },o:handle,ID_CHART,0,0,0,sTemp1)
  nRetVal := HB_DYNCALL( {"RMC_DRAW", hDll, HB_DYN_CALLCONV_STDCALL },ID_CHART)
return(.t.)
function exitForm_Chart1(o)
  nRetVal = HB_DYNCALL( {"RMC_DELETECHART", hDll, HB_DYN_CALLCONV_STDCALL },ID_CHART)
return(.t.)

function initForm_Chart2(o)
  nRetVal := HB_DYNCALL( {"RMC_CREATECHARTFROMFILE", hDll, HB_DYN_CALLCONV_STDCALL },o:handle,ID_CHART2,0,0,0,sTemp2)
  nRetVal := HB_DYNCALL( {"RMC_DRAW", hDll, HB_DYN_CALLCONV_STDCALL },ID_CHART2)
return(.t.)
function exitForm_Chart2(o)
  nRetVal = HB_DYNCALL( {"RMC_DELETECHART", hDll, HB_DYN_CALLCONV_STDCALL },ID_CHART2)
return(.t.)


/*
************************
Function GraficoVendedor
************************
*
*
Local lOk:=.f., sTemp := ""
Private inicio := bom(date())
Private fim  := eom(date())

PREPARE FONT oFont NAME "MS Sans Serif" WIDTH 0 HEIGHT -10

 INIT DIALOG oDlg CLIPPER TITLE "Gráfico Por Vendedor" Font oFont AT 0,0 SIZE 300,180 STYLE DS_CENTER 

 @ 005,035 say 'Data Inicial:' size 100,20
 @ 120,030 get oInicio Var inicio picture '@D' size 60,20
 @ 005,065 say 'Data Final:' size 100,20
 @ 120,060 get oFim Var Fim picture '@D' size 60,20

 @ 200,020 Button oBt Caption 'Cancelar' Size 70,30 ON CLICK {||EndDialog()}
 @ 200,070 Button oBt Caption 'Confirmar' Size 70,30 ON CLICK {||lOk:=.t.,EndDialog()}

 Add status to oDlg parts 300

 oDlg:Activate()
 
 if cmonth(inicio) <> cmonth(fim)
  MsgStop('Um Mes de Cada Vez !',2)
  lOk := .f.
 endif
 
 if lOk

  ano := str(year(inicio),4)
  dAno := ano + iif(lLinux,'/','\')
  nome_mes := substr(mes(month(inicio)),1,3)+'_'+ano+'.dbf'

  if file(dDados+dAno+nome_mes)
   AbreDb(dAno+Nome_Mes,'vm',.t.)
  else
   return nil
  endif
 vm->(OrdSetFocus(10)) 
 
 vArray := {{},{}}
 
 Stor 0 to nVendedor,xTotal
 
 Do While vm->(!eof())
 
   nVendedor ++
   nCV := vm->cod_vended
   Stor 0 to nTotal
   
   Do While vm->Cod_Vended = nCV
    nTotal += Soma_Valor('vm')
    xTotal += Soma_Valor('vm')
    vm->(DbSkip())
   EndDo   
   
   aadd( vArray[1],nCV )
   aadd( vArray[2],transf(nTotal,'9999999999.99') )
   
 EndDo

  sTemp = sTemp + "00003750|00004450|000051|000061|000072|00008-984833|00009401|00011Tahoma|100011|"
  sTemp = sTemp + "100035|100045|10005-5|10006-5|1000910|100101|100111|100122|100181|100200|10021"
  sTemp = sTemp + alltrim(transf(xTotal,'99999999.99')) +'|'
  sTemp = sTemp + "1002212|100238|100272|100331|100341|1003512|100378|100481|100491|10051-13408615|"
  sTemp = sTemp + "10052-2448096|100541|100558|10056-9868951|10057-11861886|10060-2987746|10061-983041|"
  sTemp = sTemp + "100626|10063-1|100652|"
  sTemp = sTemp + "10187"
  
  For n := 1 to nVendedor
   Stemp = sTemp + vArray[1,n]
   if n = nVendedor
   else 
     sTemp = sTemp + "*"
   endif              
  Next
  //Janeiro*Fevereiro*Março*Abril*Maio*Junho*Julho*Agosto*Setembro*Outubro*"Novembro*Dezembro
  
  sTemp = sTemp + "|110011|110021|110049|110061|110081|110121|110131|1102111|110221|"
  sTemp = sTemp + "1102312|110281|11053"
  For n := 1 to nVendedor
   
   Stemp = sTemp + vArray[2,n]
   if n = nVendedor
   else 
     sTemp = sTemp + "*"
   endif
    
  Next
   
 Grafico(sTemp)
 
 endif
 
Return nil

*********************
Function Chart(sTemp)
*********************
*
*
local nRetVal:=0, dll
nRetVal := dllcall(hDll,DC_CALL_STD,"RMC_CREATECHARTFROMFILE",omainwindow:handle,1001,10,10,0,sTemp)
nRetVal := dllcall(hDll,DC_CALL_STD,"RMC_DRAW",1001)

return ""

******************
Function endwindow
******************
*
*
nRetVal = dllcall(hDll,DC_CALL_STD,"RMC_RESET",1001)

omainwindow:close()

return Nil 
 
************************
Function Grafico(sTemp)
************************
*
*
Private oMainWindow, oFont
private hDll

 hDll:=loadlibrary("rmchart.dll")

 PREPARE FONT oFont NAME "Times New Roman" WIDTH 0 HEIGHT -17 CHARSET 4

 INIT DIALOG oMainWindow TITLE "GRÁFICO" Font oFont AT 0,0 SIZE 795,500 STYLE DS_CENTER ;
 On Init {|| Chart(sTemp) }

 oMainWindow:Activate()
  

Return nil
*/

RMChart

Enviado: 05 Jun 2016 14:49
por JoséQuintas
Se acompanhou o post, acrescentei muito mais métodos.
Também passei como acrescentar mais coisas que faltarem.
Como exemplo desse método, caso ainda não tenha:

Código: Selecionar todos

METHOD CreateChartFromFile( ... )  INLINE ::CallDllStd( "RMC_CREATECHARTFROMFILE", ... )
E se precisar alguma conversão, indicar parâmetros que precisam conversão (com todos os anteriores).
Exemplo:

Código: Selecionar todos

METHOD NovaFuncao(a,b,c,...) INLINE ::CallDllStd( "RMC_NOVAFUNCAO", a, ::ToDouble(b), ::ToDouble(c), ... )
Isso serve de base pra tudo que ainda não foi resolvido.

Mas pra ficar compatível com os exemplos mesmo, pra evitar qualquer GPF por causa de coisa errada, precisaria preencher o default quando o programa não preencher valor nos parâmetros.
Por exemplo:

Código: Selecionar todos

METHOD NovaFuncao(a,b,c,d,e,f)
...
METHOD NovaFuncao(a,b,c,d,e,f)
   hb_Default( @a, 0 )
   hb_Default( @b, 0 )
   hb_Default( @c, 0 )
   hb_Default( @d, 0 )
   hb_Default( @e, 0 )
   hb_Default( @f, 0 )
   RETURN ::CallDllStd( "RMC_NOVAFUNCAO", a,b,c,d,e,f)
É que no VB, ao declarar como OPTIONAL nNumero AS DOUBLE, por exemplo, isso equivale a ter usado o hb_Default() pra colocar 0 na variável.
No exemplo do VB nem precisa do parâmetro. Então se tentar no Harbour vai dar GPF por faltar o parâmetro.

Como eu disse, são mais de 200 funções, leva meses pra ajustar todas, e nem precisa usar todas durante o uso.
Então se por acaso, algum dia, precisar usar alguma dessas, é usar a referência deste post pra resolver.

Em outras palavras: com as explicações do post, a classe vai sobreviver sozinha, cada um vai poder resolver o que precisar, sem ter que esperar que alguém resolva.

RMChart

Enviado: 05 Jun 2016 15:17
por JoséQuintas
Por falar nisso... pensei num jeito simples de converter aquele .BAS contendo TODAS as declarações.
Simples.... mas ainda assim trabalhoso.

Código: Selecionar todos

Declare Function RMC_CreateChartFromFileOnDC Lib "RMCHART.DLL" Alias "RMC_CREATECHARTFROMFILEONDC" ( _
                            ByVal nParentDC As Long, _
                            ByVal nCtrlId As Long, _
                            ByVal nX As Long, _
                            ByVal nY As Long, _
                            ByVal nExportOnly As Long, _
                            ByVal sRMCFile As String _
                             ) As RMCError
Os pontos importantes são o nome interno da dll, que fica entre aspas, a quantidade de parâmetros, e o tipo de cada um.
Isso ficaria assim:

Código: Selecionar todos

METHOD CreateChartFromFileOnDc( nParentDC, nCtrlId, nX, nY, nExportOnly, sRMCFile )
   RETURN ::CallDllStd( "RMC_CREATECHARTFROMFILEONDC", ::ToLong( nParentDC ), ::ToLong( nCtrlId ), ;
   ::ToLong( nX ), ::ToLong( nY ), ::ToLong( nExportOnly ), ::ToString( sRMCFile ) )
Isso garantiria o tratamento para o tipo compatível.
Depois só criar as rotinas de conversão, exemplo:

Código: Selecionar todos

METHOD ToString( xValue )
   RETURN iif( xValue == NIL, "", xValue )

METHOD ToDouble(xValue)
   RETURN iif( xValue == NIL, 0, xValue ) // ou conversões adicionais
Lembrando que verdadeiro/falso são boolean, mas em chamadas desse tipo são numéricos.
hb_DefaultValue() não serve pra esses casos onde o tipo não é o que parece ser.

RMChart

Enviado: 05 Jun 2016 15:31
por fladimir
:)Pos

obrigado