vfp - la caja de herramientas _toolbox_ vista por dentro

45
vfp - La caja de herramientas (ToolBox) vista por dentro Autor: Beth Massi (www.BethMassi.com ) Texto original: -- Inside the Visual FoxPro 8.0 ToolBox -- Mayo 2003 http://msdn.microsoft.com/library/en-us/dnfoxgen8/html/vfp8_toolbox.asp Visual FoxPro 8.0 Conocer cómo trabaja la Caja de herramientas, (ToolBox), y ver cómo personalizarlo para que encaje en su estilo de trabajo y sus proyectos. Crear y distribuir herramientas al equipo de desarrolladores y crear paquetes de instalación de conjuntos de herramientas. Aprender la arquitectura del ToolBox y cómo extenderlo fácilmente para incorporarle comportamientos muy potentes (powerful add-in behaviors), sobre-escribir comportamientos existentes y agregar sus nuevas herramientas y tipos de categorías. Introducción Conjuntos de herramientas Conjuntos de herramientas de terceros Arquitectura del ToolBox Crear comportamientos integrados Sobrescribir comportamientos y soportar nuevos tipos de herramientas Soportar nuevas categorías de herramientas Conclusiones Introducción La caja de herramientas del Visual FoxPro es una nueva herramienta del Entorno Integrado de Desarrollo (IDE - Integrated Development Environment), que ayuda en la experiencia de desarrollo con Visual FoxPro. El toolbox muestra, agrupados por categorías, los conjuntos de herramientas personalizados por el desarrollador, incluyendo las que se consideren necesarias para la creación de aplicaciones. Los conjuntos de herramientas contienen típicamente clases y componentes; pero pueden guardar además referencias a recursos basados en archivos comunes como formularios, programas, tablas, informes, imágenes, etc. Pueden contener además otros tipos como controles ActiveX, generadores y asistentes, o elementos de Servicios Web XML. Los elementos pueden ser arrastrados al área de trabajo, se puede hacer clic sobre ellos para ejecutar acciones predeterminadas, o pueden contener comportamiento accesible desde elementos de menú contextual. Debido a que tiene control completo sobre la Caja de herramientas, se convierte en parte esencial del IDE. Y, como prácticamente todas las características del IDE de Visual FoxPro, es extensible. Entonces, si un tipo de herramienta o comportamiento no es permitido actualmente, se pueden agregar nuevos comportamientos y tipos de herramientas sin necesidad de recompilar toda la aplicación ToolBox. Los conjuntos de herramientas individuales son cargados dentro del ToolBox, cuya arquitectura admite comportamientos integrados y categorías. De esta forma, terceros suministradores o arquitectos a nivel empresarial, pueden proporcionar fácilmente su propio conjunto de herramientas dinámico para lograr un óptimo y rápido desarrollo de la aplicación.

Upload: miguelabpo

Post on 09-Aug-2015

599 views

Category:

Documents


15 download

TRANSCRIPT

Page 1: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

vfp - La caja de herramientas (ToolBox) vista por dentro

Autor: Beth Massi (www.BethMassi.com)

Texto original: -- Inside the Visual FoxPro 8.0 ToolBox -- Mayo 2003 http://msdn.microsoft.com/library/en-us/dnfoxgen8/html/vfp8_toolbox.asp

Visual FoxPro 8.0

Conocer cómo trabaja la Caja de herramientas, (ToolBox), y ver cómo personalizarlo para que encaje en su estilo de trabajo y sus proyectos. Crear y distribuir herramientas al equipo de desarrolladores y crear paquetes de instalación de conjuntos de herramientas. Aprender la arquitectura del ToolBox y cómo extenderlo fácilmente para incorporarle comportamientos muy potentes (powerful add-in behaviors), sobre-escribir comportamientos existentes y agregar sus nuevas herramientas y tipos de categorías.

Introducción Conjuntos de herramientas Conjuntos de herramientas de terceros Arquitectura del ToolBox Crear comportamientos integrados Sobrescribir comportamientos y soportar nuevos tipos de herramientas Soportar nuevas categorías de herramientas Conclusiones

Introducción

La caja de herramientas del Visual FoxPro es una nueva herramienta del Entorno Integrado de Desarrollo (IDE - Integrated Development Environment), que ayuda en la experiencia de desarrollo con Visual FoxPro. El toolbox muestra, agrupados por categorías, los conjuntos de herramientas personalizados por el desarrollador, incluyendo las que se consideren necesarias para la creación de aplicaciones. Los conjuntos de herramientas contienen típicamente clases y componentes; pero pueden guardar además referencias a recursos basados en archivos comunes como formularios, programas, tablas, informes, imágenes, etc. Pueden contener además otros tipos como controles ActiveX, generadores y asistentes, o elementos de Servicios Web XML. Los elementos pueden ser arrastrados al área de trabajo, se puede hacer clic sobre ellos para ejecutar acciones predeterminadas, o pueden contener comportamiento accesible desde elementos de menú contextual.

Debido a que tiene control completo sobre la Caja de herramientas, se convierte en parte esencial del IDE. Y, como prácticamente todas las características del IDE de Visual FoxPro, es extensible. Entonces, si un tipo de herramienta o comportamiento no es permitido actualmente, se pueden agregar nuevos comportamientos y tipos de herramientas sin necesidad de recompilar toda la aplicación ToolBox. Los conjuntos de herramientas individuales son cargados dentro del ToolBox, cuya arquitectura admite comportamientos integrados y categorías. De esta forma, terceros suministradores o arquitectos a nivel empresarial, pueden proporcionar fácilmente su propio conjunto de herramientas dinámico para lograr un óptimo y rápido desarrollo de la aplicación.

Page 2: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

En este artículo, aprenderá cómo puede crear y distribuir conjuntos de herramientas a su equipo de desarrolladores y cómo terceros suministradores pueden crear paquetes de instalación de conjuntos de herramientas. Ganará en comprensión de la arquitectura del ToolBox y cómo extender fácilmente el ToolBox creando potentes comportamientos agregados. Aprenderá además cómo sobrescribir comportamientos existentes y añadir su propio conjuntos de herramientas y tipos de categorías.

Para más información sobre el empleo de la caja de herramientas y una discusión completa de las herramientas y categorías integradas, vea el artículo que fue publicado originalmente en Universal Thread Magazine. (Nota de la traductora: Este artículo se encuentra traducido al español en http://www.utmag.com/spanish/February2003/Page32.asp)

Conjuntos de herramientas

Un conjunto de herramientas es un grupo de elementos de herramientas contenidos en el Toolbox, agrupados por categorías. Los elementos dentro del conjunto de herramientas pueden representar objetos de tipos diferentes. Estos objetos pueden ser bibliotecas de clases de Visual FoxPro y pueden ser arrastrados al área de trabajo de la misma forma que arrastra una clase de la barra de herramientas. Pero, mientras la barra de herramientas de Visual FoxPro muestra todas las clases que hay en la biblioteca, el ToolBox puede mostrar sólo las clases que el desarrollador desea. El ToolBox admite además, generadores y asistentes, controles ActiveX Servicios Web XML y retazos de texto (text scraps). Además de todos estos elementos, el ToolBox puede representar recursos basados en archivos como son: bases de datos, tablas, imágenes, informes, etiquetas, menús, formularios, aplicaciones, programas y proyectos.

Cuando se desarrollan sistemas en equipo, es frecuente que un arquitecto o un grupo de expertos creen un framework (armazón y/o entorno de trabajo) de clases de Visual FoxPro y posibles generadores u otros recursos para utilizar en el proyecto. Estos archivos se distribuyen entonces al equipo de desarrolladores. Sin embargo, debido a que todas las clases de una biblioteca de clases se muestran cuando la biblioteca es cargada en la barra de tareas de Visual FoxPro, los miembros del equipo pueden invertir tiempo en comprender qué clases son clases abstractas del framework y cuáles deben utilizarse para el desarrollo. Para ayudar a sus desarrolladores a acceder a las clases que se desea que ellos utilicen, puede establecer un conjunto de herramientas en el ToolBox y distribuirlas a su equipo de desarrolladores. Este conjunto de herramientas no está limitado a clases. Pueden contener cualquier tipo de elementos, incluyendo enlaces a otras aplicaciones o recursos. Puede además establecer carpetas de categorías dinámicas que muestren elementos desde los archivos de la red, de tal forma que los desarrolladores puedan acceder fácilmente a los recursos compartidos.

El ToolBox guarda todo su contenido en una tabla de datos (.dbf) de Visual FoxPro, específica para cada usuario. El Visual FoxPro crea la tabla la primera vez que se abre el ToolBox y guarda el contenido predeterminado. Al personalizar el ToolBox, se modifica el contenido de esta tabla. De forma predeterminada, los nombres para estos archivos de datos son: Toolbox.dbf, Toolbox.fpt, y Toolbox.cdx. Se encuentran en la carpeta HOME(7), \Documents and Settings\UserName\Application Data\Microsoft\Visual FoxPro 8\Toolbox\.

Para crear un conjunto de herramientas para sus desarrolladores, personalice su ToolBox para llenar las categorías con clases, generadores y otras herramientas de su framework que sus desarrolladores pueden utilizar en el proyecto. Puede incluso establecer categorías dinámicas y categorías filtradas. Entonces, todo lo que necesita es distribuir su tabla de contenidos de ToolBox a su equipo de desarrolladores con las bibliotecas de clases y archivos del framework.

Page 3: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

Cuando el ToolBox se abre por primera vez, pregunta por la tabla de contenido. El desarrollador puede decidir cargar una tabla que haya sido suministrada previamente, en lugar de la predeterminada, seleccionando la opción adecuada y localizando el archivo .dbf. Después que el ToolBox ha sido llamado una vez, el desarrollador puede alternar entre diferentes tablas de contenido utilizando Customize ToolBox (Personalizar ToolBox) > ficha Options (Opciones), clic derecho en el ToolBox y seleccionando Options en el árbol a la izquierda. Esto muestra todas las opciones del ToolBox. La ruta y nombre de la tabla de contenido se muestra en el medio del formulario (Figura 1). Introduzca el nuevo nombre de la tabla o haga clic en el comando (…) para localizar el archivo.dbf

Figura 1. Para alternar las tablas de contenido del ToolBox, se pueden seleccionar desde Personalizar ToolBox > Opciones.

Las bibliotecas de clases existentes deben ser distribuidas en la misma carpeta relativa de los PC de los desarrolladores para que sea fácil de utilizar. Sin embargo, si el desarrollador utiliza una herramienta y el Toolbox no puede encontrar la clase asociada, pregunta al desarrollador para que localice la biblioteca de clases y actualice los datos de ese elemento del ToolBox. Por ejemplo, si crea un elemento de la herramienta que se referiere a la clase llamada MyClass en la biblioteca de clases localizada en C:\MyFramework\MyClasses.vcx, debe distribuir la biblioteca de clases a la misma carpeta del PC del desarrollador. De no hacerlo así, se le preguntará al desarrollador, para que localice la biblioteca de clases correspondiente, cuando la herramienta es utilizada.

Antes de que establezca el conjunto de herramientas de su entidad en el ToolBox, probablemente no desee distribuir ningún contenido personal que tenga configurado. Por ejemplo, puede que haya creado categoría y filtros que no desee que sean distribuidas. Lo que necesitará será realizar una copia de seguridad de su tabla contenido y luego restaurar la tabla de contenidos original del ToolBox. Puede hacer esto fácilmente desde Customize ToolBox (Personalizar ToolBox) > Options page (página Opciones). Puede restaurar el contenido del ToolBox haciendo clic en el botón Reset ToolBox to Default (Re-Iniciar ToolBox predeterminado). Se muestra la pregunta "Do you want to maintain new categories and Toolbox items that were added by you or a third-party vendor?" (Desea mantener las nuevas categorías y los elementos de ToolBox que han sido añadidos por usted

Page 4: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

o terceros) Si hace clic en No, se restaura toda la tabla ToolBox a la configuración inicialmente predeterminada, eliminando toda la personalización que haya hecho el usuario, y haciendo una copia en la misma carpeta. (Los archivos de copias (backup) son acumulativos, por ejemplo, el primer backup creado se llama ToolboxBackup, el segundo es ToolboxBackup_1, el tercero es ToolboxBackup_2, etc)

Ahora puede personalizar su ToolBox al crear elementos de herramientas, categorías y filtros. Cuando haya terminado, distribuya la tabla de contenido del ToolBox y todas las bibliotecas de clases y archivos requeridos por sus desarrolladores. Si ha hecho muchas adiciones y ha eliminado mucho contenido, puede limpiar la tabla ToolBox antes de distribuirla a su equipo. Seleccione el botón Clean Up ToolBox (Limpiar el ToolBox) en la página Options (Opciones) para realizar un PACK a la tabla de contenido del ToolBox. Esto elimina permanentemente todos los artículos y reduce el tamaño de la tabla. Puede luego recuperar su contenido personal seleccionando la copia de resguardo de su tabla ToolBox en la página Options (Opciones)

Conjuntos de herramientas de terceros

Los conjuntos de herramientas de terceros se crean de la misma manera que un conjunto de herramientas de la empresa, excepto que tienen un requerimiento adicional de instalación, relacionado directamente con la tabla de contenidos del desarrollador. En lugar de que el desarrollador seleccione, desde el conjunto de herramientas, entre las tablas de contenido del ToolBox, debe estar disponible desde el ToolBox del desarrollador con el contenido personalizado. Esto también puede ser un requerimiento para las herramientas de la empresa. Incluye adicionar y posiblemente, actualizar los registros en la tabla de datos ToolBox.

Crear conjuntos de herramientas

Al crear una herramienta, categoría y elementos de filtro en el ToolBox, los registros se añaden a la tabla de contenido del ToolBox. De forma predeterminada, los ID únicos para estos elementos toman a forma de User.Sys(2015). La función SYS(2015) de Visual FoxPro devuelve un nombre de 10 caracteres único. Si agrega un elemento al ToolBox, el ID único es similar a User._0VC0UV6D2. Esto es importante cuando se crean conjuntos de herramientas de terceros. Después que ha finalizado la creación de su conjunto de herramientas, necesita renombrar el elemento para que sea único en su compañía o producto, por ejemplo, CompanyName.Sys(2015). De esta forma, puede crear la instalación y actualizar los scripts que afecten sólo a estos elementos.

Para crear un conjunto de herramientas de terceros desde el scratch, primero, restablezca la tabla de contenido del ToolBox haciendo clic en el botón Reset ToolBox to Default (Re-Iniciar el ToolBox predeterminado) en Customize ToolBox > Options page. Cuando pregunte Mantain user-added ítems (¿mantener los elementos añadidos por el usuario?) haga clic en No. Esto guardará su tabla de contenidos y eliminará toda la personalización. Ahora, agregue una categoría al ToolBox. Puede hacerlo directamente desde el menú contextual del ToolBox, o seleccionando una categoría en el árbol del formulario Customize (Personalizar) ToolBox y luego, seleccione el botón Add Category (Agregar categoría) en la barra de herramientas de categorías. Para este ejemplo, cree una categoría general llamada "Cool Tools."

Ahora, agregue una biblioteca de clases seleccionando el botón Add Item (Agregar elemento) y seleccionando Class (Clase) en el cuadro de diálogo Add Item y luego elija la biblioteca de clases. Suponga que tiene una biblioteca de clases llamada CoolTools.vcx en la carpeta de Visual FoxPro llamada CoolTools\ que contiene tres clases: CoolBaseControl, CoolControl, y CoolForm. Después que seleccione esta biblioteca de clase, los elementos de la herramienta se muestran en la grid (cuadrícula) y todos se muestran seleccionados de forma predeterminada. Los desarrolladores no

Page 5: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

deben utilizar CoolBaseControl directamente porque es una clase abstracta, entonces necesita limpiar ese elemento en el grid (Figura 2). Puede además, modificar los nombres de las herramientas directamente en el grid. Si va a distribuir un archivo Help (Ayuda) para sus herramientas, este archivo puede introducirse en la ficha propiedades del elemento haciendo clic en el botón Item Propierties (Propiedades del elemento) en la barra de herramientas de elemento.

Figura 2. El ToolBox puede ser configurado para mostrar sólo las clases que desee mostrar.

Ahora, vea los registros que fueron creados en la tabla contenido. Cierre el ToolBox y abra la tabla ToolBox:

USE HOME(7)+"Toolbox" EXCLUSIVE GO BOTTOM BROWSE

Esto asume que su tabla ToolBox está instalada en la localización predeterminada. Verá un registro para la categoría que ha agregado y un registro para cada elemento en la biblioteca de clases, En este caso, hay sólo 3 clases, una de las que está inactiva. Así que verá algo similar a la Tabla 1.

UniqueID Showtype ToolTypeID ParentID ToolName Inactive user._0VK0ZMPDL C CATEGORY.GENERA Cool Tools .F.

user._0VK0ZQV7H T CLASS user._0VK0ZMPDL coolbasecontrol (COOLTOOLS) .T.

user._0VK0ZQV8V T CLASS user._0VK0ZMPDL Cool Control .F.

user._0VK0ZQVAJ T CLASS user._0VK0ZMPDL Cool Form .F.

Tabla 1. Tabla ToolBox para Cool Tools.

Page 6: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

La estructura de la tabla ToolBox se explicará en detalles en la siguiente sección; pero por ahora, mire los campos UniqueID, ToolTypeID, ShowType y ParentID. Los campos ShowType y ToolTypeID indican qué tipo de elemento del ToolBox será mostrado. Observe además, que el campo ParentID en el elemento herramienta está establecido con la categoría UniqueID. Estos cuatro registros constituyen los datos para su conjunto de herramientas. Antes de que pueda comenzar a escribir el script de instalación, re-nombre los UniqueIDs para incluir el nombre de la compañía. Esto es beneficioso si el conjunto de herramientas será redistribuido por una actualización. Puede escribir el código para hacer esto automáticamente. Sin embargo, para este ejemplo, es más sencillo hacerlo manualmente desde la ventana Browse (examinar). Los registros del conjunto de herramientas se verán de esta forma ahora:

UniqueID Showtype ToolTypeID ParentID ToolName Inactive MASSI.COOLCAT C CATEGORY.GENERAL Cool Tools .F.

MASSI.COOLBASE T CLASS MASSI.COOLCAT coolbasecontrol (COOLTOOLS) .T.

MASSI.COOLCTRL T CLASS MASSI.COOLCAT Cool Control .F. MASSI.COOLFORM T CLASS MASSI.COOLCAT Cool Form .F.

Tabla 2. La tabla Toolbox una vez que ha renombrado los UniqueIDs.

El siguiente paso es tomar estos registros y colocarlos en una tabla personal para poderla incluir en el paquete de instalación. Para este ejemplo, cree una tabla llamada CoolToolBox.dbf y agregue sólo estos tres registros en la tabla.

CD HOME()+"CoolTools" USE HOME(7)+"toolbox.dbf" IN 0 ALIAS Toolbox SELECT Toolbox COPY TO CoolToolbox FOR LEFT(uniqueid,6) = "MASSI." AND NOT DELETED()

Crear scripts de instalación

Ahora que tiene los registros de su conjunto de herramientas adecuadamente colocados en su tabla, está listo para escribir un script de instalación que agregue estos registros a la tabla de contenido del ToolBox del desarrollador y copiar la biblioteca de clases CoolTools en la carpeta adecuada. Este ejemplo instala el conjunto de herramientas, sólo si no existe ya en el ToolBox. Típicamente, se controla la actualización del conjunto de herramientas y se crea nuevos conjuntos. Sin embargo, esto sólo implica la manipulación estándar de tablas de Visual FoxPro de la tabla de contenidos del ToolBox.

Cree un programa llamado Setup.prg y colóquelo en la misma carpeta que el conjunto de herramientas y archivos de bibliotecas de clases – en este caso \Microsoft Visual FoxPro 8\CoolTools\. El código es muy básico y no tendrá interfaz de usuario; pero podrá crear fácilmente un setup (instalador) que será un formulario en lugar de un programa. El truco de este código setup está en que utiliza la variable global _oToolBox para tomar la ruta de la tabla de contenidos ToolBox y cierra el ToolBox antes de que comience la instalación. Luego, se copia la biblioteca de clases a la carpeta actual a la carpeta destino, y sus registros de conjunto de herramientas se agregan a la tabla de contenido del ToolBox. Existen obviamente, muchas vías para escribir su propio scripts de setup; pero este código hace un buen trabajo para este ejemplo.

LOCAL lQuit, cToolboxTable, cSourceFolder, ; cTargetFolder, oExc, cSetDeleted, nPrevArea

Page 7: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

lQuit = .F. cSourceFolder = ADDBS(JUSTPATH(SYS(16))) cTargetFolder = HOME()+"CoolTools\" cSetDeleted = SET("Deleted") nPrevArea = SELECT() SET DELETED ON *-- Obtiene la ruta de la tabla de contenidos del Toolbox, *-- luego, cierra el Toolbox. TRY IF VARTYPE(_oToolbox)<>"O" DO (_TOOLBOX) ENDIF cToolboxTable = _oToolbox.ToolboxTable _oToolbox.Release CATCH TO oExc MESSAGEBOX(oExc.Message) lQuit = .T. ENDTRY IF lQuit RETURN ENDIF TRY *-- Abre la tabla de contenidos del Toolbox del usuario y revisa si *-- ya existen sus herramientas en ella USE (cToolboxTable) IN 0 ALIAS ToolboxTable SELECT ToolboxTable LOCATE FOR LEFT(UniqueID,10)=="MASSI.COOL" *-- Si no se ha encontrado su conjunto de herramientas, *-- crea una carpeta para guardar la biblioteca de clases, *-- copia la biblioteca de clases, y agrega los registros de este conjunto de *-- herramientas en la tabla de contenidos del ToolBox. IF NOT FOUND() TRY MD (cTargetFolder) CATCH ENDTRY COPY FILE cSourceFolder+"CoolTools.vc*" TO cTargetFolder+"CoolTools.vc*" APPEND FROM (cSourceFolder+"CoolToolbox.DBF") ENDIF CATCH TO oExc MESSAGEBOX(oExc.Message) lQuit = .T. FINALLY IF USED("ToolboxTable") USE IN ToolboxTable ENDIF ENDTRY IF lQuit RETURN ENDIF *-- Re-abre el Toolbox que muestra la herramienta instalada. DO (_TOOLBOX) WITH "MASSI.COOLCAT" MESSAGEBOX("Sus Cool Tools han sido instaladas.") SET DELETED &cSetDeleted SELECT (nPrevArea)

Ahora su nuevo conjunto de herramientas Cool Tools está listo para su distribución. Los archivos que necesita distribuir están en la carpeta Microsoft Visual FoxPro 8\CoolTools y se listan en la Tabla 3.

Nombre del Descripción

Page 8: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

campo CoolToolbox.dbf CoolToolbox.fpt

Estos archivos contienen los datos del conjunto de herramientas que serán cargados en el ToolBox.

CoolTools.vcx CoolTools.vct

Estos archivos contienen la clase Cool que tienen los desarrolladores actualmente para su utilización.

Setup.prg Este es el programa de instalación.

Tabla 3. Los archivos necesarios para distribuir el conjunto de herramientas Cool Tools.

Empaquetar y distribuir conjuntos de herramientas

Hay muchas vías para crear su paquete de instalación, desde la vía de un simple .Zip hasta un paquete instalador completo (Microsoft Installer - MSI). Sin embargo, hay una forma aun mejor para distribuir e instalar este conjunto de herramientas de terceros al crear un panel de tareas en el Administrador del panel de tareas. El Administrador del panel de tareas, es otra nueva característica del IDE de Visual FoxPro 8.0. Se utiliza para crear paneles de tareas que el usuario pueda instalar. Después que el usuario instale el panel, puede proporcionar un enlace que llame primero al código de setup para su conjunto de herramientas. Al crear un panel de tareas, puede además, proporcionar contenido dinámico para comunicar cualquier actualización, ayuda u otra información que se relacione con el conjunto de herramientas Cool Tools. Los paneles pueden consistir de XML/XSLT, HTML, mostrar páginas Web enteras en Internet, llamar a Servicios Web, o contener controles de Visual FoxPro. La mejor parte es, que el Administrador del Panel de tareas empaqueta automáticamente todos los archivos dependientes en un solo archivo, para su distribución.

Para este ejemplo puede crear un panel HTML que traiga contenido dinámico desde un archivo XML en su PC local. En realidad, el contenido del panel debe venir de un Servicio Web de su compañía, una Intranet o Internet. Además de HTML, XML, y XSLT, los paneles de tareas pueden ejecutar también código de Visual FoxPro enriquecido desde una biblioteca de clases o archivo de programa. Si no se ha familiarizado con los lenguajes mark-up (de etiquetas), puede crear fácilmente paneles con código escrito en Visual FoxPro.

Crear un panel de tareas

Primero, abra el Administrador del panel de tareas, haga clic en el botón Options (Opciones) para abrir el cuadro de diálogo del panel de tareas Opciones. En el árbol de la izquierda, seleccione Task Pane Manager (Administrador de Panel de tareas) – Customize (Personalizar) y luego haga clic en el botón Customize Panes (Personalizar paneles). Esto abre el formulario Panel de personalización. Haga clic en el botón New (Nuevo Alt - N) para crear un nuevo panel. Se le pregunta por vendor name (un nombre de suministrador) y un unique ID (ID único). Debe seguir la misma convención para el nombre que fue descrita anteriormente al crear un conjunto de herramientas. En la caja del nombre, escriba Cool Tools, y seleccione HTML como el Pane Type (Tipo de panel) (Figura 3).

Page 9: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

Figura 3. Establezca un panel de tareas HTML especificando su nombre de suministrador e ID único.

Se ha creado un nodo Cool Tools en el árbol del panel de contenido, a la derecha, y se muestra una ficha General. Este nodo es referido al contenido de la raíz. Puede seleccionar una imagen para mostrar en el Administrador del panel de tareas haciendo clic en el botón Select Image (Figura 4), en caso contrario, se muestra una imagen predeterminada.

Figura 4 Las secciones de contenido, que se crean, se muestran en el árbol del panel de contenido en el formulario Panel de personalización.

Añadir un panel de contenido

Haga clic en el botón Add (Agregar Alt+D) para añadir una sub-sección de contenido. De forma predeterminada, crea una sección llamada New Content (Contenido nuevo). En la ficha General, escriba el nombre Install. Esta sección, será un vínculo estático que ejecute un código de manipulador que llame al script de instalación (Setup.prg). Abra la ficha Data (Datos), y seleccione Static Text para Source (Origen), y escriba el siguiente HTML:

<a href="vfps:runinstaller" class="button">Install Tool Set</a>

Page 10: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

La sintaxis especial href vfps: llama al código del manipulador, pasando la acción runinstaller. Abra la ficha Handler Code (Código del manipulador) y entre el siguiente código de Visual FoxPro:

LPARAMETERS cAction, oParameters, oBrowser, oContent TRY DO CASE CASE cAction == "runinstaller" DO (oContent.CacheDir+"setup.prg") ENDCASE ENDTRY

La propiedad CacheDir en el objeto Content devuelve la ruta completa del directorio donde su panel de tareas está instalado. Aquí es donde los archivos del conjunto de herramientas serán instalados (esto lo veremos luego). Cuando hace clic en el enlace Tool Set en el panel de tareas se ejecuta el código del Setup.prg

Luego, cree la sección de contenido dinámico. Si no desea publicar el contenido dinámico en su panel de tareas, puede saltarse la próxima sección.

Agregar panel de contenido dinámico

Para crear una sub-sección de contenido dinámico, haga clic en el botón Add (Agregar Alt+D) y escriba What’s new en el cuadro de texto Name. Esta sub-sección de contenido muestra los datos desde un archivo XML. Entonces, esta sección se mostrará al inicio, haga clic en las flechas mover arriba localizada sobre el árbol del panel de contenido. Luego abra la ficha Data (Datos), y seleccione URL para Source y escriba lo siguiente en el cuadro de texto:

file:///c:/coolinfo.xml

En realidad, esto debe ser una dirección http: para un archivo localizado en Internet. Sin embargo, para este ejemplo, vendrá de un archivo local. Tenga en mente, sin embargo, que este archivo no se distribuye con el panel de tareas, así que especificando un archivo local aquí, no trabajará en otro PC. Sin embargo, esta técnica es muy buena para hacer comprobaciones.

Ahora cree el archivo CoolInfo.xml, y colóquelo en su disco C. El esquema del XML es totalmente decisión suya. En este momento especificará un estilo de hoja, así que tiene total flexibilidad en la forma en que estructure su dato. De hecho, existen muchas vías por las que el panel de tareas puede ser creado que el archivo contenido no sea un XML. Por ejemplo, el contenido XML es muy simple.

<?xml version='1.0' encoding='windows-1252' standalone='no'?> <VFPData> <content> <name>Página de inicio de Cool Tools</name> <link> <![CDATA[vfps:linkto?url=http://www.massitools.com/default.htm]]> </link> <desc>¡ Haga un viaje por los productos Cool Tool !</desc> </content> <content> <name>Referencias de Cool Tools </name> <link> <![CDATA[vfps:linkto?url=http://www.massitools.com/help.htm]]> </link> <desc>Acceso al fichero de ayuda de Cool Tools</desc> </content>

Page 11: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

<content> <name>Noticias de Cool Tools</name> <link> <![CDATA[vfps:linkto?url=http://www.massitools.com/news.htm]]> </link> <desc>Reciba la información más actualizada de Cool Tools.</desc> </content> </VFPData>

Existen tres nodos de contenido definidos en el archivo XML que contienen una breve descripción y las URLs de las páginas Web de Internet (aunque las URLs en este ejemplo no existen en realidad). Ahora especifique la transformación de este dato. Haga clic en la ficha Transform Data (Transformar datos), seleccione XSL como Type (Tipo), Static Text (Texto estático) como Source (Fuente) y entre la siguiente transformación:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="VFPData"> <table border="0" width="100%" cellpadding="2" cellspacing="0" > <xsl:apply-templates /> </table> </xsl:template> <xsl:template match="content" name="contents"> <xsl:variable name="linkvar" select="link"/> <tr> <td> <a href="{$linkvar}"><xsl:value-of select="name"/></a> </td> </tr> <tr> <td class="description"> <xsl:text>- </xsl:text><xsl:value-of select="desc"/> </td> </tr> </xsl:template> </xsl:stylesheet>

Esto transforma su XML en una tabla HTML que será utilizada en la transformación final del contenido raíz. Ahora el XML contenido en el archivo CoolInfo.xml es descargado desde la localización específica y guardado de acuerdo a los parámetros del Administrador del panel de tareas. Si la conexión no puede ser establecida después, se utiliza la copia caché. Si el URL no puede ser encontrado la primera vez, abra la página, puede especificar el dato XML predeterminado para mostrar en la ficha Default Data (Dato predeterminado)

Fusionar sub-secciones de contenido

Ahora que ha creado las sub-secciones de contenido, necesita colocarlas junto a la raíz de la sección de contenido, que es la información mostrada en el panel de tareas. Seleccione la raíz del contenido de Cool Tools desde el árbol del Panel de contenido. Haga clic en la ficha Data (Datos) y seleccione Static Text como Source (Fuente). Entre lo siguiente en el cuadro de edición:

<VFPData> <!-- XMLCONTENT --> </VFPData>

El comentario XML especifica que el XML interno contenido será el dato de origen para este panel. Cuando el Administrador del panel de tareas genere este panel, reemplaza el comentario <!-- XMLCONTENT --> con el dato contenido desde todas las sub-secciones antes de que se ejecute su propia transformación final. Especifique la transformación final en el documento HTML en la ficha Transform Data (Transformación de datos). En esta ficha, seleccione XSL como el Type (Tipo) y Static Text como Source (Origen). Luego escriba la siguiente transformación XSL.

Page 12: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html" /> <xsl:template match="VFPData"> <html> <head> <title>Cool Tools</title> <style> BODY { font-family:verdana; font-size:9pt; margin-top:0px; margin-left:2px; margin-right:2px; margin-bottom:2px; } H3 {margin-bottom:0px; margin-top:0px; font-weight: bold} A:link {color: #0033CC;text-decoration: none} A:visited {text-decoration: none} A:hover {color: #CC0000;text-decoration: underline} A {text-decoration: underline; color: #0066FF} TD {font-size:9pt} TD.TableTitle { padding:2px;background-color:#0000FF;color:#FFFFFF; } H3 {margin-bottom:0px;margin-top:0px; font-weight: bold} TD.Description {font-size:8pt; } A.button { background:#E0DFE3; font-weight:bold; padding:2px; margin-left:0px; margin-right:2px; border-top:1px solid #E5E4E8; border-left:1px solid #E5E4E8; border-bottom:1px solid #6699CC; border-right:1px solid #6699CC; color: #0033CC font-size:10pt; line-height:2em; text-align:center; } </style> </head> <body> <table cellSpacing="0" cellPadding="0" width="100%"> <tr> <td class="TableTitle" width="100%" nowrap="nowrap"> <h3>Cool Tools</h3> </td> </tr> <tr> <td></td> </tr> <xsl:for-each select="PaneContent"> <tr> <td height="10"></td> </tr> <tr> <td> <xsl:value-of select="HTMLText" disable-output-escaping="yes"/> </td> </tr> </xsl:for-each> </table> </body> </html>

Page 13: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

</xsl:template> </xsl:stylesheet

Este estilo de hoja convierte un XML en un documento HTML final, que es mostrado en el panel. Esto primero especifica los estilos para formatear el HTML en estilo de cascada estándar hojas sintaxis. El código importante, sin embargo, está localizado entre las etiquetas <body></body>. Esto especifica para cada sub-sección de contenido del panel, la salida del dato contenido en el nodo <HTML Text>. Como se mencionó previamente, el Administrador del panel de tareas crea un XML internamente que contiene todas las sub-secciones de contenido del dato transformado. Tiene un nodo <PaneContent> para cada sub-sección que cree que contenga información en la sub-sección de contenido. Es en el nodo <HTMLText> que residen los datos transformados desde la sub-sección. Por tanto en el XSLT precedente, todo lo que hace realmente es sacar el contenido en todas las sub-secciones y formatearlo en un documento HTML bien-formado. Puede echar un vistazo a alguno de los paneles de tareas existentes, tales como Start (Inicio) y Servicios Web XML, para ver más ejemplos de esta técnica.

Al hacer Clic en el botón Apply (Aplicar) en el formulario Panel de personalización, el Administrador del panel de tareas muestra el panel Cool Tools (Figura 5)

Figura 5. Puede crear fácilmente un panel de tareas para distribuir su conjunto de herramientas y mostrar contenido dinámico de Internet.

Verá el contenido XML mostrado en la parte superior de la sección del panel. Si modifica el archivo CoolInfo.xml y hace clic en el botón Refresh en el Administrador del panel de tareas, se actualiza la sección de contenido. Esta es una de las vías por las que puede fácilmente colocar contenido dinámico en los escritorios de los usuarios.

Empaquetar archivos dependientes

Ahora que ya ha establecido el panel de tareas, es el momento de añadir el script del setup y los archivos del conjunto de herramientas en el paquete del panel de tareas. Seleccione View Files (Ver archivos) en la parte superior derecha del formulario de personalización. Esto cambia lo mostrado, de forma que pueda administrar los archivos en su paquete de distribución. Haga clic en el botón Add (Agregar Alt+A) y seleccione Setup.prg, CoolTools.vcx, y CoolToolbox.dbf. (Seleccionando ambos archivos VCX y DBF incluirán los archivos VCT y FPT automáticamente). Luego haga clic en Apply (Aplicar) en la parte inferior del formulario para guardar los cambios. El Administrador

Page 14: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

del panel de tareas puede ahora empaquetar estos archivos en un archivo de distribución XML. Será instalado en la caché del panel en los PC de los usuarios cuando ellos instalen el panel de tareas. Recuerde, cuando se ejecuta el Setup.prg, el conjunto de herramientas es instalado y la biblioteca CoolTools es copiada a una carpeta debajo del directorio raíz de Visual FoxPro.

Crear, distribuir e instalar el paquete

Para crear el paquete de distribución del panel de tareas, seleccione el panel de tareas Cool Tools en el formulario Panel de personalización, y haga clic en Publish (Publicar Alt+P). Se pregunta por el tipo de paquete a crear. Seleccione Publish all content in pane (Publicar todo el contenido del panel), asegúrese de que esté seleccionada la casilla de verificación Publish file associates with the pane (Publique todos los archivos asociados con el panel), y luego haga clic en OK. Seleccione la carpeta, escriba un nombre para el archivo paquete XML (el nombre predeterminado es cool_tools.xml) y luego haga clic en Save (Guardar). Este proceso empaqueta toda la información del panel y cualquier archivo que haya sido agregado al panel en la sección Files (Archivos). Todo lo que necesita distribuir es un único archivo XML. Cuando el panel está instalado, el panel de tareas desempaqueta todos los archivos y los coloca en el panel caché.

Puede comprobar la instalación de su tarea y el conjunto de herramientas eliminando el panel de tareas Cool Tools. Seleccione el panel, haga clic en Delete (Eliminar) y luego, haga clic en Save (Guardar) en el formulario del panel de personalización. En el cuadro de diálogo Options (Opciones) del Administrador del panel de tareas seleccione Task Pane Manager (Administrador del panel de tareas) > Customize (Personalizar) desde el árbol y haga clic en el botón Install Pane (Instalar panel). Navegue al panel cool_tools.xml y haga clic en OK. El panel Cool Tools aparece al final de la lista. Para verificar adecuadamente la instalación del conjunto de herramientas, primero asegúrese de que ha eliminado la categoría Cool Tools de su ToolBox, si existiera allí. Luego, renombre la carpeta \CoolTools que se encuentra en el directorio raíz. El programa setup crea esta carpeta y copia la biblioteca de clases CoolTools del caché del panel. Haga clic en el vínculo Install Tool Set para ejecutar la instalación y luego mire el ToolBox para ver aparecer la categoría Cool Tools.

Al instalar paquetes de paneles XML, que descarga de Internet, asegúrese de que puede confiar plenamente en su suministrador. Luego, que es instalado un panel de tareas, puede ejecutar código de Visual FoxPro en su contexto seguro – por eso; ¡tenga cuidado! Sin embargo, si usted es un suministrador de herramientas, tendrá ya una firma digital para sus descargas. Distribuir paneles dentro de la comunidad de desarrolladores no es más peligroso que intercambiar cualquier otro código – sólo asegúrese de quien se lo envía.

Nota de la traductora. Si desea conocer todos los detalles del Administrador del Panel de tareas, le recomiendo el artículo Inside the Visual FoxPro 8.0 Task Pane Manager, escrito por Beth Massi, que se encuentra enhttp://msdn.microsoft.com/library/en-us/dnfoxgen8/html/vfp8_taskpanemgr.asp

o su versión en idioma español El Administrador de panel de tareas de Visual FoxPro 8.0 visto por dentro, que se encuentra enhttp://www.portalfox.com/article.php?sid=1007

Ahora que comprende cómo crear un conjunto de herramientas sencillo y cómo distribuirlo, a través de un panel de tareas dinámico, debe conocer sobre el comportamiento de los elementos del ToolBox.

Puede crear un comportamiento personalizado llamado add-in sin que conozca mucho de la arquitectura del ToolBox. Sin embargo, para crear un add-in realmente útil, necesita estar

Page 15: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

consciente de la arquitectura, tablas de datos y elementos de clases antes, para que pueda beneficiarse de todo el poder que proporciona el ToolBox.

Arquitectura del ToolBox

La aplicación Toolbox reside en el directorio raíz de Visual FoxPro (HOME()) y se llama Toolbox.app. Como ha visto anteriormente, el contenido específico para cada usuario se guarda en el archivo ToolBox.dbf que ToolBox lee para cargar las herramientas, categorías y filtros que el usuario ha creado. La localización del contenido del ToolBox es guardado en el archivo de recursos FoxUser y lo predetermina en la carpeta HOME(7).

La aplicación ToolBox también lee la tabla llamada Tooltype que guarda información sobre las categorías y tipos de herramientas admitidos por ToolBox. Esta tabla controla cómo la aplicación ToolBox va a cargar las clases de herramientas desde la biblioteca de clases _toolbox.vcx. Esta biblioteca de clases contiene la implementación de clases para todas los tipos de categorías y herramientas. La biblioteca de clases ToolBox.vcx y la tabla Tooltype se guardan en una carpeta \ToolBox en la raíz de Visual FoxPro. Tener este metadato y biblioteca de clases guardados fuera de la aplicación ToolBox.app permite que para la creación y distribución de una nueva categoría y herramienta, el desarrollador puede necesitar en el futuro. Esto significa que el ToolBox puede desarrollarse tanto como la propia comunidad de desarrolladores se lo permita.

El motor del ToolBox es responsable de cargar el formulario ToolBox, leer las tablas de datos y cargar las clases de herramientas correctas en tiempo de ejecución. Puede querer cambiar la implementación de un elemento de clases de herramientas sin tener que recompilar ToolBox.app. Cuando vea ejemplos de cómo crear nuevas herramientas y categorías, va a comprender realmente lo valiosa que llega a ser esta característica.

La variable del sistema _TOOLBOX especifica la ruta y nombre de archivo para el ToolBox de Visual FoxPro. De forma predeterminada, esta ruta es el directorio raíz de Visual FoxPro y el nombre es ToolBox.app. Sin embargo, puede especificar una ruta o nombre de archivo para _TOOLBOX en la ficha Archivos en el cuadro de diálogo Opciones de Visual FoxPro. Puede pasar un parámetro de cadena que es el ID de la categoría a la aplicación ToolBox que especifique la categoría a mostrar al abrir.

DO (_TOOLBOX) WITH "MASSI.COOLCAT"

Adicionalmente, cuando el formulario ToolBox se abre en el IDE de Visual FoxPro, la variable global _oToolbox está expuesta. Como ha visto ya, esta variable puede ser manipulada al instalar conjuntos de herramientas de tal forma que el ToolBox pueda ser cerrado mientras se ejecuta el script de instalación. Puede establecer o crear tablas de contenido de ToolBox mediante programación utilizando la propiedad oToolbox.ToolboxTable. Otras propiedades útiles de lectura/escritura son _oToolbox.FilterName y _oToolbox.Category, las que pueden tener un ID único o el nombre del filtro o categoría que quiere aplicar al ToolBox.

Todo el código fuente para la aplicación ToolBox está incluido en el Xsource.zip contenido en la carpeta \Tools\XSource\ bajo el directorio raíz de Visual FoxPro.

Tablas de contenido del ToolBox

Como se ha mencionado previamente, la tabla de contenidos del ToolBox se guarda de forma predeterminada en su carpeta \Documents and Settings\UserName\Application Data\Microsoft\Visual FoxPro 8\Toolbox\ y se llama ToolBox.dbf. El nombre y localización puede

Page 16: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

ser modificado en Customize Toolbox (Personalizar ToolBox) > Options (Opciones). Esta tabla guarda todos los elementos, categorías, filtros y add-in para cada usuario. Es importante familiarizarse con la estructura de esta tabla, si desea crear comportamientos personalizados o definir conjuntos de herramientas personalizados. La tabla 4 describe la estructura y la descripción para cada campo de la tabla de contenido del ToolBox.

Tipo

Descripción

C(25), Indexado

Un ID único para cada artículo creado. Debe tener el formato de NombreDeCompañia.IDUnico Por ejemplo: microsoft.textscraps

C(1), Indexado

Indica el tipo de elemento del Toolbox:

'C' = category (categoría) 'F' = favorites category (categoría favorita) 'S' = filter set (conjunto de filtro) 'T' = tool item (elemento de herramienta) 'I' = filter item (elemento de filtro) 'A' = add-in behaviour (comportamiento add-in) 'M' = pasa el menu contextual como el segundo parámetro que puede ser utilizado para crear un menú en lugar de invocar directamente un comportamiento add-in.

C(25), Indexado

Referencia el tipo de herramienta como está definida en ToolType.dbf, y es copiada directamente desde el campo ToolType.UniqueID al ser creado el registro.

M

Nombre amistoso para el tipo de herramienta. Es copiado directamente desde el campo ToolType.ToolType cuando se crea el registro.

C(25)

Para los elementos del menú y las herramientas (ShowType="T" OR "I"), referencia el Toolbox.UniqueID de la categoría padre o conjunto de filtros a los que pertenece. Para add-in (ShowType="A"), referencia el Toolbox.UniqueID de la opción del menú padre a la que pertenece el add-in.

C(100)

Nombre amistoso para la herramienta, categoría o conjunto de filtros.

M

Imagen a mostrar para el elemento de la herramienta.

Page 17: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

C(10)

Designa el tipo de clase. Se corresponde a la propiedad ClassType en el elemento de clases

M

Designa la biblioteca de clases para las herramientas de clase (por ejemplo el nombre del archivo VCX o PRG en el cual está definida la clase de herramienta).

M

Nombre de la clase del elemento del Toolbox. Si no se especifica, se determina de forma predeterminada a partir del campo ShowType, por ejemplo, _classtool.

M

El elemento de biblioteca de clases Toolbox donde está contenida la clase.Si no se especifica, el predeterminado es _toolbox.vcx.

M

Texto que es mostrado en ToolTips y en la sección de texto Help del Toolbox.

M

Archivo de Ayuda a utilizar cuando se presiona F1 o se selecciona Help desde el menú contextual.

N(10,0)

ID de ayuda contextual para utilizar cuando se presiona F1 o se selecciona Help desde el menú contextual.

M

Guarda el dato específico para el elemento. Es la información del cuadro de diálogo propiedades del elemento y categoría. Por ejemplo, para un elemento de clases puede ser específicamente la clase base, nombre del objeto, y propiedades adicionales en este formato:

<baseclass>Editbox</baseclass> <objectname>Editbox</objectname> <properties></properties>

I

Indica el orden en que el elemento aparece en este contenedor.

L

Si el registro es una categoría o una categoría favorita, establezca en TRUE para impedir que se agreguen nuevos elementos.

L

Page 18: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

Establezca a TRUE (Verdadero) para evitar eliminar este elemento de herramienta o categoría.

L

Establezca a TRUE (Verdadero) para evitar renombrar este elemento o categoría.

L

Establezca a TRUE para marcar el elemento como inactivo para evitar que aparezca en el Toolbox.

M

Definido por el usuario

T

Fecha / hora de última modificación

Nombre del campo UniqueID ShowType

ToolTypeID ToolType

ParentID ToolName

ImageFile ClassType

SetID ClassName

ClassLib ToolTip

HelpFile HelpID

ToolData DisplayOrd LockAdd

LockDelete LockRename

Inactive User

Modified

Page 19: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

Tabla 4. Campos en la tabla de contenido del ToolBox.

Tabla ToolType

Además de la tabla de contenidos del ToolBox, existe una tabla ToolType que se localiza en la carpeta \Toolbox\ de la aplicación ToolBox (\Program Files\Microsoft Visual FoxPro 8\Toolbox\). Si esta tabla no puede ser encontrada cuando comienza el ToolBox, se utiliza una versión incluida que se compila dentro de la aplicación ToolBox.app. Las tablas ToolType guardan información sobre las categorías y tipos de herramientas que admite ToolBox. Cada fila representa un tipo de categoría soportada o elemento de herramienta. Cuando el elemento de herramienta y categorías se crean en el ToolBox, la información del tipo de elemento que se crea se copia desde la fila apropiada en esta tabla en la tabla de contenidos del ToolBox. Si desea soportar un nuevo elemento de ToolBox, y/o una categoría, agregue filas en esta tabla.

Tipo

Descripción

C(25)

Un ID por cada registro creado. Las entradas que se agreguen deben tener el formato NombreDeCompañia.IDUnico.

C(1)

Indica el tipo de elemento del Toolbox:

'C' = category (categoría) 'T' = tool item (elemento de herramienta)

C(50)

Nombre amistoso para el tipo de herramienta.

M

Nombre de la clase del elemento del Toolbox. Si no se especifica, se determina de forma predeterminada a partir del campo ShowType, por ejemplo, _classtool.

M

El elemento de biblioteca de clases Toolbox donde está contenida la clase. Si no se especifica, el predeterminado es _toolbox.vcx.

M

Lista de los tipos de archivos delimitada por comas, a los que se les aplica Tooltype. Se utiliza para determinar el tipo del elemento creado cuando arrastra un archivo desde el Explorador hasta el Toolbox.

M

Page 20: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

Actualmente no está en uso. En el futuro, representará el ToolData predeterminado al crear un elemento de este tipo.

L

Establecer a TRUE para mostrar en un cuadro de lista los elementos de tipos disponibles al agregar un Nuevo elemento en el ToolBox.

L

Establecer a TRUE para mostrar el cuadro de diálogo propiedades después de crear un elemento/categoría de este tipo.

C(25)

Para tipos de categoría (ShowType = 'C'), se refiere a ToolType.UniqueID para el elemento predeterminado que debe contener esta categoría.

I

Indica el orden en que el elemento aparece en este contenedor.

M

Texto que es mostrado en ToolTips y en la sección de texto Help del Toolbox..

L

Establezca a TRUE para marcar el elemento como inactivo para evitar que aparezca en el Toolbox.

M

Definido por el usuario

T

Fecha / hora de última modificación

Nombre del campo UniqueID

ShowType ToolType

ClassName ClassLib

FileType DataValues

ShowNew

Page 21: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

PropSheet

DefaultID DisplayOrd

ToolTip Inactive

User Modified

Tabla 5. Campos de la tabla ToolType.

Biblioteca de clases ToolBox

La biblioteca de clases contiene la jerarquía de clases para todos los elementos de herramientas y categorías soportadas en el ToolBox (figura 6). De forma predeterminada, cada tipo de herramienta admitida contenida en la tabla ToolType se corresponde con clases en esta biblioteca. Herede de estas clases para sobrescribir comportamientos o admitir nuevos tipos. Puede además modificar esta biblioteca de clases directamente para cambiar el comportamiento de las clases admitidas. Si sólo desea agregar un nuevo menú contextual de comportamiento para un elemento, puede hacerlo a través de un add-in. Comprender las características generales de las clases en la biblioteca de clases, ayuda, aunque no es imprescindible, a la hora de crear sus propios add-in. Sin embargo, sí será necesario cuando cree su propia herramienta y tipos de categorías. En esta sección, echará un vistazo a algunos de los métodos y propiedades más importantes de esas clases. Se concentrará en los métodos comunes que típicamente sobrescribe para admitir sus propias herramientas.

Page 22: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

Figura 6. La jerarquía de clases del elemento de clases del ToolBox.

La jerarquía de clases, de las clases del ToolBox, comienza con la clase _root. Todos los elementos de herramientas y categorías para esta clase. Aquí es donde son definidos los métodos comunes que son utilizados OnClick, OnDblClick, OnKeyPress, OnOleSetData, OnStartDrag, y OnCompleteDrag. Estos métodos proporcionan un control finamente granulado de los comportamientos clic y arrastrar y soltar de todas las categorías y herramientas del ToolBox. Las propiedades más importantes y los métodos de las clases del ToolBox se enumeran a continuación.

Propiedades y métodos comunes

ShowAsLink: Esta propiedad está establecida a .T. (verdadero) si el elemento necesita ser mostrado en estilo de hipervínculo cuando el ratón le pasa por arriba. Esto se aplica solamente a elementos que no son categorías. Por ejemplo, el archivo de herramientas tiene esta propiedad establecida a verdadero.

oEngine: Esta propiedad contiene una referencia al motor del ToolBox y es utilizado para llamar los métodos del motor (verá ejemplos de utilización de esta propiedad al crear add-in y un tipo dinámico de categoría).

Page 23: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

OnDblClick(): Este método es llamado cuando se hace doble clic sobre el elemento con el ratón. También se ejecuta para un simple clic, si el doble clic no está seleccionado, para abrir el elemento del cuadro de diálogo Opciones.

OnClick(): Este método es llamado cuando se hace clic sobre el elemento con el ratón.

OnKeyPress(nKeyCode, nShiftAltCtrl): Este método es llamado cuando el objeto tiene el foco y se presiona una tecla.

OnRenderCategory(oToolCollection): Este método está disponible para las clases que heredan de la clase _category. Se ejecuta cuando se abre esta categoría, para llenarla con los elementos de herramientas. (Verá un ejemplo de utilización de este método cuando cree categorías dinámicas más adelante.)

CreateContextMenu(oContextMenu): Este método es llamado cuando es activado el menú contextual para un elemento. Es aquí donde son agregadas opciones del menú contextual. El parámetro oContextMenu es el objeto de menú que puede ser manipulado utilizando el método AddMenu, por ejemplo:

LPARAMETERS oContextMenu LOCAL oMenuBar oMenuBar = oContextMenu.Addmenu("Run", "oRef.RunItem()") oMenuBar.Bold= .T.

El primer parámetro del método AddMenu del menú contextual es el encabezado de la opción de menú. El segundo parámetro es una cadena que contiene el código a ejecutar cuando el elemento de menú es seleccionado, en este caso oRef.RunItem(). La variable oRef evalúa en tiempo de ejecución la instancia del objeto herramienta cuando el usuario escoge la selección del menú. En este ejemplo, es llamado el método RunItem del objeto. Sin embargo, un asistente u otro programa externo pueden ser ejecutados también. El método AddMenu de la clase del menú contextual devuelve un objeto barra de menú para que puedan ser establecidas sus propiedades como se muestra en la tabla 6.

Propiedad Tipo Valor predeterminado Descripción

Caption String Encabezado a mostrar en la barra de menú.

ActionCode String Código a evaluar y ejecutar cuando la barra de menú es seleccionada.

Picture String Nombre de la imagen a mostrar.

Checked Logical .F. Indica si la barra de menú es seleccionada. IsEnabled Logical .T. Indica si la barra de menú está disponible.

Bold Logical .F. Indica si la barra de menú tiene formato en negrita.

Tabla 6. Propiedades de un elemento Menu bar (barra de menú) Estas propiedades pueden ser pasadas también al método AddMenu como parámetros en el orden mostrado.

oContextMenu.Addmenu("Run", "oRef.RunItem()", "Picture.bmp", .F., .T., .T.)

Page 24: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

OnCreateDataValues(): Algunos elementos del ToolBox especifican información adicional en su hoja de propiedades. Por ejemplo, las herramientas basadas en archivos tienen una propiedad para el nombre del archivo. El método es llamado cuando el elemento es instanciado y llena una colección de propiedades para una instancia en particular. Esto se hace llamando al método AddDataValue que agrega una nueva propiedad en la colección oDataCollection. Esto añade opciones a la hoja de propiedades de los elementos:

LOCAL cName, xDefaultValue, cCaption, cToolTip, lReadOnly, ; cClassName, cClassLibrary cName = "filename" xDefaultValue = "" cCaption = "File name" cToolTip = "Specify a file which this tool represents" lReadOnly = .F. cClassName = "cfoxfilename" cClassLibrary = "" DODEFAULT() THIS.AddDataValue(cName, xDefaultValue, cCaption, cTooltip, lReadOnly, ; cClassName, cClassLibrary)

Parámetro Tipo Descripción cName String Nombre de la opción.

xDefaultValue Any (cualquier tipo)

Valor predeterminado.

cCaption String Encabezado a mostrar en la ficha propiedades. cTooltip String Texto ToolTip.

lReadOnly Logical Indica que el control es Sólo-Lectura.

cClassName String Nombre de la clase del control utilizado para colectar este valor de la propiedad.

cClassLibrary String Biblioteca de clases donde se define el control a mostrar. Si este parámetro no se especifica o está vacío, se predetermine igual a ToolboxCtrls.vcx que se compila dentro de la aplicación Toolbox.

<dl><dt>Tabla 7. Parámetros del método AddDataValue </dt></dl>

Los últimos dos parámetros de este método especifican el nombre de la clase y la localización de los controles para mostrarlos en la ficha de propiedades. Si una biblioteca de clases, no está especificada, se utiliza la ficha propiedades de la clase control contenida en la biblioteca de clases ToolboxCtrls.vcx compilada. Las clases comunes en esta biblioteca de clases se listan en la tabla 8.

Clase del control en la ficha propiedades Clase Base cFoxCheckbox Checkbox

cFoxEditbox EditBox cFoxSpinner Spinner

cFoxTextBox TextBox cFoxDirectory Container – (Muestra el cuadro de diálogo GETDIR()

cFoxFileName Container – (Muestra el cuadro de diálogo GETFILE()

Page 25: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

Tabla 8. Clases comunes en la biblioteca de clases. Adicionalmente el método GetDataValue devuelve el valor de la propiedad desde la colección y SetData Values establece un valor para una propiedad existente en la colección. Puede utilizar además el método EvalText para evaluar el valor de la propiedad. Si el valor de la propiedad está rodeado por paréntesis, EvalText devuelve la versión evaluada del valor; en caso contrario, trata el valor como un literal. Esto es útil si la propiedad contiene código script, funciones o variables.

cFileName = THIS.EvalText(NVL(THIS.GetDataValue("filename"), ''))

Métodos OLE Arrastrar y soltar

Las clases de herramientas están basadas en la clase Custom de Visual FoxPro y no heredan de Visual FoxPro el método arrastrar y pegar, que les son tan familiar al desarrollador. Sin embargo, las clases de herramienta son enviadas a los métodos OLE arrastrar y pegar llamados desde el botón ToolBox que las contienen. Por ejemplo, el método OLEStartDrag de la clase toolboxbutton llama al método OnStartDrag del elemento de herramienta de clase. Para más información sobre el OLE de arrastrar y pegar vea el resumen de OLE Arrastrar y pegar en la documentación de Visual FoxPro.

OnOleSetData(oDataObject, eFormat, oDropTarget, nMouseXPos, nMouseYPos): Este método establece el dato a arrastrar y pegar. Puede colocar el dato en el oDataObject en formato especificado con el método SetData.

#include "foxpro.h" LPARAMETERS oDataObject, eFormat, oDropTarget, nMouseXPos, nMouseYPos LOCAL cText IF VARTYPE(eFormat) == 'N' AND eFormat == CF_TEXT AND ; VARTYPE(oDropTarget) <> 'O' cText = NVL(THIS.GetDataValue("filename"), '') oDataObject.SetData(cText, eFormat) ENDIF

OnStartDrag(oDataObject, nEffect): Se llama cuando comienza la operación arrastrar.

OnCompleteDrag(nEffect, oDropTarget, nMouseXPos, nMouseYPos): Es llamado cuando el elemento ToolBox es soltado en su destino.

LPARAMETERS nEffect, oDropTarget, nMouseXPos, nMouseYPos LOCAL lcSCXName = "" THIS.DropOnContainer(oDropTarget, lcSCXName, nMouseXPos, nMouseYPos) RETURN

DropOnContainer(oDropTarget, cSCXName, nXPos, nYPos): Herramienta que hereda de _baseclasstool que este método, el que es llamado desde el método OnCompleteDrag. El código que se ejecuta establece el dato adecuado a pasar al método. El objeto puede ser soltado en el área de trabajo de diseñadores y ventanas de edición.

Crear comportamientos Add-In

Page 26: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

Utilice add-in para extender el comportamiento de un tipo particular de elemento o categoría al llamar código de personalización que coloca en el ToolBox de la tabla contenido. Puede fácilmente crear un add-in que aparezca en el elemento del menú contextual para ejecutar acciones de menú. No necesita conocer todos los detalles de la arquitectura de la aplicación ToolBox para crear un add-in. Aunque haya saltado la discusión de la arquitectura, puede crear todavía un comportamiento add-in, y distribuir su conjunto de herramienta a otros desarrolladores. Aunque, para crear un add-in realmente útil, vea el siguiente ejemplo, que accede a propiedades y métodos de una clase de herramientas, discutido antes.

Comportamiento Add-in de elemento de herramienta.

El ToolBox admite muchos tipos de elementos y su comportamiento. Se describen en la Tabla 9.

Tipo de herramienta Comportamiento

Clases basadas en Bibliotecas de clases

Estos elementos representan clases que pueden ser diseñadas en el diseñador de clases (Checkbox, Label, TextBox, Form, etc). Estas clases se definen en un archivo de biblioteca de clases (.vcx). Puede arrastrar y soltar este tipo de elementos a las áreas de trabajo de los diseñadores de clases o formularios para crear una instancia del objeto. Puede además arrastrar y soltar a un editor de texto o ventana comandos para crear una llamada para instanciar el objeto. Es posible modificar y crear clases desde el menú contextual. Seleccionando Modify (Modificar) se abre el diseñador de clases para esta clase. Haga clic en Create subclass (Crear subclase) para abrir el cuadro de diálogo Clase nueva de Visual FoxPro (CREATE CLASS). El elemento clase formulario también tiene disponible Create form en el menú contextual. Seleccionando ese elemento del menú se crea un formulario Nuevo formulario (.scx) que hereda desde la clase formulario.

Clases basadas en programas

Estos elementos representan clases que pueden ser definidas en un archivo de programa (.prg). Arrastrar y pegar tiene el mismo efecto que para los elementos de clases basadas en bibliotecas de clases. Desde el menú contextual también está disponible la acción Modify (Modificar) Haga clic en Modify para abrir un archivo de programa que contenga la definición de clases.

Clase base

Estos elementos representan las clases base de Visual FoxPro que están contenidas en la categoría de clases bases de Visual FoxPro. Arrastrar y pegar tiene el mismo efecto que para los elementos de clases basadas en bibliotecas de clases. Haga clic en Create subclass (Crear subclase) en el menú contextual para abrir el cuadro de diálogo Clase nueva de Visual FoxPro (CREATE CLASS).

Archivo de biblioteca de clases

Estos elementos representan los archivos de bibliotecas de clases como tal (.vcx). Arrastre y suelte un elemento de la librería de clases a un editor o ventana de comando para obtener la ruta del archivo y su nombre. Haga clic en el elemento para abrir el cuadro de diálogo Modificar clase, lo que es lo mismo que seleccionar Modify (Modificar) en el menú contextual.

Programa

Estos elementos representan los archivos de programas (.prg, .mpr). Arrastre y suelte un elemento de programa a un editor o ventana de comando para obtener la ruta del archivo y su nombre. Haga clic en el elemento para abrir el archivo en el editor, lo que es lo mismo que seleccionar Modify (Modificar) en el menú contextual. Puede además seleccionar Run (ejecutar) en el menú contextual para ejecutar el programa.

Page 27: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

Formulario

Estos elementos representan los archivos de formularios (.scx). Arrastre y suelte un elemento de formulario a un editor o ventana de comando para obtener la ruta del archivo y su nombre. Haga clic en el elemento para abrir el formulario en el diseñador de formularios, lo que es lo mismo que seleccionar Modify (Modificar) en el menú contextual. Puede además seleccionar Run (ejecutar) en el menú contextual para ejecutar el formulario.

Menú

Estos elementos representan los archivos de menú (.mnx). Arrastre y suelte un elemento de menú a un editor o ventana de comando para obtener la ruta del archivo y su nombre. Haga clic en el elemento para abrir el menú en el generador de menú, lo que es lo mismo que seleccionar Modify (Modificar) en el menú contextual.

Informe

Estos elementos representan los archivos de informe (.frx). Arrastre y suelte un elemento de informe a un editor o ventana de comando para obtener la ruta del archivo y su nombre. Haga clic en el elemento para abrir el informe en el generador de informes, lo que es lo mismo que seleccionar Modify (Modificar) en el menú contextual. Puede además seleccionar Run (ejecutar) en el menú contextual para ejecutar el informe.

Proyecto

Estos elementos representan los archivos de proyectos (.pjx). Arrastre y suelte un elemento de proyecto a un editor o ventana de comando para obtener la ruta del archivo y su nombre. Haga clic en el elemento para abrir el proyecto en el Administrador de proyectos, lo que es lo mismo que seleccionar Modify (Modificar) en el menú contextual.

Base de Datos

Estos elementos representan los archivos de Bases de datos de Visual FoxPro (.dbc). Arrastre y suelte un elemento de Base de datos a un editor o ventana de comando para obtener el comando OPEN DATABASE con la ruta del archivo y su nombre. Haga clic en el elemento para abrir el archivo en el editor, lo que es lo mismo que seleccionar Modify (Modificar) en el menú contextual.

Tabla

Estos elementos representan los archivos de tablas de datos de Visual FoxPro (.dbf). Arrastre y suelte un elemento de tabla de datos a un editor o ventana de comando para obtener el comando USE con la ruta del archivo y su nombre. Puede también hacer clic en Open (Abrir) en el menú contextual para abrir la tabla. Arrastre y suelte un elemento de tabla al diseñador de formularios, o haga doble clic cuando el diseñador esté abierto para agregar una cuadrícula (grid) al formulario y la tabla al entorno de datos. De forma predeterminada, suelta la clase base grid de Visual FoxPro. Puede cambiar esta clase en el cuadro de diálogo Opciones de Visual Foxpro la ficha Field Mappings (Mapeo de Campos) que se accede desde el menú Herramientas. Seleccione el tipo Multiple (Múltiplo) y haga clic en Modify (Modificar) para cambiar la clase y la información de la biblioteca de clases. Si no hay diseñadores abiertos, haga doble clic en el elemento de la tabla para visualizar la tabla, lo que es lo mismo que hacer clic en Browse (Visualizar) en el menú contextual. Puede además seleccionar Modify (Modificar) en el menú contextual para abrir el diseñador de tabla.

Imagen

Estos elementos representan los archivos de imágenes (.ani, .bmp, .cur, .dib, .gif, .ico, .jpg). Arrastre y suelte un elemento de imagen en el diseñador o haga doble clic cuando un diseñador está abierto para soltar un control imagen con el conjunto de propiedades del dibujo. Puede luego hacer clic en Open en el menú contextual para abrir la imagen en su editor de imagen predeterminado. Esto está controlado por el sistema operativo Windows (ShellExecute) y tiene el

Page 28: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

mismo efecto que hacer doble clic el archivo de imagen en el Explorador de Windows.

Aplicación

Estos elementos representan los archivos de aplicación (.app). Arrastre y suelte un elemento de aplicación a un editor o ventana de comando para obtener la ruta del archivo y su nombre. Haga clic en el elemento para ejecutar la aplicación, lo que es lo mismo que hacer clic en Run (ejecutar) en el menú contextual para ejecutar la aplicación.

Archivo de texto

Estos elementos representan los archivos de texto (.txt). Arrastre y suelte un elemento de archivo de texto a un editor o ventana de comando para obtener la ruta del archivo y su nombre. Haga clic en el elemento para abrir el archivo en el editor, lo que es lo mismo que seleccionar Modify (Modificar) en el menú contextual.

Text Scrap

Estos elementos son piezas de texto. Seleccione y arrastre el texto a la categoría Text Scrap para crear un elemento text scrap. Arrastre y suelte un text scrap a una ventana de edición, ventana de comandos, u otras aplicaciones de Windows que admite soltar y pegar textos. Los elementos Text scrap pueden ser evaluados utilizando características de FoxPro de text-merging Visual, ya que el código puede ser embedded en el text scrap y es evaluada cuando es arrastrada. Arrastre y suelte un text scrap a los diseñadores para soltar los controles etiquetas para cada línea en el scrap. Haga clic en Copy to clipboard (Copiar al PortaPapeles) en el menú contextual para copiar los contenidos del text scrap en el portapapeles de Windows.

Control ActiveX

Estos elementos representan los componentes ActiveX cargados. Puede arrastrar y soltar este tipo de elementos al área del diseñador de clases y formularios para soltar un Control OLE, o, arrastre y suelte en un editor de texto para crear una llamada a una instalación de un objeto. Puede además hacer clic en Open (Abrir) en el Object browser (visualizador de objetos) en el menú contextual para mostrar las propiedades de los componentes, eventos y métodos.

Servicio Web XML

Estos elementos representan los servicios Web XML registrados. Puede arrastrar y soltar este tipo de elementos para el área de trabajo del diseñador de clases y formularios para soltar un proxy de servicio Web que especifique. De forma predeterminada la clase WSHandler es utilizado en la librería de foundation clases _ws3client FoxPro. Arrastre y suelte un elemento de Servicio Web XML a una ventana de editor de texto para generar un código proxy automáticamente.

Otros tipos de archivos de ventanas

Elementos basados en otro tipo de archivo de Windows que no tiene un comportamiento específico soportado por el Toolbox puede también mantener, aún en las categorías, como un tipo de archivo genérico. Haga clic en estos elementos o haga clic en Open (Abrir) en el menú contextual para lanzar el editor predeterminado de Windows. Esto está controlado por el sistema operativo Windows (ShellExecute) y tiene el mismo efecto como un doble-clic en el archivo en el Explorador de Windows.

Tabla 9. Elementos del ToolBox y su comportamiento.

Puede crear su propio comportamiento add-in además de estos comportamientos agregando los registros en la tabla de contenidos del ToolBox. Estos add-in aparecen como opción del menú contextual. Por ejemplo, puede crear un add-in para herramientas de proyectos que generen la aplicación a partir del proyecto. Puede querer una opción Build Application (Generar aplicación)

Page 29: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

que aparezca en el menú contextual para todos los elementos de proyecto en el ToolBox. Al seleccionar, esto genera un archivo .app a partir del proyecto. Este tipo de add-in sencillo requiere que introduzca registros en la tabla de contenido.

Abra su tabla ToolBox, y agregue un nuevo registro, en el cual pondrá la información que se muestra en la tabla 10.

Campo Valor UNIQUEID MASSI.BUILDAPP

SHOWTYPE A TOOLTYPEID PJX

TOOLNAME Build Application INACTIVE .F.

Tabla 10. Información necesaria para agregar una opción de menú contextual Build Application (Generar aplicación)

La letra A en el campo ShowType y PJX en el campo ToolTypeID indican al ToolBox que este es un add-in para un elemento de herramienta de proyecto. Por tanto la opción Build Application va a aparecer en el menú contextual para todas las herramientas de proyectos en el ToolBox. Especifique el código a ejecutar en el campo ToolData

LPARAMETERS oToolItem LOCAL cFilename cFilename = oToolItem.GetDataValue("filename") IF FILE(cFilename) BUILD APP (FORCEEXT(cFilename, "APP")) FROM (cFilename) ENDIF

Se pasa un parámetro, oToolItem, que es una referencia de la herramienta de objeto donde fue activado el add-in. Puede acceder a cualquier propiedad o método del elemento y ejecutar cualquier código. Este add-in en particular convierte el proyecto en un archivo .app. Cierre la tabla ToolBox y re-inicie el ToolBox. En el menú contextual para todas las herramientas de proyecto del ToolBox aparecerá Build Application (Figura 7)

Page 30: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

Figura 7. Los Add-in pueden aparecer como opciones del menú contextual para un tipo de elemento en particular.

Otro ejemplo es crear una selección del menú para los elementos llamada Rename (Renombrar). Al seleccionar, este comando abre un cuadro de diálogo para introducir en nuevo nombre para la clase en la biblioteca de clases. Entonces se renombra la clase en la biblioteca de clases y se refresca la categoría. Abra su tabla ToolBox y agregue un registro nuevo para introducir la información que se muestra en la tabla 11.

Campo Valor UNIQUEID MASSI.RENAMECLASS SHOWTYPE A

TOOLTYPEID CLASS TOOLNAME Rename Class

INACTIVE .F.

Tabla 11. Información necesaria para agregar una opción de menú Rename en el menú contextual.

Luego, especifique el siguiente código en el campo ToolData

LPARAMETERS oToolItem LOCAL cClassName, cClassLib, cNewName, oException cClassName = oToolItem.GetDataValue("classname") cClassLib = oToolItem.GetDataValue("classlib") cNewName = INPUTBOX("Nuevo nombre para la clase:", "Rename Class (Renombrar clase)", cClassName) cNewName = LOWER(ALLTRIM(cNewName)) IF!EMPTY(cNewName) AND !(cNewName == LOWER(cClassName)) TRY

Page 31: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

RENAME CLASS (cClassName) OF (cClassLib) TO (cNewName) oToolItem.oEngine.RefreshCategory() CATCH TO oException MessageBox(oException.Message) ENDTRY ENDIF

Este Add-in en particular renombra la clase en la biblioteca de clases y luego refresca la categoría que elimina el elemento anterior y la anterior referencia de clases. Entonces el add-in crea un nuevo elemento con la referencia a ese nuevo elemento. Puede llamar al método RefreshCategory() en el motor del ToolBox para realizar esto.

Suponga que desea agregar otro comportamiento que sea Copy Class (Copiar clase). Al seleccionarlo, se abre el cuadro de diálogo donde introducirá el nombre de la clase nueva. Entonces, crea una copia del elemento de clase en la biblioteca de clases y refresca la categoría para mostrar esta nueva clase como un elemento del menú. Y luego, agregue un registro nuevo e introduzca la información que se muestra en la tabla 12.

Campo Valor UNIQUEID MASSI.COPYCLASS SHOWTYPE A

TOOLTYPEID CLASS TOOLNAME Copy Class

INACTIVE .F.

Tabla 12. Información necesaria para agregar una opción de menú Copy Class al menú contextual.

Luego, especifique el código a ejecutar en el campo ToolData:

LPARAMETERS oToolItem LOCAL cClassName, cClassLib, cTempClassLib, oException, cNewName cClassName= oToolItem.GetDataValue("classname") cClassLib = oToolItem.GetDataValue("classlib") cNewName = INPUTBOX("Nombre de la clase nueva:", "Copy Class (Copiar clase)", cClassName) cNewName = LOWER(ALLTRIM(cNewName)) IF !EMPTY(cNewName) AND !(cNewName == LOWER(cClassName)) cTempClassLib = ADDBS(SYS(2023)) + SYS(2015) TRY ADD CLASS (cClassName) OF (cClassLib) TO (cTempClassLib) RENAME CLASS (cClassName) OF (cTempClassLib) TO (cNewName) ADD CLASS (cNewName) OF (cTempClassLib) TO (cClassLib) oToolItem.oEngine.RefreshCategory() CATCH TO oException MessageBox(oException.Message) ENDTRY ERASE (cTempClassLib + ".vcx") ERASE (cTempClassLib + ".vct") ENDIF

Cierre y reinicie el ToolBox. Las opciones Copy Class y Rename Class aparecerán en el menú contextual de todas las herramientas de clase.

Page 32: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

En lugar de desordenar el menú contextual principal con estos dos add-in nuevos, puede especificar que las opciones Rename Class y Copy Class se muestren en un submenú llamado Class Stuff (Cosas de clases). Puede hacer esto fácilmente agregando la información de la tabla 13 en un nuevo registro de la tabla de contenidos del ToolBox.

Campo Valor UNIQUEID MASSI.CLASSSTUFF

SHOWTYPE A TOOLTYPEID CLASS

TOOLNAME Class Stuff INACTIVE .F.

Tabla 13. Información necesaria para agregar un submenú Class Stuff.

Luego, actualice el campo ParentID de los add-in Rename Class y Copy Class con el UniqueID del add-in de Class Stuff MASSI.CLASSSTUFF. No es necesario agregar ningún registro nuevo en el add-in Class Stuff, porque el ToolBox automáticamente generará la jerarquía de los menús add-in buscando el campo ParentID (figura 8).

Figura 8. Puede agregar fácilmente opciones add-in en sus propios sub-menús.

Como puede ver, los add-in pueden ser muy poderosos, y al mismo tiempo, muy sencillos de crear. Hasta ahora hemos creado opciones estáticas de menú. ¿Qué pasa si desea crear una opción dinámica de menú? Por ejemplo, suponga que desea agregar un comportamiento add-in a una herramienta de librería de clases que muestre sus clases miembro en un menú add-in. Al seleccionarlo, este menú add-in abrirá el Diseñador de clases. En dependencia de la biblioteca de clases seleccionada, este menú puede contener elementos diferentes. Afortunadamente, el ToolBox

Page 33: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

proporciona flexibilidad para crear manualmente el menú add-in, si escribe M en el campo ShowType cuando define un registro add-in (Tabla 14).

Campo Valor UNIQUEID MASSI.MODICLASSLIB

SHOWTYPE M TOOLTYPEID VCX

TOOLNAME Modify Class INACTIVE .F.

Tabla 14. La letra M en el campo ShowType le permite especificar un menú contextual en su código.

En el campo ToolData para este menú add-in, el siguiente código crea elementos del menú dinámicamente basados en los nombres de clases contenidos en el VCX. Esto lo hace manipulando el objeto oContextMenu manualmente con el método AddMenu. Cuando el nombre de la clase es seleccionado del menú, invoca a otro add-in que marca como inactivo con el UniqueID = MASSI.MODICLASS. Este es el método del elemento del menú InvokeAddIn que llama al add-in MODICLASS y abre el Diseñador de clases para las clases seleccionadas.

*-- Add-Ins con ShowType == 'M' pasa el menú contextual como el segundo *-- parámetro, el que podemos utilizar para crear un menú dinámico. LPARAMETERS oToolItem, oContextMenu LOCAL cFilename LOCAL nClassCnt LOCAL i LOCAL ARRAY aClassList[1] cFilename = oToolItem.GetDataValue("filename") nClassCnt = AVCXCLASSES(aClassList, cFileName) *-- Crea los elementos de menú dinámicamente FOR i = 1 TO nClassCnt *-- Cuando el elemento de menu es seleccionado invocamos el registro add-in *-- MODICLASS para el nombre de la clase que fue seleccionada. oContextMenu.AddMenu(aClassList[i, 1], ; [oRef.InvokeAddIn("MASSI.MODICLASS", "] + aClassList[i, 1] + [")]) ENDFOR

Ahora, para establecer el add-in MODICLASS, agregue un registro con la información que aparece en la tabla 15.

Campo Valor UNIQUEID MASSI.MODICLASS SHOWTYPE A

TOOLTYPEID VCX INACTIVE .T.

Tabla 15. Información necesaria para establecer un add-in MODICLASS

Observe que el campo Inactive está establecido en Verdadero (.T.) para evitar que este add-in esté visible en el ToolBox. Sin embargo, no evita que pueda ser llamado utilizando el método InvoqueAddin.

Page 34: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

En el campo ToolData, el código es el siguiente:

LPARAMETERS oToolItem, cClassName LOCAL cFilename cFilename = oToolItem.GetDataValue("filename") MODIFY CLASS (cClassName) OF (cFilename) NOWAIT

Cierre la tabla, para reiniciar el ToolBox. Al activar el menú contextual para un elemento de la biblioteca de clases, verá una opción de menú add-in Modify Class (Modificar clase) y su submenú contiene los nombres de las clases contenidas en la biblioteca (Figura 9). Al seleccionar una clase se abre la misma en el Diseñador de clases.

Figura 9. Puede crear menús add-in que son creados dinámicamente en tiempo de ejecución.

Categorías con comportamiento add-ins.

Los comportamientos Add-ins también se crean para tipos de categorías. La tabla 16 lista los tipos de categorías admitidas actualmente y sus comportamientos.

Tipo de categoría Comportamiento

Categoría General

Esta categoría no tiene un comportamiento especial. Es una categoría estática que puede contener cualquier tipo de elemento de herramienta.

Categoría carpeta dinámica

Especifica una carpeta de sistema y tipos de archivos para que sean leídos por este tipo de categoría. Cuando la categoría se abre, se llena dinámicamente el conjunto de herramientas basándose en el contenido de la carpeta del sistema. Open (Abrir) está disponible en el menú contextual que se abre con el Explorador de Windows en la carpeta del sistema.

Text scraps Este tipo de categoría crea herramientas scrap tools cuando el texto es seleccionado

Page 35: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

y soltado en esta categoría. Puede además seleccionar texto de otras aplicaciones de Windows tales como Word, y arrastrar a la categoría Text scrap para crear automáticamente un text scrap. Arrastre el text scrap desde el Toolbox a una ventana de edición u otras aplicaciones Windows para soltar el texto. Los text scraps pueden ser creados también utilizando la capacidad de text merge de Visual FoxPro de tal forma que el código puede ser embebido en el scrap y evaluar cuando es soltado.

Controles ActiveX registrados

Este tipo muestra todos los controles ActiveX que son cargados en Visual FoxPro. Cargue estos controles en el menú de herramientas Visual FoxPro. Haga Clic en Opciones y luego seleccione la ficha Controles.

Servicios Web XML

Este tipo de categoría muestra todos los servicios Web de Visual FoxPro registrados y especificados en el Administrador del IntelliSense de Visual FoxPro.

Tabla 16. Tipos de categorías admitidos actualmente y sus comportamientos add-in.

Puede además crear su propio comportamiento add-in además de estos comportamientos, agregando registros a la tabla de contenido del ToolBox. La única diferencia entre el campo ToolTypeID indica un tipo de categoría en lugar de un tipo de herramientas. Por ejemplo, para crear un comportamiento add-in para categoría general, entre CATEGORY.GENERAL para el valor de ToolTypeID.

Otros add-in

Puede crear además add-in que están disponibles en todos los menús contextuales para todos los elementos del ToolBox. Esto es útil si necesita un comportamiento que no sea específico para un solo tipo de herramienta. Por ejemplo, desea agregar Dock (Anclar) en el menú contextual para todos los elementos del ToolBox. Al seleccionarlo, este comando ancla el ToolBox en la parte derecha del escritorio. Puede hacer esto agregando un registro en la tabla 17.

Campo Valor UNIQUEID MASSI.DOCK SHOWTYPE A

TOOLTYPEID TOOLNAME Dock

INACTIVE .F.

Tabla 17. Información para agregar una opción Dock de menú contextual

Observe que el campo ToolTypeID está vacío. Esto orienta al ToolBox para colocar este add-in en todos los menús contextual. El código del campo ToolData se explica por sí solo:

LPARAMETERS oToolItem *-- 0 = anclar a la izquierda, 1 = anclar a la derecha _oToolbox.DockIt(1)

En lugar de crear add-in que aparezcan en los menús contextuales, puede crear comportamientos que se ejecuten cuando una categoría, elemento o el propio ToolBox sea abierto. En este caso, el campo ClassType para el add-in está establecido en el ONLOAD. Por ejemplo, entre un nuevo registro add-in con la información en la tabla 18.

Page 36: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

Campo Valor UNIQUEID MASSI.ONLOADEXAMPLE

SHOWTYPE A CLASSTYPE ONLOAD

INACTIVE .F.

Tabla 18. Información para agregar un comportamiento ONLOAD

En el campo ToolData, un simple mensaje se muestra para este ejemplo. Sin embargo, observe que se pasa al código, una referencia al motor ToolBox:

LPARAMETERS oToolboxEngine Messagebox("Leyendo tabla Toolbox " + oToolboxEngine.ToolboxTable)

Al reiniciar el ToolBox, este código se ejecutará antes de que se muestre el formulario ToolBox.

Tenga en cuenta que todos estos registros add-in pueden ser distribuidos en la misma forma que se han descrito antes. De esta forma, puede fácilmente intercambiar con otros desarrolladores comportamientos add-in como parte de sus conjuntos de herramientas. Si crea herramientas de terceros, cumpla la misma convención de nombres que tienen las otras herramientas en conjunto incluyendo nombre de proveedor o producto junto a los IDs únicos así que puedan ser incluidos en los procesos de instalación y actualización.

Sobrescribir comportamientos y apoyar nuevos tipos de herramientas.

Como se ha discutido en la sesión anterior, los add-in son una vía sencilla para agregar comportamiento personalizado para un conjunto actual de los tipos del ToolBox y se distribuyen fácilmente como parte de un conjunto de herramientas. Además de los comportamientos add-in, el ToolBox puede extenderse de tal forma que puede sobrescribir comportamientos existentes o soportar su propia nueva herramienta y tipo de categorías. Para la mayoría de situaciones, los add-in cumplen lo que el desarrollador necesita, sin embargo, existen casos cuando necesita crear su propia implementación de clase de herramientas.

Puede extender o cambiar comportamientos actuales heredando su propio conjunto de herramientas desde un tipo de elemento o cambiando el comportamiento por código directamente en el elemento de herramienta de clase. Por ejemplo, puede crear una subclase de _dbftool llamada mydbftool para apoyar un comportamiento diferente de arrastrar y soltar para los elementos de tabla. O puede modificar la clase _bdftool directamente en la biblioteca de clases _toolbox.vcx. Puede que desee crear nuevos tipos de elementos heredando la clase padre apropiada, como _filetool o _tool, dependiendo del tipo de herramientas que necesita para realizar, o del nivel de control que necesita. Como regla, todos los elementos del toolbox que cree deben heredar de la clase _tool. Todas las categorías que cree debe heredar desde _category, y las categorías dinámicas deben heredar de _dynamiccategory.

El primer ejemplo describe cómo sobrescribir un comportamiento para todas las herramientas de un tipo determinado. Existen dos vías para lograr esto; modificar la clase de herramientas directamente en la biblioteca de clases _toolbox.vcx o crear una subclase de una herramienta de clases apropiada, y orientar al ToolBox para utilizar esta clase en su lugar. Si modifica directamente _toolbox.vcx, todos los elementos de este tipo toman el nuevo comportamiento. Esto incluye, el comportamiento

Page 37: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

del método apropiado en el _toolbox.vcx para la clase de herramientas que desea modificar. Al reiniciar el ToolBox, lee el nuevo código que introduzca.

Por ejemplo, suponga que desea modificar un comportamiento arrastrar y soltar del _dbftool. Actualmente, al soltar un elemento de tabla en un formulario, suelta un objeto grid basado en la configuración de registro, que se puede establecer en el cuadro de diálogo Opciones de Visual Foxpro la ficha Asignación de campos. Al seleccionar el tipo Múltiple. Si esto no se establece, suelta la clase base Grid de Visual FoxPro. Esto significa que cada elemento de tabla soltado, tendrá esta configuración establecida. Para establecer esta información para el elemento de la tabla, en unión con este acercamiento global, una opción es modificar la clase _dbftool para buscar el nombre de la clase grid y la biblioteca especificada en el elemento del cuadro de diálogo propiedades (Figura 10). Puede entonces especificar una clase particular para soltar para cada elemento de tabla en el ToolBox.

Figura 10. El _dbftool puede ser modificado para leer las propiedades de elementos para la biblioteca de clases y nombre para determinar qué objeto grid soltar a los diseñadores.

La primera aproximación para modificar este comportamiento es editar la clase _dbftool directamente en la biblioteca de clases _toolbox.vcx. Es buena idea hacer copia de seguridad de los archivos _toolbox.vcx y _toolbox.vct antes de comenzar. Ahora, abra el _dbftool en el diseñador de clases, y abra el método DropOnContainer. Puede ver el siguiente código:

#include "foxpro.h" #include "toolbox.h" LPARAMETERS oDropTarget, cSCXName, nXPos, nYPos LOCAL cClassLib LOCAL cClassName LOCAL cPropertyList LOCAL cOriginalObjName LOCAL cFilename *-- Mirar los valores de registro para el nombre de clase y la localización a *-- utilizar. cClassLib = THIS.GetRegistryValue("ClassLocation", INTELLIDROP_KEY + "Multiple")

Page 38: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

cClassName = THIS.GetRegistryValue("ClassName", INTELLIDROP_KEY + "Multiple") *-- Obtener el valor de la propiedad 'filename' para este elemento. *-- Ex. 'C:MYDATATABLE1.DBF' cFilename = NVL(THIS.GetDataValue("filename"), '') *-- Si el valor del registro no está establecido, utilice la clase base Grid de *-- Visual FoxPro IF EMPTY(cClassName) OR !FILE(cClassLib) cClassLib = '' cClassName = "Grid" ENDIF *-- Obtener el valor de la propiedad 'objectname' para este elemento. *-- Ejemplo: 'MyGrid' cOriginalObjName = NVL(THIS.GetDataValue("objectname"), '') IF EMPTY(cOriginalObjName) cOriginalObjName = "grd" + JUSTSTEM(cFilename) ENDIF *-- Crear la lista de propiedades especificadas en el diálogo propiedades. *-- Todas las propiedades de escritura se establecerán cuando es soltado el *-- objeto. cPropertyList = TEXTMERGE( ; [RecordSourceType=1] + CHR(10) + ; [RecordSource=<<JUSTSTEM(cFilename)>>] + CHR(10), ; .F., "<<", ">>") + ; CHR(10) + THIS.EvalText(NVL(THIS.GetDataValue("properties"), '')) *-- Suelta el objeto en el diseñador THIS.DropObject(oDropTarget, cSCXName, nXPos, nYPos, cClassName, ; cClassLib, '', cOriginalObjName, cPropertyList, '', '', cFilename)

Es importante entender, que este método está leyendo el registro para el nombre de clase y localización, así que puede especificar esa información en los parámetros cClassName y cClassLib del método DropObject. Entonces, todo lo que necesita hacer, es establecer esas dos variables con la información correspondiente. Puede hacer esto con string parking. Las propiedades de un elemento pueden ser obtenidas llamando al método GetDataValue y se le pasa el nombre del valor a recibir, en este caso, propierties. Esto devuelve una cadena que contiene una lista delimitada por retornos (carriage return) de las propiedades de los elementos en el formulario de PropertyName=Value. Todo lo que necesita es buscar for Class= and ClassLibrary= para recibir el valor.

#include "foxpro.h" #include "toolbox.h" LPARAMETERS oDropTarget, cSCXName, nXPos, nYPos LOCAL cClassLib LOCAL cClassName LOCAL cPropertyList LOCAL cOriginalObjName LOCAL cFilename m.cFilename = NVL(THIS.GetDataValue("filename"), '') LOCAL lcProps lcProps = THIS.GetDataValue("properties") *-- Dónde están especificadas ambas propiedades? IF "class=" $ LOWER(lcProps) AND "classlibrary=" $ LOWER(lcProps) *-- Split (Dividir) las propiedades en matrices para buscarlo facilmente LOCAL ARRAY laProps[1] ALINES(laProps,LOWER(lcProps)) *-- Buscar la propiedad de clases y tomar el valor m.cClassName = THIS.EvalText( ; SUBSTR(laProps[ASCAN(laProps, "class=")],LEN("class=")+1)) *-- Buscar la propiedad classlibrary y tomar el valor m.cClassLib = THIS.EvalText( ; SUBSTR(laProps[ASCAN(laProps, "classlibrary=")],LEN("classlibrary=")+1)) ELSE *-- Si no especificamos las propiedades del elemento, utilice la 'Multiple' *-- registry setting (configuración de registro “Múltiple”)

Page 39: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

m.cClassLib = ; THIS.GetRegistryValue("ClassLocation", INTELLIDROP_KEY + "Multiple") m.cClassName = ; THIS.GetRegistryValue("ClassName", INTELLIDROP_KEY + "Multiple") ENDIF IF EMPTY(m.cClassName) OR !FILE(m.cClassLib) m.cClassLib = '' m.cClassName = "Grid" ENDIF . . .

Este código busca primero las propiedades para Class y ClassLibrary. Si se encuentran estas propiedades, establece las variables adecuadas, que son entonces pasadas al método DropObject. El método EvalText evalúa el valor de la propiedad de tal forma, que pueda incluir funciones y variables en el valor de propiedades del elemento. Por ejemplo, puede especificar la localización de la biblioteca de clases en cuadro de diálogo propiedades del elemento como: (HOME()+"FFC\_BASE.VCX") para utilizar las Foundation clases de Visual FoxPro. Puede verificar sus cambios cerrando la biblioteca de clase y abriendo el ToolBox. Específicamente una clase grid para una de sus herramientas de tablas en las propiedades del elemento y luego soltar el elemento en el formulario. Verá que el objeto grid que es soltado, ahora está basado en la clase que le haya especificado.

En lugar de modificar la biblioteca de clases _toolbox.vcx, puede crear una subclase de _dbftool en una nueva biblioteca de clases. Modifique luego el campo de la tabla ToolType para especificar nueva información de clase para el tipo de herramienta Tabla. Si lo hace así, los campos Class y Classlib en la tabla ToolType se copian a la tabla de contenidos del ToolBox para este elemento. Por tanto, algunos elementos existentes se refieren aun a la clase padre. Cualquier elemento nuevo que cree, sin embargo, se referirá a su nueva subclase. Puede crear un conjunto de herramientas, en el cual, herramientas individuales pueden tener comportamientos sobrepasados (overriding behaviors) Esto es especialmente ventajoso si terceros suministradores quieren herramientas en sus conjuntos de herramientas que sigan algún comportamiento especial; pero no desean sobrescribir este comportamiento para todas las herramientas de este tipo. En este caso, no necesita tocar la tabla ToolType. Sólo necesita entrar la información de Class y ClassLib manualmente en la tabla de contenidos de ToolBox para este elemento en particular y luego distribuir la biblioteca de clases.

Restaure la biblioteca de clases _toolbox.vcx y cree una nueva herramienta llamada mydbftool basada en _dbftool. Cree esta clase en una nueva biblioteca de clases llamada MyTollBox.vcx y guárdela en la misma carpet del _toolbox.vcx.

CREATE CLASS mydbftool OF MyToolbox.vcx AS _dbftool FROM _toolbox.vcx

Modifique el método DropOnContainer para incluir los cambios de código y salvar y cerrar la clase. Luego, visualice la tabla Tooltype y localice el registro donde el campo Tooltype = Table (UniqueId = DBF). Establezca el campo Classname = mydbftool y el campo ClassLib = c:\Program Files\Microsoft Visual FoxPro 8\Toolbox\MyToolbox.vcx. (nombre y ruta de la biblioteca de clases). Cierre la tabla ToolType y reinicie el ToolBox. En el formulario Customize (Personalizar) ToolBox, agregue un elemento, seleccione File como su type (tipo) y localice una tabla (archivo .dbf). Abra las propiedades del elemento, especifique su Class y ClassLibrary de una cuadrícula a soltar, y luego arrastre y suelte el elemento en el formulario. El grid está basado en la clase que ha especificado. Sin embargo, si tiene elementos de tabla existentes en su ToolBox, el comportamiento de aquellos elementos no cambiará. Puede ver esto abriendo su tabla de contenido de ToolBox y mirando los campos ClassName y ClassLib.

Page 40: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

Este mismo método es utilizado para agregar un nuevo tipo de herramienta al ToolBox. Primero, cree su clase de herramientas heredando de una herramienta determinada en la jerarquía. Si el tipo que está agregando, está basado en un tipo de archivo particular que no exista, hereda de la clase _filetool. Entonces escriba el código apropiado para su nueva clase de herramientas. Finalmente, agregue su nuevo tipo de herramienta en la tabla ToolType, asegúrese de que especifica un único ID para su nueva herramienta. Se recomienda que siga el formato NombreDeCompania.ToolName.

Para la clase mydbftool, en la tabla ToolType cree su propio tipo llamado Extended table, en lugar de especificarlo como clase de tipo de tabla. Agregue un registro a la tabla ToolType como se muestra en la tabla 19, e introduzca los valores de los campos relevantes (Puede ver la tabla ToolType descrita anteriormente en este artículo para ver la descripción de los campos de la misma.)

Campo Valor UNIQUEID MASSI.TABLEEX

SHOWTYPE T TOOLTYPE Extended Table

CLASSNAME mydbftool CLASSLIB C:\Program Files\Microsoft Visual FoxPro 8\Toolbox\MyToolbox.vcx

SHOWNEW .T. PROPSHEET .T.

INACTIVE .F.

Tabla 19. Información para crear su propio tipo de Extended table (Tabla extendida)

Cierre la tabla y reinicie el ToolBox. Debido a que el campo ShowNew está establecido en .T. (Verdadero), cuando seleccione Add Item (Agregar elemento) en el cuadro de diálogo Customize ToolBox, verá el nuevo tipo de herramienta listado (Figura 11).

Figura 11. Los nuevos tipos de herramientas que son creados, pueden ser mostrados en el cuadro de diálogo Add Item.

Después que seleccione el tipo Extended Table, la hoja propiedades del elemento se abre para que pueda introducir todos los campos requeridos para el elementos, tales como, Item name (nombre del elemento), Object name (nombre del objeto), y File name (nombre del archivo). Además, puede entrar las propiedades ClassLibrary y Class en el editor de propiedades. La hoja de propiedades se muestra inmediatamente porque el campo PropsSheet está establecido en .T. (Verdadero). Al arrastrar y pegar un elemento Extended Table al diseñador, es soltado un grid basado en la clase que

Page 41: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

haya especificado. Sin embargo, cualquier elemento de tabla que agregue en el ToolBox mantendrá el comportamiento predeterminado.

Soportar nuevos tipos de categorías

Crear nuevas categorías, es el mismo proceso que crear un nuevo tipo de herramientas. Crear la clase categoría y agregar un registro en la tabla ToolType. Tipicamente, agrega una nueva categoría porque necesita cumplimentar determinadas acciones cuando esta categoría sea abierta. Algunas de las categorías built-in ya hacen esto: por ejemplo: una categoría de carpeta dinámica crea un elemento de herramienta al vuelo, cuando es abierto. Una categoría dinámica tiene algunas características especiales que usted explorará.

Al crear categorías dinámicas, los elementos en las categorías no están representados físicamente en la tabla de contenidos del ToolBox. En su lugar, son guardados en memoria, en un cursor. Así, si busca en su tabla de contenidos ToolBox, los elementos mostrados en una categoría basada en carpeta dinámica, no verá estos registros. Esto es además, por qué las categorías dinámicas muestran el mensaje "Dynamic Category - click on Category Properties to modify" ("Categoría Dinámica – haga clic en Category Propierties (Propiedades de las categorías) para modificarlas). En el elemento del grid Customize (Personalizar) ToolBox. Para crear y manipular estos elementos de herramientas virtuales, puede mirar en el motor del ToolBox, algún método especial que guarde y restaure los elementos virtuales.

Por ejemplo, puede crear una categoría environment (entorno) que muestra como elemento de herramienta todos los conjuntos de entorno y proyectos guardados en el Administrador de entorno de Visual FoxPro. El Administrador de entorno es una nueva herramienta en el Visual FoxPro 8.0, que controla los grupos de entorno, de tal forma que puede rápida y fácilmente, cambiar la configuración de entorno y ejecutar script para establecer los proyectos. Puede asociar los proyectos con los conjuntos de entorno. Se accede típicamente desde el Administrador del panel de tareas; pero puede ejecutar además EnvMgr.app como una aplicación stand-alone. De hecho, puede pasar el nombre del conjunto de entorno para ejecutar automáticamente y puede especificar si ejecutar en modo silencioso (quiet mode). Puede además pasar el nombre de un proyecto específico para abrir que se aplicará los parámetros de entorno y entonces se abre el administrador de proyectos. Si lo ejecuta en modo silencioso, el Administrador de entorno no mostrará un cuadro de mensaje cuando se ejecuta el conjunto de entorno.

DO (HOME()+"ENVMGR.APP") WITH "Environment Set 1", .T.

Seguramente quiere, que cada elemento en la categoría sea creado dinámicamente y muestre el conjunto de entorno y cualquier nombre de proyectos para leer la tabla de Administrador de entornos (EnvMgr.dbf). Cuando el elemento es seleccionado se llama el entorno, pasa el ID del conjunto o proyecto. Puede además establecer dos opciones en la categoría: la ruta de la tabla del Administrador de entorno y, si desea ejecutarlo en modo silencioso. La ruta de la tabla que contiene el conjunto de entorno predeterminada es: \Documents and Settings\UserName\Application Data\Microsoft\Visual FoxPro 8\EnvMgr.DBF, or HOME(7)+"EnvMgr.dbf". Si esta opción está en blanco, se asume la carpeta predeterminada.

Lo primero que hay que hacer, es crear una categoría de administrador de entorno, que es una subclase de _dynamiccategory.

CREATE CLASS EnvMgrCategory OF MyToolbox.vcx AS _DynamicCategory FROM _toolbox.vcx

Page 42: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

Al crear su propio tipo de categoría dinámica, existen dos métodos a sobreescribir: OnCreateDataValues y OnRenderCategory. En el método OnCreateDataValues al especificar las opciones que debe proporcionar esta categoría. Esta información se muestra en la hoja de propiedades de la categoría. Puede especificar una opción a ejecutar en modo silencioso, y una opción para especificar la tabla de Administrador de entorno a utilizar. Idealmente, puede utilizar la tabla de recursos de Visual FoxPro para obtener esta información. Sin embargo, para este ejemplo, si la propiedad está en blanco, es asumida la ruta predeterminada. Debe recordar, que para crear estas opciones, todo lo que necesita hacer es llamar al método AddDataValue. El código del método OnCreatDataValues debe contener lo siguiente:

*-- Agregar todas las propiedades dinámicas de una categoría dinámica. DODEFAULT() *-- Agregar nuestras propiedades adicionales. THIS.AddDataValue("quietmode", .F., "Run quietly", '', .F., "cfoxcheckbox") THIS.AddDataValue("envfile", '', "Env. Manager Table", '', .F., "cfoxfilename")

Luego, escriba el código en el método OnRenderCategory para crear cada elemento de herramienta en la categoría. Primero, consulte la tabla del administrador de entorno para todos los conjuntos de entornos y proyectos. Para cada conjunto o proyecto encontrado, cree un objeto de herramienta que se muestra en la categoría. Cuando es seleccionada esa herramienta en esa categoría, ejecute EnvMgr.app, pasándole el UniqueID del elemento, y un segundo parámetro para indicar si se ejecuta en modo silencioso. Para facilitar este comportamiento, los elementos de herramienta que cree dinámicamente son una instancia de la herramienta de aplicación que indica en la tabla ToolType, donde ToolType. UniqueID = "APP". Estos tipos de herramientas actualmente referencia la clase _apptool en la biblioteca de clases _toolbox.vcx. Debido a que el tipo de herramienta aplicación ya tiene un comportamiento para ejecutar una aplicación cuando es seleccionado, todo lo que debe hacer es establecer la propiedad de nombre de archivo de la aplicación Administración de entorno. Puede agregar paréntesis alrededor del nombre de la propiedad tal que pueda ser evaluada en tiempo de ejecución. Puede entonces, llamar fácilmente a la aplicación Administrador de entorno con parámetros. Por ejemplo, para ejecutar un conjunto de entorno en modo silencioso, cree manualmente un elemento de aplicación y establezca la propiedad filename como sigue:

(DO (HOME() + "ENVMGR.APP") WITH "_0VK0QENFH", .T.)

Sin embargo, cuando crea un elemento de aplicación manualmente, crea un registro físico en la tabla de contenidos del ToolBox. Estas categorías necesitan crear una aplicación virtual, que son mostradas dinámicamente cuando la categoría es abierta. Puede administrar sus conjuntos de entorno en un lugar, el Administrador de entorno, y la categoría recoge los cambios automáticamente. Para crear elementos de herramienta virtual, utilice dos métodos del motor del ToolBox: GetVirtualToolObject y SaveVirtual. Estos métodos manipulan un cursor interno de herramientas virtuales llamado VirtualCursor. Una referencia a un motor, puede obtenerse a través de la propiedad oEngine de una herramienta de clase. Estas herramientas, pueden ser agregadas a la colección oToolCollection que se pasa en el método OnRenderCategory.

El método OnRenderCategory contiene lo siguiente:

*-- Cargar la colección oToolCollection pasada con los objetos de herramientas *-- en esta categoría – en este caso, un objeto de categoría para *-- cada conjunto de entorno o proyecto definido en el EnvMgr.dbf table. LPARAMETERS oToolCollection LOCAL oToolObject, cEnvFile, nCnt, i, oToolType, lQuietMode LOCAL cToolTypeID, cToolCaption, cToolTip, cFileName LOCAL ARRAY aEnvList[1] DODEFAULT(oToolCollection) *-- Tomar el valor de la propiedad quietmode

Page 43: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

lQuietMode = NVL(THIS.GetDataValue("quietmode"), .F.) *-- Tomar el valor de la propiedad envfile cEnvFile = THIS.EvalText(NVL(THIS.GetDataValue("envfile"), '')) IF EMPTY(cEnvFile) cEnvFile = HOME(7) + "envmgr.dbf" ENDIF IF FILE(cEnvFile) *-- Agarre todo el conjunto de entorno ('E') y proyectos ('P') desde la *-- tabla de administrador de entorno SELECT UniqueID, EnvType, SetName ; FROM (cEnvFile) ; WHERE (EnvType == 'E' OR EnvType == 'P') ; ORDER BY SetName ; INTO ARRAY aEnvList nCnt = _TALLY cToolTypeID = "APP" FOR i = 1 TO nCnt *-- Crea un objeto de herramienta virtual que es identificado en *-- ToolType.dbf as "APP". *-- (Recuerde, Tooltype es donde la clase y la biblioteca de clases es *-- especificada.) *-- El Segundo parámetro es el encabezado para el objeto de herramienta y *-- el tercer parámetro especifica el tipo de herramientas. cToolCaption = RTRIM(aEnvList[i, 3]) cToolTip = cToolCaption oToolObject = THIS.oEngine.GetVirtualToolObject(cToolTypeID, ; cToolCaption, cToolTip ) IF !ISNULL(oToolObject) IF lQuietMode *-- Para ejecutar en modo silencioso, pasa .T. (Verdadero) y el segundo *-- parámetro para EnvMgr.App cFileName = [(DO "] + HOME() + ; [EnvMgr.app" WITH "] + aEnvList[i, 1] + [", .T.)] ELSE cFileName = [(DO "] + HOME() + ; [EnvMgr.app" WITH "] + aEnvList[i, 1] + [")] ENDIF *-- Establece la propiedad filename en su herramientas de *-- aplicación virtual. oToolObject.SetDataValue("filename", cFileName ) *-- Salva el objeto de herramienta virtual en el VirtualCursor THIS.oEngine.SaveVirtual( oToolObject) *-- Agregue la herramienta a la colección de tal forma que pueda mostrar en *-- la categoría. oToolCollection.Add( oToolObject) ENDIF ENDFOR ENDIF RETURN

Note cómo la propiedad QuiteMode de la categoría, es requerida, entonces, puede establecer la propiedad filename en el objeto herramienta de forma apropiada. Puede crear su propio tipo de herramientas al subclasear (subclassing) el _apptool y tener el código para hacer algo de esto en el objeto herramienta como tal.

El paso final es agregar el nuevo tipo de categoría a la tabla ToolType. Agregue un registro a la tabla ToolType y entre el campo relevante como se indica en la tabla 20.

Campo Valor

Page 44: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

UNIQUEID MASSI.ENVMGR

SHOWTYPE C TOOLTYPE Environment Manager

CLASSNAME EnvmgrCategory CLASSLIB C:\Program Files\Microsoft Visual FoxPro 8\Toolbox\MyToolbox.vcx

SHOWNEW .T. PROPSHEET .T.

INACTIVE .F.

Tabla 20. Información para agregar un nuevo tipo de categoría para el Administrador de entorno.

Ahora, reabra el ToolBox, y agregue una categoría del Administrador de entorno seleccionando Environment Manager (Administrador de entorno), el que es listado como una selección disponible en la lista de tipos de categorías. Escriba el nombre de la categoría y haga clic en OK. Aparece la hoja de propiedades de la categoría, así que puede seleccionar la ruta de la tabla del Administrador de entorno y especificar si se puede ejecutar en modo silencioso (Figura 12).

Figura 12. La nueva categoría que crea, muestra sus propiedades personalizadas en el cuadro de diálogo Category Properties (Categoría de las propiedades).

Abra la categoría, y podrá ver el elemento de herramienta aplicación para cada conjunto de entorno y proyecto en el Administrador de entorno (Figura 13). Haga clic en una herramienta de aplicación para ver su conjunto de entorno.

Page 45: Vfp - La Caja de Herramientas _ToolBox_ Vista Por Dentro

Figura 13. El tipo de categoría Administrador de entorno que ha creado muestra su conjunto de entorno y proyectos como una aplicación de herramienta virtual.

Conclusiones

En este artículo, aprendió cómo crear y distribuir conjuntos de herramientas a sus equipos de desarrollo y cómo crear paquetes de instalación de conjuntos de herramientas. Aprendió además, sobre la arquitectura del ToolBox y lo fácil que es extender el ToolBox, creando poderosos comportamientos add-in. Además, ha descubierto cómo sobrescribir comportamientos existentes, y agregar su nuevo tipo propio de herramienta y categoría.