Delphi: Автоматично регулиране на ширините на колоните DBGrid

click fraud protection

Създаден, за да позволи на потребителя да вижда и редактира данни в таблична мрежа, DBGrid предоставя различни начини за персонализиране на начина, по който представлява "своите" данни. С толкова голяма гъвкавост, a Delphi разработчикът винаги може да намери нови начини да го направи по-мощен.

Една от липсващите характеристики на TDBGrid е, че няма опция за автоматично регулиране на ширините на конкретни колони, така че напълно да пасне на ширината на клиента на мрежата. Когато преоразмерите компонента DBGrid по време на изпълнение, ширините на колоните не се променят.

Ако ширината на DBGrid е по-голяма от общата ширина на всички колони, ще получите празна област веднага след последната колона. От друга страна, ако общата ширина на всички колони е по-голяма от ширината на DBGrid, ще се появи хоризонтална лента за превъртане.

Автоматично регулиране на ширините на колоните DBGrid

Има една удобна процедура, която можете да следвате, която коригира ширините на селективни DBGrid колони, когато решетката е оразмерена по време на изпълнение.

instagram viewer

Важно е да се отбележи, че обикновено само две до три колони в DBGrid всъщност трябва да бъдат автоматично преоразмерени; всички останали колони показват някои данни "статична ширина". Например, винаги можете да посочите фиксирана ширина за колони, показващи стойности от полета с данни, които са представени с TDateTimeField, TFloatField, TIntegerField и други подобни.

Нещо повече, вероятно ще създадете (по време на проектиране) устойчиви компоненти на полето, използвайки редактора на полета, за да посочите полетата в набора от данни, техните свойства и тяхното подреждане. С низходящ обект на TField, можете да използвате свойството Tag, за да посочите, че определена колона, показваща стойности за това поле, трябва да бъде с размер на автоматично.

Това е идеята: Ако искате колона автоматично да пасне на наличното пространство, задайте цяло число за свойството Tag на потомството на TField, което показва минималната ширина на съответната колона.

Процедурата FixDBGridColumnsWidth

Преди да започнете, в OnCreate събитие за обекта Form, съдържащ DBGrid, посочете кои колони трябва да бъдат автоматично преоразмерени, като зададете ненулева стойност за свойството Tag на съответния обект TField.

процедура TForm1.FormCreate (подател: TObject);
започвам
// настройка на автоматизиращи колони чрез присвояване
// Минимална ширина в свойството Tag.

// използвайки фиксирана стойност: 40 px
Таблица1.FieldByName ('FirstName'). Таг: = 40;
// използвайки променлива стойност: ширина на
// по подразбиране текст на заглавието на колоната
Таблица1.FieldByName ('LastName'). Таг: = 4 + Canvas. TextWidth (Table1.FieldByName ('LastName'). DisplayName);
край
;

В горния код, Table1 е компонент TTable, свързан с a Компонент DataSource, която е свързана с DBGrid. Свойството Table1.Table сочи към таблицата DBDemos Employee.

Маркирахме колоните, показващи стойностите за полета FirstName и LastName, за да бъдат автоматично преоразмерявани. Следващата стъпка е да се обадим на нашия FixDBGridColumnsWidth в обработващия събитията OnResize за Формата:

процедура TForm1.FormResize (подател: TObject);
започвам
FixDBGridColumnsWidth (DBGrid1);
край
;

Забележка: Всичко това има смисъл, ако свойството Align на DBGrid включва една от следните стойности: alTop, alBottom, alClient или alCustom.

И накрая, ето кодът на процедурата FixDBGridColumnsWidth:

процедура FixDBGridColumnsWidth (конст DBGrid: TDBGrid);
Var
i: цяло число; TotWidth: цяло число; VarWidth: цяло число; ResizableColumnCount: цяло число; AColumn: TColumn;
започвам
// обща ширина на всички колони преди преоразмеряване
TotWidth: = 0;
// как да разделите всяко допълнително пространство в мрежата
VarWidth: = 0;
// колко колони трябва да бъдат преоразмерени автоматично
ResizableColumnCount: = 0;
за i: = 0 да се -1 + DBGrid. Колони. Броя dobegin
TotWidth: = TotWidth + DBGrid. Колони [I] .Width;
ако DBGrid. Колони [I] .Field. Маркер 0 тогава
Inc (ResizableColumnCount);
край;
// добавете 1px за реда за разделяне на колониако dgColLines в DBGrid. Настроики тогава
TotWidth: = TotWidth + DBGrid. Колони. Броя;
// добавяне на ширина на колоната на индикатораако dgIndicator в DBGrid. Настроики тогава
TotWidth: = TotWidth + IndicatorWidth;
// ширина вале "вляво"
VarWidth: = DBGrid. ClientWidth - TotWidth;
// Равномерно разпределете VarWidth
// към всички колони с автоматично промяна на размера
ако ResizableColumnCount> 0 тогава
VarWidth: = varWidth Разделение ResizableColumnCount;
за i: = 0 да се -1 + DBGrid. Колони. Броя dobegin
AColumn: = DBGrid. Колони [I];
ако AColumn. Field. Маркер 0 thenbegin
AColumn. Ширина: = Колонка. Ширина + VarWidth;
ако AColumn. Ширина тогава
AColumn. Ширина: = Колонка. Field. Tag;
край;
край;
край
; (* FixDBGridColumnsWidth *)
instagram story viewer