2021年3月18日木曜日

 TTimer Free Pascal Lazarus


Lazarusメニューの[ファイル]->[新規...]->[プロジェクト]->[アプリケーション]を選択して

新しいアプリケーションプロジェクトを開始します。

※この記事内のリンクでダウンロードしたサンプルアプリをロードするには[ファイル]->[開く]を選んで、ダウンロードして解凍したディレクトリ内にあるproject1.lprを選択します。

コンパイルして起動するには、lazarus左上の▶︎を押すだけです。

 

 

フォームの画面はこんな感じです。

 

細かいForm Propertyやその他については、下の方で、このプログラムのソースをダウンロード

できる様にしておきますので、そちらを開いて確認してください。

 

いろいろ解説を書いていますが、最初は何を言っているのか、

この行が何をしているのか、何のために必要なのかわからないと思います。

 

それは、極々普通ですので、諦めないでください。

しばらくこのソースの意味が解らなくても全然問題ないです。

 

フォームのデザインを変えたり、時刻のフォントを変更したり

はじめは意味が分からなくとも自分の好みに改造してみてください。

勿論、機能もです。

そうしているうちに、そんな簡単なことかと思うほど理解できるようになります。

前回でも述べましたが理解するより、とにかくがむしゃらに沢山の色々なプログラムにチャレンジしてください。

いつか必ず理解して、プログラムそのものを掌握する事ができるようになります。

集中力が全てです。本当にこれがやりたいのなら、何時間でも集中してやりましょう。

努力など全く必要ありません。

楽しんでやりましょうね。ww

 

以下はプログラム内容の説明です。

10分くらいで、適当に作成したので、間違っていたらごめんなさい。

 

 

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    BtnStart: TButton;
    BtnStop: TButton;
    BtnReset: TButton;
    LabelStopWMilSec: TLabel;
    LabelClock: TLabel;
    Label2: TLabel;
    LabalStopW: TLabel;
    Label4: TLabel;
    ClockTimer: TTimer;
    StopWTimer: TTimer;
    procedure BtnResetClick(Sender: TObject);
    procedure BtnStartClick(Sender: TObject);
    procedure BtnStopClick(Sender: TObject);
    procedure ClockTimerTimer(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure StopWTimerTimer(Sender: TObject);
  private

  public
    gTimerStartTime:TDateTime;

   //↑public〜endまでのエリアに変数を書くと、この変数がこのプログラム全体で参照できる様になります。
  end;

var
  Form1: TForm1;

implementation
   uses DateUtils;

   //↑時間等を扱うので、dateUtilsをインクルードします。
{$R *.lfm}

{ TForm1 }

procedure TForm1.FormShow(Sender: TObject);
begin
  ClockTimer.Enabled:=True;

  //↑フォームが表示された時のイベントで、時刻を表示するタイマーを起動します。
end;



procedure TForm1.ClockTimerTimer(Sender: TObject);
var
  clocktimerstr:string[8];

  //↑現在の時刻を保存する為の変数をローカルで宣言します。
begin
  clocktimerstr:=TimeToStr(Now);

  //↑処理がここに来た時点で、現在時刻を保存します。

  //なぜ保存するかと言うと、Nowを何度も発行してPCに負荷をかけない為です。
  if(clocktimerstr<>LabelClock.Caption) then //表示されている時刻と現在時刻が違った時のみ書き直します。
  begin                                                          //こうしないと、TimerのInterval毎に書き直される事になり、CPUに負荷がかかります。
    LabelClock.Caption:=clocktimerstr;
  end;
end;

procedure TForm1.BtnStartClick(Sender: TObject);
begin
  gTimerStartTime:=Now;        //タイマー[Start]ボタンが押された時刻を記録します。
  StopWTimer.Enabled:=True;  //タイマーを起動します。
end;



procedure TForm1.BtnStopClick(Sender: TObject);
begin
  if(StopWTimer.Enabled) then  //[Timerが動いている時のみ、以下の命令を実行させます
  begin
    StopWTimer.Enabled:=False; //Timerを停止させる
    StopWTimerTimer(Nil);         //時刻表示を更新
  end;

end;

procedure TForm1.BtnResetClick(Sender: TObject);
begin
  gTimerStartTime:=Now;  //リセットするので、スタートした時刻を現在に更新
  StopWTimerTimer(Nil);   //時刻表示を更新
end;

procedure TForm1.StopWTimerTimer(Sender: TObject);
var
  nowtime:TDateTime;  //TimerなのになぜTDateTime型を利用しているかというと、例えば23:59:59〜次の日の0:00:01を計測時に
  pasttime:TDateTime; //なったときに-23:59:58ではなく00:00:02と計算させるために日付も必要なのです。
  timerstr:string[8];     //単純にstringだけでも良いのですが、メモリーの資源を節約するのと処理速度を高めるために[8]というサイズを与えます。

                                //なぜ[8]かというと、"00:00:00"は8文字だからです。
begin
  nowtime:=Now;       //何度もNow関数を呼ばなくてもいいように一旦変数に記録します。
  pasttime:= gTimerStartTime-nowtime;  //pasttime(経過時間)はStartボタンが押されてから、現在まで。
  LabelStopWMilSec.Caption:='.'+IntToStr(MilliSecondOf(pasttime) div 100); //ミリセカンド用のlabelのみ他と分けている理由は

                //Timerのインターバル(100ms)毎にいちいちTimer時刻全体を書き直すような事がないようにするためです。
  timerstr:=TimeToStr(pasttime);
  if(timerstr<>LabalStopW.Caption) then  //いちいち書き直さないように、秒数が違った時のみ書き直します。
  begin
    LabalStopW.Caption:=timerstr;
  end;
end;
end.

 

 

 

このソースプログラムのダウンロード

ttps://drive.google.com/file/d/16N-XPxBPBxX8iDSX1UpfiaMKmh55pig6/view?usp=sharing

0 件のコメント:

コメントを投稿