28 de marzo de 2008

ActiveFiX

Artículo original: ActiveFiX
http://www.foxpert.com/knowlbits_200801_1.htm
Autor: Christof Wollenhaupt
Traducido por: Ana María Bisbé York 


Los controles ActiveX no trabajan bien con formas modales de VFP. Bien, esto no es exactamente una gran sorpresa para nadie que lo haya intentado. Si contacta con el creador de un control ActiveX terminará recibiendo una de estas dos respuestas:

"Nuestros controles funcionan en todos los entornos soportados. ¿Qué es Visual FoxPro?" o "Váyase por ahí. Nosotros no escribimos código deficiente" Incluso los controles que funcionan bien con VFP, como los controles del dbi muestran este comportamiento.

¿No podemos hacer que los proveedores solucionen esto? Admitámoslo, no es su error, es un problema de Visual FoxPro. En realidad no es un error, es un problema de diseño. Uno de los problemas que tiene que resolver el FoxTeam con las ventanas modales que simplemente no existe en Windows API. OK, lo vemos; pero esto no significa que es real.

Windows crea una ventana modal inhabilitando la ventana padre. Esto trabaja bien en un único nivel de ventanas modales como es el caso de una ventana de diálogo. Sin embargo, con ventanas (o formularios) que pueden ser modales, puede ser con formas múltiples en un conjunto de formulario que mantenga accesible mientras otras ventanas no, las cosas se tornan más confusas.
Entonces, lo que ocurre con los controles ActiveX es que realmente se agregan dos ventanas al formulario. La más afuera es la ventana del OLE que guarda la ventana que es un control de Visual FoxPro. Dentro de esta ventana anfitriona, el control ActiveX crea su(s) propia(s) ventana(s) que se mantienen bajo el control del control ActiveX. La ventana interior (o ventanas) es lo que conocemos como "control ActiveX".

Cuando usted muestra una ventana modal, Visual FoxPro inhabilita la ventana anfitriona de todos los otros formularios. El control ActiveX de dentro permanece activo; pero no recibe ninguna entrada de usuario, porque la ventana padre está deshabilitada. Como resultado, el control no responde al ratón ni a eventos de teclado, ni recibe el foco. Sin embargo, continúa funcionando. Por ejemplo, se puede actualizar a sí mismo, responder a otros eventos y cosas así.

Una vez que el usuario cierra la ventana modal, Visual FoxPro activa todas las ventanas anfitrionas que fueron desactivadas. Mi apuesta (en realidad lo que yo creo) es que Visual FoxPro guarda el estado anterior cuando inhabilita la ventana OLE y lo restablece cuando la habilita. El control recibe el mensaje y responde las entradas de usuario. Bueno, esto es lo que ocurre justo en el primer nivel de los formularios modales.

Sin embargo, parece que hay solamente una variable para mantener el estado anterior habilitado para cada ventana OLE anfitriona. Entonces cuando se lanza el segundo formulario modal, Visual FoxPro guarda el estado de la ventana inhabilitada y la inhabilita nuevamente. Cuando se cierra el formulario, este estado inhabilitado comienza a ser restaurado. Al final, la ventana anfitriona permanece inhabilitada, incluso cuando todas las formas modales fueron cerradas.

La forma que existe para solucionar esto - desafortunadamente - no es genérica. Cuando se dispara el evento Activate de un formulario usted sabe que el formulario va a responder a las entradas del usuario. En este punto ninguno de los controles ActiveX del formulario actual deberían estar inhabilitados. Puede asegurarse de esto ejecutando el siguiente código para cada control ActiveX que tenga en su formulario.
Declare Long GetParent in Win32API Long
Declare Long EnableWindow in Win32API Long, Long
EnableWindow(GetParent(oleControl.Hwnd), 1)
Donde oleControl es una referencia regular al control ActiveX del formulario ( por ejemplo Thisform.oleControl1). La propiedad HWND no es una propiedad estándar que ofrezca VFP. Es problema del control ActiveX para proveer del controlador de ventana y toma el nombre de la propiedad o el método. Necesita referirse a la documentación del control ActiveX.


Nota del editor: Carlos Alloatti nos indica una corrección realizada para este artículo en: ActiveX generic fix.

¡ Gracias Carlos !

21 de marzo de 2008

Conflicto en rango de fechas

Artículo original: Date range conflicts
http://www.foxpert.com/knowlbits_200711_1.htm
Autor: Christof Wollenhaupt
Traducido por: Ana María Bisbé York

Un problema común en las aplicaciones de bases de datos es comprobar los conflictos en rangos de fecha o fecha-hora. Por ejemplo, su aplicación puede manejar citas que tienen fecha de inicio y duración. Aquí podríamos hablar de minutos o días, el problema fundamental sigue siendo el mismo. Cuando actualice una cita nueva tiene que asegurarse de que no entra en conflicto con una existente.

El problema con los rangos de fecha está en que hay cuatro variaciones que tiene que cubrir. (a) Un rango puede no tener conflicto con otro rango, (b) podría fallar completamente dentro de otro rango, (c) empieza antes; pero termina dentro de otro rango, (d) empieza dentro; pero termina después que otro rango. No puedo nunca recordar la consulta para comprobar cualquier elemento conflictivo. Entonces, (basado en http://ryanfarley.com/blog/archive/2004/08/19/966.aspx):

Si alguna de las fechas puede estar vacía:

(NOT((table.date_end < m.date_start) ;
  or (table.date_start > m.date_end)))

Si la fecha final en la tabla puede estar vacía lo que significa un día en la cita, el código podría ser:

(NOT ((table.date_end < m.date_start) ;
  OR (table.date_start > m.date_end))) ;
  OR (table.date_end=={} AND ;
  BETWEEN(table.date_start,m.date_start,m.date_end))

Esta expresión puede ser utilizada en una sentencia SET FILTER TO o en una cláusula WHERE. Si necesita filtrar en un criterio adicional (recursos, etc.) puede agregar esos filtros con AND. La expresión se puede optimizar con Rushmore cuando tiene un índice por date_end y date_start en la tabla.

17 de marzo de 2008

Separar las letras de una palabra

En ciertas ocasiones se nos presenta la necesidad de crear funciones para lograr objetivos simples , como el de separar el espacio entre las letras de una palabra ...

Ejemplo de uso:

? EspacioLetras("800234657-9",2)

FUNCTION EspacioLetras(_QueLetras,_NumeroEspacios)
  IF EMPTY(_QueLetras)
    RETURN ""
  ENDIF
  LOCAL ln, lc
  lc = ""
  FOR ln = 1 TO LEN(ALLTRIM(_QueLetras))
    lc = lc + SUBSTR(_QueLetras, ln, 1) + SPACE(_NumeroEspacios)
  ENDFOR
  RETURN lc
ENDFUNC
mgx

14 de marzo de 2008

Convierta sus botones en BMPs con transparencia con GdiPlus

Artículo original: Convert your buttons to BMPs keeping transparency with GdiPlusX
http://weblogs.foxite.com/vfpimaging/archive/2007/11/14/5404.aspx
Autor: Cesar Ch. (http://weblogs.foxite.com/vfpimaging)
Traducido por: Ana María Bisbé York (amby@telefonica.net)
Para: PortalFox (http://www.portalfox.com)


La siguiente función convierte cualquier imagen de botón en BMP para ser utilizado en formularios VFP.

Existen muchos iconos gratis y disponibles en la red; pero la gran mayoría tienen formatos ICO, GIF o PNG, que no son muy fiables para ser utilizadas en VFP. Para nosotros, el mejor formato de imagen, por muchas razones, es el formato BMP.

Son necesarias algunas transformaciones para hacer que este BMP muestre exactamente cómo que se desea, especialmente cuando convierte algunas imágenes originales en formato PNG, GIF o ICO.
VFP muestra el blanco puro - RGB(255,255,255) como transparente en nuestros botones y objetos image. El código que se muestra a continuación, convierte primero el blanco original a RGB(254,254,254) que visualmente es lo mismo; pero no se vuelve transparente y elimina la necesidad de crear una máscara de imagen (MSK) y además, convierte el color de fondo del bitmap original en blanco puro, lo que provocará que se muestre transparente en formularios VFP.

Para más detalles compruebe, por favor, estos escritos:

BMPs with Transparent Backgrounds
How to put one image over another in a form

IMPORTANTE

Necesita VFP9 y GdiPlusX para ejecutarlo

Asegúrese de que tiene la última versión, debido a que este ejemplo puede estar utilizando algunas funciones que hemos agregados o reparado recientemente.

http://www.codeplex.com/VFPX/Wiki/View.aspx?title=GDIPlusX&referringTitle=Home

Guarde el programa siguiente como BUTTON2BMP.PRG  y llámelo de esta forma:
Button2Bmp(GETPICT(), "c:\NewIcon.bmp")
Cuando compile este programa en su ejecutable, no olvide, por favor, quitar el comando LOCFILE(), en su lugar, emplee: Do System.prg
LPARAMETERS tcSourceFile, tcDestFile

DO LOCFILE("System.prg")
 
LOCAL loBmp AS xfcBitmap
LOCAL loGfx AS xfcGraphics
LOCAL loBorderClr AS xfcColor
LOCAL loRect AS xfcRectangle
LOCAL loAttr AS xfcImageAttributes
LOCAL loColorMap AS xfcColorMap
 
WITH _SCREEN.SYSTEM.Drawing
   loColorMap = .Imaging.ColorMap.New()
   loAttr = .Imaging.ImageAttributes.New()
   loBmp = .Bitmap.FromFile(tcSourceFile)
   loGfx = .Graphics.FromImage(loBmp)
   loRect = loBmp.GetBounds()

   * Toma el color del pixel que está más arriba a la izquierda, 
   * asumiendo que este color es el color de fondo BackGround para volverlo transparente
   * Para nuestro BMP, será BLANCO PURO  - RGB(255,255,255)
   * que se convierte en transparente en objetos VFP 
   loBorderClr = loBmp.GetPixel(0,0)
 
   * Convierte los blancos originales RGB(255,255,255) a OFF WHITE - RGB(254,254,254)
   * de esta forma, los blancos se mantendrán, sin necesidad de máscara
   loColorMap.OldColor = .Color.White
   loColorMap.NewColor = .Color.FromARGB(255,254,254,254)
   
   loAttr.SetRemapTable(loColorMap)
   loGfx.DrawImage(loBmp, loRect, loRect, .GraphicsUnit.Pixel, loAttr)
 
   * El siguiente paso, convertir los bordes en blanco puro, RGB(255,255,255) 
   * que lo convertirá en transparente en los botones.
   loColorMap.OldColor = loBorderClr
   loColorMap.NewColor = .Color.White
   loAttr.SetRemapTable(loColorMap)
   loGfx.DrawImage(loBmp, m.loRect, m.loRect, .GraphicsUnit.Pixel, loAttr)
 
   loBmp.Save(tcDestFile, .Imaging.ImageFormat.Bmp)
ENDWITH

3 de marzo de 2008

Nuevas liberaciones de código en VFPx

En estos últimos días se liberaron y publicaron nuevas actualizaciones de código en el sitio de VFPx: Foxpro Foundation Classes (FFC) y Visual FoxPro XSource.


Aquí están dos nuevos proyectos lanzados en VFPx con código actualizado

Foxpro Foundation Classes (FFC)

Estas librerias de clases visuales de Visual FoxPro se encuentran en la carpeta \FFC del directorio de instalación de Visial FoxPro 9.0. Estas librerias contienen una gran variedad de clases que se pueden utilizar para realzar nuestras aplicaciones. Tenga en cuenta la información del acuerdo de licencia de usuario final (EULA) contenida en la descarga.

Para descargar la última liberación de Foxpro Foundation Classes (FFC) haga clic aquí.

Visual FoxPro XSource

Este proyecto contiene el archivo XSource.zip que se encuentra en la carpeta \Tools\XSource del directorio de instalación de Visial FoxPro 9.0. XSource contiene el código fuente de varios componentes de Visual FoxPro. Tenga en cuenta la información del acuerdo de licencia de usuario final (EULA) que se encuentra en el archivo XSource_EULA.txt contenido en la descarga.

Puede descargar todos los proyectos XSource de:
O cada componente individualmente: