In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Otra vez RMChart

Foro público de Xailer en español
Responder
Moises Leon
Mensajes: 103
Registrado: Mié Dic 15, 2010 4:45 pm

Otra vez RMChart

Mensaje por Moises Leon »

Hola a todos
Pues aqui molestandolos con otra pregunta mas sobre RMChart que me trae
loco.
Alguien sabe como puedo recuperar los valores de tInfo del evento DobleClik
del Raton en la grafica?
Me interesa recuperar nDateIndex que es el numero de dato denrto del string
en el que estaria dando un DobleClik.
Con ese numero, recuperaria y mostraria información sobre ese punto en una
Grafica XY
¿Alguine me podria ayudar? ya estuve buscando esa información en internet y
no la encontre. El ToolTips no me sirvio porque necesito mas datos.
Muchas gracias
Moises Leon Rosas
Data Compensation
joselalinf
Mensajes: 291
Registrado: Jue Ene 31, 2013 1:10 pm

Otra vez RMChart

Mensaje por joselalinf »

Moises,
he mirado la documentación de RMChart y veo que en p5 devuelve un puntero,
puedes comprobarlo con MsgInfo( Valtype( p5 ) ).
Lo que necesitamos es saber cómo está definida esa estructura para acceder
a sus miembros.
Saludos,
José Lalí­n
Moises Leon
Mensajes: 103
Registrado: Mié Dic 15, 2010 4:45 pm

Otra vez RMChart

Mensaje por Moises Leon »

Ya tambien habia revisado la documentacion pero dice del 5o elemento:
"TINFO holds an instance of User Defined Type tRMC_INFO."
dice tambien:
"The fifth parameter in these events hold instead of TINFO an object oInfo
of the clInfo class."
Quise hacer algo como esto "p5:nDataIndex" pero no resulto.
En "Defined Type tRMC_INFO" dice de estos datos:
"Every time a mouse event happens on the chart control, the appropriate
mouse event in your source code gets as fifth parameter an instance of the
User Defined Type tRMC_INFO with the following type members"
y en esa lista viene nSeriesIndex y nDataIndex pero no encuentro como
rescatar esos valores.
"José Lalí­n" <joselalinf@gmail.com> escribió en el mensaje de noticias
news:5179499d$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
Moises,
he mirado la documentación de RMChart y veo que en p5 devuelve un puntero,
puedes comprobarlo con MsgInfo( Valtype( p5 ) ).
Lo que necesitamos es saber cómo está definida esa estructura para acceder
a sus miembros.
Saludos,
José Lalí­n
joselalinf
Mensajes: 291
Registrado: Jue Ene 31, 2013 1:10 pm

Otra vez RMChart

Mensaje por joselalinf »

Moises,
en algún sitio tiene que estar la declaración de la estructura TINFO. Si
tuviésemos acceso a ella entonces se podrí­a hacer una función en C para leerla:
HB_FUNC( TESTTINFO )
{
TINFO * tinfo = (TINFO *) hb_parptr( 1 );
MsgDebug( Dec( tinfo->nDataIndex ) );
}
Y podrí­as llamarla así­: TestTInfo( p5 ) pero es necesario saber cómo está
definida la estructura TINFO, sino no podemos hacer nada.
Saludos,
José Lalí­n
Moises Leon
Mensajes: 103
Registrado: Mié Dic 15, 2010 4:45 pm

Otra vez RMChart

Mensaje por Moises Leon »

Llevo 5 dias y lo que va de este buscando eso en internet y en la ayuda de
RMChart y no lo encuentro.
:(
"José Lalí­n" <joselalinf@gmail.com> escribió en el mensaje de noticias
news:[email=51794eac@svctag-j7w3v3j....]51794eac@svctag-j7w3v3j....[/email]
Moises,
en algún sitio tiene que estar la declaración de la estructura TINFO. Si
tuviésemos acceso a ella entonces se podrí­a hacer una función en C para
leerla:
HB_FUNC( TESTTINFO )
{
TINFO * tinfo = (TINFO *) hb_parptr( 1 );
MsgDebug( Dec( tinfo->nDataIndex ) );
}
Y podrí­as llamarla así­: TestTInfo( p5 ) pero es necesario saber cómo está
definida la estructura TINFO, sino no podemos hacer nada.
Saludos,
José Lalí­n
Moises Leon
Mensajes: 103
Registrado: Mié Dic 15, 2010 4:45 pm

Otra vez RMChart

Mensaje por Moises Leon »

He visto algo como esto:
Procedure MyCallback(hWnd, CBMSG, CBWPARAM, CBLPARAM)
Protected *TINFO.RMC_INFO
Protected CBCTL.w,CBCTLMSG.w
Protected Text$
Static z.l
CBCTL = PeekW(@CBWPARAM+0)
CBCTLMSG = PeekW(@CBWPARAM+2)
Select CBMSG
Case #WM_RBUTTONDOWN ; right mouse button was clicked
; CBLPARAM holds always the X/Y-position within the dialog,
; even you've clicked onto the chart
Text$="X-Pos in the dialog:"+Str(PeekW(@CBLPARAM+0))+Chr(13)
Text$+"Y-Pos in the dialog:"+Str(PeekW(@CBLPARAM+2))
MessageRequester("RMChart",Text$,0)
Case #WM_COMMAND
Select CBCTL
Case #ID_CHART ;message from the chart control
Select CBCTLMSG ;identify the message
Case #RMC_LBUTTONDOWN ;left mouse button
z = 1 ;set flag for left mouse button
pressed
Case #RMC_LBUTTONUP
z = 0 ;reset the flag for left mouse
button pressed
Case #RMC_CTRLRBUTTONDOWN ;Ctrl and right mouse button
*TINFO = CBLPARAM ;CBLPARAM holds a pointer to a
tRMC_INFO structure
Text$="X-Pos in the chart:"+Str(*TINFOnXPos)+Chr(13)
Text$+"Y-Pos in the chart:"+Str(*TINFOnYPos)
MessageRequester("RMChart",Text$,0)
Case #RMC_MOUSEMOVE ;mouse was moved in the chart
control
Debug "#RMC_MOUSEMOVE"
*TINFO = CBLPARAM ;CBLPARAM holds a pointer to a
tRMC_INFO structure
If z ;if the left mouse button is
pressed
;move the chart control within your dialog
RMC_SetCtrlPos(#ID_CHART,*TINFOnXMove,*TINFOnYMove,1)
EndIf
EndSelect
EndSelect
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
"José Lalí­n" <joselalinf@gmail.com> escribió en el mensaje de noticias
news:[email=51794eac@svctag-j7w3v3j....]51794eac@svctag-j7w3v3j....[/email]
Moises,
en algún sitio tiene que estar la declaración de la estructura TINFO. Si
tuviésemos acceso a ella entonces se podrí­a hacer una función en C para
leerla:
HB_FUNC( TESTTINFO )
{
TINFO * tinfo = (TINFO *) hb_parptr( 1 );
MsgDebug( Dec( tinfo->nDataIndex ) );
}
Y podrí­as llamarla así­: TestTInfo( p5 ) pero es necesario saber cómo está
definida la estructura TINFO, sino no podemos hacer nada.
Saludos,
José Lalí­n
joselalinf
Mensajes: 291
Registrado: Jue Ene 31, 2013 1:10 pm

Otra vez RMChart

Mensaje por joselalinf »

Moises,
creo que eso sólo sirve cuando se usa la DLL en vez del OCX.
Saludos,
José Lalí­n
vgest
Mensajes: 32
Registrado: Lun Jul 30, 2012 5:06 pm

Otra vez RMChart

Mensaje por vgest »


La estructura de tRM_INFO (con sintaxis C#) es:
public struct tRMC_INFO
{
public int nXPos;
public int nYPos;
public int nXMove;
public int nYMove;
public int nRegionIndex;
public int nRLeft;
public int nRTop;
public int nRRight;
public int nRBottom;
public int nSeriesIndex;
public int nDataIndex;
public int nChartType;
public int nSLeft;
public int nSTop;
public int nSRight;
public int nSBottom;
public int nSTop2;
public int nSBottom2;
public int nGLeft;
public int nGTop;
public int nGRight;
public int nGBottom;
public int nGCol;
public int nGRow;
public double nData1;
public double nData2;
public double nData3;
public double nData4;
public double nVirtData1;
public double nVirtData2;
public double nVirtData3;
public double nVirtData4;
}
La descripcion de cada campo viene en la ayuda de RMChart
Lo que no se es como acceder a la estructura directamente desde harbour (A primera vista no existe el acceso a estructuras C integrado, ni siquiera esta disponible cStruct.ch)
joselalinf
Mensajes: 291
Registrado: Jue Ene 31, 2013 1:10 pm

Otra vez RMChart

Mensaje por joselalinf »

Victor,
muchas gracias.
joselalinf
Mensajes: 291
Registrado: Jue Ene 31, 2013 1:10 pm

Otra vez RMChart

Mensaje por joselalinf »

Moises,
si la información de Victor es buena, podrí­a definirse la estructura en C y
luego usar el parámetro p5 desde una función C para ver si es posible
manipularla:
typedef struct {
int nXPos;
int nYPos;
etc.
} tRM_INFO;
HB_FUNC( TESTTINFO )
{
tRM_INFO * tinfo = (tRM_INFO *) hb_parptr( 1 );
MsgDebug( Dec( tinfo->nDataIndex ) );
}
Si tienes un momento, completa la estructura con todos los miembros que ha
puesto Victor y compila a ver si funciona.
Saludos,
José Lalí­n
Moises Leon
Mensajes: 103
Registrado: Mié Dic 15, 2010 4:45 pm

Otra vez RMChart

Mensaje por Moises Leon »

Hola José
No se usar C :( pero con lo que vi lo construi asi, pero me manda un
GPF
#pragma BEGINDUMP
#include "windows.h"
#include "wininet.h"
#include "Xailer.h"
typedef struct {
int nXPos;
int nYPos;
int nXMove;
int nYMove;
int mRegionIndex;
int nRLeft;
int nRTop;
int nRRight;
int nRBottom;
int nSeriesIndex;
int nDataIndex;
int nChartType;
int nSLeft;
int nSTop;
int nSRight;
int nSBottom;
int nSTop2;
int nSBottom2;
int nGLeft;
int nGTop;
int nGRight;
int nGBottom;
int nGCol;
int nGRow;
double nData1;
double nData2;
double nData3;
double nData4;
double nVirtData1;
double nVirtData2;
double nVirtData3;
double nVirtData4;
} tRM_INFO;
HB_FUNC( TESTTINFO )
{
tRM_INFO * tinfo = (tRM_INFO *) hb_parptr( 1 );
MsgDebug( Dec( tinfo->nDataIndex ) );
}
#pragma ENDDUMP
"José Lalí­n" <joselalinf@gmail.com> escribió en el mensaje de noticias
news:517e941b$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
Moises,
si la información de Victor es buena, podrí­a definirse la estructura en C y
luego usar el parámetro p5 desde una función C para ver si es posible
manipularla:
typedef struct {
int nXPos;
int nYPos;
etc.
} tRM_INFO;
HB_FUNC( TESTTINFO )
{
tRM_INFO * tinfo = (tRM_INFO *) hb_parptr( 1 );
MsgDebug( Dec( tinfo->nDataIndex ) );
}
Si tienes un momento, completa la estructura con todos los miembros que ha
puesto Victor y compila a ver si funciona.
Saludos,
José Lalí­n
--

Attached files
joselalinf
Mensajes: 291
Registrado: Jue Ene 31, 2013 1:10 pm

Otra vez RMChart

Mensaje por joselalinf »

Moises,
¿le estás pasando a la función en C el parámetro p5 de damedato()?
Saludos,
José Lalí­n
joselalinf
Mensajes: 291
Registrado: Jue Ene 31, 2013 1:10 pm

Otra vez RMChart

Mensaje por joselalinf »

Victor,
tienes forma de probar en C# qué devuelve esto:
console.write( sizeof( tRM_INFO ) )
Saludos,
José Lalí­n
joselalinf
Mensajes: 291
Registrado: Jue Ene 31, 2013 1:10 pm

Otra vez RMChart

Mensaje por joselalinf »

Moises,
esto funciona sin GPF pero no devuelve el dato correctamente. Es muy
posible que la definición de la estructura no sea correcta o que ni
siquiera sea una estructura:
#pragma BEGINDUMP
#include <windows.h>
#include <xailer.h>
typedef struct {
int nXPos;
int nYPos;
int nXMove;
int nYMove;
int nRegionIndex;
int nRLeft;
int nRTop;
int nRRight;
int nRBottom;
int nSeriesIndex;
int nDataIndex;
LONG nChartType;
LONG nSLeft;
LONG nSTop;
LONG nSRight;
LONG nSBottom;
LONG nSTop2;
LONG nSBottom2;
LONG nGLeft;
LONG nGTop;
LONG nGRight;
LONG nGBottom;
LONG nGCol;
LONG nGRow;
double nData1;
double nData2;
double nData3;
double nData4;
double nVirtData1;
double nVirtData2;
double nVirtData3;
double nVirtData4;
} RMC_INFO;
//---------------------------------------------------------- ----------------
HB_FUNC( PARSE_RMCINFO )
{
if( HB_ISPOINTER( 1 ) )
{
RMC_INFO * rmc = (RMC_INFO *) hb_parptr( 1 );
hb_retnl( rmc->nXPos );
}
else
hb_retnl( 0 );
}
#pragma ENDDUMP
//---------------------------------------------------------- ----------------
Desde tu aplicación puedes llamarlo con MsgInfo( Parse_RMCInfo( p5 ) )
Saludos,
José Lalí­n
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Otra vez RMChart

Mensaje por jfgimenez »

Moises,
lo he estado probando, y por lo que he visto, la estructura no es
exactamente com habéis puesto. No sé exactamente lo que es, pero hay un
total de 52 bytes antes del primer miembro (nXPos) que habéis puesto.
Teniendo eso en cuenta, si cambias esto te funciona:
> typedef struct {
char algo[52];
> int nXPos;
> int nYPos;
> int nXMove;
> int nYMove;
> int nRegionIndex;
.... el resto como estaba.
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
joselalinf
Mensajes: 291
Registrado: Jue Ene 31, 2013 1:10 pm

Otra vez RMChart

Mensaje por joselalinf »

Jose,
> lo he estado probando, y por lo que he visto, la estructura no es
> exactamente com habéis puesto. No sé exactamente lo que es, pero hay un
> total de 52 bytes antes del primer miembro (nXPos) que habéis puesto.
Ese era el problema.
> Teniendo eso en cuenta, si cambias esto te funciona:
Confirmado. Probado y funcionando.
Saludos,
José Lalí­n
Moises Leon
Mensajes: 103
Registrado: Mié Dic 15, 2010 4:45 pm

Otra vez RMChart

Mensaje por Moises Leon »

Hola Jose
He tratado de seguirlos pero a mi no me ha dado resultado, algo he de haber
hecho mal. Espero no agotar tu paciencia.
Estoy con la version 4.12 del RMChart, Xailer 2.7.5. y Harbour
Tengo la linea:
:MouseUp = "DameDato"
que me manda al Metodo:
METHOD DameDato( oSender, p1, p2, p3, p4, p5 ) CLASS TGrafica
MsgInfo(oSender)
MsgInfo(p1)
MsgInfo(p2)
MsgInfo(p3)
MsgInfo(p4)
MsgInfo(p5) <--- Este valor me indica que es NIL (es
probable que por eso Parse_RMCInfo(p5) mande 0 siempre)
MsgInfo( Parse_RMCInfo( p5 ) )
RETURN NIL
Esta es la definicion de la funcion Parse_RMCInfo
//---------------------------------------------------------- --------
#pragma BEGINDUMP
#include <windows.h>
#include <xailer.h>
typedef struct {
char algo[52];
int nXPos;
int nYPos;
int nXMove;
int nYMove;
int nRegionIndex;
int nRLeft;
int nRTop;
int nRRight;
int nRBottom;
int nSeriesIndex;
int nDataIndex;
LONG nChartType;
LONG nSLeft;
LONG nSTop;
LONG nSRight;
LONG nSBottom;
LONG nSTop2;
LONG nSBottom2;
LONG nGLeft;
LONG nGTop;
LONG nGRight;
LONG nGBottom;
LONG nGCol;
LONG nGRow;
double nData1;
double nData2;
double nData3;
double nData4;
double nVirtData1;
double nVirtData2;
double nVirtData3;
double nVirtData4;
} RMC_INFO;
//---------------------------------------------------------- ----------------
HB_FUNC( PARSE_RMCINFO )
{
if( HB_ISPOINTER( 1 ) )
{
RMC_INFO * rmc = (RMC_INFO *) hb_parptr( 1 );
hb_retnl( rmc->nXPos );
}
else
hb_retnl( 0 );
}
#pragma ENDDUMP
//---------------------------------------------------------- ----------------
Y el RMChartX.prg esta asi:
#include "Xailer.ch"
#include "RMChartX.ch"
CLASS TRMChartX FROM TOcx
PROPERTY cCLSID INIT "RMChart.RMChartX"
METHOD Free() INLINE ::ocx:Reset(), ::Super:Free()
PUBLISHED:
EVENT MouseDown( @nButton, @nShift, @nx, @ny, @utINFO )
EVENT MouseUp( @nButton, @nShift, @nx, @ny, @utINFO )
EVENT MouseMove( @nButton, @nShift, @nx, @ny, @utINFO )
EVENT DblClick()
EVENT MouseDownA( @nButton, @nShift, @nx, @ny, poInfo )
EVENT MouseUpA( @nButton, @nShift, @nx, @ny, poInfo )
EVENT MouseMoveA( @nButton, @nShift, @nx, @ny, poInfo )
PUBLIC:
ENDCLASS
//---------------------------------------------------------- ----------------
"José Lalí­n" <joselalinf@gmail.com> escribió en el mensaje de noticias
news:517f85e4$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
Jose,
> lo he estado probando, y por lo que he visto, la estructura no es
> exactamente com habéis puesto. No sé exactamente lo que es, pero hay un
> total de 52 bytes antes del primer miembro (nXPos) que habéis puesto.
Ese era el problema.
> Teniendo eso en cuenta, si cambias esto te funciona:
Confirmado. Probado y funcionando.
Saludos,
José Lalí­n
joselalinf
Mensajes: 291
Registrado: Jue Ene 31, 2013 1:10 pm

Otra vez RMChart

Mensaje por joselalinf »

Moises,
acabo de ver porqué no te funciona:
> :MouseUp = "DameDato"
Cámbialo por :MouseUpA := "DameDato"
> typedef struct {
> LONG nChartType;
También habrí­a que cambiar los LONG de la estructura por int. Yo he hecho
las pruebas con ambos pero creo que es mejor normalizarla.
Saludos,
José Lalí­n
Moises Leon
Mensajes: 103
Registrado: Mié Dic 15, 2010 4:45 pm

Otra vez RMChart

Mensaje por Moises Leon »

Listo !!!!!!!
Victor, Ignacio y Jose , Muchisimas gracias
Moises Leon
Data Compensation
"José Lalí­n" <joselalinf@gmail.com> escribió en el mensaje de noticias
news:517fdd68$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
Moises,
acabo de ver porqué no te funciona:
> :MouseUp = "DameDato"
Cámbialo por :MouseUpA := "DameDato"
> typedef struct {
> LONG nChartType;
También habrí­a que cambiar los LONG de la estructura por int. Yo he hecho
las pruebas con ambos pero creo que es mejor normalizarla.
Saludos,
José Lalí­n
joselalinf
Mensajes: 291
Registrado: Jue Ene 31, 2013 1:10 pm

Otra vez RMChart

Mensaje por joselalinf »

Moises,
olvidé comentarte algo.
En MiraDato( oSender, p1, p2, ... ) recibes en p1 el botón que se ha
pulsado así­ que puedes usarlo para por ejemplo mostrar un menú contextual:
METHOD DameDato( oSender, p1, p2, p3, p4, p5 )
LOCAL x, y
LOCAL oPop, nOption
IF p1 == 1 // Botón izquierdo
MsgInfo( RMC_ParseInfo( p5 ) )
ELSEIF p1 == 2 // Botón derecho
GetCursorPos( @x, @y )
MENU oPop POPUP
MENUITEM "Copia imagen" ACTION MsgInfo( "Imagen" )
MENUITEM "Copia datos" ACTION MsgInfo( "Datos" )
SEPARATOR
MENUITEM "Imprimir" ACTION MsgInfo( "Imprimir" )
ENDMENU
nOption := TrackPopupMenu( oPop:Handle, TPM_RETURNCMD, x, y,
::oChart1:hWnd )
IF nOption > 0
oPop:DoAction( nOption )
ENDIF
ENDIF
RETURN Nil
Saludos,
José Lalí­n
Moises Leon
Mensajes: 103
Registrado: Mié Dic 15, 2010 4:45 pm

Otra vez RMChart

Mensaje por Moises Leon »

Excelente Jose lo tomare en cuenta.
Muchas gracias
Moises
"José Lalí­n" <joselalinf@gmail.com> escribió en el mensaje de noticias
news:51800b2d$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
Moises,
olvidé comentarte algo.
En MiraDato( oSender, p1, p2, ... ) recibes en p1 el botón que se ha
pulsado así­ que puedes usarlo para por ejemplo mostrar un menú contextual:
METHOD DameDato( oSender, p1, p2, p3, p4, p5 )
LOCAL x, y
LOCAL oPop, nOption
IF p1 == 1 // Botón izquierdo
MsgInfo( RMC_ParseInfo( p5 ) )
ELSEIF p1 == 2 // Botón derecho
GetCursorPos( @x, @y )
MENU oPop POPUP
MENUITEM "Copia imagen" ACTION MsgInfo( "Imagen" )
MENUITEM "Copia datos" ACTION MsgInfo( "Datos" )
SEPARATOR
MENUITEM "Imprimir" ACTION MsgInfo( "Imprimir" )
ENDMENU
nOption := TrackPopupMenu( oPop:Handle, TPM_RETURNCMD, x, y,
::oChart1:hWnd )
IF nOption > 0
oPop:DoAction( nOption )
ENDIF
ENDIF
RETURN Nil
Saludos,
José Lalí­n
Responder