【问题标题】:Custom TControl doesn't paint at design time until cut and pasted自定义 TControl 在剪切和粘贴之前不会在设计时绘制
【发布时间】:2013-01-04 11:11:04
【问题描述】:

我对 TChromeTabs 有一个奇怪的问题。我知道它一定很简单,但我不知道需要做些什么来解决它。

当我最初将 TChromeTabs 控件放在窗体上时,它是完全透明的。如果我剪切控件,然后将其粘贴回表单,则内容将正确显示。如果我关闭,然后重新打开表单,内容也会出现。

由于我不知道为什么会发生这种情况,因此我无法真正给您任何代码示例。不过,您可以在这里下载源代码:http://code.google.com/p/delphi-chrome-tabs/downloads/list

【问题讨论】:

  • 这是你的控件,对吧?它并不总是这样,不是吗?如果不是,那么您引入了一些导致此问题的更改。检查修订历史以查找您在哪里引入了错误。您可以使用svn-bisect 来帮助缩小搜索范围。
  • @Rob - 是的,这是我编写的控件。不幸的是,我不确定它是否一直都是这样。一旦初始控件出现在演示表单上,它们就一直呆在那里。当然,我可以回顾所有的修订,看看其中一个是否消除了奇怪的行为,但我希望有人能给我一个线索,说明可能是什么原因造成的。

标签: delphi controls custom-controls delphi-xe2


【解决方案1】:

您的控件不会自行绘制,因为您禁用了绘制。 You call BeginUpdate in the constructoryou don't call EndUpdate until the Loaded method 被调用。但是Loaded 仅在从持久状态加载控件时调用。通常,我们认为这是从 DFM 文件加载控件时的情况,但 IDE 使用相同的技术来允许将控件放在剪贴板上。

您以前没有注意到这一点,因为显然您只是通过打开一个预制的演示项目来测试您的控件。演示项目的 DFM 文件中有一个控件,因此您使用的唯一代码路径是 DFM 案例。您不会使用直接调用构造函数的路径——当控件第一次放在窗体上时,或者当控件在代码中“动态”创建时。

要解决此问题,首先要删除 the BeginUpdate call in your constructor。相反,要检查您的控件是否仍在构建过程中,请检查csCreating in ControlState

您也可以摆脱stsLoading 状态。 Delphi 已经通过ComponentStatecsLoading 位为您提供了这一点。此外,你使用stsLoading 是错误的,因为you set it in the constructor,就像你使用BeginUpdate 一样。

您可能希望将某些代码移动到AfterConstruction 方法中,而不是依赖于调用Loaded。将需要在创建组件后运行但与从 DFM(或其他持久性源)加载属性无关的代码放在那里。我不确定我是否在您的Loaded 方法中看到了真正属于那里的任何东西。几乎所有这些都应该能够在构造函数中发生。

您还应该了解CreateWnd 方法。它在您的控件的窗口句柄被分配时调用。这就是你应该开始允许绘制操作发生的地方。当你没有窗把手时,你就没有什么可画的了。

【讨论】:

  • 非常感谢。我真的很感谢你花时间来帮助我。我认为主要问题是我在调用 Loaded 时误解了。请随时查看我的代码 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
相关资源
最近更新 更多