delphi - 如何自动调整 TStringGrid 行的大小

标签 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;

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

最佳答案

它与此顺序无关:继承的 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/

相关文章:

delphi - 枚举(带有自定义值)到字符串/文本

delphi - 如何将接口(interface)对象传递给 Pascal Script 函数调用?

forms - 简单的代码和错误发生在表单关闭

unit-testing - 我可以将一组传递给 DUnitX 中的测试用例吗?

delphi - FMX Delphi 10.2 在执行任务时显示表单或请等待面板

XMLTimeToDateTime 忽略毫秒

android - firemonkey - 无法为支持 arm 7 rev5 neon 的 android 编译(异常类非法指令 (4))

delphi - 为什么TEdit只显示长度等于或小于37440个字符的文本?

delphi - 不会触发防病毒误报的软件保护/代码混淆

delphi - 如何更改 Delphi 中的事件构建配置?