Archivo de la categoría: Como hacer …

Graficación en un formulario de Xailer con controles de terceros.

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.

Ejemplo de RMChart

Sigue leyendo

Usando FTP

Hace algún tiempo, Carlos Ortiz preguntaba si había un modo sencillo de descargar y/o subir archivos a un FTP.

Coincidiendo con Carlos en que el uso de los métodos :OpenFile(), :ReadFile() y :WriteFile() del componente TFtp de Xailer no es el mejor camino para un usuario nuevo con la herramienta, me dispuse a escribir un componente que lo haga de un modo un poco más amigable, donde sólamente sea necesario especificar los datos de la conexión, el nombre del archivo y poco más.

Las propiedades de este componente son:

    PROPERTY cRemoteFile: el nombre del archivo en el servidor FTP.

    PROPERTY cLocalFile: el nombre del archivo local.

    PROPERTY cUser: el nombre de usuario para acceder al FTP.

    PROPERTY cPassword: la contraseña.

    PROPERTY cServer: el servidor FTP. Puede indicarse tanto con su nombre (ftp.myserver.com) como con una dirección IP (127.0.0.0).

    PROPERTY nTransferType: especifica si vamos a hacer una transferencia binaria o ASCII. Los valores que puede tomar esta propiedad son ftpBINARY o ftpASCII.

    PROPERTY nBuffer: el tamaño del buffer de lectura y/o escritura que se va a utilizar durante la subida o bajada del archivo. Su valor por defecto es de 16 Kb.

Los eventos:

    EVENT OnError( oSender, nError, cError )
    Este evento nos notificará cuando alguna operación falle del código del error y su descripción.

    En caso de que el error sea un error remoto, el valor de nError será mayor o igual que 12.000 y cError nos informará en casi todos los casos de la descripción, pero si el error se debe a un fallo local nError tendrá el último valor devuelto por FError() y cError estará vacío.

    EVENT OnStart( oSender, nFileSize )
    Se lanza cuando se va a empezar a subir o bajar un archivo y nos informa de su tamaño total en bytes. Es útil si se quiere actualizar una barra de progreso o informar al usuario del tamaño del archivo.

    EVENT OnComplete( oSender )
    Se lanza cuando la subida o descarga del archivo termina.

    EVENT OnProgress( oSender, nBytes )
    Cada vez que se envía o recibe un bloque de datos se lanza este evento y se informa en nBytes de la cantidad de datos leídos. Al igual que en OnStart(), sirve para actualizar una barra de progreso y/o informar al usuario de cuántos bytes se han leído/enviado.

Los métodos:

    METHOD Upload()
    METHOD Download()
    Sirven para subir y descargar un archivo respectivamente.

Un pequeño ejemplo de cómo descargar un archivo.

  • Creamos un formulario con dos TLabel y un TButton.
  • Añadimos una DATA a la declaración de TForm.
    1. DATA nRead  INIT 0
  • Y ponemos el siguiente código en el evento OnClick del botón:
  • 
       oSender:lEnabled := .F.
    
       WITH OBJECT TFTPFile():Create( Self )
          :cRemoteFile := "tests/test.zip"
          :cLocalFile := "c:test.zip"
          :cServer := "ftp.myserver.com"
          :cUser   := "User"
          :cPassword := "Password"
          :OnStart := {|oSender, nSize| ::oLabel2:cText := ToString( nSize ) + " bytes" }
          :OnProgress := {|oSender, nBytes| ::nRead += nBytes, ::oLabel1:cText := ToString( ::nRead ) }
          :OnComplete := {|oSender| ::oLabel2:cText := "¡ Descargado !" }
          :Download()
          //:Upload()
          :Destroy()
       END
    
       oSender:lEnabled := .T.
    

    Para proba el test, sólo hay que configurar los datos de la conexión con unos reales y tras compilar/ejecutar ya podemos empezar a subir o descargar archivos desde nuestro FTP favorito.

    En el ZIP está el fuente del componente y la librería lista para usar.

    Saludos,
    José Lalín

    Situémonos, usando GoogleMaps en nuestras aplicaciones.

    En la línea de los anteriores ejemplos usando ActiveX, ahora presento un ejemplo más elaborado pero muy sencillo de utilizar al mismo tiempo, como integrar los mapas de localización de GoogleMaps en nuestras aplicaciones.

    Para ello he construído la clase TGoogleMaps con la cuál he simplificado la integración del sistema en cualquier aplicación, basta con enlazar GoogleMaps.PRG con su XFM, además de WebBrowser.Prg y su CH (como se ha visto en capítulos anteriores) en la lista de ficheros del proyecto y con solo 5 líneas podemos presentar mapas de lo más vistoso en un formulario de Xailer.

    De esta manera dotamos a nuestros programas de la posibilidad de poder localizar la dirección de un cliente, desde un botón en el formulario de clientes o la de crear un mapa con la ruta desde nuestras instalaciones hasta la dirección de entrega de un producto, calcular la distancia, etc.

    Sigue leyendo

    Siguiendo con OCX, nuevos ejemplos usando WebBrowser.

    Como hemos visto en el ejemplo anterior podemos utilizar un control OCX que resulta ser un navegador Web incluido en un control de nuestro form y con esto podemos navegar por Internet.

    Pero este control nos permite hacer bastantes más cosas, como todos sabemos desde una ventana de Internet también podemos abrir un HTML que se encuentra en el disco duro local del PC, pero no sólo esto sino que podemos usarlo para abrir otros tipos de archivos como puede ser un archivo Adobe Acrobat Reader, es decir un PDF ya que existe un ActiveX que se instala en el PC al instalar este programa y ni tan siquiera tenemos que preocuparnos de usar este ActiveX sino que el explorador de Internet se encarga de ello.

    Veamos con detalle los ejemplos que incluye el de Xailer que aquí dejo a vuestra disposición. Proyecto

    Sigue leyendo

    Usando controles ActiveX u OCX

    Me ha sorprendido gratamente que después de mi primer artículo en Xailer.info me hayan enviado varios mensajes privados agradeciendo el código fuente y el manual, sobre todo por parte de usuarios que vienen directamente de Clipper y necesitan leer código antes de empezar a tomar conciencia de trabajar con Programación Orientada a Objetos.

    Es por eso que en esa línea más práctica que teórica voy a escribir una breve serie de pequeños artículos para ilustrar con ejemplos, código y manual o explicación detallada, algunos de los agradables descubrimientos que he ido haciendo en estos últimos meses de uso de Xailer.

    Sigue leyendo

    Messages Un conjunto de utilidades para Xailer

    Agradezco a Xailer.info la posibilidad de colaborar aportando mi primer granito de arena: Messages

    Este fue mi primer ejercicio práctico en Xailer a principios del 2006 y en realidad consta de un único PRG que podemos enlazar con nuestras aplicaciones con un conjunto de pequeñas utilidades/trucos pero que nos resuelven algunas cosillas del día a día en nuestros programas.

    Consta de un completo manual en castellano y ejemplo práctico de cada una de las funciones, asi que probarlo y ver lo que hace no os costará nada.

    Que lo disfrutéis.

    Controles nativos de Vista en Xailer

    Vista introduce un nuevo tipo de control llamado CommandLink que se comporta como un botón estándar, pero pretende hacer más agradable la experiencia del usuario.

    Veamos una imagen:

    CommandLink

    Se puede apreciar cómo el control muestra una imagen, un texto principal y una breve descripción de su cometido.

    Para entender cómo funciona, nada mejor que un poco de código que crea un TCommandLink como el que se ve en la imagen anterior:

    WITH OBJECT TCommandLink():New( oForm )
       :cText := "CommandLink"
       :cNote := "This is the new TCommandLink control"
       :lShield := .T.
       :Create()
    END
    

    En el archivo vistacommandlink.zip está todo el código fuente del control, tan sólo hay que compilarlo y añadir el OBJ al proyecto en el que se quiera utilizar.

    Un saludo.

    Migrar desde otros entornos

    Varias personas me han comentado que se encuentran muy a gusto trabajando con Xailer pero lo utilizan, o van a utilizar, para desarrollos nuevos porque no quieren tener que reescribir las aplicaciones que ya tienen terminadas.

    Está claro que ninguna herramienta nos va a permitir migrar automáticamente de un entorno de desarrollo a otro: podemos aprovechar el código que maneje la capa de datos pero siempre habrá que hacer cambios en el interfaz para adaptarse a las peculiaridades de nuestra nueva herramienta.

    Partiendo de esta base, en Xailer hemos pensado que podríamos hacer algo al respecto y para ello dedicimos incorporar una opción para importar los diálogos que ya teníamos diseñados con el Workshop.

    Sigue leyendo