Как избавиться от пустого места в правой части DBGrid Delphi - PullRequest
1 голос
/ 03 октября 2009

Хотя вопрос кажется простым, я не смог найти ответ на него.

У меня есть компонент DBGrid с большим количеством столбцов, и в результате они не помещаются на страницу, и появляется полоса прокрутки. У меня также есть механизм column-autofix, который позволяет каждому столбцу иметь ширину самого длинного элемента в таблице. Когда я прокручиваю DBGrid до конца справа, после последнего столбца появляется свободное место. Как избавиться от этого пространства?

Одно из решений, которое я вижу, - растянуть последний столбец, чтобы он соответствовал пустому пространству. Но я не знаю, как найти длину этого пустого пространства! DbGrid.Width и DbGrid.ClientWidth дают только длину составной части, но не реальную длину таблицы. Любые намеки ??

Ответы [ 3 ]

5 голосов
/ 03 октября 2009

Не всегда легко заставить DBGrid вести себя так, как вы хотите. Я решил использовать альтернативные сетки БД после одного проекта со стандартной реализацией, и я никогда не оглядывался назад.

Если вы можете использовать альтернативную сетку, у вас есть много вариантов на выбор. На SO есть даже тема с множеством указателей. Среди вариантов с исходным кодом мне всегда очень нравился проект JVCL .

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

1 голос
/ 22 октября 2010

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

Вместо этого поместите тот же код не в событие рисования, а в событие AfterOpen (и AfterRefresh) исходного набора данных, чтобы выполнить его только один раз для каждого набора результатов.

1 голос
/ 11 ноября 2009

Я думаю, что нашел решение (хотя это кажется немного странным). Чтобы найти разницу между шириной столбца и реальной шириной DBgrid (то есть найти ширину пустого пространства, оставшегося после последнего столбца), нам нужно отслеживать, какой столбец теперь отображается слева (что является текущим столбцом это прокручивается до). Мы можем сделать это, используя событие OnDrawColumnCell, поскольку оно будет рисовать только те столбцы, которые прокручиваются сейчас. Затем нам нужно вычислить сумму ширин всех видимых столбцов и вычесть ее из ширины DBGrid. Постскриптум Извините за плохой английский

Ex код:

     For i:=0 to Last do
     if Vis[i] then
     Begin
      Sum:=Sum+DBG.Columns[i].Width;
      Inc(Cnt);
     End;

     if dgColLines in DBG.Options then
     Sum := Sum + Cnt;

  //add indicator column width
    if dgIndicator in DBG.Options then
    Sum := Sum + IndicatorWidth;
    Dif:=DBG.ClientWidth - Sum;
...