首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >谁在设计时绘制TTimer?

谁在设计时绘制TTimer?
EN

Stack Overflow用户
提问于 2014-04-20 03:00:23
回答 1查看 414关注 0票数 6

谁在设计时绘制TTimer?

在使用Delphi IDE的窗体设计器时,当您将一个TTimer放到窗体上时,该组件在设计时是可见的(当然,在运行时是不可见的)。

TTimer类是在单元ExtCtrls中定义的,所以我当然阅读了该单元中的TTimer源代码。

我本以为会看到这样的情况:

代码语言:javascript
复制
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“,并在运行时创建这样的表单。这是可能的,但麻烦的是,您需要像这样编写代码:

代码语言:javascript
复制
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,则需要编辑上面的过程以添加以下行:

代码语言:javascript
复制
  RegisterClass(TSpeedbutton);

跳过这一步,你会得到一个“类Txxx未找到”的-exception。

另一个问题是,即使我在dfm中添加了查找要加载的TTimer组件的代码,并且在该TTimer实例的ComponentState中手动设置了csDesigning,TTimer仍然不可见。

那么,我需要做些什么才能使TTimer像在Delphi IDE的窗体设计器中一样可见呢?

EN

回答 1

Stack Overflow用户

发布于 2014-04-20 03:18:03

非可视化组件没有Paint方法,因此无法绘制自身。

在设计时绘制TTimer的

IDE绘制非可视化组件的表示形式。

那么我需要做些什么才能使TTimer像在Delphi IDE的窗体设计器中一样可见呢?

你必须在你的代码中绘制它。非可视组件不会自行绘制。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23174190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档