Hola invitado         31 Jul, 2010 - 07:32
Menú principal
 
Ads
 
Patrocinadores
 
Anuncios
 
© 2009 PortalFox
SimpleChart revisitado lecturas 11747
 Enviado por amby en Viernes, 17 Octubre, 2003
Artículos Segunda parte del artículo "Adicionar gráficos y diagramas a sus aplicaciones en VFP" escrito por Mike Lewis y traducido por Ana María Bisbé York.

SimpleChart revisitado.

Autor: Mike Lewis
www.ml-consult.co.uk

Texto original:
-- Simple Chart Revisited --
http://www.ml-consult.co.uk/foxst-27.htm

Traducido por:
Ana María Bisbé York
amby@telefonica.net


Sus comentarios, preguntas y sugerencias sobre nuestro control para graficar.

Nuestro agradecimiento a todos ustedes que nos han enviado sus opiniones sobre nuestro control SimpleChart. Desde que nosotros publicamos el control en Marzo 2002, se ha convertido en el elemento más bajado del sitio Foxstuff, y nos da mucho gusto que muchos programadores de FoxPro lo hayan encontrado útil.

En este artículo vamos a contestar algunas de sus preguntas más frecuentes sobre este control y también pasarles algunos consejos útiles de sus usuarios.

Para aquellos que no han visto el control SimpleChart SimpleChart es en esencia una envoltura del control ActiveX Microsoft's MSChart. Su objetivo es simplificar el trabajo en la elaboración de gráficos, histogramas, y otros diagramas bidimensionales y tridimensionales. Para encontrar más información sobre él y para obtener su copia gratis, vea el artículo Add graphs and charts to your VFP applications.

¿Tiene que estar mi gráfico solo en un formulario o puedo colocarlo junto a otros controles?

Es su decisión. El control trabaja exactamente igual en ambas situaciones.

Estoy tratando de crear un gráfico bidimensional de barra horizontal; pero me aparece un error OLE, ‘Invalid property value’ (Valor de propiedad no válido). ¿Por qué?

SimpleChart admite tipos de gráficos del 0 al 9 y 14 y 16. Puede asignarle solo estos valores a la propiedad. Los otros 16 valores que se ve en la Ventana de propiedades no funcionan en VFP (el gráfico bidimensional de barra horizontal sería el 11). Esta es una limitación del MS Chart, no del SimpleChart.

He seguido cuidadosamente las instrucciones en la creación del gráfico; pero no ocurre nada. No hay mensaje de error. El gráfico simplemente falla y no aparece.

La explicación más probable es que el gráfico no ha podido encontrar la tabla o cursor. Es necesario asegurarse de que la tabla o cursor está abierta en la sesión de datos actual y el alias correcto ha sido guardado en la propiedad cAlias. Verifique también que la propiedad cData contiene una lista válida de nombres de campos numéricos. El método CreateChart retornará .F. si se detecta un problema con cAlias o cData.

¿Qué ficheros adicionales necesito para distribuir mi aplicación?

Es necesario distribuir el control ActiveX MS Chart, que es el MSCHRT20.OCX. Este OCX debe ser instalado en la carpeta System del usuario y registrarlo como un Control ActiveX. Si no está seguro de cómo hacerlo, verifique la ayuda del Asistente de Instalación (si utiliza VFP 6.0) o InstallShield Express (VFP 7.0 y VFP 8.0)

¿Cómo puedo imprimir mi gráfico?

Ni MS Chart ni SimpleChart respalda la impresión. Sin embargo, existe un método EditCopy, que permite copiar el gráfico al Portapapeles. Posteriormente se puede pegar el gráfico en otra aplicación y luego imprimirlo desde allí (vea también las dos preguntas siguientes.)

Traté de utilizar el Método EditCopy para copiar mi gráfico a MS Word, pero todo lo que logré ver fue un bloque de figuras.

Lo que vio fueron los datos subyacentes en los que se basa el gráfico. Para ver el gráfico seleccione Pegado Especial del Menú Edición de Word, luego seleccione Imagen. Lo mismo ocurrirá en Excel y algunas otras aplicaciones.

Dado que es posible pegar un gráfico en un documento de Word y después imprimirlo, ¿existe una vía para hacerlo programáticamente, sin intervención del usuario?

Si. La técnica siguiente utiliza ActiveX Automation para hacer eso justamente (nuestro agradecimiento a Ben Hambigde por sugerir la idea y a Jon Barker por su ayuda en la validación)

Primero, crear un formulario con las propiedades del usuario. Le llamaremos oWord. Inicializamos como Null, por ejemplo, para ejecutar este código en el INIT del formulario colocar:

THISFORM.oWord = NULL

Luego, ejecute el siguiente código en el momento en que usted desea imprimir el gráfico. Puede ser el Evento Clic del comando Imprimir

IF ISNULL(THISFORM.oWord)
  THISFORM.oWord=CREATEOBJECT("Word.Application")
ENDIF
oDoc=THISFORM.oWord.Documents.Add()
THISFORM.MyChart.EditCopy()
THISFORM.oWord.Selection.PasteSpecial(.F., .F., 0, .F., 3)
oDoc.PrintOut
oDoc.Close(0)

Fundamentalmente, este código va a instanciar Microsoft Word como un servidor de Automatización (a no ser que haya sido instanciado antes), copia el gráfico en el Portapapeles, pega la imagen del gráfico (no los valores) en un nuevo documento de Word, imprime el documento y cierra el documento sin salvar. (En la quinta línea del código que se muestra arriba, MYChart es el nombre del objeto SimpleChart)

Finalmente, adicione este código en el evento Destroy de este formulario.

IF NOT ISNULL(THISFORM.oWord)
  THISFORM.oWord.Quit
ENDIF 

¿Cómo puedo mostrar un cursor de rotación para que los usuarios puedan rotar mi gráfico tridimensional?

En teoría, usted puede hacer esto fijando la propiedad AllowDynamicRotation en .T. Se supone que mostrará un cursor de rotación cuando el usuario presione la tecla Control (el cursor de rotación aparece como una flecha de cuatro puntas y permite al usuario rotar el gráfico 3D interactivamente.) En la práctica, nunca lo hemos logrado obtenere en VFP (recibiremos gustosos sugerencias de alguien que sepa como hacer esto).

¿Es posible rotar un gráfico 3D programáticamente?

Si, existen las propiedades disponibles para ajustar tanto la rotación como la elevación de los gráficos. Para ver esta acción, adicione dos controles spinner a su formulario. Coloque este código en el Evento InteractiveChange del primer spinner

THISFORM.MyChart.Plot.View3d.Rotation=this.Value

Y en el evento InteractiveChange del Segundo control spinner:

THISFORM.MyChart.Plot.View3d.Elevation = this.Value

Cuando usted ejecute el formulario y ajuste los valores de los controles spinner, verá algunos efectos interesantes (Nuestro agradecimiento a Kirk Kelly por suministrar esta información)

¿Existe alguna vía para cambiar el Formato de letra utilizado en las etiquetas?

Este código va a cambiar la etiqueta del eje X a Fuente = Arial Narrow y su tamaño 14

WITH THISFORM.MyChart.Plot.Axis(0)
  FOR EACH olabel IN .Labels
    olabel.VtFont.Name = "Arial Narrow"
    oLabel.vtFont.Size = 14
  ENDFOR
ENDWITH

Alternativamente referencie Axis(1) o Axis(2) en lugar de Axis(0) en la primera línea. Esto le permitirá cambiar la fuente en los ejes verticales izquierdo y derecho respectivamente

¿Es posible mostrar títulos para los tres ejes?

Si. SimpleChart puede mostrar un título para ele eje X y para ambos ejes Y Aquí mostramos como su código pudiera ser escrito:

WITH THISFORM.MyChart.Plot.Axis(0)
  .AxisTitle.Text = "This is the X-axis"
  .AxisTitle.vtFont.Name = "Arial"
  .AxisTitle.VtFont.Size = 12
ENDWITH

Esto mostrará un título horizontal para el eje X. Al igual que las etiquetas, usted puede referenciar Axis(1) o Axis(2) para los ejes Y (izquierdo y derecho respectivamente)

El objeto AxisTitle tiene un conjunto de otras propiedades que usted puede utilizar para personalizar el título -- TextLayout.Orientation, por ejemplo, le permite escoger la orientación (1 = horizontal, 2 = vertical). Además el objeto VFont tiene propiedades para Style (1 = negrita, 2 = cursiva, 3 = negritaCursiva) y Effect (256 = tachar, 512 = subrayar)

Mike Lewis Consultants Ltd. Julio 2002. Revisado Septiembre 2002

 

 Versión imprimible  
SimpleChart revisitado | Entrar/Crear una cuenta | 14 Comentarios
Los comentarios son propiedad de sus respectivos autores.
No somos responsables de su contenido.

Re: SimpleChart revisitado


por devilsito en 21 Oct, 2003 - 08:03
(Información del usuario  | Enviar un mensaje 

Pregunta:

Es posible obtener la pantalla de propiedades,( la que aparece cuando le das clic derecho, cuando estas diseñando el formulario) en tiempo de ejecución.??

Asi no tendría que dar todas las propiedades de forma programada.

--devilzito--

  • Re: Re: SimpleChart revisitado


    por amby en 22 Oct, 2003 - 09:46
    (Información del usuario | Enviar un mensajehttp://
    Hola:

    Las propiedades las obtienes en tiempo de desarrollo como en todos los objetos.
    Yo lo que hice fue crear un grupo de botones para que escogiera el tipo de gráfico que quería y luego tengo un método del formulario que se llama Crear Gráfico al que le paso los parámetros según el tipo deseado.
    Como no me gusta la forma en que se ve la leyenda en todos los casos, la doy como opción (mediante un control checkbox) para que sea el usuario del sistema el que decida, etc. Es decir todo lo que quieras definir en tiempo de ejecución lo puedes hacer mediante objetos que colocas en tu formulario y dejan al usuario definir las características del gráfico según sus necesidades.
    En mi caso incluso las dos propiedades imprescindibles para que trabaje el SimpleChart que son el alias y los campos, no los tengo definidos de antemano, porque en un solo formulario tengo aspectos que se toman de varias tablas diferentes y en dependencia del aspecto que desee el usuario graficar, serán definidos los valores para estas propiedades.
    Resumiendo: Todo lo puedes definir en tiempo de desarrollo; pero la ventana propiedades aparece en tiempo de diseño.

    Saludos y suerte,

    Ana

    [ No se permiten comentarios a los usuarios anónimos. Por favor, Inicia tu cuenta o registrate ]

Re: SimpleChart revisitado


por moika en 27 Oct, 2003 - 04:51
(Información del usuario  | Enviar un mensaje 
Quisiera saber como puedo hacer para mostrar los valores arriba de cada barra en el grafico.

  • Re: Re: SimpleChart revisitado


    por amby en 28 Oct, 2003 - 08:11
    (Información del usuario | Enviar un mensajehttp://
    Hola:

    La verdad es que no se, me pondré en contacto con el autor, a ver si se puede.

    Saludos,

    Ana

    [ No se permiten comentarios a los usuarios anónimos. Por favor, Inicia tu cuenta o registrate ]

    • Re: Re: Re: SimpleChart revisitado


      por amby en 03 Nov, 2003 - 09:49
      (Información del usuario | Enviar un mensajehttp://
      Holaaa:

      Pues, no son buenas noticias, porque no está previsto; pero el autor va a sacar un tiempito en pensar una solución. Y por supuesto te la haré saber.

      Te dejo su respuesta:

      Off-hand, I can't think of any way of putting values inside the chart (other
      than the normal Legend, which is not what they want). However, I'll have a
      closer look when I get time, and let you know if I can suggest anything.

      Saludos,

      Ana

      [ No se permiten comentarios a los usuarios anónimos. Por favor, Inicia tu cuenta o registrate ]

      • Solución !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


        por amby en 20 Feb, 2004 - 10:06
        (Información del usuario | Enviar un mensajehttp://
        Aquí va la Solución para los que utilicen SimpleChart de Mike Lewis.

        Dentro del código del método CreateChart en el ciclo donde se están creando las series debe quedar de esta forma

        IF lnColIndex > 0

        * Determine the red, green and blue elements
        ....
        * Set the bar's colours
        .Plot.SeriesCollection(lnI).DataPoints(-1).Brush.FillColor.Set(lnRed,lnGreen,lnBlue)

        * Set colours for line series
        .Plot.SeriesCollection(lnI).pen.vtColor.Set(lnRed,lnGreen,lnBlue)

        **** NUEVO !!!!!!
        * Colocar los datos en un lugar de la figura
        .Plot.SeriesCollection(lnI).datapoints(-1).Datapointlabel.locationtype = n
        ENDIF

        Donde:
        n = número del 1 al 8 que en dependencia del gráfico deja ver los valores numéricos en diferentes posiciones del gráfico.
        Ej: 3 - Centro, 1 - Arriba del todo, 4 - Base, etc

        Saludos,

        Ana

        [ No se permiten comentarios a los usuarios anónimos. Por favor, Inicia tu cuenta o registrate ]

Re: SimpleChart revisitado


por XFOX (ossys@topmail.com.ar) en 08 Mar, 2004 - 12:58
(Información del usuario  | Enviar un mensaje http://)
es posible pegar el grafico en excel o word.....y luego seleccionandolo en estos programas, volver a copiar y pegarlo en un campo general de un cursor para imprimirlo con un reporte? ya que pasarlo a un campo general directamente no es posible?

  • Re: Re: SimpleChart revisitado


    por amby en 11 Mar, 2004 - 06:30
    (Información del usuario | Enviar un mensajehttp://
    Hola Oscar:

    Sí se puede pasar el gráfico directamente a un campo de una tabla sin necesidad de pasarlo por excel o word.

    Lo primero es copiar al Clipboard y luego pegar donde necesites. Yo copio al clipboard, luego convierto en .bmp para dejar su ruta en un campo de caracteres de mi cursor y no empleo un campo general. Luego utilizo el programa gráficos escrito por J.Enrique Ramos Menchaca.

    Cambios que hicimos:

    1.- Incluir 2 parámetros: tcArchivo, tcreporte
    tcArchivo - nombre del .bmp que se va a cargar en el objeto imagen del
    informe
    tcreporte - nombre del reporte a llamar

    2.- No emplear campo general y sí campo de caracteres con la ruta de la
    imagen a mostrar, mira donde dice código nuevo.

    * Copiar al Clipboard
    THISFORM.grafico.EditCopy

    * Copiar a un bmp
    thisform.crutagrafico = GETENV("temp")+ALLTRIM(SYS(2015))+".bmp"

    DO Graficos WITH (thisform.crutagrafico),''

    ***
    * Programa Graficos
    * Autor: J.Enrique Ramos Menchaca
    * Modificado por Jorge Mota y Ana María Bisbé York

    LPARAMETERS tcArchivo, tcreporte

    #DEFINE CF_BITMAP 2
    #DEFINE OBJ_BITMAP 7
    DO decl

    LOCAL hClipBmp, lcTargetFile
    *lcTargetFile = "C:\clipboard.bmp"
    lcTargetFile = tcArchivo &&"grafime.bmp"

    = OpenClipboard (0)
    hClipBmp = GetClipboardData (CF_BITMAP)
    = CloseClipboard()

    IF hClipBmp = 0 Or GetObjectType(hClipBmp) <> OBJ_BITMAP
    = MessageB ("No se encontro imagen bitmap en el Portapapeles.",;
    64, "Clipboard to BMP")
    RETURN .F.
    ENDIF
    = bitmap2file (hClipBmp, lcTargetFile)
    = DeleteObject (hClipBmp)
    ***
    * crear las referencias para los arreglos
    *external array laAspecto, lavalor, laporci, lavalor
    Leer el resto de este comentario...

    [ No se permiten comentarios a los usuarios anónimos. Por favor, Inicia tu cuenta o registrate ]

Re: SimpleChart revisitado


por AlejandroFabian (graduadouba97@hotmail.com) en 13 Jul, 2004 - 04:36
(Información del usuario  | Enviar un mensaje http://)
Sobre la rotación en 3D además de fijar la propiedad AllowDynamicRotation en .T. se tiene que ajustar la propiedad AllowSelections en .T., esto igualará la práctica con la teoría.

Pregunta:
¿Cómo puedo incorporar en la visualización del gráfico el valor (en cantidades) de lo representado por ejmplo por cada barra.
Gracias.


  • Re: Re: SimpleChart revisitado


    por amby en 12 Ago, 2004 - 06:36
    (Información del usuario | Enviar un mensajehttp://www.amby.net
    Hola Alejandro Fabian:

    Lamentablemente me he despistado de revisar los temas de SimpleChart en PortalFox y no te había contestado una duda que justamente hoy cumple un mes.

    Pero, primero déjame agradecerte, por el tip del AllowSelections = .T., ya le estoy escribiendo al autor Mike Lewis con tu nombre para que sepa la fuente de la solución, se rotan de maravilla.

    Sobre tu duda:

    ¿Cómo puedo incorporar en la visualización del gráfico el valor (en cantidades) de lo representado por ejmplo por cada barra.

    Hay que modificar el código del CreateChart de Mike Lewis.

    IF lnColIndex > 0

    * Determine the red, green and blue elements

    * Set the bar's colours
    .Plot.SeriesCollection(lnI).DataPoints(-1).Brush.FillColor.Set(lnRed,lnGreen,lnBlue)

    * Set colours for line series
    .Plot.SeriesCollection(lnI).pen.vtColor.Set(lnRed,lnGreen,lnBlue)

    **** nuevo
    * Colocar los datos en un lugar de la figura
    .Plot.SeriesCollection(lnI).datapoints(-1).Datapointlabel.locationtype = 7
    * donde 1 ó >= 6 = arriba de las barras
    * 2 ó 5 es dentro en la parte superior
    * 3 es dentro en el medio
    * 4 es dentro abajo

    ENDIF

    Una vez más, muchas gracias,

    Saludos,

    Ana
    www.amby.net

    [ No se permiten comentarios a los usuarios anónimos. Por favor, Inicia tu cuenta o registrate ]

Re: SimpleChart revisitado


por javi_garzon en 21 Jul, 2004 - 12:44
(Información del usuario  | Enviar un mensaje http://)
Existe una forma para que la impresion de la grafica ocupe toda la hoja???
Lo estoy enviando a Word.....

Re: SimpleChart revisitado


por mani14 en 11 Feb, 2005 - 05:54
(Información del usuario  | Enviar un mensaje http://)
hola, hay forma para hacer que las lineas salgan discontinuas en vez de continuas? lo que quisiera es que una saliese continua y la otra discontinua




Todas las marcas y los logos utilizados en este sitio son propiedad de sus respectivos dueños.
Los artículos, noticias y comentarios son propiedad y responsabilidad de sus respectivos autores.
Copyright © 2000-2010 PortalFox. Todos los derechos reservados.