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

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

    Lo que se incluye en el paquete

    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: Vea el TreeDropForm (TreeDrop.WFM) para ver cómo se implementan estos metodos.

    Algunas ideas para su uso

    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.

    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:

    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