Archivo del Autor: José Lalín

Actualización de librerías

Tras unas semanas usando Xailer 2.0 en producción y viendo que hay un gran porcentaje de usuarios que se han actualizado y aprovechando que tenemos otros muchos nuevos de esta versión (bienvenidos a todos), he decidido publicar las actualizaciones de algunas librerías que sólo estaban disponibles para la versión 1.9 y anteriores.

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

    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.