Este es el primer artículo de una serie publicada en el blog de Bernard Bout, que ha autorizado su traducción y publicación para la comunidad de habla hispana. Veremos un conjunto de ejemplos interesantes de programación avanzada con VFP. ¡ Muchas gracias a Bernard Bout !
Pensar más allá de la caja
Artículo original: Thinking Outside the Box
http://weblogs.foxite.com/bernardbout/archive/2006/05/17/FirstPost.aspx
Autor: Bernard Bout (http://weblogs.foxite.com/bernardbout)
Traducido por: Ana María Bisbé York (amby@telefonica.net)
Para: PortalFox (http://www.portalfox.com)
Gracias al impulso de Craig Bailey y Eric, quienes amablemente han brindado su espacio Web, he decidido comenzar a escribir mi Blog.
Los proyectos del trabajo me mantienen muy ocupado ya que estoy explorando nuevas áreas del uso de VFP.
Mi exploración de las capacidades de FOX me han permitido entrar en áreas desconocidas y me han hecho pensar en algunas cosas "más allá de la caja".
Lo que quiero decir es que nos acercamos a los objetos vfp con una visión estándar. Hasta ahora, esta visión me ha permitido hacer cosas en una forma más tranquila. Pero ahora mi proceder es bastante diferente.
He aquí un ejemplo de esto.
Como sabemos, VFP no tiene objetos con barras de desplazamiento nativos, por tanto, si queremos barras de desplazamiento tenemos que utilizar otras ideas. He visto muchas implementaciones de contenedor desplazable. Existen aquellos que emplean Scroll Bars ActiveX VB, otros que usan WIN API completamente y aun otras que encontré en el sitio de Craig Boyd, http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,df3cb71d-588f-4bc6-b63e-9c94017edd7f.aspx que emplea objetos VFP.
Aunque todos son buenos, todos tienen problemas. Habría que tener los runtimes de VB para el ActiveX, o tener las APIs así que la implementación no es muy visual en el editor VFP, y en el caso de Craig, el mismo ha documentado algunos defectos y algunos objetos se desgarran entre el contenedor dentro del formulario principal, usted no puede aguantar el ratón sobre la barra para obtener el efecto repetido y muchas veces, el efecto del desplazamiento es entrecortado.
Entonces, esto me hizo pensar en otras alternativas. ¿Qué objetos en VFP tienen soporte nativo de barras de movimiento y son también contenedores? Los dos únicos son: grid y formulario. He descontado el control grid, porque es muy difícil de manipular y agregar objetos. Por tanto queda el formulario.
Por tanto, creé un formulario y fijé su propiedad ScrollBars = 3 (ambas), quité el título y la propiedad Border en 0. Esto me dio un contenedor con desplazamiento al que le puedo agregar objetos fácilmente.
Clase base Scroll

Ejecuté el formulario y realicé el desplazamiento. Hasta aquí todo bien. Luego, lo guardé como clase. Luego, agregué a mi Toolbox (Caja de herramientas) y creé un formulario a partir de aquí.
Luego agregué objetos a este formulario basado en un clase base scroll form (formulario desplazable) como se muestra a continuación. Las barras de desplazamiento aparecieron. La guardé como clase. Ahora puedo fácilmente abrir esta clase y agregar/eliminar elementos, etc. Este formulario puede ser instanciado también. Muy bien por parte de la interfaz GUI.
Clase base Scroll + Objetos

Ahora, si intentamos agregar esta clase a un nuevo formulario nos pregunta si deseamos crear un conjunto de formularios. Yo odio los conjuntos de formularios, así que esta no es la vía a seguir. Además ADDOBJECT en tiempo de ejecución no funciona en un formulario. Si sólo ...
Por tanto, he recordado que he leído en algún sitio / alguna vez en Foxite sobre acerca de 2 APIs de Windows SetParent y GetParent y fluyeron algunas ideas ...
Entonces creé un nuevo formulario y agregué una forma (shape) como un portador para mi contenedor desplazable, el que me daría la representación visual de dónde debe aparecer la ventana desplazable y sus dimensiones. Además, el formulario tiene una propiedad de usuario oScroller y un método de usuario _GetScroller
En el INIT de este formulario, agregué una llamada al método de usuario - GetScroller()
El código para GetScroller está aquí:
DECLARE INTEGER SetParent IN User32 INTEGER HWND, INTEGER ParenthWnd
DECLARE INTEGER GetParent IN User32 INTEGER HWND
DECLARE INTEGER MoveWindow IN user32 INTEGER HWND, INTEGER X, ;
INTEGER Y, INTEGER nWidth, INTEGER nHeight, INTEGER bRepaint
SET CLASSLIB TO bbscroll addit
thisForm.oScroller = CREATEOBJECT("scrollobject")
WITH thisForm.oScroller
SetParent(.hWnd, THISFORM.hWnd)
* esto posiciona y refresca el formulario
MoveWindow(.HWnd, ThisForm.Scrollplaceholder2.Left, ThisForm.Scrollplaceholder2.Top,;
ThisForm.Scrollplaceholder2.width, ThisForm.Scrollplaceholder2.height , 1)
.visible = .T.
ENDWITH
Y aquí está. Ahora tengo un visor desplazable sin ninguno de los problemas de otras clases, que es GUI activa, modificable, no se desgarra y además es un ActiveX agradable .
Este es el aspecto del formulario funcionando
Formulario con desplazamiento (Scroll)


He creado además otra subclase de la clase Form original y es el momento de insertar un objeto imagen dentro de ella. Ahora si tengo un visor desplazable.
Un visor para ver imágenes

Existe un único problema que yo le veo a esta clase :(
NO le gusta ser movida. Puede ver el efecto moviendo el formulario y luego intentando el desplazamiento. Tengo que obtener una solución elegante para contrarrestar esto; pero hasta entonces, o no mueve el formulario o si lo necesita, puede emplear BINDEVENTS y LockScreen para recrear el objeto barra de desplazamiento una vez que el formulario ha dejado de moverse.
Las ideas son bienvenidas. Esto es todo, hasta la próxima ...
|