谁在设计时绘制TTimer?
在使用Delphi IDE的窗体设计器时,当您将一个TTimer放到窗体上时,该组件在设计时是可见的(当然,在运行时是不可见的)。
TTimer类是在单元ExtCtrls中定义的,所以我当然阅读了该单元中的TTimer源代码。
我本以为会看到这样的情况:
procedure TTimer.Paint;
begin
if csDesigning in ComponentState then
with Canvas do
begin
// Paint the design-time appearance of TTimer here:
// ... code ...
end else begin end; // no painting at runtime.
end;但是我很惊讶没有看到这样的代码!
TTimer组件有一个私有字段:FWindowHandle: HWND;,但它只用于从windows本身接收WM_Timer消息。它不用于绘制任何东西,即使在设计时也是如此。也没有画布。
在阅读TTimer源代码时,我找不到任何与设计时绘制相关的内容。
因此问题是:在Delphi IDE本身的窗体设计器中,什么代码负责在窗体上绘制TTimer的设计时外观,以及在何处绘制TTimer的设计时外观。
现在,如果有人想知道我为什么问这个问题,这里有一些关于这个问题的信息:
在StackOverflow的其他地方,有人问是否可以在运行时加载.dfm文件。有人回答说:"No, it is not possible"。
但事实并非如此。为此,我编写了一些代码:从磁盘加载"someform.dfm“,并在运行时创建这样的表单。这是可能的,但麻烦的是,您需要像这样编写代码:
procedure RegisterNecessaryClasses;
begin
RegisterClass(TfrmDynaForm);
RegisterClass(TPanel);
RegisterClass(TMemo);
RegisterClass(TTimer);
RegisterClass(TListBox);
RegisterClass(TSplitter);
RegisterClass(TEdit);
RegisterClass(TCheckBox);
RegisterClass(TButton);
RegisterClass(TLabel);
RegisterClass(TRadioGroup);
end;这只是第一个示例,它让我能够正确地加载和显示一个特定的表单。但是,一旦某个其他表单包含,例如: TSpeedbutton,则需要编辑上面的过程以添加以下行:
RegisterClass(TSpeedbutton);跳过这一步,你会得到一个“类Txxx未找到”的-exception。
另一个问题是,即使我在dfm中添加了查找要加载的TTimer组件的代码,并且在该TTimer实例的ComponentState中手动设置了csDesigning,TTimer仍然不可见。
那么,我需要做些什么才能使TTimer像在Delphi IDE的窗体设计器中一样可见呢?
发布于 2014-04-20 03:18:03
非可视化组件没有Paint方法,因此无法绘制自身。
在设计时绘制TTimer的
?
IDE绘制非可视化组件的表示形式。
那么我需要做些什么才能使TTimer像在Delphi IDE的窗体设计器中一样可见呢?
你必须在你的代码中绘制它。非可视组件不会自行绘制。
https://stackoverflow.com/questions/23174190
复制相似问题