在delphi stringgrid中填充空白区域

时间:2014-09-30 09:31:44

标签: delphi resize tstringgrid

我有一个可以调整大小的网格。而且我现在正忙着填充网格中的列周围的空白区域。我试图在FormResize上实现这一点。

首先,我计算列宽的总和,然后将其与字符串网格宽度进行比较。如果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;

这个实际上不起作用导致sgFilePReview.Width是我的网格的宽度。而且我不知道如何获得网格内整个空间的宽度,就像每个列+空白区域一样。如何获得网格的实际宽度?原因sgFilePreview.Width返回网格的宽度,但从网格外部看。

谢谢!

修改

Space

添加新列

          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;

如果世界大于单元格的宽度,则自动调整列的大小以适应单词

    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;    

1 个答案:

答案 0 :(得分:2)

即使你需要很多cols以便同时可以看到所有这些空格,这个空白区域的主要问题是,在StringGrid中滚动的工作方式有点不同,就像你习惯的那样其他控件。

在StringGrid中滚动时,滚动位置始终与TopLeft可见单元格的位置对齐。因此,如果可见cols的组合宽度与ClientWidth不同,这意味着您将在右侧具有部分可见的col,或者在向右滚动时具有空白空间。

现在,避免这种情况的一种可行方法是调整列的大小,使它们始终适合客户端宽度(没有部分可见的列)。但问题是,如果每列的宽度不同,这实际上是不可能的。

如果您可以忍受所有列具有相同宽度的事实,则可以使用下面的代码,该代码在大多数情况下都有效。它并不完美,因为你只能将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;

但是如果你使用变量列,那么你唯一可以做的就是调整最后一列的大小,使其宽度填满其他会发生的空白空间。

为了做到这一点,你首先要检查你是否完全向右滚动。然后你必须总结当前看到的列的宽度。你可以使用:

来做到这一点
for I := StringGrid1.LeftCol to StringGrid1.RowCount-1 do
begin
  VisibleColsWidth := VisibleColsWidth + StringGrid1.ColWidths[I];
end;

然后从StringGrid1.ClientWidth中减去此宽度,使用该宽度获得空白的宽度。所以最后你增加了空格宽度的最后一列的大小。

我真的希望如果我的回答没有为您提供实际的解决方案,它将会引导您找到正确的解决方案。