delphi - 谁在设计时绘制 TTimer?

标签 delphi ide components ttimer

谁在设计时绘制 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 组件有这个私有(private)字段:FWindowHandle: HWND;,但它仅用于从 Windows 本身接收 WM_Timer 消息。即使在设计时,它也不用于绘制任何东西。也没有 Canvas 。

在阅读 TTimer 源代码时,我找不到任何与设计时绘画相关的内容。

所以问题是:什么代码以及在哪里负责在 Delphi IDE 本身的表单设计器中的表单上绘制 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”异常。

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

那么我还需要做什么才能使 TTimer 像在 Delphi IDE 的表单设计器中一样可见?

最佳答案

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

Who paints TTimer at design time?

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

So what (else) do I need to do to make the TTimer visible the same way it is visible in the Delphi IDE's form designer?

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

关于delphi - 谁在设计时绘制 TTimer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23174190/

相关文章:

algorithm - Delphi,评估公式字符串

德尔福 XE2 : How to use sets of integers with ordinal values > 255

delphi - 相当于Delphi 2010 dbExpress 中的TUpdateSQL?

netbeans - 如何在 netbeans 中打开文件/项目资源管理器的 2 个窗口?

visual-studio-code - 在 Visual Studio 代码中,如何隐藏文件选项卡下方的文件路径?

delphi - 使用 Simple MAPI TEmail 组件记录时出现死锁

java - 是否有用于识别过时/不一致的 JavaDoc 注释的工具?

joomla - 在 Joomla 2.5 中为 TinyMCE 添加自定义按钮

ionic-framework - 顶部和底部的 Ionic 2 标签

Delphi - 当表单的 ComponentCount 递减时如何中断