Delphi: Automatické přizpůsobení šířky sloupců DBGrid

Je navržen tak, aby umožnil uživateli prohlížet a upravovat data v tabulkové mřížce DBGrid poskytuje různé způsoby přizpůsobení způsobu, jakým reprezentuje „svá“ data. S tak velkou flexibilitou Delphi vývojář vždy najde nové způsoby, jak jej zvýšit.

Jednou z chybějících funkcí TDBGrid je, že neexistuje žádná možnost, jak automaticky přizpůsobit šířky konkrétních sloupců tak, aby se zcela přizpůsobily šířce klienta sítě. Při změně velikosti komponenty DBGrid za běhu se nezmění šířky sloupců.

Pokud je šířka DBGrid větší než celková šířka všech sloupců, dostanete za poslední sloupec prázdnou oblast. Na druhou stranu, pokud je celková šířka všech sloupců větší než šířka DBGrid, zobrazí se vodorovný posuvník.

Automaticky upravit šířky sloupců DBGrid

Je možné použít jednu praktickou proceduru, která opraví šířky selektivních sloupců DBGrid při změně velikosti mřížky za běhu.

Je důležité si uvědomit, že obvykle jen dva až tři sloupce v DBGrid skutečně musí být automaticky upraveny; všechny ostatní sloupce zobrazují některá data „statické šířky“. Například vždy můžete určit pevnou šířku pro sloupce zobrazující hodnoty z datových polí, která jsou reprezentována pomocí TDateTimeField, TFloatField, TIntegerField a podobně.

instagram viewer

A co víc, pravděpodobně vytvoříte (v době návrhu) trvalé komponenty pole pomocí editoru Fields, abyste určili pole v datové sadě, jejich vlastnosti a jejich řazení. U objektu potomka TField můžete pomocí vlastnosti Tag označit, že konkrétní sloupec zobrazující hodnoty pro toto pole musí být automaticky upraven.

Toto je myšlenka: Pokud chcete, aby se sloupec automaticky přizpůsobil dostupnému prostoru, přiřaďte pro vlastnost Tag potomka TField celé číslo, která označuje minimální šířku odpovídajícího sloupce.

Procedura FixDBGridColumnsWidth

Než začnete, v Událost OnCreate pro objekt Form obsahující DBGrid určete, jaké sloupce je třeba automaticky změnit velikost přiřazením nenulové hodnoty pro vlastnost Tag odpovídajícího objektu TField.

postup TForm1.FormCreate (Sender: TObject);
začít
// setup autorizovatelné sloupce přiřazením
// Minimm Width ve vlastnosti Tag.

// pomocí pevné hodnoty: 40 px
Table1.FieldByName ('FirstName'). Tag: = 40;
// using variabilní hodnota: width of
// výchozí text nadpisu sloupce
Table1.FieldByName ('LastName'). Tag: = 4 + Canvas. TextWidth (Table1.FieldByName ('LastName'). DisplayName);
konec
;

Ve výše uvedeném kódu je tabulka1 TTable komponentou spojenou s a Komponenta DataSource, který je propojen s DBGrid. Vlastnost Table1.Table odkazuje na tabulku zaměstnanců DBDemos.

Sloupce zobrazující hodnoty pro pole Jméno a Příjmení jsme označili jako automatické změny velikosti. Dalším krokem je volání našeho FixDBGridColumnsWidth v obslužné rutině události OnResize pro formulář:

postup TForm1.FormResize (Sender: TObject);
začít
FixDBGridColumnsWidth (DBGrid1);
konec
;

Poznámka: To vše má smysl, pokud vlastnost Zarovnat DBGrid obsahuje jednu z následujících hodnot: alTop, alBottom, alClient nebo alCustom.

Nakonec je zde kód procedury FixDBGridColumnsWidth:

postup FixDBGridColumnsWidth (konst DBGrid: TDBGrid);
var
i: celé číslo; TotWidth: celé číslo; VarWidth: celé číslo; ResizableColumnCount: integer; AColumn: TColumn;
začít
// celková šířka všech sloupců před změnou velikosti
TotWidth: = 0;
// jak rozdělit jakýkoli další prostor v mřížce
VarWidth: = 0;
// kolik sloupců musí být upraveno automaticky
ResizableColumnCount: = 0;
pro i: = 0 na -1 + DBGrid. Sloupce. Počet dobegin
TotWidth: = TotWidth + DBGrid. Sloupce [i]. Šířka;
-li DBGrid. Sloupce [i] .Obrázek. Značka 0 pak
Inc (ResizableColumnCount);
konec;
// přidat 1px pro řádek oddělovače sloupců-li dgColLines v DBGrid. Možnosti pak
TotWidth: = TotWidth + DBGrid. Sloupce. Počet;
// přidat šířku sloupce indikátoru-li dgIndicator v DBGrid. Možnosti pak
TotWidth: = TotWidth + IndicatorWidth;
// width "leve"
VarWidth: = DBGrid. ClientWidth - TotWidth;
// Rovnoměrně distribuujte VarWidth
// do všech automaticky přizpůsobitelných sloupců
-li ResizableColumnCount> 0 pak
VarWidth: = varWidth div ResizableColumnCount;
pro i: = 0 na -1 + DBGrid. Sloupce. Počet dobegin
Sloupec: = DBGrid. Sloupce [i];
-li Sloupec. Pole. Značka 0 thenbegin
Sloupec. Šířka: = AColumn. Šířka + VarWidth;
-li Sloupec. Šířka pak
Sloupec. Šířka: = AColumn. Pole. Štítek;
konec;
konec;
konec
; (* FixDBGridColumnsWidth *)
instagram story viewer