【问题标题】:Where to initialize code that needs a valid Canvas?在哪里初始化需要有效 Canvas 的代码?
【发布时间】:2014-02-14 16:53:02
【问题描述】:

我有一个从 TStringGrid 派生的控件。 在创建过程中,我想访问 Cancas 进行一次初始化。 我无法在 Create 中执行此操作,因为 Canvas 尚未准备好。我也不能在 CreateWnd 中这样做,因为 CreateWnd 它被多次调用。

有一些便宜的技巧(使用布尔变量)来初始化该 var 一次,但我想知道如何以“好方法”来做。 因此,由于 Create 和 CreateWnd 不是一个好地方,在创建控件期间我只能初始化 var 一次。

【问题讨论】:

  • 第一次使用前不能检查一下吗?
  • 一般你不想只做一次,比如控件的字体可以改变。
  • @Sertac,好点子! CM_FONTCHANGED 消息处理程序不是正确的地方吗?该消息不是在控件初始化时发送的吗?
  • @TLama - 好吧,我看不出有什么理由在绘画时不应该调用它。
  • @Sertac,过早优化,也许?

标签: delphi


【解决方案1】:

简单的答案是你不应该缓存这个值。在需要时按需计算价值。

缓存是您应该避免做的事情。缓存的问题是您必须确保您永远不会使用过时的值。您需要对可能导致值更改的任何事情做出响应并更新您的缓存值。

更新逻辑很容易出错。即使你做对了,你也只是给你的代码增加了一大堆复杂性。如果可能的话,你总是想避免这种情况。在物理字体度量的情况下,与您使用它们的目的相比,它们的获取成本很低。您将始终使用字体度量作为绘画代码的一部分。当然,这比获取字体度量要贵很多数量级。

因此,您可以通过不缓存的非常简单的权宜之计解决所有问题,并在需要时获取字体度量。一定要使用 getter 方法将其包装在一个属性中,以使代码尽可能干净。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2015-06-27
    • 1970-01-01
    相关资源
    最近更新 更多