El Control TreeDropper
Una clase personalizada escrita para Visual dBASE 7.01
por Dan Howard - Fecha: Marzo, 1999
Traducción : Juan Manuel Espinosa G., Desarrollador de Software

| Cual es el control TreeDropper? Caracteristícas Lo que se incluye en el paquete Instalación Como usar el TreeDropper en sus formas Algunas ideas para su uso Ajustando tuercas & tornillos Limitaciones Conclusión Problemas conocidos

¿Cuál es el control de TreeDropper?

El TreeDropper es un nuevo control que es similar en funcionalidad al combobox incluido en dBASE. Aunque este dejará caer abajo un treeview en lugar de la lista simple. Esto se aprovecha de dos de las clases más poderosas en dBASE: la clase container (recipiente) y la clase treeview.

#### Caracteristícas

- La caracteristica de dejar caer le da todas las propiedades disponibles al treeview.
- Produce la selección jerárquica de la lista y/o listas simples con imágenes.
- Los resultados pueden aparecer con o sin la exhibición de la jerarquía.
- Soporta un evento onChange si usted lo define.

¡ Mueva su ratón encima de la imagen para ver el TreeDropper en acción!

#### Lo que se incluye en el paquete

- DForm.cfm–Una clase tipo form personalizada que TreeDropper necesita.
- TreeDrop.cc–El código para el control TreeDropper.
- TreeDrop.wfm–UNA forma de ejemplo para demostrar este control.
- down.bmp - UN bitmap para el botón de descenso.
- back.png - El fondo para la forma de ejemplo.
- arrow.ico, darrow.ico, dot.ico, udarrow.ico - los Iconos usados en la forma de ejemplo. Enviado a mí por George Burt. ¡Gracias George!

#### Instalación

Simplemente extraiga todos los archivos de bu01tree.zip en un directorio, abra dBASE, localice el directorio donde deempacó los archivos a haga doble clic en TreeDrop.wfm en el navegador ver la forma de ejemplo.

#### Cómo usar el TreeDropper en sus propias formas

La primera cosa que usted debe hacer es abrir Dform.cfm en el editor de código y repasar los métodos agregados en él. Esta forma base tiene una característica importante del TreeDropper y cualquier otro control que usted pueda usar. DForm usa iteración para buscar un método especial llamado “INIT” en la forma o cualquier control en la forma. Si encuentra uno, lo ejecuta antes de que abra la forma. Esto le da la ventaja de toda la inicialización de la forma o cualquier control en la forma, puede hacerse mientras la forma no está visible en pantalla. Esto previene el parpadeo cuando usted abre la forma. La clase de DForm puede llevarse a cabo como una clase baja para sus propias formas o usted puede simplemente recortar el código y pegarlo en sus propias clases de tipo forma base. ¡DForm tiene tambíen otras golosinas!

Para asegurar que el TreeDropper siempre está cargado cuando dBASE arranca, abra una forma en el diseñador de formas, haga click-derecho en la paleta de componentes y eliga "Configurar Custom Components" del menú. Usted verá una caja de diálogo que lista todos los archivos de clase de personalizados (custom class)que usted actualmente use. Haga clic en el botón "Agregar" y localize el archivo TreeDrop.cc entonces pulse el botón “Aceptar” Ahora esta clase se agregará a su archivo de vdb.ini y se cargará la próxima vez automáticamente cuando usted abra dBASE.

Ahora vaya a la etiqueta “Costum” en la paleta de componentes, encuentre el objetoTreeDropper arrastrelo hacia la superficie de la forma. Lo que usted verá es algo similar a lo muestra la imagen de debajo. ¿Nota que el botón no esta ? Esto es porque cree este botón dinámicamente antes de que la forma abra y lo posiciono al margen correcto del entryfield. Esto le ahorra el problema de tener que reubicarlo usted mismo en el diseñador. Tampoco tiene que preocuparse por la longitud de ancho del entryfield o el propio treeview. Ellos se ajustaran a si mismos a la longitud de ancho del container (recipiente).

También note la línea delgada abajo del entryfield. Esto es el propio treeview. Lo hago pequeño para no tomar demasiado espacio de su forma. Este treeview será ajustado y reubicado en tiempo de ejecución dependiendo de la longitud de ancho del control TreeDropper. Está disponible en el diseñador que para que usted pueda personalizar el treeview de cualquier manera que usted quiera.

Si usted quiere agregar treeitems al TreeDropper en el diseñador de la forma, use su ratón para extender el recipiente descendentemene y entonces extender el treeview. Puede usar este treeview igual que cualquier otro standard en el diseñador.

Usted puede agregar, revisar y puede anular los elementos que usted quiera y la información se guardará en su forma. Hay otras maneras de relleno para treeview con elementos pero lo veremos mas adelante.

El TreeDropper tiene algunas propiedades personalizadas que usted también puede usar. Puesto que el dBASE no soporta todavia todavia el uso de propiedades personalizadas, estas tienen que ser definidos en los metodos Init o onOpen de su forma.

Estas son:

- DropDownHeight: Esta propiedad especifica la altura real del treeview cuando desciende el control (métrica en characters). Tiene como valor predefinido 7.
- ShowParents: Esta propiedad afecta como aparece el resultado de la selección del usuario en el entryfield. Cuando se asigno a verdadero (true), el texto de la selección actual y cada uno de los textos padre aparecerán en el entryfield. Cuando se asignó a falso (false) muestra solo el texto de la selección actual. Tiene como valor predeterminado falso (false).
- Separator: Esta propiedad se usa junto con la propiedad de ShowParents. Es una cadena que se mostrará como un separador entre cada texto del treeitem en el entryfield. Su valor predeterminado es “.”
- Selected: Ésta es una referencia al objeto del treeitem actualmente seleccionado.
- IsOpen: Esta propiedad le dice si un TreeDropper particular está abierto o no. No asigne a esta propiedad. Es para propósitos de solo-lectura.
- OnChange: Si se definió, esto se disparará cuando el usuario cambie su selección en el TreeDropper.

Vea el TreeDropForm (TreeDrop.WFM) para ver cómo se implementan estos metodos.

#### Algunas ideas para su uso

- Este control podría ser un componente en un atractivo sistema de ayuda.
- Usted podría personalizar esto para reemplazar un combobox regular. ¿Que tal una lista de estados o provincias con sus banderas como imágenes?
- Podría usarse para mostrar padres y relaciones en genealogía.
- Si usted es atrevido podría considerar el concepto de fabricación este control datos-aware (manejador de datos). Muy viable de hacer.

#### Ajustando Tuercas & Tornillos

Esta clase implementa algunas técnicas interesantes. Uno de los desafíos propuesto por este control es el orden-z (ordenamiento sencillo). Si se deja caer por ejemplo el pushbutton, los treeview se presentarán debajo de él. No es exactamente lo que nosotros queremos. Mi solución es usar de la API la función de SetParent. Esta función atará un objeto a otro objeto. Esto toma dos propiedades hWND como parámetros. Vea el código del TreeDropper para ver cómo funciona. Hay una limitación para esto: una lista de un combobox caerá fuera de la forma si es necesario - el la lista de TreeDropper no. Aun no me he figurado lo suficiente como hacer esto por si usted propone una forma de hacerlo, me lo deje saber.

Me gusta la habilidad para crear y mover objetos antes de que la forma se abra. Esto le permite definir dos tipos de funcionalidad: tiempo-de-diseño y tiempo-de-ejecución. También simplifica el uso de containers (recipientes) en el diseñador de la forma de modo que usted no tiene que tratar con ajustar todos los componentes del recipiente. Usted puede definir sus propias reglas sobre cómo los componentes del recipiente se verán en tiempo-de-ejecución.

Creé que una propiedad de la forma llamada ActiveTreeDropper en esta clase. Es un apuntador al control de TreeDropper que actualmente está activo. Acostumbro asegurar que solo un TreeDropper está abierto a la vez.

También agregué varios métodos nuevos al treeview que usted podría pasar a su propia clase del treeview.

- Fill: Este método llenará el treeview desde un arreglo. El arreglo puede ser una arreglo simple, una arreglo que contiene otros arreglos o un arreglo de objectos TreeItemInfo. Los objetos de TreeItemInfo son objetos simples para soportar información de un treeitem como las propiedades de su imagen etc. Usted podría crear una tabla para guardar esta información y entonces usarlo para llenar el treeview.
- Iterate: Este método ejecutará un bloque del código por cada elemento en el treeview. Usted puede ver cómo usar esto en una froma de ejemplo. El TreeDropper lo usa para asegurarse que cada treeitem se extiende antes de que abra.
- AddItem: Este método simplifica por usted el agregado de nuevos treeitems al treeview. Simplemente llame este método con un parámetro de string (cadena) y los treeitem se crearán con ese texto. El segundo parámetro es el padre bajo el que usted quiere crear el treeitem. Tiene como valor predefinido el propio treeview.

#### Limitaciones

Puesto que las listas son objetos y no simples cadenas usted no debe usar este control probablemente para listas muy grandes. Unos cientos serán suficientes pero más de eso y usted podría ejecutar desbordando la memoria.

No gasté mucho tiempo probando la lógica del posicionamiento con diferentes tipos de letra . Normalmente uso Arial 8 pt para mis formas y controles. Usted podría encontrar que el botón no se posiciona correctamente si usted regulariza en un formato de letra diferente. Las mejoras que haga en este área se apreciarán enormemente. También esto solo funciona con metrica de 'char'. Necesitaría algunos ajustes más para soportar otras metricas.

La propiedad de DropDownHeight realmente no hace lo que yo quiero. Esta debe especificar cuántos elementos aparecerán en el treeview sin tener en cuenta el tipo de letra o los tamaños que se usaron. Actualmente simplemente predetermina la altura del treeview a su mismo valor.

Finalmente definitivamente no llamaría a esto un control productivo. hace los básico pero hay mucha funcionalidad extra que podría agregarse. Dejeme saber cualquier idea que usted tenga para este control y lo implementaré para la próxima versión.

### Conclusión

Usted puede ver que la clase container ( recipiente) nos da una completa nueva avenida para la creación de controles personalizados (custom controls). Con el container(recipiente) podemos crear objetos compuestos. Puede crear virtualmente cualquier tipo de control que pueda soñar. Si usted está buscando inspiración para sus propios controles, de una mirada ahora al software que tiene en su escritorio. Piense acerca de como otros controles operan en en distintas aplicaciones. ¿Cómo interactua usuario con ellos? Cómo interactuan entre ellos ? Cuando usted vea algo que le gusta, siéntese, planéelo y entonces programelo . ¡Las posibilidades son interminables!

Problemas conocidos:

- En Visual dBASE 7.01 hay un error con el metodo releaseAllChildren. Si usted agrega treeitems en el diseñador y entonces intenta liberarlos en su código todavía serán visibles en el inspector.

> Workaround: Simplemente o use el treeview como un treeview estático o uno dinámico. No los mezcle. En otras palabras - si usted sabe que los contenidos de su treeviews van a cambiar en algún momento, no agrega artículos a ellos en el diseñador - use el método de Fill en su lugar.

Para descargar el código del Control TreeDropper, pulse aqui
(es archivo empacado de 63Kb)

Dan Howard ha sido un desarrollador de software independiente durante casi 10 años usando Clipper para DOS y el Visual dBASE para Windows. Puede contactarlo en : sproket ARROBA total PUNTO net.

Traducción por : Juan Manuel Espinosa, Desarrollador de Software en México, D.F.
Administrador de la Comunidad de dBASE en Español
puede contactarlo por e-mail en: juan_espinosa_mx ARROBA yahoo PUNTO com ó db2kSistemas ARROBA netscape PUNTO net.