2014-09-30 6 views
-2

У меня есть сетка, размер которой можно изменить. И я теперь задыхаюсь, заполняя пустое пространство вокруг столбцов в сетке. Я пытаюсь достичь этого в FormResize.Заполнение пустого пространства в delphi stringgrid

Сначала я вычислил, что является общей шириной столбцов, и затем я сравниваю ее с шириной сетки. если ширины stringgrid больше, то я добавляю к каждой колонке ширину равные части оставшегося пробела. Вот как это выглядит в formResize процедуры:

procedure TBDDTool.FormResize(Sender: TObject); 
var 
    totColWidth,i : integer; 
begin 
    totColWidth := 0; 
    for i := 0 to sgFilePreview.ColCount - 1 do 
    totColWidth := totColWidth + sgFilePreview.ColWidths[i]; 
    if sgFilePreview.Width > TotColWidth then 
    begin 
     for i := 0 to sgFilePreview.ColCount - 1 do 
     begin 
      sgFilePreview.ColWidths[i] := round(sgFilePreview.ColWidths[i] + 
       ((sgFilePreview.Width - totColWidth)/(sgFilePreview.colCount))); 
     end; 
    end; 

end; 

Это actualy не работает причина sgFilePReview.Width ширина моей сетки. И я не знаю, как получить ширину всего пространства внутри сетки, как и все столбцы + пустое пространство. Как я могу получить реальную ширину сетки? Причина sgFilePreview.Width возвращает ширину сетки, но, как видно из внешней сетки.

Спасибо!

EDIT

Space

Addine новые столбцы

  for val in sLineSplitted do 
     begin 
      if Pos('#',val) <> 0 then propVal := copy(val,0,pos('#',val)-1) 
      else propVal := val; 
      col := col +1; 
      if (row = 1) then 
      begin 
       if (col >1) then 
     //Add column 
       sgFilePreview.ColCount := col; 
       sgFilePreview.Cols[col-1].Text := propVal; 
       SetLength(aSourceData[row-1],col); 
       aSourceData[row-1,col-1] := val; 
      end 
      else 
      begin 
      sgFilePreview.RowCount := row; 
       SetLength(aSourceData[row-1],col); 
       aSourceData[row-1, col-1] := val; 
       sgFilePreview.Cells[col-1, row-1] := propVal; 
       pnlFileManager.Visible := true; 
      end; 


     end; 

колонки Auto размер, чтобы соответствовать слово, если мир больше, чем клетки ширина

procedure TBDDTool.AutoSizeGrid(Grid: TStringGrid); 
const 
    ColWidthMin = 10; 
var 
    C,R,W, ColWidthMax: integer; 
begin 

    for c := 0 to Grid.ColCount - 1 do 
    begin 
     ColWidthMax := ColWidthMin; 
     for R := 0 to Grid.RowCount - 1 do 
     begin 
      W := Grid.Canvas.TextWidth(Grid.Cells[C,R]); 
      if W > ColWidthMax then 
      ColWidthMax :=W; 
     end; 
     Grid.ColWidths[C] := ColWidthMax +5; 
    end; 


end;  
+0

Вы не используете 'ClientWidth'? –

+0

@DavidHeffernan Я использовал clientWidth, но он возвращает то же значение, что и gird.Width вернет – user28470

+0

В этом случае я не понимаю ваш вопрос –

ответ

2

Основная проблема, почему это пустое пространство для вас, даже когда у вас много колов, чтобы одновременно было видно, что в прокрутке StringGrid несколько отличается, поскольку вы привыкли к другим управления.

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

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

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

procedure TForm1.FormResize(Sender: TObject); 
var cwDefaultWidth: Integer; 
    VisibleCols: Integer; 
    ColWidth: Integer; 
begin 
    cwDefaultWidth := 64; 
    VisibleCols := StringGrid1.ClientWidth div cwDefaultWidth; 
    if VisibleCols >= StringGrid1.ColCount then 
    begin 
    ColWidth := Round(StringGrid1.ClientWidth/StringGrid1.ColCount-1); 
    end 
    else 
    begin 
    ColWidth := Round(StringGrid1.ClientWidth/VisibleCols-1);  
    end; 
    StringGrid1.DefaultColWidth := ColWidth; 
end; 

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

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

for I := StringGrid1.LeftCol to StringGrid1.RowCount-1 do 
begin 
    VisibleColsWidth := VisibleColsWidth + StringGrid1.ColWidths[I]; 
end; 

Затем вычитаем эту ширину от StringGrid1.ClientWidth, с которой вы получите ширину пустого пространства. Итак, вы увеличиваете размер последнего столбца для пустой пробела.

Я действительно надеюсь, что если мой ответ не предоставит вам фактическое решение, это поможет вам найти правильное решение.

+0

Я попробую ваше предложение завтра. У меня нет доступа к коду дома. Я использую первое решение, поэтому мои столбцы будут выглядеть форматированными, и на самом деле они выглядели бы красивее, если бы все они имели ту же ширину, что и я. Спасибо, что нашли время, чтобы ответить мне, я попробую ваше решение завтра как ssoon, как я могу. – user28470

+0

Всегда пустое место. Я пробовал оба метода. Я думаю, что это невозможно исправить. Во втором случае размер последнего столбца занимает пустое место, но после этого добавляется еще одно пустое пространство, поэтому я начинаю думать, что Delphi - это тролль ха-ха. В любом случае, я позволю ему с пустым пространством ха-ха. Спасибо за ваше отношение :) – user28470

+0

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

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