Советы по Delphi

         

Изменение размеров DBGrid


У меня есть форма. На ней расположены поле редактирования, компонент 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.

[000071]



Содержание раздела