Как сделать так, чтобы столбцы TDBGrid соответствовали ширине сетки? - PullRequest
4 голосов
/ 05 января 2010

У меня есть TDBGrid с предопределенными столбцами, и я просто не могу правильно определить ширину. Я могу связываться со свойством Width столбцов в конструкторе форм и заставить ширину выглядеть правильно во время разработки, но во время выполнения, по любой причине, столбцы имеют тенденцию быть значительно шире, и я получаю полосу прокрутки в нижней части сетки. Есть ли способ получить правильный размер столбцов без проб и ошибок, особенно если сетка имеет только один или два из них?

Ответы [ 5 ]

4 голосов
/ 05 января 2010

Я использую эту процедуру внутри формы 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;

Он имеет некоторые недостатки, но работает довольно хорошо.

1 голос
/ 04 октября 2012

Мне кажется, я знаю ответ на проблему. У меня была такая же проблема в течение нескольких лет. Когда я помещаю демонстрационные данные, я изменяю ширину столбцов (время разработки), но я подозреваю, что как ошибка в Delphi, если введенная вами ширина совпадает с шириной по умолчанию, которую Delphi назначает столбцу, ширина не сохраняется файл dfm - как видно, если вы просматриваете dfm как текст.

Мое решение состоит в том, чтобы установить его на один пиксель шире или уже, так что Delphi будет вынужден хранить ширину (или редактировать dfm напрямую), и поэтому он будет установлен во время выполнения. Если вы не установите его, Delphi назначит некоторую вычисленную ширину во время выполнения - это не то, что вам нужно, поскольку она может меняться в зависимости от данных. Простое решение, но мне потребовалось много времени, чтобы понять.

0 голосов
/ 05 января 2010

Вы можете посмотреть ответы на этот вопрос.

Возможно, здесь может помочь защищенный метод CalcDrawInfo.

0 голосов
/ 05 января 2010

Ответ JP - довольно хорошее решение. Вам необходимо вручную растянуть или сжать столбцы, чтобы они поместились в окне. Для получения ширины вертикальной полосы прокрутки есть вызов API Windows. Затем вы можете посмотреть на видимые строки, чтобы увидеть, отображается ли вертикальная полоса прокрутки.

Другой метод заключается в определении ширины каждого столбца относительно друг друга. Затем, когда вы изменяете их размер, сохраняйте то же соотношение.

0 голосов
/ 05 января 2010

Вы можете сделать это, но вы должны проверить ширину всех полей для всех записей , которые вы потенциально можете отобразить.

Учитывая тот факт, что все еще существует множество приложений, которые едва фильтруют свой набор записей, это может означать, что вам нужно проверить миллион записей, просто чтобы избавиться от полосы прокрутки.

Вы когда-нибудь думали, что вам может понадобиться отображать слишком много информации одновременно?

Возможная альтернатива - показать текст подсказки для полей, которые не помещаются в их столбце?

Я использовал такую ​​альтернативу, но нужно проверить источники; Я могу принести тебе пример кода завтра.

- Йерун

...