Если у тебя есть постоянная девушка, то на всех вечеринках приходится использовать установки "default" (по умолчанию). Можно попробовать переустановить "систему" в режиме "custom", но получаться те же самые Windows-совские глюки. Если ты Unix-оид, то у тебя, скорей всего, нет постоянной девушки.
У меня есть форма. На ней расположены поле редактирования, компонент SQL
Query, DBGrid и кнопка. Я заполняю поле редактирования и при нажатии на кнопку
DBGrid отражает результат запроса. Как я могу изменить размер табличной сетки и
ее колонок в зависимости от новых значений полей? Поля, возвращаемые запросом,
не заполняют всей ширины сетки, а все мои попытки сделать это из кода терпят
крах...
Вы можете изменить размер колонки во время выполнения программы, изменяя
свойство DisplayWidth соответствующего поля компонента DBGrid...
Если Вам действительно необходимо вычислить ширину всего 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 dofor i := 0 to FieldCount - 1 dowith Fields[i] doif visible thenbegin
iColWidth := iCharWidth * DisplayWidth;
if dgTitles in dbg.Options thenbegin
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 thenbegin
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.
Изменение размеров колонок DBGrid: можно изменить размер колонки во время выполнения программы, изменяя свойство DisplayWidth соответствующего поля компонента DBGrid или использовать функцию NewTextWidth для вычисления ширины табличной сетки.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.