Вы можете изменить размер колонки во время выполнения программы, изменяя свойство 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;tryresult := Application.MainForm.Canvas.TextWidth(sString);finallyApplication.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 dofor i := 0 to FieldCount - 1 do with Fields[i] doif visible thenbeginiColWidth := iCharWidth * DisplayWidth;if dgTitles in dbg.Options thenbeginiTitleWidth := 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 thenbegininc(iColumns, 1);inc(result, iINDICATOR_WIDE);end;if dgColLines in dbg.Optionsthen inc(result, iColumns)else inc(result, 1);end; |
Я должен использовать функцию NewTextWidth, а не Canvas.TextWith компонента DBGrid, так как Canvas еще не инициализирован во время вызова iCalcGridWidth.
[000071]