30 de noviembre de 2006

Cómo trabaja FoxPro internamente

Artículo original: How FoxPro works internally
http://www.foxpert.com/docs/howfoxproworks.en.htm
Autor: Christof Wollenhaupt
Traducido por: Fernando D. Bozzo

FoxPro desde adentro

Érase una vez, que el xBase no era un lenguaje de programación, era una herramienta para recuperar y para manipular automáticamente datos. Los usuarios de las herramientas xBase no eran principalmente desarrolladores; eran expertos en una variedad enorme de diversas áreas que utilizaban FoxBase, dBase, y herramientas similares para manejar sus datos. El xBase fue mejorado constantemente y finalmente desarrollado como un verdadero lenguaje de programación. FoxPro se convirtió en un entorno profesional de desarrollo que alcanzó sus alturas con FoxPro 2.5/2.6. En 1995 el paradigma de la herramienta cambió otra vez. Un lenguaje de programación procedural se convirtió en una herramienta orientada a objetos que continúa desarrollándose como un diseño basado en componentes.

Visual FoxPro no es sólo un entorno orientado a objetos como Delphi o Visual Basic.NET. Visual FoxPro todavía contiene sus raíces. Sólo intente hacer funcionar un programa de Turbo PASCAL 3.0 en Delphi 7.0. ¿Qué tal sus programas de GW-BASIC en Visual Basic.NET? ¿Pero Foxbase? Hasta hoy puede hacer funcionar código sin cambios en Visual FoxPro que ha escrito en los años ochenta. La salida por pantalla no luce tan agradable, pero todavía puede ejecutar código en VFP 8 casi 20 años después de que lo ha escrito.

Visual FoxPro es casi totalmente compatible hacia atrás. Pensando sobre esto, significa que mucho del código en FoxPro y FoxBase son todavía parte de Visual FoxPro. Esto significa que la orientación a objetos se sienta encima de FoxPro, y no viceversa. Muchos comportamientos extraños de Visual FoxPro llegan a ser solamente explicables si piensas cómo habrías hecho algo en FoxBase, sólo para darse cuenta de que Visual FoxPro no lo hace distinto.

Una advertencia por adelantado: Los siguientes artículos intentan describir cómo trabaja internamente Visual FoxPro. Los interiores reales de FoxPro son propiedad intelectual de Microsoft y no se divulgan públicamente. Cada uno de los que realmente saben como trabaja FoxPro internamente esta impedido para hablar de esto firmando un Acuerdo de No-Divulgación (NDA). He recogido la siguiente información de una variedad de fuentes públicas. Cierta información está en la biblioteca MSDN que Microsoft publica trimestralmente (algunos items existen solamente en versiones más viejas de la biblioteca MSDN). Otra información viene del código de ejemplo que Microsoft envía. La mayoría de las piezas, sin embargo, vienen de pruebas y de observaciones, no sólo de mí, sino de muchos, muchos desarrolladores en varios foros. Especialmente las diferencias en el comportamiento de varias versiones permiten hacer conclusiones de la estructura interna de VFP. Algunas de las estructuras siguientes se han extendido en la versión más reciente de FoxPro.

El índice de la tabla de nombres (NTI)

En Visual FoxPro podemos nombrar varios items. A esos items, Visual FoxPro les asigna algo llamado un nombre. Estos items son variables (no propiedades), nombres de matrices, procedimientos, funciones, alias de tablas, nombres de campo y objetos (no clases). Cada uno de estos elementos tiene una etiqueta y un alcance. La visibilidad (alcance) de una variable, por ejemplo, depende de su tipo, mientras que el alcance de un alias es la sesión de datos. Un nombre de campo debe ser único en una tabla y los procedimientos son limitados en alcance a un archivo de programa.

Siempre que se crea una variable, se abre una tabla, y así sucesivamente, Visual FoxPro crea una nueva entrada en una lista interna, la Tabla de Nombres. La posición dentro de esta lista es el Índice de la Tabla de Nombres - o NTI para abreviar. En esta lista, a cada nombre se el asigna un número único entre 1 y 65.000, porque se mantiene como valor de 16-bits. Hay sólo una lista global. Esta es la razón por la cuál se pueden crear hasta 65.000 variables solamente. Puesto que los alias y los nombres de objetos (hasta Visual FoxPro 6.0) también se incluyen en esta lista, el número real de variables es reducido por el número de objetos instanciados y áreas de trabajo asignadas.

El manejo de esta lista se ha optimizado en las distintas versiones de FoxPro. Cuando se libera un nombre cerrando una tabla o porque no se necesita más una variable, Visual FoxPro no quita la entrada inmediatamente. Solamente marca la entrada como inválida, como se hace con los registros eliminados.

Los items finalmente son quitados por un proceso llamado Garbage Collection (recolección de basura). Este término se refiere al proceso de quitar entradas inválidas de las listas, liberar entradas desactualizadas de la caché, compactar la memoria moviendo bloques de memoria alrededor, comprobando el acceso a los ficheros temporales, y así sucesivamente. Visual FoxPro ejecuta la recolección de basura en su bucle ocioso (idle loop). Se entra en este bucle siempre que Visual FoxPro está en una condición de espera causada por READ, READ EVENTS, INKEY() o WAIT WINDOW. Esto sigue siendo cierto si se utiliza el comando con las opciones de no esperar (NOWAIT). Se puede utilizar este truco para forzar a Visual FoxPro a limpiar la memoria usando un WAIT WINDOW "" NOWAIT.

No fue hasta Visual FoxPro 7.0 que SYS(1104) se hizo en la documentación aún cuando la función está disponible desde FoxPro 2.6, por lo menos. SYS(1104) dispara manualmente una recolección de basura. No es lo mismo que el bucle ocioso, aunque, como en el bucle ocioso Visual FoxPro hace más que ejecutar la recolección de basura, como adicionalmente procesar los mensajes de Windows. Durante la ejecución del programa, Visual FoxPro no está en un bucle ocioso y por lo tanto no realiza una recolección de basura. Hasta Visual FoxPro 5.0 esto tenía el efecto de que más y más entradas en la tabla de nombres han estado marcadas como inválidas, pero no se liberaban.

Esto tenía consecuencias de gran envergadura en la performance, pero también en la estabilidad. Cada vez que una nueva entrada se agrega a la tabla de nombres, Visual FoxPro tiene que buscar todas las entradas existentes para encontrar nombres conflictivos. Para las variables esto implica comprobar si existe una nueva variable con un alcance más bajo, porque no se puede, por ejemplo, crear una variable PÚBLICA cuando existe una variable LOCAL con el mismo nombre. Para los alias esto implica verificar que el nombre del alias no esté usado en la sesión actual de datos. Este proceso de búsqueda ha causado la degradación exponencial de la performance. Mientras que se podría medir la creación del primer objeto en milisegundos o incluso nanosegundos, a Visual FoxPro le tomó varios minutos para crear el objeto 60,000.

Las aplicaciones que nunca alcanzaban un estado ocioso, como las rutinas de importación o los proveedores de servicio, se hacían más lentos cuanto más tiempo funcionaban. Algunas funciones, también, exigían una nueva entrada en la tabla de nombres, como la función REQUERY al recargar una vista. La desaceleración no era el único problema. Cuanto más se acercaba una aplicación al límite, más inestable se volvía. Si se era afortunado, Visual FoxPro indicaba un error de "demasiados nombres", pero generalmente simplemente se colgaba.

Visual FoxPro 6.0 mejoró perceptiblemente este comportamiento. Cuando el número de items en la tabla de nombres se acerca al 95% del límite, Visual FoxPro inicia automáticamente una recolección de basura. En un programa que crea 65.000 objetos se nota como un descanso más largo al crear ese objeto.

Una mejora importante vino en Visual FoxPro 7.0. Todas las versiones anteriores contaron objetos.


28 de noviembre de 2006

Buscar direcciones postales en Google Maps con VFP

Como buscar direcciones postales en Google Maps desde un formulario VFP, mostrando mapas e imágenes de satélite.

Hace unos días, Luis María Guayán publicó el artículo Google Maps en un formulario de VFP que mostraba un ejemplo de como acceder a diferentes localizaciones en Google Maps mediante sus coordenadas terrestres

Al ver y probar el código publicado, enseguida me surgió la inquietud de adaptarlo a una búsqueda por la dirección postal en lugar de por sus coordenadas que, normalmente, no conozco.

Luis María me remitió a otro artículo Integrando VFP con Microsoft Virtual Earth que mostraba un ejemplo muy completo de como realizar búsquedas (y muchas más cosas) sobre Virtual Earth.
Como el código de Luis María era más sencillo (y se ajustaba mejor a mis necesidades), decidí revisar la API de Google Maps para implementar la búsqueda por la dirección postal.

Antes de pasar al código, debo hacer varias aclaraciones sobre éste:

En primer lugar, este código puede ser ejecutado con do "MiPrograma.prg" con lo que, al abrirse el formulario, podremos introducir la dirección a buscar, o bien podremos ejecutarlo con do "MiPrograma.prg" with "direccion a buscar", con lo que, al abrirse el formulario, se realizará la búsqueda de la dirección introducida directamente.

En segundo lugar, vereis que al ejecutar el código, el formulario abierto no tiene barra de título, pero esto no significa que no pueda ser movido. Sólo teneis que pinchar sobre una zona libre del formulario y arrastrar con el ratón. El truco reside en dos llamadas a la API en el Load del formulario y el evento MouseDown de este.

También, al hacer las diferentes pruebas, me encontré con que las búsquedas de direcciones que contenían "eñes" no se realizaban correctamente pero, si las sustituía por "enes", la búsqueda era correcta. Ese es el motivo de haber utilizado la función strtran, sólo a efectos de búsqueda.

Por último, mi agradecimiento a todas las personas que en el foro contestaron a mis dudas, y en especial a Luis María Guayán, sin cuya colaboración y apoyo, este mi primer artículo, no habría visto nunca la luz.

Y ahora, el código completo de este ejemplo es el siguiente:

Do MiPrograma With "Puerta de Alcala, Madrid, España"

*
* MiPrograma.prg
*
Procedure MiPrograma
  Lparameters MiAddress
  Public oMiForm
  oMiForm = Createobject("MiForm", MiAddress)
  oMiForm.Show
  Return
Endproc

Define Class MiForm As Form
  Height = 560
  Width = 625
  AutoCenter = .T.
  Caption = "Ejemplo con Google Maps"
  Name = "MiForm"
  SetPoint = ""
  SetDecimals = 2
  ShowWindow = 0
  TitleBar = 0
  BorderStyle = 2
  Closable = .F.
  MaxButton = .F.
  MinButton = .F.

  Add Object Descrip As TextBox With ;
    HEIGHT = 24, Left = 12, Top = 12, Width = 330, ;
    STYLE = 0, Name = "Descrip", SelectOnEntry = .T., Enabled = .T.

  Add Object cmdMostrar As CommandButton With ;
    TOP = 10, Left = 350, Height = 27, Width = 100, ;
    CAPTION = "Mostrar mapa", Name = "cmdMostrar"

  Add Object cmdCerrar As CommandButton With ;
    TOP = 10, Left = 573, Height = 27, Width = 40, ;
    CAPTION = "Salir", Name = "cmdCerrar"

  Add Object oleIE As OleControl With ;
    TOP = 48, Left = 12, Height = 500, Width = 600, ;
    NAME = "oleIE", OleClass = "Shell.Explorer.2"

  Procedure Load
    Sys(2333,1)
    This.SetPoint = Set("Point")
    This.SetDecimals = Set("Decimals")
    Set Point To .
    Set Decimals To 8
    Set Safety Off
    Declare Integer ReleaseCapture In WIN32API
    Declare Integer SendMessage In WIN32API Integer, Integer, Integer, Integer
  Endproc

  Procedure Init(MiAddress)
    If Type('miaddress')<>'C'
      This.Descrip.Value=''
    Else
      This.Descrip.Value=miaddress
      Thisform.cmdMostrar.Click()
    Endif
  Endproc

  Procedure MouseDown
    Lparameters nButton, nShift, nXCoord, nYCoord
    Local lnHandle
    If nButton = 1
      ReleaseCapture()
      SendMessage(This.HWnd, 0x112, 0xF012,0)
    Endif
  Endproc

  Procedure cmdCerrar.Click
    Set Point To (Thisform.SetPoint)
    Set Decimals To (Thisform.SetDecimals)
    Thisform.Release
  Endproc

  Procedure cmdMostrar.Click
    If Empty(Alltrim(Thisform.Descrip.Value ))
      Thisform.Descrip.SetFocus()
      Return
    Else
      *
      lcClave = "http://maps.google.es/maps?file=api&v=2.x&" + ;
        "key=ABQIAAAAtOjLpIVcO8im8KJFR8pcMhQjskl1-YgiA" + ;
        "_BGX2yRrf7htVrbmBTWZt39_v1rJ4xxwZZCEomegYBo1w" 
TEXT TO lcHtml NOSHOW TEXTMERGE
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
    <title>Busqueda en Google Maps</title>
    <script src="<<lcClave>>"
    type="text/javascript"></script>
    <script type="text/javascript">
    //<![CDATA[
    var map = null
    var geocoder = null
    var address = "<<Strtran(ALLTRIM(ThisForm.Descrip.Value),'ñ','n',1,10,1)>>"

    function load()
    { if (GBrowserIsCompatible())
      { map = new GMap2(document.getElementById("map"),'G_SATELLITE_MAP');
        map.addControl(new GLargeMapControl());
        map.addControl (new GMapTypeControl());
        map.addControl(new GOverviewMapControl());

        geocoder = new GClientGeocoder();
        if (geocoder) {
            geocoder.getLatLng(address,
          function(point)
          { if (!point)
            { alert("No Encontrado");
             }
          else
            { map.setCenter(point, 20);
            map.setMapType(G_NORMAL_MAP);
            var marker = new GMarker(point);
            map.addOverlay(marker);
            }
          }
         );
       }
      }
    }
    //]]>
    </script>
  </head>
  <body  scroll="no" bgcolor="#CCCCCC" topmargin="0" leftmargin="0" onload="load()" onunload="GUnload()">
  <div id="map" style="width: 600px; height: 500px"></div>
  </body>
</html>
ENDTEXT
      *
      Strtofile(lcHtml,"MiHtml.htm")
      Thisform.oleIE.Navigate2(Fullpath("MiHtml.htm"))
    Endif
  Endproc
Enddefine

Espero volver por aquí.

Jose Antonio Blasco, Zaragoza, España

27 de noviembre de 2006

Visual FoxPro muestra su transparencia

Artículo original: Visual Foxpro shows its Glass!
http://weblogs.foxite.com/bernardbout/archive/2006/10/28/2765.aspx
Autor: Bernard Bout
Traducido por: Ana María Bisbé York


Vista está casi aquí con su nuevo tema Aero Glass (transparencia) y sus nuevas APIs. Se ha mostrado ya que VFP puede correr en Vista y Craig Boyd ha mostrado cómo lograr algunos de los efectos de transparencia en un formulario VFP. Si no lo ha hecho, vea aquí:

http://www.sweetpotatosoftware.com/SPSBlog/Vista's Aero Glass for Visual FoxPro

Muchos de nosotros no nos habremos actualizado aun posiblemente hasta el SP1 o incluso después, ya que el PC más nuevo y poderoso lo necesitará y ¿Quién tiene tanto suelto como para además agregarle el coste del propio Vista? He investigado en Internet y he encontrado algunos sitios que piden simular los efectos de transparencia en XP. Incluso, he descargado un ejemplo en .NET que realmente realiza ese efecto; pero el formulario es tan lento que era imposible utilizarlo en la práctica. Pero cuidado, Visual FoxPro es rápido. Nosotros sabemos eso. Entonces, decidí intentar por mi cuenta.

¿Qué tal si tomamos un formulario cortamos porciones de el, y hacemos que las partes visibles sean transparentes y colocamos una forma opaca con objetos dentro de ella? Podría entonces controlar su ubicación, movimiento, etc. En una pantalla podría tener una apariencia de un formulario transparente. Entonces, allá vamos ...

(Puede descargar el código completo así como el artículo del enlace adjunto al final de este escrito)

Crear Mainfrom.scx

Comienzo con una forma normal. El formulario tiene configuradas las siguientes propiedades:
BackColour = RGB(64,64,64) 
BorderStyle = 0 - Sin Borde
ShowWindow = 2 - Como formulario de Nivel superior
TitleBar = 0 – Desactivado
El formulario tiene también algunas propiedades y Métodos los cuales se pueden ver en el ejemplo que se incluye. El Nombre del formulario es MainForm.

Luego agregué algunos elementos de diseño (skin) como se muestra:

 (el cual que está estirado) y  en la parte superior.

En el mismo centro coloqué una forma y fijé su color de fondo en RGB(0,255,0) (verde brillante)
Para tener las esquinas redondeadas coloqué 4 imágenes en las 4 esquinas las que tienen esta apariencia, 5 píxeles por 5 píxeles. (agrandado):

 para el borde superior izquierdo y  para el borde superior derecho.

Otros dos similares se colocaron al final.

23 de noviembre de 2006

Utilizar el canal Alpha en imágenes Visual FoxPro

Artículo original: Using the Alpha Channel in Visual Foxpro Images
http://weblogs.foxite.com/bernardbout/2006/09/10/using-the-alpha-channel-in-visual-foxpro-images/
Autor: Bernard Bout
Traducido por: Ana María Bisbé York


Utilizar el canal Alpha en imágenes PNG puede provocar efectos muy interesantes y agradables.
Estuve trabajando en algunos seudo formularios empleando máscaras de canal Alfa de imágenes PNG así que decidí intentar.

Actualizado el 12/09/2006 (vea debajo)

Creé las imágenes en Paint Shop Pro; pero cualquier aplicación para tratamiento de imágenes como Photoshop, etc puede crear máscaras que lo hagan. Al cargar un objeto imagen VFP, estas imágenes muestran muchos efectos interesantes, así que decidí invertir algún tiempo extra explorando este aspecto y las pantallas siguientes muestran el resultado que alcancé. El Titlebar.png es utilizado por la barra de título, mainform.png es utilizada para el área principal del formulario. Agregué Vistabuttons.bmp y coloqué sobre el un botón de comando invisible, para las acciones. Todo esto está colocado en un contenedor transparente en un objeto imagen VFP y los otros como etiquetas, cuadros de texto, etc están colocados encima. Pueden ser instanciados utilizando ADDOBJECT() sobre el formulario. Las imágenes pueden ser guardadas haciendo clic en el botón secundario del ratón y SavePictureAs (Guardar imagen como)

Titlebar.png


Mainform.png


VistaButtons.bmp



22 de noviembre de 2006

Formularios transparentes en Visual FoxPro al descubierto

Artículo original: Transparent Forms in Visual FoxPro Revealed
http://weblogs.foxite.com/bernardbout/2006/08/27/transparent-forms-in-visual-foxpro-revealed/
Autor: Bernard Bout 
Traducido por: Ana María Bisbé York


Cómo se ha hecho

Mi post anterior fue algo vago a propósito porque yo quería despertar un poco más de interés. Sólo describir el método utilizado para describir el efecto podría ser mucho más sencillo; pero el interés hubiera terminado ahí.

Muchos lectores "picaron". Algunos pensaron significativamente diferente a lo que yo había hecho, no obstante existen muchas formas de cambiar el diseño. Otros sencillamente no lo hicieron.

En cualquier caso, en esta entrada voy a describir el método que he utilizado para alcanzar el efecto medio transparente de un formulario. Espero que los lectores piensen sobre las técnicas utilizadas y lleguen a su propia forma de hacerlo.

El formulario principal es un formulario SDI con mi clase de navegación "Outlook". Básicamente seleccionando una opción al hacer clic en los botones azules llena un árbol debajo con las ventanas disponibles. Haga clic sobre uno de estos abre una ventana a la derecha donde tiene lugar la acción. Hasta aquí todo se entiende. El formulario SDI tiene una gran imagen de fondo.



Justo debajo de "Product ordering" se puede ver "X". Esto, normalmente tiene Visible = .F. y lo empleo como marcador.

20 de noviembre de 2006

Visual FoxPro es muy bueno

Artículo original: VFP is very very cool
http://weblogs.foxite.com/bernardbout/2006/08/16/vfp-is-very-very-cool/
Autor: Bernard Bout
Traducido por: Ana María Bisbé York

Son sólo artimañas

Se han ido los días de los controles grises. Ahora las pantallas necesitan tener tanta apariencia visual como su funcionalidad. Microsoft comenzó la evolución al diseñar la interfaz de Outlook 2000 y mejoró luego la interfaz de Outlook 2003, que emplea temas. En todas partes de la red vemos el efecto del color en las páginas Web.

Bueno, tenemos la capacidad de utilizar temas en VFP y en la interfaz del Outlook se presta con facilidad a copiar y agregar una apariencia similar y sentirlo como interfaz VFP.

Debo recalcar en el hecho que estas imágenes tienen el copywrite y pertenecen a la empresa para la que trabajo y no pueden ser utilizadas sin permiso.

Las dos pantallas siguientes pertenecen a una aplicación que he diseñado y que se emplea en mi compañía. Hay algunos puntos a resaltar aquí.

Como he mencionado en mi post anterior, mi filosofía de programación es programar una interfaz. Por tanto, no me preocupo en añadir funcionalidad que no será empleada, por tanto los botones que están a la izquierda están fijos y no les he agregado ninguna funcionalidad para añadirlos o eliminarlos.

Vamos a revisar la interfaz.

El formulario principal es un formulario de nivel superior SDI. No hay nada especial aquí.

Arriba a la izquierda, hay un control ActiveX calendar cuyo propósito en este caso es rellenar el espacio. Es completamente funcional así que se puede hacer búsqueda de fecha. Pero para la aplicación, tengo mi propio control para capturar la fecha.

Más abajo, en la mitad izquierda, es un área para la selección de pantallas que van a aparecer a la derecha. Es una clase de usuario que yo desarrollé empleando el control Treeview. Los elementos  que aparecen aquí se leen de una BDF local,  son completamente configurables incluyendo las imágenes.

Debajo a la izquierda están los famosos botones degradados de Outlook. A diferencia de la clase de usuario que yo desarrollé, estos botones serán configurables en tiempo de diseño; pero no se podrán cambiar en tiempo de ejecución.

Al final hay otro botón control de barra de estado de usuario que yo desarrollé. Es sencillo, muestra la hora, algunos mensajes y tiene un remolcador para el redimensionamiento del formulario. En esta aplicación el redimensionamiento no está permitido ya que esto rompería el efecto de las pantallas así como la colocación de los objetos. Está simplemente ahí y se ve bien.

En su lugar habitual, encima del todo, hay un menú que es un menú estándar VFP y añade Copy/Paste (Copiar/Pegar), además de alguna otra funcionalidad no disponible en el Treeview de la vista del Outlook.

A la derecha está la ventana principal que muestra una imagen - en este caso es un entrenador personal que ayuda a una persona que se entrena.

La interfaz trabaja según lo esperado. El usuario selecciona un botón  desde la banda de la izquierda que llena el árbol desde una dbf dando al usuario acceso a la pantalla que está debajo de ese grupo.

Todo esto trabaja de forma similar a un menú donde selecciona un elemento de menú y otro formulario que aparece ...




Ahora viene la mejor parte.

Hemos ejecutado los ejemplos que vienen con VFP y visto los "Formularios transparentes" donde los formularios y todo su contenido se vuelven transparentes utilizando API SetLayeredWindowAttributes. Aunque está bonito, utilizarlo requiere un formulario de nivel superior y provoca que TODO el contenido se vuelva transparente, incluyendo los controles y todo en el formulario. No tiene un aspecto muy agradable, ¡incluso el texto que se escribe también es transparente!

El formulario es, después de todo, una representación bidimensional y muestra qué es lo que quiere mostrar. El efecto transparente tiene lugar; pero ¿en un formulario donde incluso los controles se vuelvan transparentes? Esto es un No rotundo. Pero, ¿qué tal si pudiéramos hacer que el formulario fuera medio transparente mientras mantenemos los controles y todo lo que está dentro en opaco?

Para el usuario, el efecto que estoy tratando de lograr, es un formulario medio transparente, donde el fondo es parcialmente visible; pero todos los controles son opacos y las entradas de texto son claramente visibles. Cómo lo hago no importa en realidad dado el efecto final que se ve.

Obviamente SetLayeredWindowAttributes no es lo que se emplea aquí, porque esta función hace que todo se vea transparente, incluyendo los controles. Este no es el efecto que deseo, así es que la descarto. ¿Cómo puedo lograr este efecto? La clave aquí es saber lo que se quiere lograr.

Después de experimentar un poco llegué a la solución que se muestra debajo. El usuario selecciona una acción desde el árbol y se abre el formulario a la derecha. Este formulario tiene todos los controles opacos; pero aun así se puede ver la imagen al fondo. El formulario es medio transparente mientras que los controles son opacos, como cualquier formulario normal. Esto es lo que ve el usuario. Este es el efecto que yo quiero.




Para enfatizar la traslucidez he dejado una pequeña abertura de unos 3 pixels a la izquierda del formulario. Esto muestra la imagen de fondo y crea la ilusión de que el formulario es transparente.



Pero, ¿Cómo se hizo esto?

Ahora le dejo saber mi pequeño secreto. Todo esto es una ilusión. Si los dibujos del pavimento pueden aparentar 3D, lo cual no es nada, sino una ilusión óptica, entonces el formulario puede aparentar que es traslúcido. La pequeña abertura dejada a la izquierda añade la impresión de que el usuario está viendo una imagen a través del formulario que está por encima de ella.

Los magos emplean artimañas para lograr sus efectos. Yo utilizo VFP y un poco de imaginación. El formulario no tiene que ser transparente para aparentar que lo es. Sólo el efecto final da esa impresión.

Se completó la ilusión.

Ahora, ¿quien dice que el VFP no es genial? VFP puede ser tan bueno como usted quiere que sea. En mi caso ...

Ahora dejo a su imaginación flotar y diseñar algunas pantallas deslumbrantes. Envíenme algunas imágenes cuando lo tengan hecho.

¿Está interesado en seguir el tema? Escriba un comentario en mi Blog y su correo.

17 de noviembre de 2006

Visual FoxPro hace transparencias

Artículo original: Visual Foxpro does Glass!
http://weblogs.foxite.com/bernardbout/2006/06/15/visual-foxpro-does-glass/
Autor: Bernard Bout 
Traducido por: Ana María Bisbé York


Ha sido liberado el CTP de Windows vista y ha sido descargado por todo aquel que tenga buen ancho de banda. Una de las "golosinas" de los Temas de Vista es algo llamado Formulario de cristal (Glass Forms). Cuando se aplica, muestra un efecto de formulario transparente, como cristal.

Sin embargo, no se apure y piense que sus gráficos actuales no van a soportar este requerimiento. Hay una recomendación muy clara sobre que únicamente una parte de la ventana debe ser transparente.

Entonces, ¿qué debemos hacer los que utilizamos XP? ¿Soportará VFP o tendrá soporte para estos efectos tal y como tenemos el soporte para temas actual? ¡ Quién sabe !

En cualquier caso, yo quise mostrar aquí algunas golosinas en las que he estado trabajando con Visual FoxPro 9 en mi tiempo libre. Esta es una Beta, muy muy beta aun; pero muestra algunas posibilidades, especialmente ¡ porque corre en el viejo XP plano, y en el aburrido y viejo Visual FoxPro !

Si alguien está interesado en seguir con el desarrollo de esta idea, que me envíe una línea y podemos seguir a partir de aquí.

Sin más, tengo algunas pantallas de mi entorno VFP. El fondo fue fijado temporalmente para mostrar el efecto "CRISTAL". En ese momento, yo puedo mover el formulario; pero el efecto está un poco agitado. Hay algunos errores con ACTIVATE, etc.

Recuerde que este es mi formulario Beta ejecutándose en XP, no sobre Vista o alguna tarjeta gráfica de alta resolución.

Lo fundamental es que recuerde que esto es VFP.

¡ Viva el Fox !

Las siguientes ventanas no están ejecutándose en Vista sino en XP. No han sido dañados animales en la producción ni se emplean temas especiales. Todo esto es puro VFP. Haga clic sobre la imagen para ver la versión más grande.

Formulario de cristal VFP



Formulario transparente VFP.

Observe que todos los objetos son transparentes. No se ve muy bonito.



Otra vista del formulario cristalino. Todos los controles son opacos.



16/06/2006

Existe confusión sobre lo que representa un efecto "Cristal"

El ejemplo de formulario transparente es simplemente eso, un formulario medio transparente que emplea API SetLayeredWindowsAttributes y que se puede lograr con apenas 4 líneas de código para un par de APIs. No hay efecto "Cristal", solamente es "Transparente"

El efecto Cristal se usa en referencia de los formularios Vista, es donde parte de los formularios es transparente y otra parte no. Todos los objetos que se colocan en un formulario transparente asumirán para sí mismos la misma transparencia que el formulario padre. Esto no es así en un formulario de Cristal. Dentro de un formulario de cristal, los objetos van a permanecer opacos.

13 de noviembre de 2006

La percepción con VFP. ¡ Hazlo bonito !

Artículo original: With VFP its Perception. Make it cool
http://weblogs.foxite.com/bernardbout/2006/06/06/with-vfp-its-perception-make-it-cool/
Autor: Bernard Bout
Traducido por: Ana María Bisbé York


Todo está en la percepción

Craig Baley en su blog habló sobre cómo hacer para que VFP se vea bonito. Como el dijo, todo está en la mente - percepción - VFP es xBase y es una tecnología vieja, los controles VFP tienen apariencia antigua, etc. Necesitamos cambiar esto. Esto es lo que debemos leer:

http://craigbailey.blogspot.com/2006/05/vfp-how-to-make-visual-foxpro-cool.html

(Nota del editor: Este artículo se encuentra traducido  bajo el título: Como hacer a Visual FoxPro bonito)

Entonces, ¿VFP es genial o qué? Existen componentes que pueden ser utilizados para ver y sentir que VFP es genial como cualquier otra aplicación que conocemos.

Eche un vistazo a estas pantallas de Office 2007 y vea el control "Ribbon" (banda). Se ven mucho mejor logrados que las fichas (tabs). ¿Qué hay de los famosos controles OneNote? Otro conjunto de fichas y algunas selecciones caprichosas desde una barra expandible, similar a lo que tenemos en Outlook 2003. ¿Puede hacerse esto en VFP? Seguro, ¿Por qué no? Y no se verían genial.

He aquí los ejemplos de pantallas de algunos controles Ribbon y OneNote de Office 2007







¿Pero, qué hay de controles VFP nativos?

No hay necesidad de correr e implementar TODAS las funcionalidades de estos controles. Después de todo usted es desarrollador y puede hacer tanto como necesite para que su aplicación sea buena e incluirle tanta funcionalidad como necesite. La banda (Ribbon) puede tener las funciones; pero si no las necesita, entonces, ahorre tiempo. Su aplicación trabajará bien tanto con ellas, como sin ellas.

Word tiene muchas funciones porque se dirige a una audiencia muy amplia. Pero ¿Cuántos de nosotros utilizamos TODAS estas funciones? El 40%, 50%, si usted utiliza el 60% de las funciones es realmente un usuario fuerte.

Entonces, al crear controles en VFP que se vean "bien", ¿por qué debemos brindar su funcionalidad global sin que lo necesite? Si tiene en planes vender sus controles, entonces el público al que va dirigido es mayor y espera todo esto. Pero, para sus aplicaciones por qué perder tiempo y esfuerzo creando esto cuando en realidad no lo necesita. Cree solamente lo que necesite.

Esta es la filosofía que he utilizado al crear los controles que utilizo en mis aplicaciones. Les coloco solamente la funcionalidad suficiente que necesito, no más.

He aquí algunos de los controles que he creado recientemente. Seguro que se parecen a los controles de Microsoft Outlook. Pero esto es porque están creados para que tengan dicha apariencia. Tienen código 100% VFP, sin siquiera una llamada a API o ActiveX. La percepción es todo. ¡ VFP ES genial !

Mi versión de Minibar Cerrada y abierta con la con la sección "Programs" seleccionada

   

La sección "Maintence", en naranja, está cerrada.



Y algunas vistas de mi control OneNoteTab en código puro VFP:







Puedo especificar tantas fichas como yo quiera:



VFP  Rocks!