谁在设计时画了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组件具有此私有字段:FWindowHandle: HWND;
,但仅用于从Windows本身接收WM_Timer消息。即使在设计时,它也不会用于绘制任何东西。也没有画布。
在阅读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的表单设计器中可见的方式可见?
答案 0 :(得分:5)
非可视组件没有Paint
方法,因此无法自行绘制。
谁在设计时画了TTimer?
IDE绘制非可视组件的表示。
那么我需要做什么(其他)才能使TTimer在Delphi IDE的表单设计器中可见的方式可见?
您必须在代码中绘制它。非可视组件不会自行绘制。