Delphi: Justera DBGrid-kolumnbredder automatiskt

Utformad för att göra det möjligt för en användare att se och redigera data i ett tabellnät, DBGrid tillhandahåller olika sätt att anpassa hur det representerar "dess" data. Med så mycket flexibilitet, a Delphi utvecklare kan alltid hitta nya sätt att göra det mer kraftfullt.

En av de saknade funktionerna i TDBGrid är att det inte finns något alternativ att automatiskt justera bredden på specifika kolumner för att helt anpassa rutnätets klientbredd. När du ändrar storlek på DBGrid-komponenten under körning ändras inte kolumnbredderna.

Om bredden på DBGrid är större än den totala bredden för alla kolumner, får du ett tomt område direkt efter den sista kolumnen. Å andra sidan, om den totala bredden för alla kolumner är större än bredden på DBGrid, kommer en horisontell rullningslista att visas.

Justera DBGrid-kolumnbredder automatiskt

Det finns en praktisk procedur som du kan följa som fixar bredden på selektiva DBGrid-kolumner när rutnätet ändras vid körning.

Det är viktigt att notera att vanligtvis bara två till tre kolumner i en DBGrid behöver ändras automatiskt. alla andra kolumner visar "statisk bredd" -data. Till exempel kan du alltid ange fast bredd för kolumner som visar värden från datafält som representeras med TDateTimeField, TFloatField, TIntegerField och liknande.

instagram viewer

Dessutom skapar du förmodligen (vid designtid) ihållande fältkomponenter med hjälp av fältredigeraren för att ange fälten i datasatsen, deras egenskaper och deras beställning. Med ett TField-efterföljande objekt kan du använda egenskapen Tag för att indikera att en viss kolumn som visar värden för det fältet måste vara automatiskt stor.

Det här är idén: Om du vill att en kolumn ska anpassa det tillgängliga utrymmet automatiskt tilldelar du ett heltal för TField-efterföljarens Tag-egenskap som anger motsvarande kolumns minsta bredd.

FixDBGridColumnsWidth-proceduren

Innan du börjar, i OnCreate-händelse för Form-objektet som innehåller DBGrid, ange vilka kolumner som måste ändras automatiskt genom att tilldela ett värde som inte är noll för Tag -egenskapen för motsvarande TField-objekt.

procedur TForm1.FormCreate (avsändare: TObject);
Börja
// ställa in autoresizerbara kolumner genom att tilldela
// Minimmbredd i egenskapen Tag.

// med fast värde: 40 px
Tabell1.FieldByName ('Förnamn'). Tagg: = 40;
// med variabelt värde: bredden på
// standard Kolumntiteltext
Tabell1.FieldByName ('LastName'). Tagg: = 4 + Canvas. Textbredd (Table1.FieldByName ('LastName'). DisplayName);
slutet
;

I ovanstående kod är Tabell 1 en TTable-komponent kopplad till en DataSource-komponent, som är kopplad till DBGrid. Tabellen1.Tabellegenskapen pekar på tabellen DBDemos anställda.

Vi har markerat kolumnerna som visar värdena för fältet Förnamn och Efternamn som kan ändras automatiskt. Nästa steg är att ringa vår FixDBGridColumnsWidth i händelsehanteraren OnResize för formuläret:

procedur TForm1.FormResize (avsändare: TObject);
Börja
FixDBGridColumnsWidth (DBGrid1);
slutet
;

Notera: Allt detta är vettigt om egenskapen Align i DBGrid innehåller ett av följande värden: alTop, alBottom, alClient eller alCustom.

Slutligen, här är FixDBGridColumnsWidth-procedurens kod:

procedur FixDBGridColumnsWidth (const DBGrid: TDBGrid);
var
i: heltal; TotWidth: heltal; VarWidth: heltal; ResizableColumnCount: heltal; AColumn: TColumn;
Börja
// total bredd för alla kolumner innan storleken
Totbredd: = 0;
// hur man delar upp extra utrymme i nätet
Varbredd: = 0;
// hur många kolumner som måste ändras automatiskt
ResizableColumnCount: = 0;
för i: = 0 till -1 + DBGrid. Kolumner. Räkna dobegin
TotWidth: = TotWidth + DBGrid. Kolonner [i] .Width;
om DBGrid. Kolonner [i] .Field. Tagga 0 sedan
Inc (ResizableColumnCount);
slutet;
// lägg till 1px för kolumnseparatorradom dgColLines i DBGrid. alternativ sedan
TotWidth: = TotWidth + DBGrid. Kolumner. Räkna;
// lägg till kolumnens breddom dgIndicator i DBGrid. alternativ sedan
TotWidth: = TotWidth + IndicatorWidth;
// bredd vale "vänster"
VarWidth: = DBGrid. ClientWidth - TotWidth;
// Distribuera VarWidth lika
// till alla autokaliserbara kolumner
om ResizableColumnCount> 0 sedan
VarWidth: = varWidth div ResizableColumnCount;
för i: = 0 till -1 + DBGrid. Kolumner. Räkna dobegin
AColumn: = DBGrid. Kolonner [i];
om AColumn. Fält. Tagga 0 thenbegin
AColumn. Bredd: = AColumn. Bredd + VarBredd;
om AColumn. Bredd då
AColumn. Bredd: = AColumn. Fält. Märka;
slutet;
slutet;
slutet
; (* FixDBGridColumnsWidth *)
instagram story viewer