自定义TControl在剪切和粘贴之前不会在设计时绘制

时间:2013-01-04 11:11:05

标签: delphi controls custom-controls delphi-xe2

我对TChromeTabs有一个奇怪的问题。我知道它必须是简单的,但我无法弄清楚需要做些什么来解决它。

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

由于我不知道为什么会这样,我真的不能给你任何代码示例。但是,您可以在此处下载源代码:http://code.google.com/p/delphi-chrome-tabs/downloads/list

1 个答案:

答案 0 :(得分:4)

您的控件不会自行绘制,因为您禁用绘画。 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已经为您提供csLoadingComponentState。此外,自you set it in the constructor以来stsLoading使用BeginUpdate是错误的,就像使用Loaded一样。

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

您还应该了解{{1}}方法。当控件的窗口句柄被分配时调用它。那是你应该开始允许油漆操作发生的地方。如果没有窗口句柄,则无需绘制任何内容。