Progettato per consentire a un utente di visualizzare e modificare i dati in una griglia tabulare, il DBGrid fornisce vari modi di personalizzare il modo in cui rappresenta i "suoi" dati. Con così tanta flessibilità, a Delphi lo sviluppatore 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 runtime, le larghezze di colonna non vengono ridimensionate.
Se la larghezza di DBGrid è maggiore della larghezza totale di tutte le colonne, otterrai un'area vuota subito dopo l'ultima colonna. D'altra parte, se la larghezza totale di tutte le colonne è maggiore della larghezza di DBGrid, verrà visualizzata 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, di solito, solo due o tre colonne in un DBGrid devono effettivamente essere ridimensionate automaticamente; tutte le altre colonne mostrano alcuni dati di "larghezza statica". Ad esempio, è sempre possibile specificare una larghezza fissa per le colonne che visualizzano valori da campi di dati che sono rappresentati con TDateTimeField, TFloatField, TIntegerField e simili.
Inoltre, probabilmente creerai (in fase di progettazione) componenti di campo persistenti utilizzando l'editor Campi, per specificare i campi nel set di dati, le loro proprietà e il loro ordinamento. Con un oggetto discendente TField, è possibile utilizzare la proprietà Tag per indicare che una determinata 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 per la proprietà Tag del discendente di TField che indica la larghezza minima della colonna corrispondente.
La procedura FixDBGridColumnsWidth
Prima di iniziare, in Evento OnCreate per l'oggetto Form contenente 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 (Mittente: TObject);
inizio// imposta le colonne autorizzabili assegnando
// Minimm Width nella proprietà Tag.
// usando un valore fisso: 40 px
Table1.FieldByName ('FirstName'). Tag: = 40;
// utilizzando il valore variabile: larghezza del file
// testo del titolo della colonna predefinito Table1.FieldByName ('LastName'). Tag: = 4 + Canvas. TextWidth (Table1.FieldByName ('LastName'). DisplayName);
fine;
Nel codice sopra, Table1 è un componente TTable collegato a Componente DataSource, che è collegato con DBGrid. La proprietà Table1.Table punta alla tabella Employee DBDemos.
Abbiamo contrassegnato le colonne che visualizzano i valori per i campi FirstName e LastName per il ridimensionamento automatico. Il passaggio successivo consiste nel chiamare FixDBGridColumnsWidth nel gestore eventi OnResize per il modulo:
procedura TForm1.FormResize (Mittente: TObject);
inizio 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: numero intero; TotWidth: intero; VarWidth: intero; ResizableColumnCount: intero; AColumn: TColumn;
inizio// larghezza totale di tutte le colonne prima del ridimensionamento
TotWidth: = 0;
// come dividere qualsiasi spazio extra nella griglia
VarWidth: = 0;
// quante colonne devono essere ridimensionate automaticamente
ResizableColumnCount: = 0;
per i: = 0 per -1 + DBGrid. Colonne. Contare dobegin
TotWidth: = TotWidth + DBGrid. Colonne [i] .width;
Se DBGrid. Colonne [i] .Field. Tag 0 poi
Inc (ResizableColumnCount);
fine;
// aggiungi 1px per la riga di separazione delle colonneSe dgColLines in DBGrid. Opzioni poi
TotWidth: = TotWidth + DBGrid. Colonne. Contare;
// aggiunge la larghezza della colonna dell'indicatoreSe dgIndicator in DBGrid. Opzioni poi
TotWidth: = TotWidth + IndicatorWidth;
// larghezza vale "sinistra"
VarWidth: = DBGrid. ClientWidth - TotWidth;
// Distribuire equamente VarWidth
// a tutte le colonne con ridimensionamento automaticoSe ResizableColumnCount> 0 poi
VarWidth: = varWidth div ResizableColumnCount;
per i: = 0 per -1 + DBGrid. Colonne. Contare dobegin
AColumn: = DBGrid. Colonne [i];
Se Una colonna. Campo. Tag 0 thenbegin
Una colonna. Larghezza: = AColumn. Larghezza + VarLarghezza;
Se Una colonna. Larghezza quindi
Una colonna. Larghezza: = AColumn. Campo. Etichetta;
fine;
fine;
fine; (* FixDBGridColumnsWidth *)