谁在设计时描绘了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的表单设计器中可见?