Delphi: Juster DBGrid-kolonnebredder automatisk

Designet til at gøre det muligt for en bruger at se og redigere data i et tabelnettet, the DBGrid giver forskellige måder at tilpasse den måde, den repræsenterer "dens" data på. Med så meget fleksibilitet, a Delphi udvikler kan altid finde nye måder at gøre det mere magtfuldt.

En af de manglende funktioner i TDBGrid er, at der ikke er nogen mulighed for automatisk at justere bredderne på specifikke kolonner, så de passer perfekt til gitterets klientbredde. Når du ændrer størrelse på DBGrid-komponenten under kørsel, ændres kolonnebredderne ikke.

Hvis bredden af ​​DBGrid er større end den samlede bredde på alle kolonner, får du et tomt område lige efter den sidste kolonne. På den anden side, hvis den samlede bredde på alle søjler er større end bredden af ​​DBGrid, vises en vandret rullepanel.

Juster automatisk DBGrid-kolonnebredder

Der er en praktisk procedure, som du kan følge, der fikserer bredden af ​​selektive DBGrid-søjler, når gitteret ændres til kørslen.

Det er vigtigt at bemærke, at det normalt kun er to til tre kolonner i en DBGrid, der faktisk skal ændres automatisk. alle de andre kolonner viser nogle "statisk bredde" -data. For eksempel kan du altid specificere fast bredde for kolonner, der viser værdier fra datafelter, der er repræsenteret med TDateTimeField, TFloatField, TIntegerField og lignende.

instagram viewer

Hvad mere er, vil du sandsynligvis oprette (på designtidspunktet) vedvarende feltkomponenter ved hjælp af Fields-editoren til at specificere felterne i datasættet, deres egenskaber og deres rækkefølge. Med et TField-efterkommerobjekt kan du bruge egenskaben Tag til at indikere, at en bestemt kolonne, der viser værdier for dette felt, skal være automatisk størrelse.

Dette er ideen: Hvis du vil have en kolonne, der automatisk tilpasser den tilgængelige plads, skal du tildele en heltalværdi for TField-efterkommerens Tag-egenskab, der angiver den tilsvarende søjles minimale bredde.

Proceduren FixDBGridColumnsWidth

Inden du begynder, i OnCreate-begivenhed for Form-objektet, der indeholder DBGrid, skal du specificere, hvilke kolonner der skal ændres automatisk ved at tildele en ikke-nul-værdi for egenskaben Tag for det tilsvarende TField-objekt.

procedure TForm1.FormCreate (Afsender: TObject);
begynde
// opsæt autoresizable kolonner ved at tildele
// Minimm bredde i egenskaben Tag.

// ved hjælp af fast værdi: 40 px
Table1.FieldByName ('FirstName'). Tag: = 40;
// ved hjælp af variabel værdi: bredden af
// standardtekst til kolonnetitel
Tabel1.FieldByName ('LastName'). Tag: = 4 + lærred. TextWidth (Table1.FieldByName ('LastName'). DisplayName);
ende
;

I ovenstående kode er Tabel1 en TTable-komponent, der er knyttet til en DataSource-komponent, som er knyttet til DBGrid. Tabel1.Tabel-egenskab peger på DBDemos-medarbejder-tabellen.

Vi har markeret kolonnerne, der viser værdierne for felterne Førnavn og Efternavn, så de kan ændres automatisk. Det næste trin er at kalde vores FixDBGridColumnsWidth i OnResize event handler for formularen:

procedure TForm1.FormResize (Afsender: TObject);
begynde
FixDBGridColumnsWidth (DBGrid1);
ende
;

Bemærk: Alt dette giver mening, hvis egenskaben Align i DBGrid inkluderer en af ​​følgende værdier: alTop, alBottom, alClient eller alCustom.

Endelig er her FixDBGridColumnsWidth-procedurens kode:

procedure FixDBGridColumnsWidth (const DBGrid: TDBGrid);
Var
i: heltal; TotWidth: heltal; VarWidth: heltal; ResizableColumnCount: heltal; AColumn: TColumn;
begynde
// total bredde for alle kolonner før størrelse
Totbredde: = 0;
// hvordan man opdeler ekstra plads i gitteret
Varvidde: = 0;
// hvor mange kolonner der skal ændres automatisk
ResizableColumnCount: = 0;
til i: = 0 til -1 + DBGrid. Kolonner. Tælle dobegin
TotWidth: = TotWidth + DBGrid. Kolonner [i] .Width;
hvis DBGrid. Kolonner [i] .Field. Mærke 0 derefter
Inc (ResizableColumnCount);
ende;
// tilføj 1px til kolonneseparatorlinjenhvis dgColLines i DBGrid. Muligheder derefter
TotWidth: = TotWidth + DBGrid. Kolonner. Tælle;
// Tilføj indikators kolonnebreddehvis dgIndicator i DBGrid. Muligheder derefter
TotWidth: = TotWidth + IndicatorWidth;
// bredde vale "venstre"
VarWidth: = DBGrid. ClientWidth - TotWidth;
// Fordel VarWidth lige
// til alle autokaliserbare kolonner
hvis ResizableColumnCount> 0 derefter
VarWidth: = varWidth div ResizableColumnCount;
til i: = 0 til -1 + DBGrid. Kolonner. Tælle dobegin
AColumn: = DBGrid. Kolonner [i];
hvis AColumn. Mark. Mærke 0 thenbegin
AColumn. Bredde: = AColumn. Bredde + VarBredde;
hvis AColumn. Bredde derefter
AColumn. Bredde: = AColumn. Mark. tag;
ende;
ende;
ende
; (* FixDBGridColumnsWidth *)
instagram story viewer