Archivo por meses: Diciembre 2007

FormWizard una pequeña utilidad para Xailer.

Una de las mejores cosas que tenemos a nuestra disposición en Xailer, es poder diseñar nuestros Form con acceso a una base de datos usando DataControls de una forma muy sencilla.

Pero comentando el otro día, en la taberna entre dos vinos como hacemos los de Bilbao, el amigo David Marina me comentaba que le parecía curioso que no hubiera, como en otros IDEs de programación, algunos Wizard para hacer cosas elementales como un form con todos los campos de una tabla y tenía razón, así que le animé a que lo hiciera como ejercicio práctico y así comenzó esta pequeña historia que entre ambos hemos montado.

FormWizard es una utilidad que permite tomar un DBF (lo siento de momento no sabemos de SQL) y con todos sus campos o los indicados y en el orden deseado, mas otras florituras, genera un formulario con su PRG y XFM que guardaremos en la carpeta Source del proyecto en el que estamos y listo. Asigna los DataControl al control más lógico, los autoajusta al tamaño necesario, etc.

A continuación simplemente añadimos el recién creado PRG al proyecto (Proyecto – Añadir fichero al proyecto o el Icono correspondiente) y listo. Pulsando F12 podremos ver el formulario y modificarlo al gusto si nos apetece, ya que es lo mismo que si lo hubiéramos hecho a mano desde cero con el IDE.

Si además queremos usarlo con mas facilidad lo mejor es meter el ejecutable en la carpeta que queramos (yo lo he puesto en C:XailerBin) añadirlo al menú herramientas mediante la opción “Configurar herramientas” con los siguientes datos:

Herramienta FormWizard

Aunque no es una ayuda bárbara, esperamos que os guste y le saquéis provecho a nuestro regalo navideño. Proyecto FormWizard

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