Pues entonces, aquí está la solución:
En la creación de nuestra forma, tendremos algo así.
procedure TForm1.FormCreate(Sender: TObject); begin //Asignamos a la propiedad TAG del DBGrid el ancho //mínimo que deseamos utilizar. 40 pixeles. Table1.FieldByName('FirstName').Tag := 40; //Ahora, el valor de cada título: Ancho de la // columna de título. Table1.FieldByName('LastName').Tag := 4 + Canvas.TextWidth(Table1.FieldByName('LastName').DisplayName); end;
En el código anterior, obtendremos de una tabla de una base de datos el ancho de cada columna de nuestro TDbGrid, lo que nos permitirá hacer el cálculo y mostrar una rejila limpia y pareja.
Ahora, llamaremos a nuestra función que nos permitirá visualizar correctamente nuestra rejilla.
procedure TForm1.FormResize(Sender: TObject); begin FixDBGridColumnsWidth(DBGrid1); end;
Y ahora, la función que nos permitirá hacer todo el trabajo. Y poner a nuestro cliente como un defensor más de Delphi.
procedure FixDBGridColumnsWidth(const DBGrid: TDBGrid); var i : integer; TotWidth : integer; VarWidth : integer; ResizableColumnCount : integer; AColumn : TColumn; begin //Ancho total de todas las columnas antes de procesar TotWidth := 0; //Cómo dividir el espacio sobrante de nuestras columnas VarWidth := 0; //Cuantas columnas se procesarán ResizableColumnCount := 0; for i := 0 to -1 + DBGrid.Columns.Count do begin TotWidth := TotWidth + DBGrid.Columns[i].Width; if DBGrid.Columns[i].Field.Tag <> 0 then Inc(ResizableColumnCount); end; //Sumar un pixel para la línea de separación if dgColLines in DBGrid.Options then TotWidth := TotWidth + DBGrid.Columns.Count; //Agregar el ancho del indicador de columna if dgIndicator in DBGrid.Options then TotWidth := TotWidth + IndicatorWidth; //width vale "left" VarWidth := DBGrid.ClientWidth - TotWidth; //Distribuir equitativamente VarWidth //a todas las columnas que se procesarán if ResizableColumnCount > 0 then VarWidth := varWidth div ResizableColumnCount; for i := 0 to -1 + DBGrid.Columns.Count do begin AColumn := DBGrid.Columns[i]; if AColumn.Field.Tag <> 0 then begin AColumn.Width := AColumn.Width + VarWidth; if AColumn.Width < AColumn.Field.Tag then AColumn.Width := AColumn.Field.Tag; end; end; end; (*FixDBGridColumnsWidth*)
Y listo...
Se aceptan comentarios y modificaciones para mejorar éste pequeño código.