
ListBox en modo caracter
Os voy a presentar una rutina con la cual podremos generar un listbox (mas o menos) de lo que deseemos para utilizarlo en cualquier programa.
La idea parte, porque muchas veces tenía que hacer pequeñas ventanitas para mostrar opciones y he pensado en hacer una genérica en un programa aparte, el cual es llamado y así construir lo que podriamos llamar un listbox, con algunas limitaciones.
El programa, va a consistir en una pequeña ventana que podremos colocar en cualquier parte de la pantalla. Esa ventana recibira una Linkage con los valores necesarios, que son los siguientes:
- LB-DATO, será el dato que le pasaremos una vez seleccionado un elemento o vacío, en caso de rechazarlo.
- LB-TOTAL, número de elementos que tendrá el LISTBOX.
- LB-TITULO, titulo de la ventana para información.
- LB-COLUM, la columna donde aparecerá la ventana.
- LB-LINEA, la línea donde aparecerá la ventana.
- LB-ORDEN, podrá tener el valor 0 ó 1, e indicará si se clasificará la tabla.
- LB-MULTI, indicará si será multiselección o no.
- LB-TABLA, será la tabla que contendrá los elementos del ListBox, en principio yo la he dimensionado con 100 elementos de 30 caracteres de ancho, pero podéis cambiarla como queráis, teniendo en cuenta también entonces, las dimensiones de la ventana. Además en la tabla guardaremos para la multiselección si está o no seleccionado el elemento.
Desde cualquier programa que llamemos a la rutina deberemos tener los campos definidos como sigue:
01 LB-CONTROL.
02 LB-DATO PIC X(30).
02 LB-TOTAL PIC 9(6).
02 LB-TITULO PIC X(30).
02 LB-COLUM PIC 99.
02 LB-LINEA PIC 99.
02 LB-ORDEN PIC 9.
02 LB-MULTI PIC 9.
02 LB-TABLA.
03 LB-ELEMEN PIC X(30) OCCURS 100 TIMES.
03 LB-SIONO PIC 9 OCCURS 100 TIMES.
Ahora para hacer la llamada, solo habrá que dar los datos a los campos y hacer el Call:
CALL 'listbox' USING LB-CONTROL
Al volver a nuestro programa, después de ejecutar el ListBox, el campo LB-DATO contendrá la selección que se ha realizado o bien espacios, con lo cual podremos actuar como queramos.
Si la llamada se ha realizado con multiselección, entonces tendremos que recorrernos la tabla y comprobar que elementos tienen en la variable LB-SIONO un 1, eso significará que están seleccionados.
Los elementos de la tabla aunque solo sea un campo PIC X(30), podremos formatearlo previamente como deseemos, por ejemplo, código y nombre, NIF y nombre, teléfono y nombre, etc ....
¿Como funciona?
Una vez le lleguen los datos a la rutina, está los clasificará o no, dependiendo del valor de la variable LB-ORDEN y a continuación nos mostrará los 10 primeros. Para desplazarnos por el ListBox utilizaremos las flechas para ir de uno en uno, o bien AvPag, RePag, para avanzar o retroceder de 10 en 10.
Además pulsando una letra o número se sitúa en la línea que empieza por dicho carácter, lo que nos ayuda a posicionarnos en tablas muy grandes.
Le he puesto el signo mas a la derecha, para una previsualización del tamaño de la tabla. Y al final os muestra una línea de información sobre la cantidad de elementos que hay y los que se han seleccionado en caso de ser multiselección.
Cuando sea multiselección se antepondrá a cada línea el símbolo > que nos indicará si está o no seleccionado. Para seleccionar o deseleccionar utilizaremos la tecla TAB.
Os presento dos imagenes de como queda, extraidas de uno de los programas donde lo utilizo.

 Yo, personalmente, creo que ha quedado muy bien y sobre todo práctico. Ahora solo queda que lo bajéis y me digáis que tal os parece y si realmente es interesante.
Para descargarlo, solo seguíd este enlace.
|
|