Come correggere automaticamente le larghezze delle colonne DBGrid

Progettato per consentire a un utente di visualizzare e modificare i dati in una griglia tabulare, DBGrid fornisce vari modi per personalizzare il modo in cui rappresenta i "suoi" dati. Con così tanta flessibilità, uno sviluppatore Delphi può sempre trovare nuovi modi per renderlo più potente.

Una delle caratteristiche mancanti di TDBGrid è che non esiste alcuna opzione per regolare automaticamente le larghezze di colonne specifiche per adattarle completamente alla larghezza del client della griglia. Quando si ridimensiona il componente DBGrid in fase di esecuzione, le larghezze di colonna non vengono ridimensionate.

Se la larghezza del controllo DBGrid è maggiore della larghezza totale di tutte le colonne, verrà visualizzata un'area vuota subito dopo l'ultima colonna. D'altra parte, se la larghezza totale di tutte le colonne è maggiore della larghezza del controllo DBGrid, si visualizzerà una barra di scorrimento orizzontale.

Regola automaticamente le larghezze delle colonne DBGrid

C'è una pratica procedura che puoi seguire che corregge le larghezze delle colonne DBGrid selettive quando la griglia viene ridimensionata in fase di esecuzione.

È importante notare che, in genere, solo due o tre colonne in un controllo DBGrid devono essere ridimensionate automaticamente; tutte le altre colonne visualizzano alcuni dati di "larghezza statica". Ad esempio, è sempre possibile specificare una larghezza fissa per le colonne che visualizzano valori dai campi dati rappresentati con TDateTimeField, TFloatField, TIntegerField e simili.

Inoltre, probabilmente creerai (in fase di progettazione) componenti di campo persistenti utilizzando l'editor dei campi, per specificare i campi nel set di dati, le loro proprietà e il loro ordine. Con un oggetto discendente TField, è possibile utilizzare la proprietà Tag per indicare che una particolare colonna che visualizza i valori per quel campo deve essere ridimensionata automaticamente.

Questa è l'idea: se si desidera che una colonna si adatti automaticamente allo spazio disponibile, assegnare un valore intero alla proprietà Tag del discendente di TField che indichi la larghezza minima della colonna corrispondente.

La procedura FixDBGridColumnsWidth

Prima di iniziare, nell'evento OnCreate per l'oggetto Form che contiene il DBGrid, specificare quali colonne devono essere ridimensionate automaticamente assegnando un valore diverso da zero per la proprietà Tag dell'oggetto TField corrispondente.

procedura TForm1.FormCreate (Sender: TObject);
iniziare
// imposta colonne ridimensionabili automaticamente assegnando
// Larghezza minima nella proprietà Tag.

// utilizzando un valore fisso: 40 px
Table1.FieldByName ('FirstName'). Tag: = 40;
// utilizzando il valore della variabile: larghezza del
// testo del titolo della colonna predefinito Table1.FieldByName ('LastName'). Tag: = 4 + Canvas.TextWidth (Table1.FieldByName ('LastName'). DisplayName);
fine
;

Nel codice precedente, Table1 è un componente TTable collegato a un componente DataSource, che è collegato a DBGrid. La proprietà Table1.Table punta alla tabella DBDemos Employee.

Abbiamo contrassegnato le colonne che mostrano i valori per i campi FirstName e LastName in modo che siano ridimensionabili automaticamente. Il passaggio successivo consiste nel chiamare il nostro FixDBGridColumnsWidth nel gestore di eventi OnResize per il Form:

procedura TForm1.FormResize (Sender: TObject);
iniziare
FixDBGridColumnsWidth (DBGrid1);
fine
;

Nota: Tutto ciò ha senso se la proprietà Align di DBGrid include uno dei seguenti valori: alTop, alBottom, alClient o alCustom.

Infine, ecco il codice della procedura FixDBGridColumnsWidth:

procedura FixDBGridColumnsWidth (const DBGrid: TDBGrid);
var
i: intero; TotWidth: numero intero; VarWidth: intero; ResizableColumnCount: intero; AColumn: TColumn;
iniziare
// larghezza totale di tutte le colonne prima del ridimensionamento
TotWidth: = 0;
// come dividere lo spazio extra nella griglia
VarWidth: = 0;
// quante colonne devono essere ridimensionate automaticamente
ResizableColumnCount: = 0;
per i: = 0 a -1 + DBGrid.Columns.Count dobegin
TotWidth: = TotWidth + DBGrid.Columns [i] .Width;
if DBGrid.Columns [i] .Field.Tag 0 poi
Inc (ResizableColumnCount);
fine;
// aggiunge 1px per la riga del separatore di colonnaif dgColLines in DBGrid.Options poi
TotWidth: = TotWidth + DBGrid.Columns.Count;
// aggiunge la larghezza della colonna dell'indicatoreif dgIndicator in DBGrid.Options poi
TotWidth: = TotWidth + IndicatorWidth;
// larghezza vale "sinistra"
VarWidth: = DBGrid.ClientWidth - TotWidth;
// Distribuire equamente VarWidth
// a tutte le colonne ridimensionabili automaticamenteif ResizableColumnCount> 0 poi
VarWidth: = varWidth div ResizableColumnCount;
per i: = 0 a -1 + DBGrid.Columns.Count dobegin
AColumn: = DBGrid.Columns [i];
if AColumn.Field.Tag 0 quindi iniziare
AColumn.Width: = AColumn.Width + VarWidth;
if AColumn.Width allora
AColumn.Width: = AColumn.Field.Tag;
fine;
fine;
fine
; (* FixDBGridColumnsWidth *)