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
¿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.exe 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 ejecutable
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@total.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@yahoo.com
ó db2kSistemas@netscape.net