Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 在哪里初始化需要有效画布的代码?_Delphi - Fatal编程技术网

Delphi 在哪里初始化需要有效画布的代码?

Delphi 在哪里初始化需要有效画布的代码?,delphi,Delphi,我有一个从TStringGrid派生的控件。 在创建过程中,我想访问Cancas进行一次性初始化。 我不能在Create中完成,因为画布还没有准备好。我也无法在CreateWnd中执行此操作,因为CreateWnd被多次调用 有一些便宜的技巧(使用一个布尔变量)只初始化该变量一次,但我想知道如何用“好方法”来初始化它。 因此,由于Create和CreateWnd不是一个好地方,在创建控件的过程中,我只能初始化var一次。简单的答案是不应该缓存该值。根据需要计算价值 缓存是您应该避免做的事情。缓存

我有一个从TStringGrid派生的控件。 在创建过程中,我想访问Cancas进行一次性初始化。 我不能在Create中完成,因为画布还没有准备好。我也无法在CreateWnd中执行此操作,因为CreateWnd被多次调用

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

简单的答案是不应该缓存该值。根据需要计算价值

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

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


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

您不能在第一次使用它之前检查它吗?通常您不希望只执行一次,例如,控件的字体可以更改。@Sertac,很好的一点!消息处理程序的位置是否正确?这条消息不是也在控件初始化时发送的吗?@TLama-嗯,我看不出有什么理由不在绘制时调用它。@Sertac,可能是过早优化?