Изменение размеров колонок DBGrid
|
Если у тебя есть постоянная девушка, то на всех вечеринках приходится использовать установки "default" (по умолчанию). Можно попробовать переустановить "систему" в режиме "custom", но получаться те же самые Windows-совские глюки. Если ты Unix-оид, то у тебя, скорей всего, нет постоянной девушки.
|
У меня есть форма. На ней расположены поле редактирования, компонент SQL
Query, DBGrid и кнопка. Я заполняю поле редактирования и при нажатии на кнопку
DBGrid отражает результат запроса. Как я могу изменить размер табличной сетки и
ее колонок в зависимости от новых значений полей? Поля, возвращаемые запросом,
не заполняют всей ширины сетки, а все мои попытки сделать это из кода терпят
крах...
Вы можете изменить размер колонки во время выполнения программы, изменяя
свойство DisplayWidth соответствующего поля компонента DBGrid...
MyTableMyField.DisplayWidth := Length(MyTableMyField.value);
|
Если Вам действительно необходимо вычислить ширину всего DBGrid, используйте
следующий код:
function NewTextWidth(fntFont: TFont; const sString: OpenString): integer;
var
fntSave: TFont;
begin
result := 0;
fntSave := Application.MainForm.Font;
Application.MainForm.Font := fntFont;
try
result := Application.MainForm.Canvas.TextWidth(sString);
finally
Application.MainForm.Font := fntSave;
end;
end;
{ вычисляем ширину табличной сетки, которую необходимо отобразить без }
{ горизонтальной полосы прокрутки и без дополнительного пространства между последней }
{ колонкой и вертикальной полосой прокрутки. Свойство Datasource у компонента DBGrid, }
{ как и свойство Dataset у Datasource должны быть назначены заранее, }
{ но таблица не должна быть открытой. Примечание: полученная ширина включает ширину }
{ вертикальной полосы прокрутки, полученной на основе базового режима }
{ отображения. Вычисленная ширина полностью занимает рабочую область компонента. }
function iCalcGridWidth(
dbg: TDBGrid { корректируемый компонент }
): integer; { "точная" ширина }
const
cMEASURE_CHAR = '0';
iEXTRA_COL_PIX = 4;
iINDICATOR_WIDE = 11;
var
i, iColumns, iColWidth, iTitleWidth, iCharWidth: integer;
begin
iColumns := 0;
result := GetSystemMetrics(SM_CXVSCROLL);
iCharWidth := NewTextWidth(dbg.Font, cMEASURE_CHAR);
with dbg.dataSource.dataSet do
for i := 0 to FieldCount - 1 do
with Fields[i] do
if visible then
begin
iColWidth := iCharWidth * DisplayWidth;
if dgTitles in dbg.Options then
begin
iTitleWidth := NewTextWidth(dbg.TitleFont, DisplayLabel);
if iColWidth < iTitleWidth then
iColWidth := iTitleWidth;
end;
inc(iColumns, 1);
inc(result, iColWidth + iEXTRA_COL_PIX);
end;
if dgIndicator in dbg.Options then
begin
inc(iColumns, 1);
inc(result, iINDICATOR_WIDE);
end;
if dgColLines in dbg.Options then
inc(result, iColumns)
else
inc(result, 1);
end;
|
Я должен использовать функцию NewTextWidth, а не Canvas.TextWith компонента
DBGrid, так как Canvas еще не инициализирован во время вызова
iCalcGridWidth.
|