Cómo
Resaltar celdas en un Grid
por Jean-Pierre Martel, Editor del Boletín para Desarrolladores de dBASE
Traducción : Juan Manuel Espinosa G., Desarrollador de Software

A L USAR un Grid para atraer la atención del usuario en algunas celdas que cumplan una característica particular, sería simples si dBASE pudiera desplegarlos en un color diferente. Desde el pecado original, desafortunadamente el Mundo es mas complicado de lo que nosotros quisiéramos. Como resultado, por ahora es imposible hacer esto. Así que usaremos una solución alternativa.

En cambio agregaremos un marcador al Grid. En nuestro ejemplo, este marcador tomará la forma de una flecha al lado de aquellos que deben pagar sólo efectivo, y este marcador se desplegará en su propia columna, al lado del nombre del cliente. Pero usted tiene que decirle a dBASE a quien debe ser confiado y a quién no. Las instrucciones que necesita saber estarán en un campo lógico llamado “Credit”. Cuando se asigna a verdadero, el cliente podría cargarlo a su cuenta si él quiere. Cuando se asigna a falso, el cliente tiene que pagar dinero en efectivo. Para dBASE, esto es simple y claro.

Un campo calculado en un datamodule

Para desplegar este marcador, nosotros podríamos transformar el campo. Podríamos decir a dBASE: “Cuando leas verdadero en el campo "Credit", no despliegues nada en la celda apropiada del Grid: pero si encuentras el valor falso, despliega en su lugar un marcador.” Pero si transformamos el campo, perderemos la capacidad de desplegar el valor real del campo “Credit” en cualquier forma usando este rowset y también perderemos la habilidad de escribir a este campo. Así que crearemos un campo calculado.

En este tomo de la revista, Peter Rorlick ha mostrado cómo poner un campo calculado en un Grid. El Grid se pobló con datos que vienen de una tabla. Aquí, nosotros usaremos un Datamodule (DMD). para ver cómo agregamos este campo calculado en un DMD, por favor cargue Credit.dmd en el Editor de Código (teclee `modify command credit.dmd` en la ventana de Comandos).

En este DMD sencillo, tenemos dos queries, cada uno creando un rowset de una tabla diferente (clients.dbf y orders.dbf). orders.dbf esta ligado a clients.dbf a través de un masterRowset y una propiedad masterFields. Agregamos el campo calculado en la primera tabla porque contiene el campo “Credit” que dBASE necesita evaluar para crear el valor correcto en el campo calculado. Si el campo a ser evaluado hubiera estado en la segunda tabla, el campo calculado se habría creado allí.

Al principio del código DMD, Agregamos una línea en el código constructor del query Clients1. Esta línea crea un método onOpen para este query.

| `this.CLIENTS1 = new QUERY()` `this.CLIENTS1.parent = this` `with (this.CLIENTS1)` `onOpen = CLASS::CLIENTS1_ONOPEN // Esta es la linea agregada` `left = 11` `top = 4.6818` `sql = 'select * from "clients.dbf"'` `active = true` `endwith`

Más abajo en nuestro código, agregamos esta función Clients1_onOpen.

| `Function clients1_onOpen` `local X` `X = new field()` `X.fieldName := "NOcredit"` `X.BeforeGetValue := { || IIF(this.parent["CREDIT"].value = .T., " ", "Ü") }` `this.rowset.fields.add( X )` `return`

Veamos cada linea separadamente.

`local X` // Esto crea una variable local llamada X (podría ser cualquier nombre).

`X = new field()` // La variable X se vuelve una referencia para un nuevo objeto creado. El operador “new” crea un nuevo caso de la clase field.

`X.fieldName := "NOcredit"` // El nuevo campo se bautiza “NOcredit”. para prevenir la creación de una propiedad que no existe, usamos “:=”. Éste es un operador único-de-asignación. Si usted inadvertidamente escribe mal el nombre de la propiedad con el = operador, se crea una nueva propiedad; su código correrá sin el error, pero no se comportará como usted piensa. Usando el operador := , si la propiedad (o variable) no existe, ocurre un error. Este operador no puede ser personalizado para crear una nueva propiedad o una variable: sólo se usa para asignar un valor a una variable o una propiedad que ya existe (este párrafo es tomado desde la ayuda en-línea).

`X.BeforeGetValue := { || IIF(this.parent["CREDIT"].value = .T., " ", "Ü") }`

Esta línea es el corazón de nuestra función del onOpen. Usa el evento de BeforeGetValue del campo “NOcredit”. Este evento normalmente se dispara después de que la propiedad de valor de un campo es leída exitosamente desde una tabla pero antes de que este valor se ponga en buffer del campo o fila. Puesto que es un campo calculado, no existe en la tabla. Así que estamos dando algunas instrucciones sobre qué debe poner dBASE en el rowset cuando el nuevo campo se agregué al arreglo de campos.

Aquí, nuestras órdenes son no poner nada (“ ") o un caracter especial en el campo “NOcredit” según el valor dentro del otro campo (“credit”). Si el `rowset.fields["CREDIT"].value` es verdad (si podemos darle crédito al cliente), entonces el `rowset.fields["NOcredit"].value` no será nada. Pero si no podemos confiar en el cliente (si su `rowset.fields["CREDIT"].valuees falso)`, entonces ponga una bandera en el campo de NOcredit. Por último, por qué contiene esta U un diéresis (Ü)? Veremos por qué cuándo le demos formato a la columna que despliega nuestro campo calculado.

`this.rowset.fields.add( X )` // Esto agrega el nuevo campo al Clients1.rowset

Aquí nosotros usamos un campo lógico. Pero los mismos principios aplican a otros tipos de campos. Para los campos de fecha: para poner una bandera al lado del nombre de miembros de una asociación que se olvidó de pagar su deuda desde el 1 de enero de 1999, usted escribiría:

`X.BeforeGetValue := { || IIF(this.parent["dPAYMENT"].value > "98/12/31", " ", "Ü") }`

Para los campos numéricos: para “marcar" clientes que le compraron más de un millón de $US en año, usted escribiría:

`X.BeforeGetValue := { || IIF(this.parent["nTOTALYEAR"].value > 1000000, "Ü", " ") }`

Para agregar un nuevo campo en su Grid

En el diseñador de Forma, haga clic en su Grid. En el Inspector (F11), vaya a la propiedad de las Columnas. Dos pushbuttons aparecerán dentro de la propiedad de la Columna. Pulse el botón en la herramienta de llave ingles (no la “i” dentro de un triángulo)

En el panel izquierdo del diálogo Constructor de Propiedades de Columnas, haga doble-clic en el nombre de su campo calculado. En el panel correcto, arrástrelo al orden deseado en su Grid. Presione el botón OK. Ahora el campo calculado aparece en su Grid.

Para formatear la nueva columna

Dijimos que pondríamos una "bandera" en nuestro grid. A su expresión más simple, esta bandera podría ser hecha con signos comúnes en el teclado "=>", "<=", etc. Pero nosotros haremos algo más agradable.

Wingdings es un conjunto de caracteres normal bajo Windows: está en cada computadora pero nadie sabe qué hacer con el. En esa columna estrecha, justo al lado de las celdas que cumplen cierta característica, usted puede desplegar n (la “n” en ese conjunto de caracteres), un u o w (minúscula “u” o “w”), un Ü o Û (ALT-0220 o 0219 — nota: ¿si usted teclea ALT-0220, usted conseguirá la Ü sobre la que estábamos hablando previamente ). Cómo sabe si este conjunto de caracteres esta instalado en su computadora? Simple: si usted ve los signos de los que estoy hablando, este conjunto de caracteres está instalado en su computadora (se instala de forma predeterminada). Si de hecho está instalado y le gustaría ver los símbolos de los que dispone, desde la ventana Comando, sólo teclee:

`run(.T., "charmap.exe")` // y seleccione el conjunto de caracteres de Wingdings del Combobox

Nota: Para asegurarse de que esto funciona bajo condiciones muy diferentes, cambié el driver del idioma en el Administrador de BDE de 'WEurope' ANSI o el que tenga a 'ascii' ANSI: el resultado será idéntico, por lo menos con las “banderas” que estoy sugiriendo.

¿Ahora, cómo le dice usted a dBASE usar este conjunto de caracteres para desplegar sus marcadores? Desde el diseñador de la Forma, haga clic sobre su Grid. Llame al Inspector. Encuentre la propiedad de las Columnas. haga clic sobre la herramienta “i” (no la herramienta de llave inglesa esta vez). Entonces haga clic en el nombre de la Columna que soporta su campo calculado (aquí esta Column1). También haga clic en la herramienta “i”.

Fije su column1.width 'ancho de la columna' (de la imagen debajo, usted verá que nosotros hemos escogido 18 porque nuestro form.metric es 6 // pixeles). Juegue con este valor: dBASE ajustará su forma cada vez que usted ponga un nuevo valor y usted presione <Enter>. Cuando la anchura sea suficiente, pulse el botón de la herramienta “i” al lado de la propiedad del editorControl. Estas propiedades se ilustran abajo a la derecha. Usted puede escoger el Wingdings tecleando ese nombre en la propiedad del fontName o (si usted tiene miedo de un dedazo, pulse el botón en la herramienta de llave inglesa y seleccione el conjunto de caracteres correcto). no se olvide de poner el color que usted quiera: esa propiedad está más abajo (no mostrado).

El resultado final

En la imagen debajo, la primera columna es donde nuestro campo calculado se despliega. El Sr. Duarte y el Sr. Sharov tienen que pagar dinero en efectivo. En Wingdings, la letra Ü es ahora una flecha que apunta a aquellos cuyo crédito es dudoso. ¿Estaría más claro si nosotros pudiéramos poner el color de filas individuales en dBASE? Probablemente. Pero por ahora, tenemos otras maneras muy buenas de resaltar las filas que nosotros queremos.

Para descargar esta aplicación, haga clic aquí
(es un archivo empacado de 83Kb)

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.
Corrección de pruebas: Fabian Cevallos.