添加行时计算StringGrid高度

时间:2012-10-30 03:28:26

标签: delphi tstringgrid

鉴于我希望我的字符串网格具有相同的高度行...

我知道它将从5行开始,我在设计时就这样做了。

在运行时我可能想要添加一些额外的行(并且我的代码不会添加到父级底部之下;此时我依赖滚动条)。

似乎sg.height:= sg.height + sg.RowHeights [0];没有产生预期的结果 - 在最后一行之后有空洞的空白(我仍在尝试计算额外高度如何与行数相对应,但看起来它是一行的高度,无论多少行在网格中。)

还有什么我应该考虑的吗? (也许是GridLineWidth?)或者我可以在Object Inspector中错误地设置属性吗?我应该使用GridHeight,而不是Height吗?

注意:仅当stringgid与所有单元格一样宽并且出现滚动条时,才会出现此问题,从而绘制最后一列的一部分。如果我在字符串网格的右侧留下一个丑陋的空白sapce以使滚动条适合,则问题不会发生。

在添加多行后,有人能告诉我计算新网格高度的公式吗?或者我在做错事。


[更新] 3点的软糖因子对应margin属性

2 个答案:

答案 0 :(得分:1)

万一我以外的人都感兴趣,这就是我为了让它发挥作用所做的一切。

当找到一行时:

newHeight := stringGrid.Height + 
             stringGrid.RowHeights[Pred(stringGrid.Row)] + 
             stringGrid.GridLineWidth;  

if newHeight < maxheight then
   stringGrid.Height := newHeight;

stringGrid.RowCount := stringGrid.RowCount + 1;

或者,我可以保留它,直到我添加所有行然后

stringGrid.Height := ((stringGrid.RowHeights[1] + stringGrid.GridLineWidth) *              
                      (stringGrid.VisibleRowCount + stringGrid.FixedRows)) + 3;

答案 1 :(得分:1)

如果有任何价值,我会将您的试验和错误添加到您的研究中 TMS AdvStringGrid。这是TMS AdvStringGrid的图像。我认为它主要基于一个普通的字符串网格,有很多有用的扩展。为了更容易计算行数,我使用SnagIt放大了图像并使像素网格线可见。我在网格的顶行添加了一些红线。在此网格上,DefaultRowHeight设置为21.在红线之间,每个都有5个像素,因此要获得DefaultRowHeight的21个像素,您必须包含高度为1像素的stringgrid网格线。当我加载这个网格时,我使用这个代码:

with gridLimits do
    begin
      RowCount := 3;
      Cells[0, 0] := 'Maximum Amount';
      Cells[0, 1] := 'Maximum Base';
      Cells[0, 2] := 'Maximum Period';
      IntegralHeight := False;
      MyHeight := 0;
      for i := 0 to RowCount - 1 do
        inc(MyHeight, RowHeights[i]);
      Height := MyHeight + 5;
    end;
end;

我使用SnagIt捕获网格并让它捕获屏幕上的对象。它包括网格周围的1像素灰线。网格实际上似乎明显从蓝线开始,所以为了获得高度,我认为我需要添加DefaultRowHeight时间三加上顶部蓝线加上底部蓝线,但如果我这样做并点击在底行,网格向上滚动。如果我向高度添加3,它也会向上滚动。如果我向高度添加4,则不会滚动。我不知道为什么我把它设置为5并且我现在将它设置为4因为你可以看到底部有1个像素太多了。

可能应该添加顶部和底部灰线以获得网格的总高度,这就是为什么它是DefaultRowHeight时间3加上顶部和底部线以及另外两个包含SnagIt的灰色线条的原因