You are on page 1of 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 cmo trabaja la Caja de herramientas, (ToolBox), y ver cmo personalizarlo para que encaje en su estilo de trabajo y sus proyectos. Crear y distribuir herramientas al equipo de desarrolladores y crear paquetes de instalacin de conjuntos de herramientas. Aprender la arquitectura del ToolBox y cmo extenderlo fcilmente para incorporarle comportamientos muy potentes (powerful add-in behaviors), sobre-escribir comportamientos existentes y agregar sus nuevas herramientas y tipos de categoras.

Introduccin Conjuntos de herramientas Conjuntos de herramientas de terceros Arquitectura del ToolBox Crear comportamientos integrados Sobrescribir comportamientos y soportar nuevos tipos de herramientas Soportar nuevas categoras de herramientas Conclusiones

Introduccin
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 categoras, los conjuntos de herramientas personalizados por el desarrollador, incluyendo las que se consideren necesarias para la creacin de aplicaciones. Los conjuntos de herramientas contienen tpicamente clases y componentes; pero pueden guardar adems referencias a recursos basados en archivos comunes como formularios, programas, tablas, informes, imgenes, etc. Pueden contener adems 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 prcticamente todas las caractersticas 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 aplicacin ToolBox. Los conjuntos de herramientas individuales son cargados dentro del ToolBox, cuya arquitectura admite comportamientos integrados y categoras. De esta forma, terceros suministradores o arquitectos a nivel empresarial, pueden proporcionar fcilmente su propio conjunto de herramientas dinmico para lograr un ptimo y rpido desarrollo de la aplicacin.

En este artculo, aprender cmo puede crear y distribuir conjuntos de herramientas a su equipo de desarrolladores y cmo terceros suministradores pueden crear paquetes de instalacin de conjuntos de herramientas. Ganar en comprensin de la arquitectura del ToolBox y cmo extender fcilmente el ToolBox creando potentes comportamientos agregados. Aprender adems cmo sobrescribir comportamientos existentes y aadir su propio conjuntos de herramientas y tipos de categoras. Para ms informacin sobre el empleo de la caja de herramientas y una discusin completa de las herramientas y categoras integradas, vea el artculo que fue publicado originalmente en Universal Thread Magazine. (Nota de la traductora: Este artculo se encuentra traducido al espaol 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 categoras. 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 slo las clases que el desarrollador desea. El ToolBox admite adems, generadores y asistentes, controles ActiveX Servicios Web XML y retazos de texto (text scraps). Adems de todos estos elementos, el ToolBox puede representar recursos basados en archivos como son: bases de datos, tablas, imgenes, informes, etiquetas, mens, formularios, aplicaciones, programas y proyectos. Cuando se desarrollan sistemas en equipo, es frecuente que un arquitecto o un grupo de expertos creen un framework (armazn 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 cules 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 adems establecer carpetas de categoras dinmicas que muestren elementos desde los archivos de la red, de tal forma que los desarrolladores puedan acceder fcilmente a los recursos compartidos. El ToolBox guarda todo su contenido en una tabla de datos (.dbf) de Visual FoxPro, especfica 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 categoras con clases, generadores y otras herramientas de su framework que sus desarrolladores pueden utilizar en el proyecto. Puede incluso establecer categoras dinmicas y categoras 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.

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 opcin adecuada y localizando el archivo .dbf. Despus 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 fcil 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 ningn contenido personal que tenga configurado. Por ejemplo, puede que haya creado categora 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 fcilmente desde Customize ToolBox (Personalizar ToolBox) > Options page (pgina Opciones). Puede restaurar el contenido del ToolBox haciendo clic en el botn 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 categoras y los elementos de ToolBox que han sido aadidos por usted

o terceros) Si hace clic en No, se restaura toda la tabla ToolBox a la configuracin inicialmente predeterminada, eliminando toda la personalizacin 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, categoras 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 botn Clean Up ToolBox (Limpiar el ToolBox) en la pgina Options (Opciones) para realizar un PACK a la tabla de contenido del ToolBox. Esto elimina permanentemente todos los artculos y reduce el tamao de la tabla. Puede luego recuperar su contenido personal seleccionando la copia de resguardo de su tabla ToolBox en la pgina 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 instalacin, 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 tambin 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, categora y elementos de filtro en el ToolBox, los registros se aaden a la tabla de contenido del ToolBox. De forma predeterminada, los ID nicos para estos elementos toman a forma de User.Sys(2015). La funcin 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. Despus que ha finalizado la creacin de su conjunto de herramientas, necesita renombrar el elemento para que sea nico en su compaa o producto, por ejemplo, CompanyName.Sys(2015). De esta forma, puede crear la instalacin y actualizar los scripts que afecten slo 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 botn Reset ToolBox to Default (Re-Iniciar el ToolBox predeterminado) en Customize ToolBox > Options page. Cuando pregunte Mantain user-added tems (mantener los elementos aadidos por el usuario?) haga clic en No. Esto guardar su tabla de contenidos y eliminar toda la personalizacin. Ahora, agregue una categora al ToolBox. Puede hacerlo directamente desde el men contextual del ToolBox, o seleccionando una categora en el rbol del formulario Customize (Personalizar) ToolBox y luego, seleccione el botn Add Category (Agregar categora) en la barra de herramientas de categoras. Para este ejemplo, cree una categora general llamada "Cool Tools." Ahora, agregue una biblioteca de clases seleccionando el botn Add Item (Agregar elemento) y seleccionando Class (Clase) en el cuadro de dilogo 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. Despus que seleccione esta biblioteca de clase, los elementos de la herramienta se muestran en la grid (cuadrcula) y todos se muestran seleccionados de forma predeterminada. Los desarrolladores no

deben utilizar CoolBaseControl directamente porque es una clase abstracta, entonces necesita limpiar ese elemento en el grid (Figura 2). Puede adems, 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 botn Item Propierties (Propiedades del elemento) en la barra de herramientas de elemento.

Figura 2. El ToolBox puede ser configurado para mostrar slo 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 localizacin predeterminada. Ver un registro para la categora que ha agregado y un registro para cada elemento en la biblioteca de clases, En este caso, hay slo 3 clases, una de las que est inactiva. As que ver algo similar a la Tabla 1. UniqueID Showtype ToolTypeID CATEGORY.GENERA CLASS CLASS CLASS user._0VK0ZMPDL ParentID ToolName Cool Tools Inactive .F.

user._0VK0ZMPDL C user._0VK0ZQV7H T user._0VK0ZQV8V T user._0VK0ZQVAJ T

coolbasecontrol .T. (COOLTOOLS) .F. .F.

user._0VK0ZMPDL Cool Control user._0VK0ZMPDL Cool Form

Tabla 1. Tabla ToolBox para Cool Tools.

La estructura de la tabla ToolBox se explicar en detalles en la siguiente seccin; 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 adems, que el campo ParentID en el elemento herramienta est establecido con la categora UniqueID. Estos cuatro registros constituyen los datos para su conjunto de herramientas. Antes de que pueda comenzar a escribir el script de instalacin, re-nombre los UniqueIDs para incluir el nombre de la compaa. Esto es beneficioso si el conjunto de herramientas ser redistribuido por una actualizacin. Puede escribir el cdigo para hacer esto automticamente. Sin embargo, para este ejemplo, es ms sencillo hacerlo manualmente desde la ventana Browse (examinar). Los registros del conjunto de herramientas se vern de esta forma ahora: UniqueID MASSI.COOLCAT Showtype C ToolTypeID CATEGORY.GENERAL CLASS CLASS CLASS MASSI.COOLCAT ParentID ToolName Cool Tools Inactive .F.

MASSI.COOLBASE T MASSI.COOLCTRL T MASSI.COOLFORM T

coolbasecontrol .T. (COOLTOOLS) .F. .F.

MASSI.COOLCAT Cool Control MASSI.COOLCAT Cool Form

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 instalacin. Para este ejemplo, cree una tabla llamada CoolToolBox.dbf y agregue slo 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 instalacin Ahora que tiene los registros de su conjunto de herramientas adecuadamente colocados en su tabla, est listo para escribir un script de instalacin 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, slo si no existe ya en el ToolBox. Tpicamente, se controla la actualizacin del conjunto de herramientas y se crea nuevos conjuntos. Sin embargo, esto slo implica la manipulacin estndar de tablas de Visual FoxPro de la tabla de contenidos del ToolBox. Cree un programa llamado Setup.prg y colquelo en la misma carpeta que el conjunto de herramientas y archivos de bibliotecas de clases en este caso \Microsoft Visual FoxPro 8\CoolTools\. El cdigo es muy bsico y no tendr interfaz de usuario; pero podr crear fcilmente un setup (instalador) que ser un formulario en lugar de un programa. El truco de este cdigo 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 instalacin. 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 vas para escribir su propio scripts de setup; pero este cdigo hace un buen trabajo para este ejemplo.
LOCAL lQuit, cToolboxTable, cSourceFolder, ; cTargetFolder, oExc, cSetDeleted, nPrevArea

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 distribucin. Los archivos que necesita distribuir estn en la carpeta Microsoft Visual FoxPro 8\CoolTools y se listan en la Tabla 3. Nombre del Descripcin

campo CoolToolbox.dbf CoolToolbox.fpt CoolTools.vcx CoolTools.vct Setup.prg Estos archivos contienen los datos del conjunto de herramientas que sern cargados en el ToolBox. Estos archivos contienen la clase Cool que tienen los desarrolladores actualmente para su utilizacin. Este es el programa de instalacin.

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

Empaquetar y distribuir conjuntos de herramientas Hay muchas vas para crear su paquete de instalacin, desde la va 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 caracterstica del IDE de Visual FoxPro 8.0. Se utiliza para crear paneles de tareas que el usuario pueda instalar. Despus que el usuario instale el panel, puede proporcionar un enlace que llame primero al cdigo de setup para su conjunto de herramientas. Al crear un panel de tareas, puede adems, proporcionar contenido dinmico para comunicar cualquier actualizacin, ayuda u otra informacin que se relacione con el conjunto de herramientas Cool Tools. Los paneles pueden consistir de XML/XSLT, HTML, mostrar pginas 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 automticamente todos los archivos dependientes en un solo archivo, para su distribucin. Para este ejemplo puede crear un panel HTML que traiga contenido dinmico desde un archivo XML en su PC local. En realidad, el contenido del panel debe venir de un Servicio Web de su compaa, una Intranet o Internet. Adems de HTML, XML, y XSLT, los paneles de tareas pueden ejecutar tambin cdigo 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 fcilmente paneles con cdigo escrito en Visual FoxPro. Crear un panel de tareas Primero, abra el Administrador del panel de tareas, haga clic en el botn Options (Opciones) para abrir el cuadro de dilogo 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 botn Customize Panes (Personalizar paneles). Esto abre el formulario Panel de personalizacin. Haga clic en el botn 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 convencin 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).

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 raz. Puede seleccionar una imagen para mostrar en el Administrador del panel de tareas haciendo clic en el botn 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 personalizacin.

Aadir un panel de contenido Haga clic en el botn Add (Agregar Alt+D) para aadir una sub-seccin de contenido. De forma predeterminada, crea una seccin llamada New Content (Contenido nuevo). En la ficha General, escriba el nombre Install. Esta seccin, ser un vnculo esttico que ejecute un cdigo de manipulador que llame al script de instalacin (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>

La sintaxis especial href vfps: llama al cdigo del manipulador, pasando la accin runinstaller. Abra la ficha Handler Code (Cdigo del manipulador) y entre el siguiente cdigo 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 sern instalados (esto lo veremos luego). Cuando hace clic en el enlace Tool Set en el panel de tareas se ejecuta el cdigo del Setup.prg Luego, cree la seccin de contenido dinmico. Si no desea publicar el contenido dinmico en su panel de tareas, puede saltarse la prxima seccin. Agregar panel de contenido dinmico Para crear una sub-seccin de contenido dinmico, haga clic en el botn Add (Agregar Alt+D) y escriba Whats new en el cuadro de texto Name. Esta sub-seccin de contenido muestra los datos desde un archivo XML. Entonces, esta seccin 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 direccin 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 tcnica es muy buena para hacer comprobaciones. Ahora cree el archivo CoolInfo.xml, y colquelo en su disco C. El esquema del XML es totalmente decisin 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 vas 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>Pgina 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>

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

Existen tres nodos de contenido definidos en el archivo XML que contienen una breve descripcin y las URLs de las pginas Web de Internet (aunque las URLs en este ejemplo no existen en realidad). Ahora especifique la transformacin de este dato. Haga clic en la ficha Transform Data (Transformar datos), seleccione XSL como Type (Tipo), Static Text (Texto esttico) como Source (Fuente) y entre la siguiente transformacin:
<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 transformacin final del contenido raz. Ahora el XML contenido en el archivo CoolInfo.xml es descargado desde la localizacin especfica y guardado de acuerdo a los parmetros del Administrador del panel de tareas. Si la conexin no puede ser establecida despus, se utiliza la copia cach. Si el URL no puede ser encontrado la primera vez, abra la pgina, 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 raz de la seccin de contenido, que es la informacin mostrada en el panel de tareas. Seleccione la raz 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 edicin:
<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 transformacin final. Especifique la transformacin final en el documento HTML en la ficha Transform Data (Transformacin de datos). En esta ficha, seleccione XSL como el Type (Tipo) y Static Text como Source (Origen). Luego escriba la siguiente transformacin XSL.

<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>

</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 estndar hojas sintaxis. El cdigo importante, sin embargo, est localizado entre las etiquetas <body></body>. Esto especifica para cada sub-seccin 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-seccin que cree que contenga informacin en la subseccin de contenido. Es en el nodo <HTMLText> que residen los datos transformados desde la sub-seccin. 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 ms ejemplos de esta tcnica. Al hacer Clic en el botn Apply (Aplicar) en el formulario Panel de personalizacin, el Administrador del panel de tareas muestra el panel Cool Tools (Figura 5)

Figura 5. Puede crear fcilmente un panel de tareas para distribuir su conjunto de herramientas y mostrar contenido dinmico de Internet.

Ver el contenido XML mostrado en la parte superior de la seccin del panel. Si modifica el archivo CoolInfo.xml y hace clic en el botn Refresh en el Administrador del panel de tareas, se actualiza la seccin de contenido. Esta es una de las vas por las que puede fcilmente colocar contenido dinmico en los escritorios de los usuarios. Empaquetar archivos dependientes Ahora que ya ha establecido el panel de tareas, es el momento de aadir 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 personalizacin. Esto cambia lo mostrado, de forma que pueda administrar los archivos en su paquete de distribucin. Haga clic en el botn Add (Agregar Alt+A) y seleccione Setup.prg, CoolTools.vcx, y CoolToolbox.dbf. (Seleccionando ambos archivos VCX y DBF incluirn los archivos VCT y FPT automticamente). Luego haga clic en Apply (Aplicar) en la parte inferior del formulario para guardar los cambios. El Administrador

del panel de tareas puede ahora empaquetar estos archivos en un archivo de distribucin 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 raz de Visual FoxPro. Crear, distribuir e instalar el paquete Para crear el paquete de distribucin del panel de tareas, seleccione el panel de tareas Cool Tools en el formulario Panel de personalizacin, 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), asegrese de que est seleccionada la casilla de verificacin 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 informacin del panel y cualquier archivo que haya sido agregado al panel en la seccin 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 instalacin 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 personalizacin. En el cuadro de dilogo 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 botn 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 instalacin del conjunto de herramientas, primero asegrese de que ha eliminado la categora Cool Tools de su ToolBox, si existiera all. Luego, renombre la carpeta \CoolTools que se encuentra en el directorio raz. El programa setup crea esta carpeta y copia la biblioteca de clases CoolTools del cach del panel. Haga clic en el vnculo Install Tool Set para ejecutar la instalacin y luego mire el ToolBox para ver aparecer la categora Cool Tools. Al instalar paquetes de paneles XML, que descarga de Internet, asegrese de que puede confiar plenamente en su suministrador. Luego, que es instalado un panel de tareas, puede ejecutar cdigo 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 ms peligroso que intercambiar cualquier otro cdigo slo asegrese de quien se lo enva. Nota de la traductora. Si desea conocer todos los detalles del Administrador del Panel de tareas, le recomiendo el artculo 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 versin en idioma espaol 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 cmo crear un conjunto de herramientas sencillo y cmo distribuirlo, a travs de un panel de tareas dinmico, 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

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 aplicacin Toolbox reside en el directorio raz de Visual FoxPro (HOME()) y se llama Toolbox.app. Como ha visto anteriormente, el contenido especfico para cada usuario se guarda en el archivo ToolBox.dbf que ToolBox lee para cargar las herramientas, categoras y filtros que el usuario ha creado. La localizacin del contenido del ToolBox es guardado en el archivo de recursos FoxUser y lo predetermina en la carpeta HOME(7). La aplicacin ToolBox tambin lee la tabla llamada Tooltype que guarda informacin sobre las categoras y tipos de herramientas admitidos por ToolBox. Esta tabla controla cmo la aplicacin ToolBox va a cargar las clases de herramientas desde la biblioteca de clases _toolbox.vcx. Esta biblioteca de clases contiene la implementacin de clases para todas los tipos de categoras y herramientas. La biblioteca de clases ToolBox.vcx y la tabla Tooltype se guardan en una carpeta \ToolBox en la raz de Visual FoxPro. Tener este metadato y biblioteca de clases guardados fuera de la aplicacin ToolBox.app permite que para la creacin y distribucin de una nueva categora 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 ejecucin. Puede querer cambiar la implementacin de un elemento de clases de herramientas sin tener que recompilar ToolBox.app. Cuando vea ejemplos de cmo crear nuevas herramientas y categoras, va a comprender realmente lo valiosa que llega a ser esta caracterstica. 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 raz 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 dilogo Opciones de Visual FoxPro. Puede pasar un parmetro de cadena que es el ID de la categora a la aplicacin ToolBox que especifique la categora 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 instalacin. Puede establecer o crear tablas de contenido de ToolBox mediante programacin 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 categora que quiere aplicar al ToolBox. Todo el cdigo fuente para la aplicacin ToolBox est incluido en el Xsource.zip contenido en la carpeta \Tools\XSource\ bajo el directorio raz 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 localizacin puede

ser modificado en Customize Toolbox (Personalizar ToolBox) > Options (Opciones). Esta tabla guarda todos los elementos, categoras, 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 descripcin para cada campo de la tabla de contenido del ToolBox. Tipo Descripcin C(25), Indexado Un ID nico para cada artculo creado. Debe tener el formato de NombreDeCompaia.IDUnico Por ejemplo: microsoft.textscraps C(1), Indexado Indica el tipo de elemento del Toolbox: 'C' = category (categora) 'F' = favorites category (categora 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 parmetro 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 categora padre o conjunto de filtros a los que pertenece. Para add-in (ShowType="A"), referencia el Toolbox.UniqueID de la opcin del men padre a la que pertenece el add-in. C(100) Nombre amistoso para la herramienta, categora o conjunto de filtros. M Imagen a mostrar para el elemento de la herramienta.

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 seccin 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 especfico para el elemento. Es la informacin del cuadro de dilogo propiedades del elemento y categora. Por ejemplo, para un elemento de clases puede ser especficamente 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 categora o una categora favorita, establezca en TRUE para impedir que se agreguen nuevos elementos. L

Establezca a TRUE (Verdadero) para evitar eliminar este elemento de herramienta o categora. L Establezca a TRUE (Verdadero) para evitar renombrar este elemento o categora. 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 modificacin 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

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

Tabla ToolType Adems de la tabla de contenidos del ToolBox, existe una tabla ToolType que se localiza en la carpeta \Toolbox\ de la aplicacin ToolBox (\Program Files\Microsoft Visual FoxPro 8\Toolbox\). Si esta tabla no puede ser encontrada cuando comienza el ToolBox, se utiliza una versin incluida que se compila dentro de la aplicacin ToolBox.app. Las tablas ToolType guardan informacin sobre las categoras y tipos de herramientas que admite ToolBox. Cada fila representa un tipo de categora soportada o elemento de herramienta. Cuando el elemento de herramienta y categoras se crean en el ToolBox, la informacin 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 categora, agregue filas en esta tabla. Tipo Descripcin C(25) Un ID por cada registro creado. Las entradas que se agreguen deben tener el formato NombreDeCompaia.IDUnico. C(1) Indica el tipo de elemento del Toolbox: 'C' = category (categora) '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

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 dilogo propiedades despus de crear un elemento/categora de este tipo. C(25) Para tipos de categora (ShowType = 'C'), se refiere a ToolType.UniqueID para el elemento predeterminado que debe contener esta categora. I Indica el orden en que el elemento aparece en este contenedor. M Texto que es mostrado en ToolTips y en la seccin 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 modificacin Nombre del campo UniqueID ShowType ToolType ClassName ClassLib FileType DataValues ShowNew

PropSheet DefaultID DisplayOrd ToolTip Inactive User Modified


Tabla 5. Campos de la tabla ToolType.

Biblioteca de clases ToolBox La biblioteca de clases contiene la jerarqua de clases para todos los elementos de herramientas y categoras 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 adems modificar esta biblioteca de clases directamente para cambiar el comportamiento de las clases admitidas. Si slo desea agregar un nuevo men contextual de comportamiento para un elemento, puede hacerlo a travs de un add-in. Comprender las caractersticas 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 categoras. En esta seccin, echar un vistazo a algunos de los mtodos y propiedades ms importantes de esas clases. Se concentrar en los mtodos comunes que tpicamente sobrescribe para admitir sus propias herramientas.

Figura 6. La jerarqua de clases del elemento de clases del ToolBox.

La jerarqua de clases, de las clases del ToolBox, comienza con la clase _root. Todos los elementos de herramientas y categoras para esta clase. Aqu es donde son definidos los mtodos comunes que son utilizados OnClick, OnDblClick, OnKeyPress, OnOleSetData, OnStartDrag, y OnCompleteDrag. Estos mtodos proporcionan un control finamente granulado de los comportamientos clic y arrastrar y soltar de todas las categoras y herramientas del ToolBox. Las propiedades ms importantes y los mtodos de las clases del ToolBox se enumeran a continuacin. Propiedades y mtodos comunes ShowAsLink: Esta propiedad est establecida a .T. (verdadero) si el elemento necesita ser mostrado en estilo de hipervnculo cuando el ratn le pasa por arriba. Esto se aplica solamente a elementos que no son categoras. 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 mtodos del motor (ver ejemplos de utilizacin de esta propiedad al crear add-in y un tipo dinmico de categora).

OnDblClick(): Este mtodo es llamado cuando se hace doble clic sobre el elemento con el ratn. Tambin se ejecuta para un simple clic, si el doble clic no est seleccionado, para abrir el elemento del cuadro de dilogo Opciones. OnClick(): Este mtodo es llamado cuando se hace clic sobre el elemento con el ratn. OnKeyPress(nKeyCode, nShiftAltCtrl): Este mtodo es llamado cuando el objeto tiene el foco y se presiona una tecla. OnRenderCategory(oToolCollection): Este mtodo est disponible para las clases que heredan de la clase _category. Se ejecuta cuando se abre esta categora, para llenarla con los elementos de herramientas. (Ver un ejemplo de utilizacin de este mtodo cuando cree categoras dinmicas ms adelante.) CreateContextMenu(oContextMenu): Este mtodo es llamado cuando es activado el men contextual para un elemento. Es aqu donde son agregadas opciones del men contextual. El parmetro oContextMenu es el objeto de men que puede ser manipulado utilizando el mtodo AddMenu, por ejemplo:
LPARAMETERS oContextMenu LOCAL oMenuBar oMenuBar = oContextMenu.Addmenu("Run", "oRef.RunItem()") oMenuBar.Bold= .T.

El primer parmetro del mtodo AddMenu del men contextual es el encabezado de la opcin de men. El segundo parmetro es una cadena que contiene el cdigo a ejecutar cuando el elemento de men es seleccionado, en este caso oRef.RunItem(). La variable oRef evala en tiempo de ejecucin la instancia del objeto herramienta cuando el usuario escoge la seleccin del men. En este ejemplo, es llamado el mtodo RunItem del objeto. Sin embargo, un asistente u otro programa externo pueden ser ejecutados tambin. El mtodo 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 Caption Tipo String Valor predeterminado Descripcin Encabezado a mostrar en la barra de men. Cdigo a evaluar y ejecutar cuando la barra de men es seleccionada. Nombre de la imagen a mostrar. Indica si la barra de men es seleccionada. Indica si la barra de men est disponible. Indica si la barra de men tiene formato en negrita.

ActionCode String Picture Checked IsEnabled Bold String Logical .F. Logical .T. Logical .F.

Tabla 6. Propiedades de un elemento Menu bar (barra de men)

Estas propiedades pueden ser pasadas tambin al mtodo AddMenu como parmetros en el orden mostrado.
oContextMenu.Addmenu("Run", "oRef.RunItem()", "Picture.bmp", .F., .T., .T.)

OnCreateDataValues(): Algunos elementos del ToolBox especifican informacin adicional en su hoja de propiedades. Por ejemplo, las herramientas basadas en archivos tienen una propiedad para el nombre del archivo. El mtodo es llamado cuando el elemento es instanciado y llena una coleccin de propiedades para una instancia en particular. Esto se hace llamando al mtodo AddDataValue que agrega una nueva propiedad en la coleccin oDataCollection. Esto aade 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)

Parmetro cName

Tipo String Nombre de la opcin. Valor predeterminado.

Descripcin

Any xDefaultValue (cualquier tipo) cCaption cTooltip lReadOnly cClassName String String Logical String

Encabezado a mostrar en la ficha propiedades. Texto ToolTip. Indica que el control es Slo-Lectura. Nombre de la clase del control utilizado para colectar este valor de la propiedad. Biblioteca de clases donde se define el control a mostrar. Si este parmetro no se especifica o est vaco, se predetermine igual a ToolboxCtrls.vcx que se compila dentro de la aplicacin Toolbox.

cClassLibrary String

<dl><dt>Tabla 7. Parmetros del mtodo AddDataValue </dt></dl> Los ltimos dos parmetros de este mtodo especifican el nombre de la clase y la localizacin 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 cFoxCheckbox cFoxEditbox cFoxSpinner cFoxTextBox cFoxDirectory cFoxFileName Checkbox EditBox Spinner TextBox Container (Muestra el cuadro de dilogo GETDIR() Container (Muestra el cuadro de dilogo GETFILE() Clase Base

Tabla 8. Clases comunes en la biblioteca de clases.

Adicionalmente el mtodo GetDataValue devuelve el valor de la propiedad desde la coleccin y SetData Values establece un valor para una propiedad existente en la coleccin. Puede utilizar adems el mtodo EvalText para evaluar el valor de la propiedad. Si el valor de la propiedad est rodeado por parntesis, EvalText devuelve la versin evaluada del valor; en caso contrario, trata el valor como un literal. Esto es til si la propiedad contiene cdigo script, funciones o variables.
cFileName = THIS.EvalText(NVL(THIS.GetDataValue("filename"), ''))

Mtodos OLE Arrastrar y soltar Las clases de herramientas estn basadas en la clase Custom de Visual FoxPro y no heredan de Visual FoxPro el mtodo arrastrar y pegar, que les son tan familiar al desarrollador. Sin embargo, las clases de herramienta son enviadas a los mtodos OLE arrastrar y pegar llamados desde el botn ToolBox que las contienen. Por ejemplo, el mtodo OLEStartDrag de la clase toolboxbutton llama al mtodo OnStartDrag del elemento de herramienta de clase. Para ms informacin sobre el OLE de arrastrar y pegar vea el resumen de OLE Arrastrar y pegar en la documentacin de Visual FoxPro. OnOleSetData(oDataObject, eFormat, oDropTarget, nMouseXPos, nMouseYPos): Este mtodo establece el dato a arrastrar y pegar. Puede colocar el dato en el oDataObject en formato especificado con el mtodo 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 operacin 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 mtodo, el que es llamado desde el mtodo OnCompleteDrag. El cdigo que se ejecuta establece el dato adecuado a pasar al mtodo. El objeto puede ser soltado en el rea de trabajo de diseadores y ventanas de edicin.

Crear comportamientos Add-In

Utilice add-in para extender el comportamiento de un tipo particular de elemento o categora al llamar cdigo de personalizacin que coloca en el ToolBox de la tabla contenido. Puede fcilmente 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 aplicacin ToolBox para crear un add-in. Aunque haya saltado la discusin de la arquitectura, puede crear todava 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 mtodos 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

Estos elementos representan clases que pueden ser diseadas en el diseador 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 diseadores de clases o formularios para crear una instancia del objeto. Puede adems arrastrar y soltar a un editor de Clases basadas en texto o ventana comandos para crear una llamada para instanciar el objeto. Es Bibliotecas de posible modificar y crear clases desde el men contextual. Seleccionando clases Modify (Modificar) se abre el diseador de clases para esta clase. Haga clic en Create subclass (Crear subclase) para abrir el cuadro de dilogo Clase nueva de Visual FoxPro (CREATE CLASS). El elemento clase formulario tambin 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. 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 Clases basadas en de clases basadas en bibliotecas de clases. Desde el men contextual tambin programas est disponible la accin Modify (Modificar) Haga clic en Modify para abrir un archivo de programa que contenga la definicin de clases. Estos elementos representan las clases base de Visual FoxPro que estn contenidas en la categora 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 dilogo Clase nueva de Visual FoxPro (CREATE CLASS). Estos elementos representan los archivos de bibliotecas de clases como tal (.vcx). Arrastre y suelte un elemento de la librera 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 dilogo Modificar clase, lo que es lo mismo que seleccionar Modify (Modificar) en el men contextual. 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 adems seleccionar Run (ejecutar) en el men contextual para ejecutar el programa.

Clase base

Archivo de biblioteca de clases

Programa

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 diseador de formularios, lo que es lo mismo que seleccionar Modify (Modificar) en el men contextual. Puede adems seleccionar Run (ejecutar) en el men contextual para ejecutar el formulario. 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. 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 adems seleccionar Run (ejecutar) en el men contextual para ejecutar el informe. 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. 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. 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 tambin hacer clic en Open (Abrir) en el men contextual para abrir la tabla. Arrastre y suelte un elemento de tabla al diseador de formularios, o haga doble clic cuando el diseador est abierto para agregar una cuadrcula (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 dilogo Opciones de Visual Foxpro la ficha Field Mappings (Mapeo de Campos) que se accede desde el men Herramientas. Seleccione el tipo Multiple (Mltiplo) y haga clic en Modify (Modificar) para cambiar la clase y la informacin de la biblioteca de clases. Si no hay diseadores 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 adems seleccionar Modify (Modificar) en el men contextual para abrir el diseador de tabla. Estos elementos representan los archivos de imgenes (.ani, .bmp, .cur, .dib, .gif, .ico, .jpg). Arrastre y suelte un elemento de imagen en el diseador o haga doble clic cuando un diseador 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

Men

Informe

Proyecto

Base de Datos

Tabla

Imagen

mismo efecto que hacer doble clic el archivo de imagen en el Explorador de Windows. Estos elementos representan los archivos de aplicacin (.app). Arrastre y suelte un elemento de aplicacin a un editor o ventana de comando para obtener la ruta del archivo y su nombre. Haga clic en el elemento para ejecutar la aplicacin, lo que es lo mismo que hacer clic en Run (ejecutar) en el men contextual para ejecutar la aplicacin. 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. Estos elementos son piezas de texto. Seleccione y arrastre el texto a la categora Text Scrap para crear un elemento text scrap. Arrastre y suelte un text scrap a una ventana de edicin, ventana de comandos, u otras aplicaciones de Windows que admite soltar y pegar textos. Los elementos Text scrap pueden ser evaluados utilizando caractersticas de FoxPro de text-merging Visual, ya que el cdigo puede ser embedded en el text scrap y es evaluada cuando es arrastrada. Arrastre y suelte un text scrap a los diseadores para soltar los controles etiquetas para cada lnea 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. Estos elementos representan los componentes ActiveX cargados. Puede arrastrar y soltar este tipo de elementos al rea del diseador de clases y formularios para soltar un Control OLE, o, arrastre y suelte en un editor de texto para crear una llamada a una instalacin de un objeto. Puede adems 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 mtodos. Estos elementos representan los servicios Web XML registrados. Puede arrastrar y soltar este tipo de elementos para el rea de trabajo del diseador de clases y formularios para soltar un proxy de servicio Web que especifique. De forma predeterminada la clase WSHandler es utilizado en la librera de foundation clases _ws3client FoxPro. Arrastre y suelte un elemento de Servicio Web XML a una ventana de editor de texto para generar un cdigo proxy automticamente. Elementos basados en otro tipo de archivo de Windows que no tiene un comportamiento especfico soportado por el Toolbox puede tambin mantener, an en las categoras, como un tipo de archivo genrico. 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.

Aplicacin

Archivo de texto

Text Scrap

Control ActiveX

Servicio Web XML

Otros tipos de archivos de ventanas

Tabla 9. Elementos del ToolBox y su comportamiento.

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

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 informacin que se muestra en la tabla 10. Campo UNIQUEID SHOWTYPE TOOLTYPEID TOOLNAME INACTIVE MASSI.BUILDAPP A PJX Build Application .F. Valor

Tabla 10. Informacin necesaria para agregar una opcin de men contextual Build Application (Generar aplicacin)

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 opcin Build Application va a aparecer en el men contextual para todas las herramientas de proyectos en el ToolBox. Especifique el cdigo 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 parmetro, oToolItem, que es una referencia de la herramienta de objeto donde fue activado el add-in. Puede acceder a cualquier propiedad o mtodo del elemento y ejecutar cualquier cdigo. 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)

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

Otro ejemplo es crear una seleccin del men para los elementos llamada Rename (Renombrar). Al seleccionar, este comando abre un cuadro de dilogo 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 categora. Abra su tabla ToolBox y agregue un registro nuevo para introducir la informacin que se muestra en la tabla 11. Campo UNIQUEID SHOWTYPE TOOLTYPEID TOOLNAME INACTIVE MASSI.RENAMECLASS A CLASS Rename Class .F. Valor

Tabla 11. Informacin necesaria para agregar una opcin de men Rename en el men contextual.

Luego, especifique el siguiente cdigo 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

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 categora 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 mtodo 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 dilogo donde introducir el nombre de la clase nueva. Entonces, crea una copia del elemento de clase en la biblioteca de clases y refresca la categora para mostrar esta nueva clase como un elemento del men. Y luego, agregue un registro nuevo e introduzca la informacin que se muestra en la tabla 12. Campo UNIQUEID SHOWTYPE TOOLTYPEID TOOLNAME INACTIVE MASSI.COPYCLASS A CLASS Copy Class .F. Valor

Tabla 12. Informacin necesaria para agregar una opcin de men Copy Class al men contextual.

Luego, especifique el cdigo 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 aparecern en el men contextual de todas las herramientas de clase.

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 fcilmente agregando la informacin de la tabla 13 en un nuevo registro de la tabla de contenidos del ToolBox. Campo UNIQUEID SHOWTYPE TOOLTYPEID TOOLNAME INACTIVE MASSI.CLASSSTUFF A CLASS Class Stuff .F. Valor

Tabla 13. Informacin 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 ningn registro nuevo en el add-in Class Stuff, porque el ToolBox automticamente generar la jerarqua de los mens add-in buscando el campo ParentID (figura 8).

Figura 8. Puede agregar fcilmente opciones add-in en sus propios sub-mens.

Como puede ver, los add-in pueden ser muy poderosos, y al mismo tiempo, muy sencillos de crear. Hasta ahora hemos creado opciones estticas de men. Qu pasa si desea crear una opcin dinmica de men? Por ejemplo, suponga que desea agregar un comportamiento add-in a una herramienta de librera de clases que muestre sus clases miembro en un men add-in. Al seleccionarlo, este men add-in abrir el Diseador de clases. En dependencia de la biblioteca de clases seleccionada, este men puede contener elementos diferentes. Afortunadamente, el ToolBox

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 UNIQUEID SHOWTYPE TOOLTYPEID TOOLNAME INACTIVE MASSI.MODICLASSLIB M VCX Modify Class .F. Valor

Tabla 14. La letra M en el campo ShowType le permite especificar un men contextual en su cdigo.

En el campo ToolData para este men add-in, el siguiente cdigo crea elementos del men dinmicamente basados en los nombres de clases contenidos en el VCX. Esto lo hace manipulando el objeto oContextMenu manualmente con el mtodo 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 mtodo del elemento del men InvokeAddIn que llama al add-in MODICLASS y abre el Diseador de clases para las clases seleccionadas.
*-- Add-Ins con ShowType == 'M' pasa el men contextual como el segundo *-- parmetro, el que podemos utilizar para crear un men dinmico. 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 dinmicamente 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 informacin que aparece en la tabla 15. Campo UNIQUEID SHOWTYPE TOOLTYPEID INACTIVE MASSI.MODICLASS A VCX .T. Valor

Tabla 15. Informacin 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 mtodo InvoqueAddin.

En el campo ToolData, el cdigo 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 opcin 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 Diseador de clases.

Figura 9. Puede crear mens add-in que son creados dinmicamente en tiempo de ejecucin.

Categoras con comportamiento add-ins. Los comportamientos Add-ins tambin se crean para tipos de categoras. La tabla 16 lista los tipos de categoras admitidas actualmente y sus comportamientos. Tipo de categora Categora General Categora carpeta dinmica Text scraps Comportamiento Esta categora no tiene un comportamiento especial. Es una categora esttica que puede contener cualquier tipo de elemento de herramienta. Especifica una carpeta de sistema y tipos de archivos para que sean ledos por este tipo de categora. Cuando la categora se abre, se llena dinmicamente el conjunto de herramientas basndose 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. Este tipo de categora crea herramientas scrap tools cuando el texto es seleccionado

y soltado en esta categora. Puede adems seleccionar texto de otras aplicaciones de Windows tales como Word, y arrastrar a la categora Text scrap para crear automticamente un text scrap. Arrastre el text scrap desde el Toolbox a una ventana de edicin u otras aplicaciones Windows para soltar el texto. Los text scraps pueden ser creados tambin utilizando la capacidad de text merge de Visual FoxPro de tal forma que el cdigo 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 Este tipo de categora muestra todos los servicios Web de Visual FoxPro XML registrados y especificados en el Administrador del IntelliSense de Visual FoxPro.
Tabla 16. Tipos de categoras admitidos actualmente y sus comportamientos add-in.

Puede adems crear su propio comportamiento add-in adems de estos comportamientos, agregando registros a la tabla de contenido del ToolBox. La nica diferencia entre el campo ToolTypeID indica un tipo de categora en lugar de un tipo de herramientas. Por ejemplo, para crear un comportamiento add-in para categora general, entre CATEGORY.GENERAL para el valor de ToolTypeID. Otros add-in Puede crear adems add-in que estn disponibles en todos los mens contextuales para todos los elementos del ToolBox. Esto es til si necesita un comportamiento que no sea especfico 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 UNIQUEID SHOWTYPE TOOLTYPEID TOOLNAME INACTIVE Dock .F. MASSI.DOCK A Valor

Tabla 17. Informacin para agregar una opcin Dock de men contextual

Observe que el campo ToolTypeID est vaco. Esto orienta al ToolBox para colocar este add-in en todos los mens contextual. El cdigo 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 mens contextuales, puede crear comportamientos que se ejecuten cuando una categora, 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 informacin en la tabla 18.

Campo UNIQUEID SHOWTYPE CLASSTYPE INACTIVE MASSI.ONLOADEXAMPLE A ONLOAD .F.

Valor

Tabla 18. Informacin para agregar un comportamiento ONLOAD

En el campo ToolData, un simple mensaje se muestra para este ejemplo. Sin embargo, observe que se pasa al cdigo, una referencia al motor ToolBox:
LPARAMETERS oToolboxEngine Messagebox("Leyendo tabla Toolbox " + oToolboxEngine.ToolboxTable)

Al reiniciar el ToolBox, este cdigo 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 fcilmente intercambiar con otros desarrolladores comportamientos add-in como parte de sus conjuntos de herramientas. Si crea herramientas de terceros, cumpla la misma convencin 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 instalacin y actualizacin.

Sobrescribir comportamientos y apoyar nuevos tipos de herramientas.


Como se ha discutido en la sesin anterior, los add-in son una va sencilla para agregar comportamiento personalizado para un conjunto actual de los tipos del ToolBox y se distribuyen fcilmente como parte de un conjunto de herramientas. Adems 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 categoras. Para la mayora de situaciones, los add-in cumplen lo que el desarrollador necesita, sin embargo, existen casos cuando necesita crear su propia implementacin 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 cdigo 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 categoras que cree debe heredar desde _category, y las categoras dinmicas deben heredar de _dynamiccategory. El primer ejemplo describe cmo sobrescribir un comportamiento para todas las herramientas de un tipo determinado. Existen dos vas 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

del mtodo apropiado en el _toolbox.vcx para la clase de herramientas que desea modificar. Al reiniciar el ToolBox, lee el nuevo cdigo 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 configuracin de registro, que se puede establecer en el cuadro de dilogo Opciones de Visual Foxpro la ficha Asignacin de campos. Al seleccionar el tipo Mltiple. Si esto no se establece, suelta la clase base Grid de Visual FoxPro. Esto significa que cada elemento de tabla soltado, tendr esta configuracin establecida. Para establecer esta informacin para el elemento de la tabla, en unin con este acercamiento global, una opcin es modificar la clase _dbftool para buscar el nombre de la clase grid y la biblioteca especificada en el elemento del cuadro de dilogo 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 diseadores.

La primera aproximacin 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 diseador de clases, y abra el mtodo DropOnContainer. Puede ver el siguiente cdigo:
#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 localizacin a *-- utilizar. cClassLib = THIS.GetRegistryValue("ClassLocation", INTELLIDROP_KEY + "Multiple")

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 dilogo propiedades. *-- Todas las propiedades de escritura se establecern 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 diseador THIS.DropObject(oDropTarget, cSCXName, nXPos, nYPos, cClassName, ; cClassLib, '', cOriginalObjName, cPropertyList, '', '', cFilename)

Es importante entender, que este mtodo est leyendo el registro para el nombre de clase y localizacin, as que puede especificar esa informacin en los parmetros cClassName y cClassLib del mtodo DropObject. Entonces, todo lo que necesita hacer, es establecer esas dos variables con la informacin correspondiente. Puede hacer esto con string parking. Las propiedades de un elemento pueden ser obtenidas llamando al mtodo 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") *-- Dnde estn 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 (configuracin de registro Mltiple)

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 cdigo busca primero las propiedades para Class y ClassLibrary. Si se encuentran estas propiedades, establece las variables adecuadas, que son entonces pasadas al mtodo DropObject. El mtodo EvalText evala 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 localizacin de la biblioteca de clases en cuadro de dilogo 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. Especficamente 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 informacin 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 algn comportamiento especial; pero no desean sobrescribir este comportamiento para todas las herramientas de este tipo. En este caso, no necesita tocar la tabla ToolType. Slo necesita entrar la informacin 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 gurdela en la misma carpet del _toolbox.vcx.
CREATE CLASS mydbftool OF MyToolbox.vcx AS _dbftool FROM _toolbox.vcx

Modifique el mtodo DropOnContainer para incluir los cambios de cdigo 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 cuadrcula 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.

Este mismo mtodo es utilizado para agregar un nuevo tipo de herramienta al ToolBox. Primero, cree su clase de herramientas heredando de una herramienta determinada en la jerarqua. 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 cdigo apropiado para su nueva clase de herramientas. Finalmente, agregue su nuevo tipo de herramienta en la tabla ToolType, asegrese 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 artculo para ver la descripcin de los campos de la misma.) Campo UNIQUEID SHOWTYPE TOOLTYPE CLASSNAME CLASSLIB SHOWNEW PROPSHEET INACTIVE MASSI.TABLEEX T Extended Table mydbftool C:\Program Files\Microsoft Visual FoxPro 8\Toolbox\MyToolbox.vcx .T. .T. .F. Valor

Tabla 19. Informacin 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 dilogo 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 dilogo Add Item.

Despus 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). Adems, 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 diseador, es soltado un grid basado en la clase que

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

Soportar nuevos tipos de categoras


Crear nuevas categoras, es el mismo proceso que crear un nuevo tipo de herramientas. Crear la clase categora y agregar un registro en la tabla ToolType. Tipicamente, agrega una nueva categora porque necesita cumplimentar determinadas acciones cuando esta categora sea abierta. Algunas de las categoras built-in ya hacen esto: por ejemplo: una categora de carpeta dinmica crea un elemento de herramienta al vuelo, cuando es abierto. Una categora dinmica tiene algunas caractersticas especiales que usted explorar. Al crear categoras dinmicas, los elementos en las categoras no estn representados fsicamente 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 categora basada en carpeta dinmica, no ver estos registros. Esto es adems, por qu las categoras dinmicas muestran el mensaje "Dynamic Category - click on Category Properties to modify" ("Categora Dinmica haga clic en Category Propierties (Propiedades de las categoras) 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, algn mtodo especial que guarde y restaure los elementos virtuales. Por ejemplo, puede crear una categora 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 rpida y fcilmente, cambiar la configuracin de entorno y ejecutar script para establecer los proyectos. Puede asociar los proyectos con los conjuntos de entorno. Se accede tpicamente desde el Administrador del panel de tareas; pero puede ejecutar adems EnvMgr.app como una aplicacin stand-alone. De hecho, puede pasar el nombre del conjunto de entorno para ejecutar automticamente y puede especificar si ejecutar en modo silencioso (quiet mode). Puede adems pasar el nombre de un proyecto especfico para abrir que se aplicar los parmetros 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 categora sea creado dinmicamente 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 adems establecer dos opciones en la categora: 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 opcin est en blanco, se asume la carpeta predeterminada. Lo primero que hay que hacer, es crear una categora de administrador de entorno, que es una subclase de _dynamiccategory.
CREATE CLASS EnvMgrCategory OF MyToolbox.vcx AS _DynamicCategory FROM _toolbox.vcx

Al crear su propio tipo de categora dinmica, existen dos mtodos a sobreescribir: OnCreateDataValues y OnRenderCategory. En el mtodo OnCreateDataValues al especificar las opciones que debe proporcionar esta categora. Esta informacin se muestra en la hoja de propiedades de la categora. Puede especificar una opcin a ejecutar en modo silencioso, y una opcin para especificar la tabla de Administrador de entorno a utilizar. Idealmente, puede utilizar la tabla de recursos de Visual FoxPro para obtener esta informacin. 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 mtodo AddDataValue. El cdigo del mtodo OnCreatDataValues debe contener lo siguiente:
*-- Agregar todas las propiedades dinmicas de una categora dinmica. DODEFAULT() *-- Agregar nuestras propiedades adicionales. THIS.AddDataValue("quietmode", .F., "Run quietly", '', .F., "cfoxcheckbox") THIS.AddDataValue("envfile", '', "Env. Manager Table", '', .F., "cfoxfilename")

Luego, escriba el cdigo en el mtodo OnRenderCategory para crear cada elemento de herramienta en la categora. 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 categora. Cuando es seleccionada esa herramienta en esa categora, ejecute EnvMgr.app, pasndole el UniqueID del elemento, y un segundo parmetro para indicar si se ejecuta en modo silencioso. Para facilitar este comportamiento, los elementos de herramienta que cree dinmicamente son una instancia de la herramienta de aplicacin 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 aplicacin ya tiene un comportamiento para ejecutar una aplicacin cuando es seleccionado, todo lo que debe hacer es establecer la propiedad de nombre de archivo de la aplicacin Administracin de entorno. Puede agregar parntesis alrededor del nombre de la propiedad tal que pueda ser evaluada en tiempo de ejecucin. Puede entonces, llamar fcilmente a la aplicacin Administrador de entorno con parmetros. Por ejemplo, para ejecutar un conjunto de entorno en modo silencioso, cree manualmente un elemento de aplicacin y establezca la propiedad filename como sigue:
(DO (HOME() + "ENVMGR.APP") WITH "_0VK0QENFH", .T.)

Sin embargo, cuando crea un elemento de aplicacin manualmente, crea un registro fsico en la tabla de contenidos del ToolBox. Estas categoras necesitan crear una aplicacin virtual, que son mostradas dinmicamente cuando la categora es abierta. Puede administrar sus conjuntos de entorno en un lugar, el Administrador de entorno, y la categora recoge los cambios automticamente. Para crear elementos de herramienta virtual, utilice dos mtodos del motor del ToolBox: GetVirtualToolObject y SaveVirtual. Estos mtodos manipulan un cursor interno de herramientas virtuales llamado VirtualCursor. Una referencia a un motor, puede obtenerse a travs de la propiedad oEngine de una herramienta de clase. Estas herramientas, pueden ser agregadas a la coleccin oToolCollection que se pasa en el mtodo OnRenderCategory. El mtodo OnRenderCategory contiene lo siguiente:
*-- Cargar la coleccin oToolCollection pasada con los objetos de herramientas *-- en esta categora en este caso, un objeto de categora 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

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 parmetro es el encabezado para el objeto de herramienta y *-- el tercer parmetro 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 *-- parmetro 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 *-- aplicacin virtual. oToolObject.SetDataValue("filename", cFileName ) *-- Salva el objeto de herramienta virtual en el VirtualCursor THIS.oEngine.SaveVirtual( oToolObject) *-- Agregue la herramienta a la coleccin de tal forma que pueda mostrar en *-- la categora. oToolCollection.Add( oToolObject) ENDIF ENDFOR ENDIF RETURN

Note cmo la propiedad QuiteMode de la categora, 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 cdigo para hacer algo de esto en el objeto herramienta como tal. El paso final es agregar el nuevo tipo de categora 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

UNIQUEID SHOWTYPE TOOLTYPE CLASSNAME CLASSLIB SHOWNEW PROPSHEET INACTIVE

MASSI.ENVMGR C Environment Manager EnvmgrCategory C:\Program Files\Microsoft Visual FoxPro 8\Toolbox\MyToolbox.vcx .T. .T. .F.

Tabla 20. Informacin para agregar un nuevo tipo de categora para el Administrador de entorno.

Ahora, reabra el ToolBox, y agregue una categora del Administrador de entorno seleccionando Environment Manager (Administrador de entorno), el que es listado como una seleccin disponible en la lista de tipos de categoras. Escriba el nombre de la categora y haga clic en OK. Aparece la hoja de propiedades de la categora, 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 categora que crea, muestra sus propiedades personalizadas en el cuadro de dilogo Category Properties (Categora de las propiedades).

Abra la categora, y podr ver el elemento de herramienta aplicacin para cada conjunto de entorno y proyecto en el Administrador de entorno (Figura 13). Haga clic en una herramienta de aplicacin para ver su conjunto de entorno.

Figura 13. El tipo de categora Administrador de entorno que ha creado muestra su conjunto de entorno y proyectos como una aplicacin de herramienta virtual.

Conclusiones
En este artculo, aprendi cmo crear y distribuir conjuntos de herramientas a sus equipos de desarrollo y cmo crear paquetes de instalacin de conjuntos de herramientas. Aprendi adems, sobre la arquitectura del ToolBox y lo fcil que es extender el ToolBox, creando poderosos comportamientos add-in. Adems, ha descubierto cmo sobrescribir comportamientos existentes, y agregar su nuevo tipo propio de herramienta y categora.

You might also like