如何自动调整 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;
(就像首先它改变高度,然后它实际上设置正确的字体大小 - 因此高度落后一步)
最佳答案
它与此顺序无关:继承的 CMFontChanged
消息处理程序和 DefaultRowHeight
属性 setter 都调用 invalidate。这是由于当前字体设置尚未更新所致:
procedure TStrGrid.CMFontchanged(var Message: TMessage);
begin
Canvas.Font := Font;
DefaultRowHeight := Canvas.TextHeight('Ap') + GridLineWidth + 3;
end;
说明:
仅使标记窗口无效,以便将来在某个地方重新绘制窗口(网格)。在获取文本高度后肯定会发生这种情况。作为替代方案,您可以在请求新文本高度之前调用 Repaint
,但这会导致双重重绘,因此需要设置 Canvas.Font
。
关于delphi - 如何自动调整 TStringGrid 行的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7053419/