Delphi 谁在设计时绘制TTimer?
谁在设计时绘制TTimer 使用DelphiIDE的表单设计器时,在表单上放置TTimer时,组件在设计时可见(当然,在运行时不可见) TTimer类是在单元ExtCtrls中定义的,所以我当然阅读了该单元中的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
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,它将用图标绘制框,并通过一些链接属性与组件实例绑定。