Tutorial BBjGrid (parte 1)
Uso de BBjGrid para crear un control Grid
Uno de los controles más interesantes de dominar en BBj, es sin duda el BBjGrid. Quienes hayan trabajado con Grids en Visual Pro/5 usando la sintaxis existente, o haya hecho uso de las librerías GML para mejorar su funcionalidad, entonces agradecerá la nueva sintaxis de objetos del BBjGrid.
Este es el procedimiento sugerido para usar el control BBjGrid con métodos:
1. Crear un control Grid usando BBjWindow::addGrid
2. Definir varios atributos de la grid usando los métodos de BBjGrid
3. Establecer el texto de la celda usando BBjGrid::setCellText(fila,columna,texto) o setCellText(BBjVector) usando el objeto BBjVector. Si los datos tienen una extensión de filas y/o columnas, establecer el texto de las celdas en respuesta al evento de actualización de tabla puede ser aún más rápido dado que no tiene que inicializar los datos de todas las celdas a la vez. Usar setCellText(BBjVector) es más rápido que setCellText(fila,columna,texto) debido a que se necesita llamar menos métodos.
4. Use BBjGrid::setUpdateCached(FALSO) para activar la opción de no enviar la notificación de eventos 22 cuando la celda ya contiene datos. Esto reduce el número de eventos “actualización de tabla” que se envían desde la Grid.
5. Establezca el “modo edición” de la Grid usando BBjGrid::setGridEditable. Si la edición se quiere hacer en todas las celdas, no se necesita nada más.
6. Establezca la opción de “Drag a Drop” (tomar y arrastrar) si desea usando BBjGrid::setDragAccept.
7. Muestre la grid
8. Registre los callbacks para manejar los eventos o use read record para leer los eventos. Aunque este tutorial usa callback por sus ventajas indiscutibles. No se requiere manejo de eventos para administrar los datos, ni editarlos o tomarlos y arrastrarlos cuando se está usando la grid. Aunque, están soportados todos los eventos regulares y las notificaciones.
Los siguientes pasos crean una grid que despliega información del clima para una semana.
La grid será editable si el check box que aparece en la zona superior del formulario está marcado y la edición comenzará cuando se pulse doble click sobre la celda escogida.
Paso 9: Define la ventana. Como ya lo aprendiste en los primeros pasos de BBj, tu programa que define el formulario debe tener este aspecto inicial:
rem "[PRG01] Usando un BBjGrid con sintaxis de objetos
rem
rem "Obtiene una instancia del objeto BBjAPI
rem "=======================================
LET miAPI!=BBjAPI()
rem
rem "Abre el dispositivo SYSGUI
rem "==========================
SYSGUI=UNT
OPEN (SYSGUI) "X0"
rem
rem "Obtiene la instancia del objeto BBjSysGui
rem "=========================================
LET sysgui!=miAPI!.getSysGui()
rem
rem "Valores para crear una ventana
rem "==============================
X=10
Y=10
ANCHO=700
ALTO=500
TITULO$="Formulario que usa BBjGrid"
rem
rem "Establece el contexto actual
rem "============================
sysgui!.setContext(0)
rem
rem "Crea la ventana
rem "===============
window! = sysgui!.addWindow(X,Y,ANCHO,ALTO,TITULO$)
escape
Paso 10: A continuación crea otros controles importantes de nuestro ejemplo:
window!.addStaticText(101,10,05,150,25,"Pronostico del tiempo",$0000$)
window!.addStaticText(102,160,10,200,25,"Temperatura en grados Fahrenheit",$0000$)
editable! = window!.addCheckBox(103,450,05,100,25,"Grid Editable",$0000$)
Paso 11. Crea el control Grid básico con el método correspondiente:
numfil=7
numcol=9
miGrid!=window!.addGrid(104,20,30,544,230,$8856$,numfil,numcol)
Paso 12. Establece algunos atributos de la Grid:
miGrid!.setFitToGrid(1)
miGrid!.setRowHeaderWidth(100)
miGrid!.setRowHeight(20)
miGrid!.setVisible(1)
Paso 13. A continuación definimos los títulos de encabezado usando la sintaxis de objetos. Para ello creamos un BBjVector para agregar los encabezados:
rem "Establece encabezados de columnas
rem "=================================
vector!=sysgui!.makeVector()
vector!.add("8 AM")
vector!.add("9 AM")
vector!.add("10 AM")
vector!.add("11 AM")
vector!.add("12 PM")
vector!.add("1 PM")
vector!.add("2 PM")
vector!.add("3 PM")
vector!.add("Lluvia")
miGrid!.setColumnHeaderText(vector!)
Paso 14. Lo mismo con los encabezados de filas, para lo cual aprovechamos el mismo vector de títulos al que le aplicamos una inicialización para reutilizar:
rem
rem "Establece encabezado de filas
rem "=============================
vector!.clear()
vector!.add("Domingo")
vector!.add("Lunes")
vector!.add("Martes")
vector!.add("Miercoles")
vector!.add("Jueves")
vector!.add("Viernes")
vector!.add("Sabado")
miGrid!.setRowHeaderText(vector!)
Paso 15. Definimos el estilo de la última columna:
miGrid!.setColumnStyle(8, sysgui!.GRID_STYLE_UNCHECKED)
Paso 16. Establecemos algunas celdas individuales como chequeadas:
rem
rem "Establece algunas celdas chequeadas
rem "===================================
miGrid!.setCellStyle(1,8,sysgui!. GRID_STYLE_CHECKED)
miGrid!.setCellStyle(4,8,sysgui!. GRID_STYLE_CHECKED)
Paso 17. Establece los colores de las columnas. Los objetos color se generan usando BBjSysGui::makeColor. (Aprovecha de notar la sintaxis multilínea de la construcción IF..THEN..ELSE..ENDIF)
rem
rem "establece colores de las columnas
rem "=================================
for col=0 to 8
if col<3 then
let color!=sysgui!.makeColor("green")
else
if col<6 then
let color!=sysgui!.makeColor("yellow")
else
if col<8 then
let color!=sysgui!.makeColor(255,50,50)
else
let color!=sysgui!.makeColor("blue")
endif
endif
endif
miGrid!.setColumnBackColor(col,color!)
next col
Paso 18. Ahora colocamos texto en las celdas de la Grid usando BBjGrid::setCellText(BBjVector)
rem "Establece el texto en las celdas usando setCellText(BBjVector)
rem "Primero se llena el vector. Se cargan los datos en las filas partiendo
rem "desde la fila 0, columna 0 for as many strings are in the BBjVector
vector!.clear()
for fila=0 to 6
for col=0 to 8
if col = 8
buff$=""; REM “la ultima columna sin texto
else
buff$=str(50+fila+col)
endif
vector!.add(buff$)
next col
next fila
miGrid!.setCellText(vector!)
Paso 19. Establece propiedades de la grid
miGrid!.setUpdateCached(0)
gosub deja_editable
rem
rem "establece la propiedad de tomar y arrastrar
miGrid!.setDragAccept(1)