我对TChromeTabs有一个奇怪的问题。我知道它必须是简单的,但我无法弄清楚需要做些什么来解决它。
当我最初将TChromeTabs控件放在表单上时,它是完全透明的。如果我剪切控件然后将其粘贴回表单,内容将正确显示。如果我关闭,则会显示内容,然后重新打开表单。
由于我不知道为什么会这样,我真的不能给你任何代码示例。但是,您可以在此处下载源代码:http://code.google.com/p/delphi-chrome-tabs/downloads/list。
答案 0 :(得分:4)
您的控件不会自行绘制,因为您禁用绘画。 You call BeginUpdate
in the constructor和you don't call EndUpdate
until the Loaded
method被调用。但Loaded
仅在从持久状态加载控件时调用。通常,我们认为这是从DFM文件加载控件时,但IDE使用相同的技术来允许将控件放在剪贴板上。
您之前没有注意到这一点,因为显然您只是通过打开预先制作的演示项目来测试您的控件。演示项目在其DFM文件中有一个控件,因此您使用的唯一代码路径是DFM案例。您不会直接调用构造函数的路径 - 首次在窗体上放置控件时,或者在代码中“动态”创建控件时。
要解决此问题,请先摆脱the BeginUpdate
call in your constructor。相反,要检查您的控件是否仍在构建过程中,请检查csCreating in ControlState
。
你也可以摆脱你的stsLoading
州。 Delphi已经为您提供csLoading
位ComponentState
。此外,自you set it in the constructor以来stsLoading
使用BeginUpdate
是错误的,就像使用Loaded
一样。
您可能希望将某些代码移入AfterConstruction
方法,而不是依赖于Loaded
被调用。将代码放在那里,需要在创建组件后运行,但这与从DFM(或其他持久性源)加载属性无关。我不确定我在你的CreateWnd
方法中看到任何真正属于那里。几乎所有它都应该能够在构造函数中出现。
您还应该了解{{1}}方法。当控件的窗口句柄被分配时调用它。那是你应该开始允许油漆操作发生的地方。如果没有窗口句柄,则无需绘制任何内容。