Delphi: automatisch DBGrid-kolombreedten aanpassen

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

Een van de ontbrekende kenmerken van TDBGrid is dat er geen optie is om de breedte van specifieke kolommen automatisch aan te passen aan de volledige breedte van de klant. Wanneer u de grootte van de DBGrid-component wijzigt tijdens runtime, wordt de grootte van de kolombreedten niet gewijzigd.

Als de breedte van de DBGrid groter is dan de totale breedte van alle kolommen, krijg je 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, zal er een horizontale schuifbalk verschijnen.

Automatisch DBGrid-kolombreedten aanpassen

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

instagram viewer

Het is belangrijk op te merken dat normaal gesproken slechts twee tot drie kolommen in een DBGrid automatisch van grootte moeten worden veranderd; alle andere kolommen tonen enkele "statische breedte" -gegevens. U kunt bijvoorbeeld altijd een vaste breedte opgeven voor kolommen met waarden uit gegevensvelden die worden weergegeven met TDateTimeField, TFloatField, TIntegerField en dergelijke.

Bovendien zult u waarschijnlijk (tijdens het ontwerpen) persistente veldcomponenten maken met behulp van de Fields-editor, om de velden in de dataset, 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 in de beschikbare ruimte past, wijst u een geheel getal toe aan de eigenschap Tag van de TField-afstammeling die de minimale breedte van de overeenkomstige kolom aangeeft.

De FixDBGridColumnsWidth-procedure

Voordat je begint, in de OnCreate-gebeurtenis Geef voor het Form-object met DBGrid op welke kolommen automatisch moeten worden verkleind door een niet-nulwaarde toe te wijzen voor de eigenschap Tag van het bijbehorende TField-object.

procedure TForm1.FormCreate (Afzender: TObject);
beginnen
// Autoresibele kolommen instellen door middel van asigning
// Minimm Breedte in de eigenschap Tag.

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

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

We hebben de kolommen gemarkeerd waarin de waarden voor de velden Voornaam en Achternaam automatisch kunnen worden aangepast. De volgende stap is om onze FixDBGridColumnsWidth aan te roepen in de OnResize-eventhandler voor het formulier:

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

Notitie: Dit alles is logisch als de eigenschap Align van de 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 u extra ruimte in het raster verdeelt
VarWidth: = 0;
// hoeveel kolommen automatisch aangepast moeten worden
ResizableColumnCount: = 0;
voor ik: = 0 naar -1 + DBGrid. Kolommen. Tel dobegin
TotWidth: = TotWidth + DBGrid. Kolommen [i] .Width;
als DBGrid. Kolommen [i] .Veld. Label 0 vervolgens
Inc (ResizableColumnCount);
einde;
// voeg 1px toe voor de regel voor kolomscheidingals dgColLines in DBGrid. Opties vervolgens
TotWidth: = TotWidth + DBGrid. Kolommen. Tellen;
// voeg indicator kolombreedte toeals dgIndicator in DBGrid. Opties vervolgens
TotWidth: = TotWidth + IndicatorWidth;
// width vale "left"
VarWidth: = DBGrid. ClientWidth - TotWidth;
// Verdeel VarWidth evenredig
// naar alle automatisch aanpasbare kolommen
als ResizableColumnCount> 0 vervolgens
VarWidth: = varWidth div ResizableColumnCount;
voor ik: = 0 naar -1 + DBGrid. Kolommen. Tel dobegin
AColumn: = DBGrid. Kolommen [i];
als Een kolom. Veld. Label 0 dan beginnen
Een kolom. Breedte: = AColumn. Breedte + VarWidth;
als Een kolom. Breedte dan
Een kolom. Breedte: = AColumn. Veld. Label;
einde;
einde;
einde
; (* FixDBGridColumnsWidth *)
instagram story viewer