Página 5 de 23

RMChart

Enviado: 07 Mai 2016 21:23
por JoséQuintas
Vamos precisar de ajuda de quem conheça C e talvez GTWVG.

Tomara que isso também resolva uma pendência que eu tinha.
Porque se for a mesma coisa... um novo mundo vai se abrir.

RMChart

Enviado: 07 Mai 2016 22:24
por asimoes
Quintas,

Esse problema de sumir a tela só acontece com o harbour, a minigui funciona direito, provavelmente pelo fato da minigui ser 100% gui
Nota: não é somente com a rmchart que acontece o problema de sumir a tela

RMChart

Enviado: 07 Mai 2016 23:12
por JoséQuintas
Nem queira saber dos meus testes.... rs

Revirei a GTWVG, mexi no activex.prg, reduzi linhas pra usar criação de janelas padrão...

E alterei a rotina de eventos contida em activex.prg

Código: Selecionar todos

METHOD WvgActiveXControl:handleEvent( nEvent, aNM )
   MsgExclamation( Transform( nEvent, "" ) )
Um detector de chamadas!! .... rs

Ao redimensionar janela, a rotina recebe o evento 5, que deve ser o resize.
Ao mover a janela.... cadê... nenhum sinal de evento.

Pode ser bug, ou pode ser proposital, vamos aguardar a resposta.

RMChart

Enviado: 08 Mai 2016 08:23
por asimoes
Quintas,

Já que ao mover a janela dispara o evento 5 , então a janela tem que ser restaurada, será que com WIN_SC_RESTORE resolve?

wapi_SendMessage(hb_gtInfo( HB_GTI_WINHANDLE ), WM_SYSCOMMAND, WIN_SC_RESTORE, 0)

https://msdn.microsoft.com/en-us/librar ... 85%29.aspx

RMChart

Enviado: 08 Mai 2016 10:19
por JoséQuintas
É justamente o contrário: Ao mover janela, na gtwvg não existe evento.
Não sei se é normal isso.

RMChart

Enviado: 08 Mai 2016 12:40
por JoséQuintas
Apesar de eu ter baseado meu exemplo na GTWVG, ele está diferente.

DEMOWVG:

RMChart funciona corretamente, tanto no resize quanto no move.
Mas tem muita coisa complicada no mesmo exemplo, difícil identificar o mínimo necessário, que funcione.
O próprio DEMOWVG tem problemas nessa janela de activex, usando ou não o RMChart.
Nele são usados wvgDialog(), wvgCrt(), wvgDrawArea(), wvgActivex() além de wvgToolbar(), wvgTreeview(), wvgListBox(), wvgStatusbar(), etc.

Meu teste:

Baseado no exemplo da GTWVG, mas diferente.
A única coisa que não funcionou foi "mover janela", aonde o gráfico fica em branco.
Só usei a janela normal, e um wvgActivex().

A única idéia por enquanto é pegar o demowvg inteiro, e ir removendo o que não interessa, até chegar no RMChart isolado.

Anexo o demowvg com o rmchart funcionando até no "mover janela".
Lembrando que pode ser necessário usar o gerenciador de tarefas pra fechar o aplicativo, no final.

RMChart

Enviado: 08 Mai 2016 13:59
por asimoes
Quintas,

A janela que está funcionando +- com demowvg pelo que percebi é 100% gui deve ser a wvgDialog()

RMChart

Enviado: 08 Mai 2016 16:02
por JoséQuintas
O difícil é enxugar o fonte.

No momento, pra facilitar testes, ao invés do RMChart dá pra usar o internet explorer.

Código: Selecionar todos

#include "inkey.ch"

PROCEDURE Main

   LOCAL oCom, cUrl := Pad( "www.github.com", 95 ), GetList := {}

   SetMode(40,100)
   CLS
   DO WHILE .T.
      @ 0, 0 GET cUrl PICTURE "@KX"
      READ
      IF LastKey() == K_ESC
         EXIT
      ENDIF
      oCom := WvgActiveXControl():New( wvgSetAppWindow(), , { -1, 0 }, { -MaxRow(), -MaxCol() - 1 }, , .T. )
      oCom:CLSID := "Shell.Explorer.2"
      oCom:create()
      IF HB_ISOBJECT( oCom )
         oCom:Navigate( Trim( cUrl ) )
      ENDIF
   ENDDO
   RETURN

RMChart

Enviado: 09 Mai 2016 10:37
por JoséQuintas
Não, não é solução, é só pra curiosidade mesmo.
Tem até exemplo de uso no xHarbour e Fivewin.
Não tinha reparado antes, mas agora que vi, chamou a atenção o fórum: Visual Basic

http://www.tech-archive.net/Archive/VB/ ... 00090.html

RMChart

Enviado: 09 Mai 2016 20:09
por JoséQuintas
Unir o útil ao agradável.

Levei um susto agora porque meu aplicativo estava lento.
Então acionei o GIT pra ver no que eu tinha mexido.
O git mostra tudo que foi alterado na pasta.
git.png
Com essa história de "caçar" algum evento pra atualizar a tela do RMChart, criei um log no disco de todos os eventos Windows.
Esqueci disso.

Se não fosse eu estar usando o GIT, ia demorar pra descobrir que esqueci de retirar isso.
Logo de cara, o arquivo de log, como sendo algo que não existia antes.
Vale a pena usar, a gente nunca sabe quando vai precisar dele.

Nota: estou usando pra todos os fontes de uma vez, não um controle por projeto.

RMChart

Enviado: 09 Mai 2016 20:25
por JoséQuintas
Até dei risada agora.
Fui olhar uns emails de erro que recebi, e olha o que encontrei
Verifique as instruções abaixo
Conforme o problema, o próprio responsável da empresa poderá resolvê-lo.
Se for problema no programa, uma nova versão estará disponível com a correção.
Se o email automático falhar, envie esta página por email à JPA.
--------------------------------------------------------------------------------
Não foi possível localizar informação em erros conhecidos

Horário : 09/05/16 19:55:34
--------------------------------------------------------------------------------
19:55:29 WVGCRT 10
19:55:29 WVGCRT 10
19:55:29 WVGCRT 10
19:55:29 WVGCRT 10
...
Como usei o arquivo padrão do Harbour HB_OUT.LOG no registro de eventos, minha rotina de erros me enviou por email.... rs

Também tinha esquecido disso.
É a vantagem de, ao invés de inventar nomes, usar nomes padrão conhecidos.
A única coisa que fiz foi usar o nome do arquivo onde são gravados erros.

Fica aí a dica, simples, mas útil.
O próprio aplicativo me avisando da meleca que eu fiz.... rs

RMChart

Enviado: 10 Mai 2016 09:25
por asimoes
Quintas,

Usando a dll ao invés do activex

O único problema que eu não consegui resolver foi no AddBarSeries se colocar RMC_ADDBARSERIES dá erro, se colocar RMC_AddBarSeries não dá erro mas também não mostra as barras.

Notem que todas as funções estão em caixa alta, porque é assim que está assinado na dll, mas se colocar RMC_ADDBARSERIES com caixa alta vem o erro,
Screen Shot 05-10-16 at 09.55 AM.PNG
Screen Shot 05-10-16 at 09.24 AM.PNG

Código: Selecionar todos

FUNCTION RmChart
   nHandleDLL:=hb_LibLoad("rmchart.dll")
   
   oCrt := WvgCrt():New( , , { -1, -1 }, { 50, MaxCol() - 6 }, , .T. )
   oCrt:lModal := .T.
   oCrt:icon   := "demo.ico"
   oCrt:create()
   oCrt:resizable := .F.
   cLegenda := "Entradas*Saidas*Mais Um"
   cLabels  := "Janeiro*Fevereiro*Março*Abril*Maio*Junho*Julho*Agosto*Setembro*Outubro*Novembro*Dezembro"
   cTitulo  := "Grafico de Teste"
   aDados   := { { 225.25, 100.00, 100.00, 150.00, 250.00, 300.00, 25.00, 75.00, 300.00, 200.00, 325.00, 300.00 } }
   aDadosGraf:={}
   cImagem := "" //"Paper.jpg"
   cUnidade := "R$ "
   cTextoVert := ""
   nMax     := 0
   
   FOR cTrGra1:=1 TO LEN( aDados )
   
       nMax := MAX( nMax, aMax( aDados[cTrGra1] ) )
       
       FOR cTrGra2:=1 TO LEN( aDados[cTrGra1] )
           IF cTrGra1 == 1
              AADD( aDadosGraf, aDados[cTrGra1, cTrGra2] )
              oData1 := aDados[cTrGra1,cTrGra2]
           ELSEIF cTrGra1 == 2
              oData2 := aDados[cTrGra1,cTrGra2]
           ELSEIF cTrGra1 == 3
              oData3 := aDados[cTrGra1,cTrGra2]
           ENDIF
      NEXT
   
   NEXT
   
   nMax := ROUND( ( INT( nMax/10 ) * 10 ) + 10 , 2 )
   
   altd()
   
   nRetVal :=hb_dynCall( { "RMC_CREATECHART", nHandleDLL, HB_DYN_CALLCONV_STDCALL },;
                        hb_gtInfo( HB_GTI_WINHANDLE ), ID_CHART, 0, 0, 770, 400, Azure, RMC_CTRLSTYLE3DLIGHT, .F., cImagem, "", 0, 0 )
 
   nRetVal := hb_dynCall( {"RMC_ADDREGION",    nHandleDLL, HB_DYN_CALLCONV_STDCALL },;
                          ID_CHART, 0, 0, 760, 400, "RmChart", .F. )
                          
   nRetVal := hb_dynCall( {"RMC_ADDCAPTION",   nHandleDLL, HB_DYN_CALLCONV_STDCALL  },;
                          ID_CHART, 1, cTitulo, Transparent, Red, 9, .T. )
                         
   nRetVal := hb_dynCall( {"RMC_ADDGRID",      nHandleDLL, HB_DYN_CALLCONV_STDCALL },;
                          ID_CHART, 1, LightBlue, .F., 20, 20, 685, 330, RMC_BICOLOR_LABELAXIS )
   
   nRetVal := hb_dynCall( {"RMC_ADDLABELAXIS", nHandleDLL, HB_DYN_CALLCONV_STDCALL },;
                          ID_CHART, 1, cLabels, 1, Len( aDados[1] ), RMC_LABELAXISBOTTOM, 8, Black, RMC_TEXTCENTER, Black, RMC_LINESTYLENONE, "" )
                          
   nRetVal := hb_dynCall( {"RMC_ADDDATAAXIS",  nHandleDLL,  HB_DYN_CALLCONV_STDCALL },;
                          ID_CHART, 1, RMC_DATAAXISRIGHT, 0.0, nMax, Len( aDados[1] ), 8, Black, Black, RMC_LINESTYLESOLID, 0, cUnidade, cTextoVert, "", RMC_TEXTCENTER )

   nRetVal := hb_dynCall( {"RMC_ADDLEGEND", nHandleDLL, HB_DYN_CALLCONV_STDCALL },;
                         ID_CHART, 1, cLegenda, RMC_LEGEND_BOTTOM, Transparent, RMC_LEGENDNORECT, Red, 8, .T. ) 

//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)

   FOR x:=1 TO LEN(aDadosGraf)
       nRetVal := hb_dynCall( {"RMC_AddBarSeries", nHandleDLL, HB_DYN_CALLCONV_STDCALL },;
                              ID_CHART, 1, aDadosGraf[1], 12, RMC_BARGROUP, RMC_BAR_FLAT_GRADIENT2, .F., 0, .F., 1, RMC_VLABEL_ABSOLUTE, x, RMC_HATCHBRUSH_OFF )          
                              
   NEXT
   
   nRetVal:=hb_dynCall( { "RMC_DRAW", nHandleDLL, hb_bitOr( HB_DYN_CTYPE_LONG , HB_DYN_CALLCONV_STDCALL ) },;
                        ID_CHART)
   
   Inkey(0)
   oCrt:destroy()
   
   hb_LibFree(nHandleDLL)

RETURN Nil
O Erro

Código: Selecionar todos

Application Internal Error - D:\Harbour\h-RMChart\HARBOUR\demo.exe
Terminated at: 2016-05-10 09:57:46
Erro irrecuper vel 6005: Exception error:

    Exception Code:C0000005 ACCESS_VIOLATION
    Exception Address:0095DDE1
    EAX:00000000  EBX:00000000  ECX:00000000  EDX:00000002
    ESI:00000000  EDI:00000000  EBP:0028F820
    CS:EIP:0023:0095DDE1  SS:ESP:002B:0028F784
    DS:002B  ES:002B  FS:0053  GS:002B
    Flags:00010246
    Exception Parameters: 00000000 00000000
    CS:EIP: DD 03 8B 5D 08 B8 01 00 00 00 03 C6 2B 43 18 8B
    SS:ESP: 406C27FF 00000000 00000000 00000000 00000000 00000000 00000000 0000B009 00000000 00000000 0095DD5D FFFFFFFF 0028F958 00000000 FFFFFE80 009782C9

    C stack:
    EIP:     EBP:       Frame: OldEBP, RetAddr, Params...
    0095DDE1 0028F820   0028F958 0091211F 0028F834 00000000 406C2800 00000000 01160208 406C2800 00000008 00000000


Modules:
00400000 002D9000 D:\Harbour\h-RMChart\HARBOUR\demo.exe
77D20000 0016F000 C:\WINDOWS\SYSTEM32\ntdll.dll
77A00000 00140000 C:\WINDOWS\SYSTEM32\KERNEL32.DLL
75EF0000 000D7000 C:\WINDOWS\SYSTEM32\KERNELBASE.dll
75B60000 0007C000 C:\WINDOWS\SYSTEM32\ADVAPI32.dll
72FA0000 00206000 C:\WINDOWS\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.9600.18006_none_a9ec6aab013aafee\COMCTL32.DLL
766A0000 0009B000 C:\WINDOWS\SYSTEM32\COMDLG32.DLL
75820000 0010F000 C:\WINDOWS\SYSTEM32\GDI32.dll
76560000 000C3000 C:\WINDOWS\SYSTEM32\msvcrt.dll
76020000 00129000 C:\WINDOWS\SYSTEM32\ole32.dll
764C0000 00095000 C:\WINDOWS\SYSTEM32\OLEAUT32.dll
76740000 012BC000 C:\WINDOWS\SYSTEM32\SHELL32.dll
75D90000 00153000 C:\WINDOWS\SYSTEM32\USER32.dll
72790000 00065000 C:\WINDOWS\SYSTEM32\WINSPOOL.DRV
75620000 00041000 C:\WINDOWS\SYSTEM32\sechost.dll
77B40000 000BA000 C:\WINDOWS\SYSTEM32\RPCRT4.dll
757D0000 00045000 C:\WINDOWS\SYSTEM32\SHLWAPI.dll
76150000 0017D000 C:\WINDOWS\SYSTEM32\combase.dll
75510000 0001E000 C:\WINDOWS\SYSTEM32\SspiCli.dll
75500000 0000A000 C:\WINDOWS\SYSTEM32\CRYPTBASE.dll
74610000 0008B000 C:\WINDOWS\SYSTEM32\SHCORE.DLL
754A0000 00054000 C:\WINDOWS\SYSTEM32\bcryptPrimitives.dll
75FE0000 00027000 C:\WINDOWS\system32\IMM32.DLL
756B0000 00112000 C:\WINDOWS\SYSTEM32\MSCTF.dll
71180000 000ED000 C:\WINDOWS\SYSTEM32\UxTheme.dll
5DDF0000 0000E000 C:\Program Files\Acer\Acer Power Management\CBT_DLL.dll
6FEA0000 0001A000 C:\WINDOWS\SYSTEM32\dwmapi.dll
753D0000 00009000 C:\WINDOWS\SYSTEM32\kernel.appcore.dll
008D0000 000BA000 D:\Harbour\h-RMChart\HARBOUR\rmchart.dll
742B0000 00170000 C:\WINDOWS\WinSxS\x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.9600.18123_none_dad9a2585bcb0fd8\gdiplus.dll
72800000 00006000 C:\WINDOWS\system32\msimg32.dll
64840000 00181000 C:\WINDOWS\SYSTEM32\DWrite.dll

Called from HB_DYNCALL(0)
Called from RMCHART(199) in DEMO.PRG
Called from CHART(118) in DEMO.PRG
Called from MAIN(24) in DEMO.PRG
------------------------------------------------------------------------

RMChart

Enviado: 10 Mai 2016 11:29
por JoséQuintas
Desse jeito, o problema de atualização de tela fica resolvido?

RMChart

Enviado: 10 Mai 2016 11:36
por JoséQuintas
Sugestão, somente se o problema de tela estiver resolvido dessa forma.
Algo mais ou menos assim:

Código: Selecionar todos

CREATE CLASS RmChart
   VAR hHandle
   VAR hWnd
   METHOD New()
   METHOD Destroy() // não sei o nome pra destruir automático
   METHOD ... cada um dos existentes na DLL
   END CLASS

METHOD New( hWnd )
   nHandle := hb_LibLoad(...)
   RETURN SELF

METHOD AddBarSeries( ... )
   RETURN hb_DynCall( ::hHandle, ::hWnd, ... )

METHOD Destroy()
   hb_LibFree(...)
   RETURN NIL
No uso:

Código: Selecionar todos

oRmChar := RMChart():New( hWnd )
oRmChart:AddBarSeries( xxxxxxxxxxx )
...
oRmChart:Destroy() // se não for automático

RMChart

Enviado: 10 Mai 2016 11:41
por JoséQuintas
Ah sim, o uso, veja se ajuda:

Código: Selecionar todos

Declare Function RMC_AddBarSeries Lib "RMCHART.DLL" Alias "RMC_ADDBARSERIES" ( _
                            ByVal nCtrlId As Long, _
                            ByVal nRegion As Long, _
                            Optional ByRef nFirstDataValue As Double, _
                            Optional ByVal nDataValuesCount As Long, _
                            Optional ByVal nType As BarSeriesType, _
                            Optional ByVal nStyle As BarSeriesStyle, _
                            Optional ByVal nIsLucent As Long, _
                            Optional ByVal nColor As RMC_Colors, _
                            Optional ByVal nIsHorizontal As Long, _
                            Optional ByVal nWhichDataAxis As Long, _
                            Optional ByVal nValueLabelOn As ValueLabels, _
                            Optional ByVal nPointsPerColumn As Long, _
                            Optional ByVal nHatchMode As Hatchmodes _
                            ) As RMCError
Declare Function RMC_AddBarSeriesI Lib "RMCHART.DLL" Alias "RMC_ADDBARSERIESI" ( _
                            ByVal nCtrlId As Long, _
                            ByVal nRegion As Long, _
                            ByRef nFirstDataValue As Double, _
                            ByVal nDataValuesCount As Long, _
                            T As tRMC_BARSERIES _
                            ) As RMCError
tem parâmetro BYREF, para o Harbour significa @variavel
Por isso é sempre bom criar uma rotina intermediária, pra não esquecer disso.