如何自动调整TStringGrid行的大小

时间:2011-08-13 21:33:35

标签: delphi

如何自动调整TStringGrid行(DefaultRowHeight)以匹配使用的字体高度? 我喜欢

  

Grid.DefaultRowHeight:= Grid.Canvas.TextHeight('X')+ 4;

但它不起作用。对于小字体,行的高度太大了。


更新

这似乎是程序逻辑的一个问题。如果我多次更改字体,则行的当前高度与先前字体更改事件的字体大小相匹配(落后一步)。

我使用此代码拦截字体的大小更改:

procedure TStrGrid.CMFontChanged(var Message: TMessage);
begin
  inherited; // let TControl react first
  DefaultRowHeight:= Canvas.TextHeight('ApApM')+ 4;
end;

它的行为就像程序:

begin
  DefaultRowHeight:= Canvas.TextHeight('ApApM')+ 4;
  inherited; 
end;

(首先它改变了高度,然后它实际上设置了正确的字体大小 - 因此高度落后一步)

2 个答案:

答案 0 :(得分:5)

它与此顺序无关:继承的CMFontChanged消息处理程序和DefaultRowHeight属性setter调用都无效。这是由于当前的字体设置尚未更新:

procedure TStrGrid.CMFontchanged(var Message: TMessage);
begin
  Canvas.Font := Font;
  DefaultRowHeight := Canvas.TextHeight('Ap') + GridLineWidth + 3;
end;

说明:

仅使标志窗口无效以在将来某处重新绘制窗口(网格)。在获得文本高度后肯定会发生这种情况。作为替代方案,您可以在请求新文本高度之前调用Repaint,但这会导致双重重绘,因此设置Canvas.Font

答案 1 :(得分:2)

当涉及到事件排序相关问题时,最简单,最快捷的解决方案通常是通过PostMessage(此处来自您的CMFontChanged处理程序)向自己发送消息,并在收到发布的消息时进行更新。

这样做的好处是它不会干扰网格更新其内部状态所需要做的任何事情。