У меня есть TDBGrid с предопределенными столбцами, и я просто не могу получить ширину справа. Я могу испортить свойство Width столбцов в конструкторе форм и получить ширину, чтобы смотреть прямо на время разработки, но по какой-либо причине столбцы имеют тенденцию быть значительно более широкими, и я получаю полосу прокрутки в нижней части сетки. Есть ли способ получить правильные размеры столбцов без всех проб и ошибок, особенно если в сетке есть только один или два из них?Как создать столбцы TDBGrid, соответствующие ширине сетки?
ответ
Вы можете сделать это, но вы должны проверить ширину всех полей для всех записей, что вы потенциально можете отобразить.
Учитывая тот факт, что все еще есть множество приложений, которые вряд ли фильтруют их набор записей, это может означать, что вам нужно проверить миллион записей, просто чтобы избавиться от полосы прокрутки.
Вы когда-нибудь считали, что можете просто отобразить слишком много информации сразу?
Возможна альтернатива - показать текст подсказки для полей, которые не соответствуют их колонке?
Я использовал такую альтернативу, но вам нужно проверить источники; Завтра я получу вам образец кода.
--jeroen
Вы, кажется, неправильно интерпретируете мою просьбу. Я не пытаюсь сделать столбцы такими же широкими, как данные в поле, которое они отображают, я пытаюсь сделать столбцы * такими же широкими, как и ширина элемента управления сеткой. * –
Ах, извините за это :-) –
Я использую эту процедуру внутри формы OnResize событий
procedure AutoStretchDBGridColumns(Grid: TDBGrid; Columns, MinWidths: Array of integer);
var
x, i, ww: integer;
begin
// Stretches TDBGrid columns
// Columns contains columns to stretch
// MinWidths contains columns minimum widhts
// To stretch grids columns 1,2 and 5 automatically and set minimum widths to 80, 150 and 150 call
// AutoStretchDBGridColumns(DBGrid1, [1,2,5], [80, 150, 150]);
Assert(Length(Columns) = Length(MinWidths), 'Length(Columns) <> Length(MinWidths)');
ww := 0;
for i := 0 to Grid.Columns.Count - 1 do
begin
if Grid.Columns[i].Visible then
ww := ww + Grid.Columns[i].Width + 1; //** +1 for grid line width
end;
if dgIndicator in Grid.Options then
ww := ww + IndicatorWidth;
x := (Grid.ClientWidth - ww) div Length(Columns);
for i := 0 to High(Columns) do
Grid.Columns[Columns[i]].Width := Max(Grid.Columns[Columns[i]].Width + x, MinWidths[i]);
end;
Он имеет некоторые недостатки, но работает достаточно хорошо.
Я использую LAZARUS, и у меня была та же проблема. Я использовал ваш метод, и он работает :) На самом деле я просто добавляю 1 к ширине каждого столбца. Благодаря! – itsols
Вот мой оригинальный вопрос: http://stackoverflow.com/questions/18798169/why-does-the-tdbgrid-take-up-more-space-at-run-time – itsols
JP's answer - довольно хорошее решение. Вам необходимо вручную растянуть или сжать столбцы, если это необходимо, чтобы он вписывался в окно. Существует вызов API Windows, чтобы получить ширину полосы прокрутки по вертикали. Затем вы можете посмотреть на видимые строки, чтобы увидеть, отображается ли вертикальная полоса прокрутки.
Другая методика заключается в определении ширины каждого столбца относительно друг друга. Затем, когда вы изменяете размер, они поддерживают одинаковое соотношение.
Возможно, вы ответите на вопрос this.
Возможно, защищенный метод CalcDrawInfo может помочь здесь.
Я думаю, что знаю ответ на проблему. У меня была такая же проблема в течение нескольких лет. Когда я помещаю демо-данные в я изменяю размер столбцов (время разработки), но я подозреваю, что в качестве ошибки в Delphi, если введенная ширина совпадает с шириной по умолчанию, которую Delphi присваивает столбцу, ширина не сохраняется в файл dfm - как можно видеть, если вы рассматриваете dfm как текст.
Мое решение состоит в том, чтобы установить его на один пиксель шире или уже, чтобы Delphi был вынужден хранить ширину (или редактировать непосредственно dfm), и поэтому он будет установлен во время выполнения. Если вы его не установили, Delphi назначит некоторую расчетную ширину во время выполнения - это не то, что вы хотите, поскольку это может измениться в зависимости от данных. Простое решение, но мне потребовалось много времени, чтобы разобраться.
Поскольку у меня такая же проблема с Lazarus, я не думаю, что это ошибка. В любом случае ответ JP ответил на меня :) – itsols
Наблюдение: у меня был TDBGrid в форме предка и форма потомства, унаследованные от этой формы. Колонка была установлена у предка.У меня была та же проблема, что и ошибки времени. Я заметил, что форма потомка подтвердила некоторые, но не все столбцы предка (смотря на DFM). Я удалил эти столбцы из DFM потомка. Кажется, это показывает все столбцы (это то, что я хотел в любом случае). После этого ширина пробега была правильной. –