jpf*_*ius 12 delphi internationalization delphi-xe
我需要计算具有许多行的列的宽度(列AutoSize功能).使用Canvas.TextWidth太慢了.
当前解决方案:我当前的解决方案使用文本测量器类,该类为固定字母表构建一次查找表,然后通过累加从查找表中检索的字符宽度来非常快速地计算给定字符串的宽度.对于未包含在查找表中的字符,使用平均字符宽度(也计算一次).
问题:这适用于欧洲语言,但不适用于亚洲语言.
问题:解决这个问题的最佳方法是什么?如何在没有相对较慢的Canvas功能且不依赖于特定字母的情况下实现这样的AutoSize功能?
谢谢你的帮助.
您说您想获得列的最大文本宽度.你不能说,只拿4或5根最长的弦并获得它们的宽度吗?这样你就不必找到所有物品的宽度,可以节省很多时间.
或者您使用缓存查找字符串的粗略长度,然后通过获取找到的前4或5个项目的实际宽度来优化它.
我认为使用Canvas.TextWidth或GetTextExtentPoint32并不重要.在使用上述方法之一猜测最长/最宽的字符串后,只需使用其中一个来获得精确的宽度.
如果原始问题的海报认为它可以起作用,我没有理由认为它不会.他最清楚他所拥有的列中可以包含哪种字符串.
但这不是我的主要论点.他已经写过,他通过添加字符的预定个别宽度来执行初步文本宽度.这没有考虑任何字距调整.好吧,字距调整只能使字符串变窄,因此仅检查前4或5项的确切宽度仍然是有意义的.可能出现的最大问题是列可能是几个像素太宽,不再是.但它比在每个条目上使用TextWidth或GetTextExtentPoint32或类似函数要快得多(假设超过5个条目),这就是原始海报想要的.我建议那些不相信我的人干脆尝试一下.
至于使用纯字符串长度:即使这可能还不错.是的,'WWW'可能比'!!!!!'更广泛,但原版海报可能会知道他所拥有的最好的弦乐材料,如果可行的话.'!!!!!' 或者'WWW'不是人们期望的通常条目.特别是如果您考虑不仅检查了一个单独的字符串,而且检查了最长的4或5个字符串(或者任何数字都是最佳的).最宽的字符串不可能不在其中.但原始海报可以判断这是可行的还是可行的.他似乎认为是.
所以停止downvoting并为自己尝试.