Изменение размеров DBGrid
У меня есть форма. На ней расположены поле редактирования, компонент SQL Query, DBGrid и кнопка. Я заполняю поле редактирования и при нажатии на кнопку DBGrid отражает результат запроса. Как я могу изменить размер табличной сетки и ее колонок в зависимости от новых значений полей? Поля, возвращаемые запросом, не заполняют всей ширины сетки, а все мои попытки сделать это из кода терпят крах...
Вы можете изменить размер колонки во время выполнения программы, изменяя свойство DisplayWidth соответствующего поля компонента DBGrid...
MyTableMyField.DisplayWidth := Length(MyTableMyField.value); |
Если Вам действительно необходимо вычислить ширину всего DBGrid, используйте следующий код:
function NewTextWidth(fntFont : TFont; const sString : OpenString) : integer;
varfntSave : TFont;
beginresult := 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;
beginiColumns := 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.
[000071]