Delphi 谁在设计时绘制TTimer?

Delphi 谁在设计时绘制TTimer?,delphi,ide,components,ttimer,Delphi,Ide,Components,Ttimer,谁在设计时绘制TTimer 使用DelphiIDE的表单设计器时,在表单上放置TTimer时,组件在设计时可见(当然,在运行时不可见) TTimer类是在单元ExtCtrls中定义的,所以我当然阅读了该单元中的TTimer源代码 我希望看到这样的事情: procedure TTimer.Paint; begin if csDesigning in ComponentState then with Canvas do begin // Paint the desig

谁在设计时绘制TTimer

使用DelphiIDE的表单设计器时,在表单上放置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;
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;
但是我很惊讶没有看到这样的代码

TTimer组件有这个私有字段:
FWindowHandle:HWND,但它仅用于从windows本身接收WM_定时器消息。它不用于绘制任何东西,即使在设计时也是如此。也没有画布

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

所以问题是:在DelphiIDE本身的表单设计器中,在表单上绘制TTimer的设计时外观的代码和位置是什么

现在,如果有人想知道我为什么问这个问题,这里有一些信息:

在StackOverflow的其他地方,有人问是否可以在运行时加载.dfm文件。有人回答:

但事实并非如此。我已经编写了一些代码来实现这一点:从磁盘加载“someform.dfm”,并在运行时创建这样的表单。这是可能的,但麻烦的是,您需要编写如下代码:

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;
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的表单设计器中相同的方式可见呢?

非可视组件没有
绘制方法,因此无法绘制它们自己

谁在设计时绘制TTimer

IDE绘制非可视组件的表示

那么,我还需要做什么才能使TTimer以与DelphiIDE表单设计器中相同的方式可见呢


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

直接
t组件
子体(非可视组件)不支持绘图。Delphi IDE的表单设计器负责处理非可视组件(包括它们的绘图),如果您想要类似的东西,请制作一个可视组件,该组件将使用设计时图标绘制一个类似的框。请注意,绘图仅从继承树上的
t控件开始。尽管您进行了解释,我看不出在运行时加载DFM时绘制TTimer组件的原因。“您必须在代码中绘制它。”这一点非常模糊,听起来有点像您可以创建一个子类并重写
paint
方法(OP预期会找到)。试图从非可视组件创建可视控件(与表单设计器一样,具有焦点和拖放支持)需要的不仅仅是这些。我能想到的最简单的方法是制作一些
TNonVisual
visualcontrol,它将用图标绘制框,并通过一些链接属性与组件实例绑定。