谁在设计时描绘了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的表单设计器中可见?
当我从a访问全局变量或VCL时TTimer,是否需要使用Synchronize?我使用相同的变量和对象TThread,我已经使用同步.
间隔设置为1秒的TTimer每1秒发送一条消息.此消息在应用程序的消息循环中处理,这会导致触发OnTimer事件.
如果应用程序繁忙且没有时间处理消息循环,则会跳过OnTimer事件.
我知道TTimer使用内部SetTimer.
我的问题是:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Caption = i;
i++;
MessageDlg(stuff); <----- we "block" application here but form's caption is still updated.
}
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,允许我的用户打开和关闭计时器,以跟踪他们在某项任务上花费的时间.计时器运行一个时钟,用于向用户显示已用时间,就像秒表一样.
下面的代码已经按照我的想法工作了几年了.但是,当应用程序在Win 10上运行时,"时间"速率有时会在会话期间加快2或3倍.如果用户重新启动应用程序,它可能以正常速度运行.
赢得10 Delphi 10.3
procedure TfmTimeCard.btnTimerClick(Sender: TObject);
begin
if btnTimer.Caption = 'Start &Timer' then
begin
btnTimer.Down := True;
btnTimer.Caption := 'Stop &Timer';
pnlTimer.Color := clPurple;
btnResume.Enabled := True;
btnAssign.Enabled := False;
Timer1.Enabled := true;
UpdateTimer.Enabled := True;
ElapsedTime := ElapsedTime;
//btnPostRecord.Enabled := False;
btnCancel.Enabled := False;
btnDeleteTimeCard.Enabled := False;
end
else
begin
btnTimer.Down := False;
btnTimer.Caption := 'Start &Timer';
pnlTimer.ParentColor := True;
btnResume.Enabled := False;
btnAssign.Enabled := True;
pnlTimer.Color := clMoneyGreen;
end;
end;
procedure TfmTimeCard.Timer1Timer(Sender: TObject);
begin
if …Run Code Online (Sandbox Code Playgroud)