17 de abril de 2012

Generar un GUID (Globally Unique IDentifier)

Dos funciones que se expusieron el el Foro de la Comunidad VFP en Español. La primera mediante API y la segunda mediante WSH. La función con la API de Windows es 3 veces mas rápida que la que utiliza WSH.

Con API

? GenerateGUID()

FUNCTION GenerateGUID()
  *-- Con la API de Windows
  LOCAL lcRetval, lcStruc_GUID, lcGUID, lnSize
  DECLARE INTEGER CoCreateGuid IN "ole32.dll" STRING @lcGUIDStruc
  DECLARE INTEGER StringFromGUID2 IN "ole32.dll" STRING cGUIDStruc, STRING @cGUID, LONG nSize
  lcStruc_GUID = REPLICATE(" ",16)
  lcGUID = REPLICATE(" ",80)
  lnSize = LEN(lcGUID) / 2
  IF CoCreateGuid(@lcStruc_GUID) <> 0
    RETURN ""
  ENDIF
  IF StringFromGUID2(lcStruc_GUID,@lcGuid,lnSize) = 0
    RETURN ""
  ENDIF
  RETURN STREXTR(STRCONV(lcGUID,6),"{","}") && >= VFP7
  *RETURN SUBSTR(STRCONV(lcGUID,6),2,36) && < VFP7
ENDFUNC

Con WSH

? GenerateGUID()

FUNCTION GenerateGUID
  *-- Con WSH (Windows Script Host)
  LOCAL loObj
  loObj = CREATEOBJECT("Scriptlet.TypeLib")
  RETURN STREXTRACT(loObj.GUID, "{", "}") && >= VFP7
  *RETURN SUBSTR(loObj.GUID,2,36) && < VFP7
ENDFUNC

15 de abril de 2012

Función Traductor Ingles-Español con Google Translator

Función que traduce texto del ingles al español recibe como parámetro el texto en ingles y lo devuelve en español, utilizando para esto el motor de traducción de Google.

Esta funcion utiliza automatizacion de un objeto IE (Internet Explorer) y extrae el codigo HTML y depura el texto traducido.
? TraducirIE("Nothing runs like a fox")

FUNCTION TraducirIE
  LPARAMETERS ATRA
  LOCAL cUrl, Texto, oIE, cResul, oDoc,XPI,XPF,TRA,X
  IF TYPE("oIE")#'O'
    oIE = CREATEOBJECT("internetexplorer.application")
  ENDIF
  oIE.Navigate2("about:blank")
  cUrl=LOWER('http://translate.google.com.mx/?hl=es&tab=TT#en|es|'+ALLTRIM(ATRA))
  oIE.navigate2(cUrl)
  Texto ='Traduciendo.'
  DO WHILE oIE.busy OR oIE.readystate!=4
    WAIT WINDOW Texto TIMEOUT 0.1
    Texto=Texto+'.'
    IF OCCURS('.',Texto)>3
      Texto ='Traduciendo.'
    ENDIF
  ENDDO
  WAIT WINDOW 'Terminado' TIMEOUT 1
  oDoc = oIE.DOCUMENT
  Texto = TYPE('oDoc.body')
  cResul = oDoc.body.innerHTML()
  oDoc = .NULL.
  RELEASE oDoc
  oIE.QUIT
  RELEASE oIE
  XPI = AT('',cResul)+32
  cResul = SUBSTR(cResul,XPI)
  XPF = AT('',cResul)-1
  cResul = SUBSTR(cResul,1,XPF)
  X=OCCURS('<',cResul)
  TRA=''
  DO WHILE X>0
    XPI=0
    XPF=0
    XPI=AT('<',cResul)-1
    XPF=AT('>',cResul)+1
    TRA=TRA+SUBSTR(cResul,1,XPI)
    cResul=SUBSTR(cResul,XPF)
    X=OCCURS('<',cResul)
  ENDDO
  TRA=TRA+cResul
  RETURN TRA
ENDFUNC
Erick J. Mireles Riojas

10 de abril de 2012

Interfaces en VFP

Como todos sabemos, VFP no ofrece una forma nativa de declarar ni aplicar interfaces, mas alla de la interaccion con objetos OLE.

La clase InterfaceHelper (http://www.victorespina.com.ve/wiki/index.php?title=Implementacion_de_interfaces_en_VFP) ofrece una forma sencilla (aunque limitada) de lograr los beneficios del uso de interfaces en VFP.

Su uso es muy sencillo:

1) Se declara una variable publica que almacene una instanca de interfaceHelper:
PUBLIC goInterfaces   && Puede ser cualquier nombre
goInterfaces = CREATE("interfaceHelper")

2) Se declaran las interfaces como clases derivadas de la clase Interface:
DEFINE CLASS IEnumerable AS Interface
  Count = 0
  DIMEN Items[1]
ENDDEFINE

3) Se publica la interfaz en el helper de interfaces:
goInterfaces.Declare("IEnumerable")

4) Se usa el metodo Implements del helper para determinar si un cierto objeto implementa una interfaz publicada:
IF goInterfaces.Implements(oData, "IEnumerable")
  FOR i = 1 TO oData.Count
  ...
  ENDFOR
ENDIF

En el caso de versiones de VFP anterior a la 9, no es posible declarar las interfaces mediante subclases de Interface, pero aun asi puede hacerse manualmente:
goInterfaces.Declare("IEnumerable","count,items")

Saludos

Victor Espina

9 de abril de 2012

FoxRibbon versión 0.10 Beta

FoxRibbon es una biblioteca de clases VCX 100% Visual FoxPro que ofrece una serie de herramientas para mejorar el aspecto visual de nuestras aplicaciones. Su uso y distribución es libre para toda la Comunidad de Visual FoxPro.

FoxRibbon fue desarrollada por Guillermo Carrero (Barcelona, España)

Pueden descargar y probar esta nueva clase desde:
http://sites.google.com/site/foxribbonclass