2009-10-03 4 views
1

Хотя вопрос кажется простым, я не смог найти ответ на него.Как избавиться от пустого пространства в правой части DBGrid Delphi

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

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

ответ

1

Я думаю, что нашел решение (хотя кажется немного странным). Чтобы найти разницу между шириной столбцов и реальной шириной 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; 
5

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

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

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

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^