我有一个可以调整大小的网格。而且我现在正忙着填充网格中的列周围的空白区域。我试图在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;
答案 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中减去此宽度,使用该宽度获得空白的宽度。所以最后你增加了空格宽度的最后一列的大小。
我真的希望如果我的回答没有为您提供实际的解决方案,它将会引导您找到正确的解决方案。