小编mik*_*ika的帖子

谁在设计时描绘了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;
Run Code Online (Sandbox Code Playgroud)

但我很惊讶地看到没有这样的代码!

TTimer组件具有以下私有字段:FWindowHandle: HWND;但仅用于从Windows本身接收WM_Timer消息.即使在设计时,它也不会用于绘制任何东西.也没有画布.

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

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

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

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

但事实并非如此.我写了一些代码来完成这个:从磁盘加载"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;
Run Code Online (Sandbox Code Playgroud)

这只是第一个让我加载并呈现一个特定表单而没有错误的例子.但是,只要其他一些表单包含,例如:TSpeedbutton,则需要编辑上述过程以添加此行:

  RegisterClass(TSpeedbutton);
Run Code Online (Sandbox Code Playgroud)

跳过那个,你就会有一个"未找到类Txxx" - 例外.

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

那么我需要做什么(否则)才能使TTimer在Delphi IDE的表单设计器中可见?

ide delphi components ttimer

6
推荐指数
1
解决办法
401
查看次数

标签 统计

components ×1

delphi ×1

ide ×1

ttimer ×1