标签: ttimer

谁在设计时描绘了TTimer?

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

ide delphi components ttimer

6
推荐指数
1
解决办法
401
查看次数

我是否需要从TTimer事件中调用Synchronize?

当我从a访问全局变量或VCL时TTimer,是否需要使用Synchronize?我使用相同的变量和对象TThread,我已经使用同步.

delphi synchronization ttimer

2
推荐指数
1
解决办法
1569
查看次数

TTimer实际上如何在内部运作?

间隔设置为1秒的TTimer每1秒发送一条消息.此消息在应用程序的消息循环中处理,这会导致触发OnTimer事件.
如果应用程序繁忙且没有时间处理消息循环,则会跳过OnTimer事件.

我知道TTimer使用内部SetTimer.

我的问题是:

  1. TTimer是否使用内部/单独的线程(通过SetTimer)?
  2. 为什么如果模态MessageDlg"阻塞"表单,那么持有计时器(及其OnTimer偶数)的表单仍可以执行操作?(见下面的代码)
  3. 文件称SetTimer要求Win2000最低限度.如何在Win98中实现TTimer?

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)

windows delphi winapi ttimer rad-studio

0
推荐指数
1
解决办法
237
查看次数

Delphi TTimer在Win 10中提供了不寻常的结果

我有一个应用程序,允许我的用户打开和关闭计时器,以跟踪他们在某项任务上花费的时间.计时器运行一个时钟,用于向用户显示已用时间,就像秒表一样.

下面的代码已经按照我的想法工作了几年了.但是,当应用程序在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)

delphi ttimer windows-10 delphi-10.3-rio

-2
推荐指数
1
解决办法
116
查看次数