Разработанный, чтобы позволить пользователю просматривать и редактировать данные в табличной сетке, DBGrid предоставляет различные способы настройки способа представления «своих» данных. С такой большой гибкостью, Delphi разработчик всегда может найти новые способы сделать его более мощным.
Одной из недостающих функций TDBGrid является то, что нет возможности автоматически регулировать ширину определенных столбцов, чтобы полностью соответствовать ширине клиента сетки. При изменении размера компонента DBGrid во время выполнения ширина столбцов не изменяется.
Если ширина DBGrid превышает общую ширину всех столбцов, вы получите пустую область сразу после последнего столбца. С другой стороны, если общая ширина всех столбцов больше ширины DBGrid, появится горизонтальная полоса прокрутки.
Автоматическая настройка ширины столбца DBGrid
Есть одна удобная процедура, которой вы можете следовать, которая фиксирует ширину отдельных столбцов DBGrid при изменении размера сетки во время выполнения.
Важно отметить, что, как правило, только два-три столбца в DBGrid должны быть автоматически изменены; все остальные столбцы отображают некоторые данные «статической ширины». Например, вы всегда можете указать фиксированную ширину для столбцов, отображающих значения из полей данных, представленных с помощью TDateTimeField, TFloatField, TIntegerField и аналогичных.
Более того, вы, вероятно, создадите (во время разработки) постоянные компоненты полей с помощью редактора полей, чтобы указать поля в наборе данных, их свойства и их порядок. С объектом-потомком TField вы можете использовать свойство Tag, чтобы указать, что определенный столбец, отображающий значения для этого поля, должен иметь автоматический размер.
Идея такова: если вы хотите, чтобы столбец автоматически помещался в доступное пространство, присвойте целочисленное значение свойству Tag потомка TField, которое указывает минимальную ширину соответствующего столбца.
Процедура FixDBGridColumnsWidth
Прежде чем начать, в Событие OnCreate для объекта Form, содержащего DBGrid, укажите, какие столбцы необходимо изменить с помощью автоматического изменения размера, назначив ненулевое значение для свойства Tag соответствующего объекта TField.
процедура TForm1.FormCreate (Отправитель: TObject);
начать// настраиваем авторазменные столбцы по назначению
// Минимальная ширина в свойстве Tag.
// используя фиксированное значение: 40 px
Table1.FieldByName ('FirstName'). Tag: = 40;
// используя значение переменной: ширина
// текст заголовка столбца по умолчанию Table1.FieldByName ('LastName'). Tag: = 4 + Canvas. TextWidth (Table1.FieldByName ('LastName'). DisplayName);
конец;
В приведенном выше коде Table1 является компонентом TTable, связанным с Компонент DataSource, который связан с DBGrid. Свойство Table1.Table указывает на таблицу сотрудников DBDemos.
Мы пометили столбцы, отображающие значения полей FirstName и LastName для автоматического изменения размера. Следующим шагом является вызов нашей FixDBGridColumnsWidth в обработчике события OnResize для формы:
процедура TForm1.FormResize (Отправитель: TObject);
начать FixDBGridColumnsWidth (DBGrid1);
конец;
Замечания: Все это имеет смысл, если свойство Align DBGrid содержит одно из следующих значений: alTop, alBottom, alClient или alCustom.
Наконец, вот код процедуры FixDBGridColumnsWidth:
процедура FixDBGridColumnsWidth (Const DBGrid: TDBGrid);
вар я: целое число; TotWidth: целое число; VarWidth: целое число; ResizableColumnCount: integer; AColumn: TColumn;
начать// общая ширина всех столбцов перед изменением размера
TotWidth: = 0;
// как разделить лишнее пространство в сетке
VarWidth: = 0;
// сколько столбцов нужно изменить в размере
ResizableColumnCount: = 0;
за я: = 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;
за я: = 0 в -1 + DBGrid. Столбцы. подсчитывать dobegin
AColumn: = DBGrid. Колонны [I];
если AColumn. Поле. Тег 0 thenbegin
AColumn. Ширина: = AColumn. Ширина + VarWidth;
если AColumn. Ширина тогда
AColumn. Ширина: = AColumn. Поле. Тег;
конец;
конец;
конец; (* FixDBGridColumnsWidth *)