14 de junio de 2004

Obtener el tamaño de un archivo o serie de archivos

Una función para calcular el tamaño de un archivo...
****************************************************************
* Function FileSize
* Purpose: Get the FileSize (in bytes) of a single or multiple file
* Use: ?FileSize("miArchivo.txt") or ?FileSize("*.txt")
****************************************************************

FUNCTION FileSize
LPARAMETERS tcFile

LOCAL lnFileSize
lnFileSize = 0

FOR lnCounter=1 TO ADIR(laFile,tcFile)
   lnFileSize = lnFileSize+ laFile[2]  
ENDFOR

RETURN lnFileSize
ENDFUNC

Espartaco Palma Martínez

9 de junio de 2004

Autocompletar en un ComboBox

Método para añadir la característica Autocompletar en un control ComboBox.

* Escribe este codigo en el evento InteractiveChange
LOCAL lnUltimaTecla, lcMostrarValor,lcUltimoValorMostrado, ;
  lnUltimaSeleccion, lnSeleccionados
lnUltimaTecla = LASTKEY()
lcUltimoValorMostrado = ""
lnUltimaSeleccion = 0
lnSeleccionados = 0
IF (lnUltimaTecla >= 32 AND lnUltimaTecla <= 126)
  IF THIS.SELSTART >= 1
    lcMostrarValor = SUBSTR(THIS.DISPLAYVALUE,1,THIS.SELSTART-1)+(CHR(lnUltimaTecla))
  ELSE
    lcMostrarValor = (CHR(lnUltimaTecla))+ALLT(THIS.DISPLAYVALUE)
  ENDIF
  IF EMPTY(lcMostrarValor)
    lcMostrarValor = ALLT(CHR(lnUltimaTecla))
  ENDIF
  FOR i = 1 TO THIS.LISTCOUNT
    IF UPPER(lcMostrarValor) = UPPER(SUBSTR(THIS.LIST(i),1,LEN(lcMostrarValor)))
      THIS.DISPLAYVALUE = THIS.LIST(i)
      IF LEN(ALLT(THIS.DISPLAYVALUE)) > LEN(lcMostrarValor)
        THIS.SELSTART = LEN(lcMostrarValor)
        THIS.SELLENGTH = LEN(ALLT(THIS.DISPLAYVALUE))-LEN(lcMostrarValor)
      ENDIF
      lcUltimoValorMostrado = THIS.DISPLAYVALUE
      lnUltimaSeleccion = THIS.SELSTART
      lnSeleccionados = THIS.SELLENGTH
      RETURN
    ENDIF
  ENDFOR
  THIS.DISPLAYVALUE = lcUltimoValorMostrado
  THIS.SELSTART = lnUltimaSeleccion
  THIS.SELLENGTH = lnSeleccionados
ENDIF
Oscar Arley Yepes Aristizabal

Nota del editor: A continuación un ejemplo completo para ejecutar con el código anterior.
PUBLIC oMiFormulario
oMiFormulario=NEWOBJECT("MiFormulario")
oMiFormulario.SHOW
RETURN
*--------------------------------
DEFINE CLASS MiFormulario AS FORM
  DOCREATE = .T.
  CAPTION = "Autocompletar en ComboBox"
  NAME = "frmAutocompletar"
  ADD OBJECT combo1 AS COMBOBOX WITH ;
    FONTBOLD = .T., ;
    FONTSIZE = 12, ;
    ROWSOURCETYPE = 1, ;
    ROWSOURCE = "ALICIA,AMIRA,ANA,ELENA,ESTELA," + ;
    "ESTHER,MARCELA,MARIA,MARTA," + ;
    "MARTINA,MERCEDES,MIRTA,MONICA", ;
    HEIGHT = 24, ;
    LEFT = 24, ;
    TOP = 24, ;
    WIDTH = 240, ;
    NAME = "Combo1"
  PROCEDURE combo1.INTERACTIVECHANGE
    LOCAL lnUltimaTecla, lcMostrarValor,lcUltimoValorMostrado, ;
      lnUltimaSeleccion, lnSeleccionados
    lnUltimaTecla = LASTKEY()
    lcUltimoValorMostrado = ""
    lnUltimaSeleccion = 0
    lnSeleccionados = 0
    IF (lnUltimaTecla >= 32 AND lnUltimaTecla <= 126)
      IF THIS.SELSTART >= 1
        lcMostrarValor = SUBSTR(THIS.DISPLAYVALUE,1,THIS.SELSTART-1)+(CHR(lnUltimaTecla))
      ELSE
        lcMostrarValor = (CHR(lnUltimaTecla))+ALLT(THIS.DISPLAYVALUE)
      ENDIF
      IF EMPTY(lcMostrarValor)
        lcMostrarValor = ALLT(CHR(lnUltimaTecla))
      ENDIF
      FOR i = 1 TO THIS.LISTCOUNT
        IF UPPER(lcMostrarValor) = UPPER(SUBSTR(THIS.LIST(i),1,LEN(lcMostrarValor)))
          THIS.DISPLAYVALUE = THIS.LIST(i)
          IF LEN(ALLT(THIS.DISPLAYVALUE)) > LEN(lcMostrarValor)
            THIS.SELSTART = LEN(lcMostrarValor)
            THIS.SELLENGTH = LEN(ALLT(THIS.DISPLAYVALUE))-LEN(lcMostrarValor)
          ENDIF
          lcUltimoValorMostrado = THIS.DISPLAYVALUE
          lnUltimaSeleccion = THIS.SELSTART
          lnSeleccionados = THIS.SELLENGTH
          RETURN
        ENDIF
      ENDFOR
      THIS.DISPLAYVALUE = lcUltimoValorMostrado
      THIS.SELSTART = lnUltimaSeleccion
      THIS.SELLENGTH = lnSeleccionados
    ENDIF
  ENDPROC
ENDDEFINE
*--------------------------------

27 de mayo de 2004

Cambiar la imagen del escritorio de Windows con una API

Aquí una cómoda manera de cambiar el escritorio de Windows con una API, podrías poner el logo de tu aplicación después de haberla instalado.

SystemParametersInfo: Esta función tiene muchas utilidades.

En este ejemplo cambia el papel tapiz de Windows, este ejemplo pide que busque un archivo con extensión BMP para colocarlo de papel tapiz.

Declare integer SystemParametersInfo in "user32";
  Long uAction,;
  Long uParam,; 
  string lpvParam,;
  Long fuWinIni
lfFile = getpict()
IF !empty(lfFile)
  = SystemParametersInfo(20, 0,lfFile, 1)
ENDIF
Jimmy Pozo Jiménez

19 de mayo de 2004

Generación de Claves

Esta clase nos permite generar una cadena única de caracteres a partir de otra cadena. Se hizo tomando como base una rutina similar enviada por Luis María, a quien le agradezco inmensamente.

Es muy útil a la hora de generar claves de acceso y/o cadenas de licencias, etc. Los cambios efectuados están básicamente en la semilla que se le pasa a la función RAND, evitando así que en cadenas similares de caracteres se generen claves similares. En esta clase, el RAND se inicializa con el valor de la suma de chequeo (función SYS(2007)) divido por la longitud de la cadena deseada.

La clase es la siguiente.
DEFINE CLASS GenKey AS CUSTOM
  HIDDEN Caracteres
  HIDDEN LenCarac
  Caracteres = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
  LenCarac = LEN( THIS.Caracteres )
  PROCEDURE GenKey( lsString AS STRING, lnLong AS INT ) AS STRING
    LOCAL lnLenString
    LOCAL lnInt
    LOCAL lsReturn
    lsReturn = ""
    IF TYPE( "lnLong" ) != "N"
      lnLong = 8
    ENDIF
    IF TYPE( "lsString" ) != "C"
      RETURN lsReturn
    ELSE
      lnLong = IIF( lnLong >= 10, 10, lnLong )
      RAND( INT( VAL( SYS( 2007, lsString ) ) / lnLong ) )
      FOR lnCont = 1 TO lnLong
        lsReturn = lsReturn + SUBSTR( THIS.Caracteres, RAND() * THIS.LenCarac + 1, 1 )
      ENDFOR
    ENDIF
    RETURN lsReturn
  ENDPROC
ENDDEFINE
Actualmente está diseñada para generar llaves de 8 caracteres por defecto, y hasta 10 máximo. Se puede extender a cualquier límite. La forma de utilizarla es..
oKey = CREATEOBJECT("GenKey")
? oKey.GenKey("MiTexto", 8)
RELEASE oKey

Mario Cerón Charry 

Nota del editor: Para que los valores retornados por la función RAND() sean lo mas aleatorio posible tener en cuenta la ayuda de la función en la documentación de Visual FoxPro:

Sintaxis:

RAND([nSeedValue])

Parámetros

nSeedValue: Especifica el valor Seed que determina la secuencia de valores que devuelve RAND().
RAND() devuelve la misma secuencia de números aleatorios si utiliza el mismo valor Seed para nSeedValue la primera vez que ejecuta la función RAND(), seguida de llamadas posteriores a la función RAND() sin nSeedValue.

Si nSeedValue es negativo la primera vez que ejecuta RAND(), se usará un valor Seed a partir del reloj del sistema. Para obtener la serie más aleatoria de números, utilice inicialmente RAND() con un argumento negativo y después, ejecute RAND() sin ningún argumento.

Si omite nSeedValue, RAND() utilizará de forma predeterminada el valor Seed 100.001.

10 de mayo de 2004

Conectarse a SQL Server

Una cómoda manera de conectarse a SQL Server mediante un DSN

cCadConnDSN = "DRIVER=SQL Server;" ;
  + "SERVER=tu_server;" ;
  + "UID=nombre_usuario;" ;
  + "PWD=clave_pw;" ;
  + "DATABASE=PUBS;" ;   && Nombre de la base de datos
  + "WSID=nombre_usuario;" ;
  + "APP=__"
nHanConn = SQLSTRINGCONNECT(m.cCadConnDSN)
IF nHanConn > 0
  =MESSAGEBOX("Conectado a la base de datos de SQl Server")
ELSE
  =MESSAGEBOX("Error al conectarse a la base de datos de SQl Server")
ENDIF
Jimmy Pozo Jiménez