10-06-1998
Continuando con las explicación de los principales controles de datos (dataaware) que Delphi pone a nuestra disposición, voy a hablar del Dbdrig (o regilla de datos). Personalmente este control es el que más me llamó la atención, cuando migré del Clipper al Delphi, el principal motivo es su aspecto unido a sus posibilidades. Este control permite mostrar todos los campos (o una selección de ellos) de una tabla de una forma consecutiva, además de permitir su edición, mientras sean campos que no contengan datos especiales, como puede ser imágenes, o campos memos (ver imagen adjunta). Este control, como casi todos, tiene propiedas comunes, como Align y otras, pero destacan dos propiedades, que son donde el verdadero alma de este control, y son Columns y Options.
En opciones (options) tenemos las principales caracteristicas de configuración del control, y son:
dsEditing | El usuario puede editar los datos sobre la regilla |
dgAlwaysShowEditor | La regilla esta en modo edición, no hace falta pulsar F2 |
dgTitles | Muestra los títulos de las columnas |
dgIndicator | Se muestra un indicador para conocer el registro activo |
dgColumnResize | Permite cambiar el ancho de las columnas |
dgColLins | Dibuja líneas de separación entre las columnas |
dgRowLines | Dobuja lineas de separación entre las filas |
dgTabs | Se puede navegar por el componente usado la tecla Tab |
dgRowSelect | Selecciona filas completas en lugar de filas |
dgConfirmDelete | Permite borrar registros, mostrando un mensaje |
dgCancelOnExit | Cancelas las inserciones vacías al salir del control |
dgMultiSelect | Permite seleccionar multiples filas a la vez |
Pero la verdadera potencia de este control, esta en su propiedad Columns, la
cual solo existe desde Delphi 2.0. Esta propiedad contiene multiples subpropiedades, y con
ellas podemos determinar el número de columnas que se muestren, y que el campo que
muestre cada columna, así como su título, fuente, etc. Para acceder a este grupo de
propiedades debemos seleccionar la propiedad y pulsar sobre el botón que hay en campo que
contiene la propiedad, y se mostrará una nueva ventana donde podemos
añadir/quitar/modificar las columnas. Los seis botones nos permiten, añadir (Add),
delete (Borrar), desplazar hacia arriba (Move up), desplazar hacia abajo (move down),
añadir todos los campos de la tabla (Add All Fields), y restaurar los valores por defecto
(Restore Defaults).
Cuando se añade una columna nueva o se selecciona, el inspector de objectos muestra las propiedades de la columna, las cuales son:
Alignment | Alineación de la columna |
Button style | Permite desplegar un lista con valores, o un botón |
Color | Color de fondo de la columna |
DropDown Rows | Número de filas desplegables |
FieldName | Nombre del campo que se visualiza |
Font | Fuente con la que se muestra la información de la columna |
PickList | Lista de valores que aparecerán al deplegar la columna |
ReadOnly | Esta columna solo es de lectura |
Width | Ancho de la columna en Pixels |
Title | Título de la columna |
La propiedad título de la columna tiene a su vez otras subpropiedades, como son:
Alignment | Alineación de la cabecera de columna |
Caption | Texto que mostrá la cabecera |
Color | Color fondo de la cabecera |
Font | Fuente con la que mostrara la cabecera |
Que las columnas esten agrupadas bajo subpropiedad, más correcto seria decir que
forman un grupo de propiedades del tipo Tcolumn (funcionan de manera similar a los
Tstringlist, pero con sus propias propiedades), nos trae ventajas al igual que los
TstringList, aunque son dos tipos diferentes la filosofia de uso es identico. Así si
queremos duplicar el ancho de de las columnas se puede hacer de una manera rápida y
general. Como acabo de decir su filosofia es la misma, así por tanto disponemos de unas
propiedades en tiempo de ejecución que con Items y Count. La primera nos sirve para
acceder a la columna deseada, quizas estes pensando que es igual a los items de un
TlistBox, pues no te has equivocado, ya que esta propiedad nos da acceso a la colunma
indica, por ejemplo, para saber cual es el título de la primer columna se podria hacer
algo así:
Titulo := dbgrid1.column[0].Title.Caption;
Fíjate que al ser una propiedad del tipo items, el primer elemento es el 0 (cero)
La otra propiedad nos da el número de columnas. Con estas dos propiedades (te recuerdo que solo estan disponibles en tiempo de ejecución) se puede hacer un truquillo, que es guarda el ancho de la columnas, así si el usuario ha cambiado el tamaño para adaptarlo a su pantalla, o a su gusto, luego podemos restaurarlo al arrancar el programa logrando un toque de profesionalidad en nuestra aplicación.
Aquí debajo os muestro dos procedimientos que uso a menudo para salvar y restaurar el ancho de la columnas, yo lo hago en un fichero del tipo ini, en el directorio de la aplicación, el cual es indicado por la variable Directorio, está declarada a nivel privado, y es inicializado el procedimiento Oncreate del formulario, si necesitas más detalles sobre esto y como trabajar con los fichero del tipo Ini, consulta el capítulo correspondiente en este cursillo.
Procedure Tform1.LeerConfiguracion; Var Fichero : tinifile; I : integer; Begin Fichero := Tinifile.Create (directorio+'\ajustes.ini'); With Fichero Do Begin For I := 0 to Dbgrid1.Columns.Count -1 do DbGrid1.Columns[i].width := ReadInteger ('grid','col'+intToStr(i),100); end; end; Procedure Tform1.GuardarConfiguracion; Var fichero : Tinifile; I : integer; Begin Fichero := Tinifile.Create (directorio+'\ajustes.ini'); With Fichero Do Begin For I := 0 to Dbgrid1.Columns.Count-1 Do Writeinteger ('grid','col'+inttostr (i),dbgrid1.Columns[i].width); end;
El efecto que consigo con estos procedimientos es grabar un fichero ini, en el cual hay una sección que se llama grid, y tiene tantas variables como columnas tenga el Dbdrig. El nombre de las variables es formado con la palabra Col más el número de columna que es; como este es un integer (un número) y el nombre de la variable es un string ha de ser convertido, lo cual hago con la función IntToStr, la cual ya es una vieja conocida. Quizas estes pensando que al hacer la conversión de entero a cadena, se puede producir un error, lo cual es posible si la conversión falla, pero no en este caso ya que si te fijas el valor a convertir en I, el cual es extraido de un bucle que cuenta con enteros desde cero hasta el número de colunmas menos uno.