gpt4 book ai didi

delphi - 谁在设计时绘制 TTimer?

转载 作者:行者123 更新时间:2023-12-03 15:00:55 26 4
gpt4 key购买 nike

谁在设计时绘制 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com