【问题标题】:Filling blank space in delphi stringgrid填充delphi stringgrid中的空白
【发布时间】:2014-09-30 09:31:43
【问题描述】:

我有一个可以调整大小的网格。我现在正在努力填充网格中列周围的空白区域。我正在尝试在 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 返回网格的宽度,但从网格外部看到。

谢谢!

编辑

添加新列

          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;    

【问题讨论】:

  • 你不使用ClientWidth吗?
  • @DavidHeffernan 我使用了 clientWidth 但它返回的值与 gird.Width 将返回的值相同
  • 那我不明白你的问题
  • @DavidHeffernan 我的网格末尾有一个空白区域。在所有列之后。为了摆脱那个空间,我想把这个空间平等地添加到所有的列上,这样就没有更多的空间了。我不想看到那个空间,这就是我尝试这样做的原因
  • 我想你也需要考虑边界线和列之间的线。我将从总宽度开始。然后从该总数中删除所有边框/分隔线,从而使宽度可用。然后遍历将宽度设置为 WidthAvailable div ColCountRemaining 的每一列。在执行每一列时,将 WidthAvailable 递减您刚刚使用的宽度,并将 ColCountRemaining 递减 1。

标签: delphi resize tstringgrid


【解决方案1】:

为什么这些空白仍然出现在您身上的主要问题是,即使您有太多列,以便同时看到所有这些,是因为在 StringGrid 中滚动的工作方式与您习惯的有点不同。其他控件。

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

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

如果您可以接受所有列都具有相同宽度的事实,您可以使用下面的代码,该代码在大多数情况下都有效。它并不完美,因为您只能将列宽设置为整数值,有时您需要更高的精度。

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 中减去这个宽度,你就得到了空白空间的宽度。所以最后你增加了最后一列的大小作为空白宽度。

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

【讨论】:

  • 明天我会试试你的提议,因为我在家没有访问代码的权限。我将使用第一个解决方案,所以我的列看起来会格式化,如果它们都具有我想的相同宽度,它实际上看起来会更漂亮。感谢您花时间回答我,我明天会尽快尝试您的解决方案。
  • 总是有空格。这两种方法我都试过了。我认为它无法修复。在第二个中,最后一列的大小占用了空格,但在此之后添加了另一个空格,所以我开始认为 Delphi 是一个巨魔哈哈。无论如何,我会让它与空白空间哈哈。感谢您的关心:)
  • 很可能数学不能正确工作,因此使 cols 宽度有点大。如果是第二种方法,您可以尝试手动将最后一列的新大小减小几个像素并查看结果。
  • 是的,我试过手动输入我的尺寸,但它总是在最后添加一个空格。无论如何,我会就这样离开它。没那么重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多