Delphi: Reglați automat lățimile coloanei DBGrid

Proiectat pentru a permite utilizatorului să vizualizeze și să editeze datele într-o grilă tabulară, DBGrid oferă diverse modalități de personalizare a modului în care reprezintă datele „sale”. Cu atâta flexibilitate, a Delphi dezvoltatorul poate găsi întotdeauna noi modalități de a-l face mai puternic.

Una dintre caracteristicile lipsă ale TDBGrid este că nu există nicio opțiune de a ajusta automat lățimile coloanelor specifice pentru a se potrivi complet cu lățimea clientului grilei. Când redimensionați componenta DBGrid la timpul de execuție, lățimile coloanei nu sunt redimensionate.

Dacă lățimea DBGrid este mai mare decât lățimea totală a tuturor coloanelor, veți obține o zonă goală imediat după ultima coloană. Pe de altă parte, dacă lățimea totală a tuturor coloanelor este mai mare decât lățimea DBGrid, va apărea o bară de defilare orizontală.

Reglați automat lățimile coloanei DBGrid

Există o procedură la îndemână pe care o poți urmări care stabilește lățimile coloanelor DBGrid selective atunci când grila este redimensionată la timpul de rulare.

instagram viewer

Este important de reținut că, de obicei, doar două-trei coloane dintr-un DBGrid trebuie să fie redimensionate automat; toate celelalte coloane afișează câteva date „latime statice”. De exemplu, puteți specifica întotdeauna lățimea fixă ​​pentru coloanele care afișează valori din câmpurile de date reprezentate cu TDateTimeField, TFloatField, TIntegerField și altele similare.

Mai mult, probabil, veți crea (la momentul proiectării) componente persistente de câmp folosind editorul Fields, pentru a specifica câmpurile din setul de date, proprietățile lor și ordonarea lor. Cu un obiect descendent TField, puteți utiliza proprietatea Tag pentru a indica faptul că o anumită coloană care afișează valori pentru acel câmp trebuie să fie de dimensiune automată.

Aceasta este ideea: Dacă doriți ca o coloană să se încadreze automat în spațiul disponibil, alocați o valoare întreagă pentru proprietatea Tag-ul descendentului TField care indică lățimea minimă a coloanei corespunzătoare.

Procedura FixDBGridColumnsWidth

Înainte de a începe, în Eveniment OnCreate pentru obiectul Form care conține DBGrid, specificați ce coloane trebuie redimensionate automat prin alocarea unei valori non-zero pentru proprietatea Tag a obiectului TField corespunzător.

procedură TForm1.FormCreate (Expeditor: TObject);
începe
// configurați coloane autoreizabile prin asignare
// Lățimea minimă în proprietatea Etichetă.

// folosind o valoare fixă: 40 px
Tabelul1.FieldByName ('FirstName'). Etichetă: = 40;
// folosind valoarea variabilă: lățimea
// implicit Textul titlului coloanei
Tabelul1.FieldByName ('LastName'). Etichetă: = 4 + Canvas. TextWidth (Table1.FieldByName ('LastName'). DisplayName);
Sfârșit
;

În codul de mai sus, Tabelul 1 este o componentă TTable legată de a Componenta DataSource, care este legat de DBGrid. Proprietatea Table1.Table indică tabelul angajaților DBDemos.

Am marcat ca coloanele care afișează valorile câmpurilor FirstName și LastName să fie redimensionabile. Următorul pas este să apelăm la FixDBGridColumnsWidth al nostru în gestionarul de evenimente OnResize pentru Formular:

procedură TForm1.FormResize (Expeditor: TObject);
începe
FixDBGridColumnsWidth (DBGrid1);
Sfârșit
;

Notă: Toate acestea au sens dacă proprietatea Align a DBGrid include una dintre următoarele valori: alTop, alBottom, alClient sau alCustom.

În cele din urmă, iată codul procedurii FixDBGridColumnsWidth:

procedură FixDBGridColumnsWidth (const DBGrid: TDBGrid);
var
i: număr întreg; TotWidth: număr întreg; VarWidth: număr întreg; ResizableColumnCount: număr întreg; AColumn: TColumn;
începe
// lățimea totală a tuturor coloanelor înainte de redimensionare
TotWidth: = 0;
// cum se împarte orice spațiu suplimentar în grilă
VarWidth: = 0;
// câte coloane trebuie redimensionate automat
ResizableColumnCount: = 0;
pentru i: = 0 la -1 + DBGrid. Coloane. Numara dobegin
TotWidth: = TotWidth + DBGrid. Coloanele [i] .Width;
dacă DBGrid. Coloanele [i] .Field. Eticheta 0 apoi
Inc (ResizableColumnCount);
Sfârșit;
// adăugați 1px pentru linia de separare a coloanelordacă dgColLines în DBGrid. Opțiuni apoi
TotWidth: = TotWidth + DBGrid. Coloane. Numara;
// adăugați lățimea indicatorului coloaneidacă dgIndicator în DBGrid. Opțiuni apoi
TotWidth: = TotWidth + IndicatorWidth;
// lățime vale "stânga"
VarWidth: = DBGrid. ClientWidth - TotWidth;
// Distribuiți în mod egal VarWidth
// la toate coloanele redimensionabile automat
dacă ResizableColumnCount> 0 apoi
VarWidth: = varWidth div ResizableColumnCount;
pentru i: = 0 la -1 + DBGrid. Coloane. Numara dobegin
AColumn: = DBGrid. Coloanele [i];
dacă O coloana. Camp. Eticheta 0 thenbegin
O coloana. Lățime: = Acolumn. Lățime + lățime VarW;
dacă O coloana. Lățime atunci
O coloana. Lățime: = Acolumn. Camp. Etichetă;
Sfârșit;
Sfârșit;
Sfârșit
; (* FixDBGridColumnsWidth *)