Continuando con el uso de controles OCX vamos ahora a ver como utilizar un control de terceros no presente directamente en el sistema operativo (como los vistos hasta ahora), esto quiere decir que habremos de instalarlo en cada PC del cliente donde queramos utilizarlo, aunque esto se puede automatizar como se verá mas adelante.
Este control es un generador de gráficos estadísticos de muy fácil manejo, pero de excelentes prestaciones, que además tiene la gran ventaja de ser gratuito ya que su autor lo ha donado de forma altruista al dominio público, es el control OCX llamado RMChart.
Se descarga de http://www.rmchart.com el Setup.exe y se instala, esta instalación incluirá un programa en el PC que además de los archivos necesarios para integrar en nuestra aplicación que son solo dos y detallaremos después, también nos propone un ejecutable RMCDesigner para generar gráficos manualmente, un montón de ejemplos de gráficos ya generados y el manual de ayuda del programa en Inglés.
Con el ejecutable RMChart podemos ver los ejemplos y generar nuevos gráficos que nos darán la idea de la gran potencia del producto.
Este programa incluso puede generar el código fuente del gráfico diseñado en él (Menú File, opción Get Source”, para copiar y pegar en las aplicaciones hechas en varios lenguajes de programación, pero no para Xailer, aunque si se ve el código generado para “VisualBasic.Net using ActiveX” es bastante parecido y nos puede servir haciendo unos retoques.
De todas maneras una vez que hayamos incluido el control ActiveX en nuestra aplicación de Xailer e instanciemos un objeto de la clase ya podremos utilizar sus propiedades y métodos escribiendo el código a mano.
Incluir el control ActiveX.
Después de crear el proyecto de Xailer o sobre uno ya creado, importamos el control ActiveX desde el menú componentes y buscando en la lista de controles el llamado RMChart.RMChartX y pulsamos en crear clase.
Como siempre que tomamos un control ActiveX desde Xailer, se genera automáticamente un Prg y un Ch en este caso ambos de nombre RMChart. El PRG es pequeño y no tiene mucha utilidad pero el CH es interesante ya que nos da la lista de colores, los tipos de gráficos y sus variantes, los tipos de leyendas, etc. que RMChart maneja y que luego podremos utilizar para crear gráficos.
He incluido el Proyecto RMChart ya creado para que podáis empezar a trabajar directamente sin tener que crear uno nuvo.
Utilizar el control ActiveX
Aunque el manual de ayuda de RMChart es amplio no me ha parecido muy ordenado y además esta en Inglés, por lo tanto no solo voy a explicar como se instancia la clase sino también repasaré los conceptos básicos de generación de graficas con RMChart.
En el proyecto de Xailer que adjunto se ve todo el proceso necesario dentro del PRG FormGrafica.Prg.
Instanciar el objeto gráfico es tan simple como con cualquier otro:
WITH OBJECT ::oChart := TRMChartX():New( Self )
:nAlign := alCLIENT
:Create()
END
Ahora es cuando podemos empezar a añadir los datos generales de un gráfico como el color de fondo (también se puede usar una imagen de fondo), anchura y altura del área gráfica:
WITH OBJECT ::oChart
:Reset()
:RMCBackColor = BlanchedAlmond
:RMCStyle = RMC_CTRLSTYLE3D
:RMCWidth = oSender:nWidth
:RMCHeight = oSender:nHeight
:RMCBgImage = ""
:Font = "Tahoma"
A continuación debemos de crear una región gráfica dentro del gráfico general. Una región es un área para alojar el gráfico dentro, pero RMChart permite tener de 1 a 4 regiones gráficas para presentar hasta 4 gráficos dentro de un solo contenedor, pudiendo darle a cada uno el tamaño que queramos.
Para crear la primera región haremos:
// Crear la primera región o gráfico del control
:AddRegion()
With object :Region(1)
// Márgenes respecto al form
:Left = 5
:Top = 10
:Width = -5
:Height = -20
// Título
:AddCaption()
With object :Caption
:Titel = "Total de inversión distribuido por bancos de la empresa "+CRLF+Alltrim(::oDbfEmp:Nombre)
:TextColor = Black
:FontSize = 14
:Bold = TRUE
End
// Pie de página
:Footer = "Datos a fecha: "+Dtoc(Date())
….
….
….
Como se ve con los márgenes respecto al contenedor
:Left = 5 :Top = 10 :Width = -5 :Height = -20
Damos 5 y 10 pixel de distancia respecto a la parte superior izquierda del contenedor y 5 y 20 puntos de la parte inferior derecha (curioso se expresan en negativo así es mas fácil que dando una dirección exacta ya que el contenedor puede variar de tamaño) de esta manera y como se comprende fácilmente no queda mas espacio en el contenedor para una segunda región extra.
A continuación podemos insertar, si es necesario, una leyenda para los datos mostrados:
// Leyenda
:AddLegend()
With OBJECT :Legend
:Alignment = RMC_LEGEND_CUSTOM_CENTER
:BackColor = Default
:Style = RMC_LEGENDRECTSHADOW
:TextColor = Default
:Fontsize = 0
:Bold = FALSE
For nItem:=1 to Len(aFondos)
:LegendString:=:LegendString+aFondos[nItem,1]+"*"
Next
:LegendString:=Left(:LegendString,Len(:LegendString)-1)
End
Y finalmente el gráfico de líneas, barras, tarta, etc. en si mismo:
//Añadir gráfico sin rejilla
:AddGridlessSeries()
With OBJECT :GridLessSeries
:SeriesStyle = RMC_DONUT_3D
:Alignment = RMC_FULL
:Lucent = TRUE
:ValueLabelOn = RMC_VLABEL_TWIN
:HatchMode = RMC_HATCHBRUSH_OFF
:StartAngle = 0
For nItem:=1 to Len(aFondos)
:DataString:=:DataString+Alltrim(Tostring(aFondos[nItem,2]))+"*"
Next
:DataString:=Left(:DataString,Len(:DataString)-1)
End
End
Y se muestra el gráfico:
:Draw( .T. )
END
Consideraciones importantes:
El gráfico a mostrar puede ser de dos tipos
• :AddGrid() para gráficos con rejilla, es decir con ejes X e Y de líneas o barras
• :AddGridlessSeries() para gráficos sin rejilla, es decir de tarta
Los segundos son más rápidos de hacer ya que solo incluyen una serie numérica y no hay que generar los ejes X e Y.
Para dotar al gráfico de los datos numéricos a mostrar hay que generar una cadena de texto llamada :DataString en la que hay que poner en línea los datos numéricos convertidos a texto y separados con el símbolo * (asterisco).
De la misma manera para alimentar los textos de la leyenda hay que generar una cadena de texto llamada :LegendString con los textos separados por *.
Así el gráfico generado se mostrará en su ventana contenedora que es el form que he llamado FormGrafica que se autoajusta a un 75% de la pantalla que tengáis y en el cual veréis que aparecen 3 botones para imprimir, enviar al portapapeles o grabar en disco el gráfico. Estas tres opciones son 3 métodos directos de RMChart y no tenemos mas que usarlos, ¿simple no?.
En el resto de los ejemplos que acompañan al código veréis como generar gráficos con rejilla X/Y (los cuatro primeros) que son ejemplos con más código, como usar mas de una serie numérica en una misma región (tercer ejemplo), como usar 2 regiones diferentes (cuarto ejemplo), gráfico de barras (quinto ejemplo), de tarta (sexto ejemplo) y tipo donut (séptimo ejemplo).
Instalación del control ActiveX en el PC del cliente.
Como no podemos decir al cliente que descargue de Internet el programa RMChart y ni falta que le hace instalarlo completo, podemos simplemente adjuntar los 2 ficheros necesarios a nuestra aplicación e instalarlos desde un programa de instalación o mas sencillo aún hacer lo siguiente.
En la carpeta del proyecto e incluido una subcarpeta llamada RMChart, su contenido es simplemente RMChart.Dll y RMChart.Ocx, los únicos necesarios para que el sistema generador de gráficos funcione, pero estos han de estar en C:WindowsSystem32 y además hay que registrar en Windows el archivo OCX.
Esto lo hace directamente el método que he creado en FormGrafica.Prg llamado Registrar() que al ejecutar el programa mira si están copiados y registrados y si no lo hace automáticamente.
Problemas:
• Para el usuario de nuestra aplicación: Si el S.O. es Windows Vista no los podrá copiar y registrar a no ser que se ejecute el programa con privilegios de administrador incluso siendo usuario administrador (clic derecho en el ejecutable, ejecutar como administrador).
• Para nuestro PC: Si no tienes estos archivos copiados y registrados no podrás compilar el EXE ya que no tienes el ActiveX en el sistema, mejor descarga e instala en tu PC el programa RMChart tal y como se indica al principio de este artículo y luego podrás probar este proyecto.
Para finalizar.
Es muy recomendable trastear un rato con el ejecutable RMCDesigner y abrir los ejemplos que incluye para ver más tipos de gráficos y sobre todo para ver todas las propiedades de la clase que luego podremos utilizar desde nuestro código.
Espero que os guste y dejéis a vuestros clientes impactados con los gráficos generados por vuestras aplicaciones.