10-06-1998

Bases de Datos III

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.