Interesante

Cómo arreglar anchos de columna DBGrid automáticamente

Cómo arreglar anchos de columna DBGrid automáticamente

Diseñado para permitir que un usuario vea y edite datos en una cuadrícula tabular, el DBGrid proporciona varias formas de personalizar la forma en que representa "sus" datos. Con tanta flexibilidad, un desarrollador de Delphi siempre puede encontrar nuevas formas de hacerlo más poderoso.

Una de las características faltantes de TDBGrid es que no hay opción para ajustar automáticamente los anchos de columnas específicas para que se ajusten completamente al ancho del cliente de la cuadrícula. Cuando cambia el tamaño del componente DBGrid en tiempo de ejecución, los anchos de columna no cambian de tamaño.

Si el ancho de DBGrid es mayor que el ancho total de todas las columnas, obtendrá un área vacía justo después de la última columna. Por otro lado, si el ancho total de todas las columnas es mayor que el ancho de DBGrid, aparecerá una barra de desplazamiento horizontal.

Ajustar automáticamente los anchos de columna DBGrid

Hay un procedimiento útil que puede seguir que corrige los anchos de las columnas selectivas de DBGrid cuando la red se redimensiona en tiempo de ejecución.

Es importante tener en cuenta que, por lo general, solo dos o tres columnas en un DBGrid realmente deben redimensionarse automáticamente; todas las otras columnas muestran algunos datos de "ancho estático". Por ejemplo, siempre puede especificar un ancho fijo para columnas que muestran valores de campos de datos que se representan con TDateTimeField, TFloatField, TIntegerField y similares.

Además, probablemente creará (en tiempo de diseño) componentes de campo persistentes utilizando el editor de campos, para especificar los campos en el conjunto de datos, sus propiedades y su orden. Con un objeto descendiente TField, puede usar la propiedad Tag para indicar que una columna en particular que muestra valores para ese campo debe tener el tamaño automático.

Esta es la idea: si desea que una columna se ajuste automáticamente al espacio disponible, asigne un valor entero para la propiedad Tag del descendiente de TField que indique el ancho mínimo de la columna correspondiente.

El procedimiento FixDBGridColumnsWidth

Antes de comenzar, en el evento OnCreate para el objeto Form que contiene DBGrid, especifique qué columnas deben redimensionarse automáticamente asignando un valor distinto de cero para la propiedad Tag del objeto TField correspondiente.

procedimiento TForm1.FormCreate (Remitente: TObject);
empezar
// configurar columnas autorizables asignando
// Ancho mínimo en la propiedad Tag.

// usando un valor fijo: 40 px
Tabla1.FieldByName ('FirstName'). Etiqueta: = 40;
// usando el valor variable: ancho del
// texto de título de columna predeterminado
Table1.FieldByName ('Apellido'). Etiqueta: = 4 + Canvas.TextWidth (Table1.FieldByName ('Apellido'). DisplayName);
fin
;

En el código anterior, Table1 es un componente TTable vinculado a un componente DataSource, que está vinculado con DBGrid. La propiedad Table1.Table apunta a la tabla DBDemos Employee.

Hemos marcado las columnas que muestran los valores de los campos Nombre y Apellido para que se puedan redimensionar automáticamente. El siguiente paso es llamar a nuestro FixDBGridColumnsWidth en el controlador de eventos OnResize para el formulario:

procedimiento TForm1.FormResize (remitente: TObject);
empezar
FixDBGridColumnsWidth (DBGrid1);
fin
;

Nota: Todo esto tiene sentido si la propiedad Align de DBGrid incluye uno de los siguientes valores: alTop, alBottom, alClient o alCustom.

Finalmente, aquí está el código del procedimiento FixDBGridColumnsWidth:

procedimiento FixDBGridColumnsWidth (const DBGrid: TDBGrid);
var
i: entero; TotWidth: entero; VarWidth: entero; ResizableColumnCount: entero; AColumn: TColumn;
empezar
// ancho total de todas las columnas antes de cambiar el tamaño
Ancho total: = 0;
// cómo dividir cualquier espacio extra en la cuadrícula
VarWidth: = 0;
// cuántas columnas necesitan ser redimensionadas automáticamente
ResizableColumnCount: = 0;
para i: = 0 a -1 + DBGrid.Columns.Count dobegin
TotWidth: = TotWidth + DBGrid.Columnsi.Width;
Si DBGrid.Columnsi.Field.Tag 0 luego
Inc (ResizableColumnCount);
fin;
// agrega 1px para la línea de separación de columnasSi dgColLines en DBGrid.Options luego
TotWidth: = TotWidth + DBGrid.Columns.Count;
// agregar ancho de columna de indicadorSi dgIndicator en DBGrid.Options luego
TotWidth: = TotWidth + IndicatorWidth;
// ancho vale "left"
VarWidth: = DBGrid.ClientWidth - TotWidth;
// Distribuye igualmente VarWidth
// a todas las columnas auto-redimensionables
Si ResizableColumnCount> 0 luego
VarWidth: = varWidth div ResizableColumnCount;
para i: = 0 a -1 + DBGrid.Columns.Count dobegin
AColumn: = DBGrid.Columnsi;
Si AColumn.Field.Tag 0 entonces comenzar
AColumn.Width: = AColumn.Width + VarWidth;
Si AColumn.Width entonces
AColumn.Width: = AColumn.Field.Tag;
fin;
fin;
fin
; (* FixDBGridColumnsWidth *)