Hoe DBGrid kolombreedten automatisch te repareren

Ontworpen om een ​​gebruiker in staat te stellen gegevens in een tabelraster te bekijken en te bewerken, biedt de DBGrid verschillende manieren om de manier aan te passen waarop het "zijn" gegevens weergeeft. Met zoveel flexibiliteit kan een Delphi-ontwikkelaar altijd nieuwe manieren vinden om het krachtiger te maken.

Een van de ontbrekende functies van TDBGrid is dat er geen optie is om de breedte van specifieke kolommen automatisch aan te passen om volledig te passen in de clientbreedte van het raster. Wanneer u tijdens runtime het formaat van de DBGrid-component wijzigt, wordt de grootte van de kolombreedten niet gewijzigd.

Als de breedte van de DBGrid groter is dan de totale breedte van alle kolommen, krijgt u direct na de laatste kolom een ​​leeg gebied. Aan de andere kant, als de totale breedte van alle kolommen groter is dan de breedte van de DBGrid, verschijnt een horizontale schuifbalk.

Pas automatisch DBGrid kolombreedtes aan

Er is een handige procedure die u kunt volgen die de breedte van selectieve DBGrid-kolommen corrigeert wanneer het formaat van het raster tijdens runtime wordt gewijzigd.

Het is belangrijk op te merken dat meestal slechts twee tot drie kolommen in een DBGrid automatisch moeten worden aangepast; alle andere kolommen geven enkele "statische breedte" gegevens weer. U kunt bijvoorbeeld altijd een vaste breedte opgeven voor kolommen die waarden weergeven uit gegevensvelden die worden weergegeven met TDateTimeField, TFloatField, TIntegerField en dergelijke.

Bovendien zult u waarschijnlijk (tijdens het ontwerp) permanente veldcomponenten maken met behulp van de Velden-editor om de velden in de gegevensset, hun eigenschappen en hun volgorde op te geven. Met een TField-afstammingsobject kunt u de eigenschap Tag gebruiken om aan te geven dat een bepaalde kolom met waarden voor dat veld automatisch moet worden aangepast.

Dit is het idee: als u wilt dat een kolom automatisch de beschikbare ruimte aanpast, wijst u een geheel getal toe voor de eigenschap Tag van de TField-afstammeling die de minimale breedte van de overeenkomstige kolom aangeeft.

De FixDBGridColumnsWidth-procedure

Voordat u begint, geeft u in de OnCreate-gebeurtenis voor het Form-object dat de DBGrid bevat aan welke kolommen automatisch moeten worden aangepast door een niet-nulwaarde toe te wijzen voor de eigenschap Tag van het overeenkomstige TField-object.

procedure TForm1.FormCreate (Sender: TObject);
beginnen
// autoresizable kolommen instellen door toe te wijzen
// Minimm-breedte in de eigenschap Tag.

// met vaste waarde: 40 px
Table1.FieldByName ('FirstName'). Tag: = 40;
// met behulp van variabele waarde: breedte van de
// standaard kolomteksttekst
Table1.FieldByName ('LastName'). Tag: = 4 + Canvas.TextWidth (Table1.FieldByName ('LastName'). DisplayName);
einde
;

In de bovenstaande code is Tabel1 een TTable-component gekoppeld aan een DataSource-component, die is gekoppeld aan de DBGrid. De eigenschap Table1.Table verwijst naar de tabel DBDemos-medewerker.

We hebben de kolommen met de waarden voor de velden Voornaam en Achternaam gemarkeerd als automatisch aanpasbaar. De volgende stap is om onze FixDBGridColumnsWidth aan te roepen in de OnResize-gebeurtenishandler voor het formulier:

procedure TForm1.FormResize (Sender: TObject);
beginnen
FixDBGridColumnsWidth (DBGrid1);
einde
;

Notitie: Dit is allemaal zinvol als de eigenschap Align van DBGrid een van de volgende waarden bevat: alTop, alBottom, alClient of alCustom.

Ten slotte is hier de code van de FixDBGridColumnsWidth-procedure:

procedure FixDBGridColumnsWidth (const DBGrid: TDBGrid);
var
i: geheel getal; TotWidth: geheel getal; VarWidth: geheel getal; ResizableColumnCount: geheel getal; AColumn: TColumn;
beginnen
// totale breedte van alle kolommen voordat het formaat wordt gewijzigd
TotWidth: = 0;
// hoe extra ruimte in het raster te verdelen
VarWidth: = 0;
// hoeveel kolommen automatisch moeten worden aangepast
ResizableColumnCount: = 0;
voor i: = 0 naar -1 + DBGrid.Columns.Count dobegin
TotWidth: = TotWidth + DBGrid.Columns [i] .Width;
als DBGrid.Columns [i] .Field.Tag 0 vervolgens
Inc (ResizableColumnCount);
einde;
// voeg 1 px toe voor de kolomscheidingslijnals dgColLines in DBGrid.Options vervolgens
TotWidth: = TotWidth + DBGrid.Columns.Count;
// voeg de kolombreedte van de indicator toeals dgIndicator in DBGrid.Options vervolgens
TotWidth: = TotWidth + IndicatorWidth;
// breedte vale "links"
VarWidth: = DBGrid.ClientWidth - TotWidth;
// Verdeel VarWidth gelijkelijk
// naar alle automatisch aanpasbare kolommen
als ResizableColumnCount> 0 vervolgens
VarWidth: = varWidth div ResizableColumnCount;
voor i: = 0 naar -1 + DBGrid.Columns.Count dobegin
AColumn: = DBGrid.Columns [i];
als AColumn.Field.Tag 0 thenbegin
AColumn.Width: = AColumn.Width + VarWidth;
als AColumn.Width then
AColumn.Width: = AColumn.Field.Tag;
einde;
einde;
einde
; (* FixDBGridColumnsWidth *)