1

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

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

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

4

1 回答 1

4

您的控件不会自行绘制,因为您禁用了绘制。BeginUpdate在构造函数中调用,并且在调用方法之前不会调用EndUpdateLoaded。但Loaded仅在从持久状态加载控件时调用。通常,我们认为这是从 DFM 文件加载控件时的情况,但 IDE 使用相同的技术来允许将控件放在剪贴板上。

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

要解决此问题,首先要摆脱您的构造函数中BeginUpdate调用。相反,要检查您的控件是否仍在构建过程中,请检查csCreating in ControlState.

你也可以摆脱你的stsLoading状态。Delphi 已经为您提供了csLoading一些ComponentState. 此外,您的使用stsLoading是错误的,因为您在构造函数中设置了它,就像您对BeginUpdate.

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

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

于 2013-01-04T16:38:44.830 回答