[Back to DATETIME SWAG index] [Back to Main SWAG index] [Original]

    {
    ±> Does anyone know how to make a clock (ie....working second to second)

    You can use the clock from the Gadgets unit included with BP7.
    }

    type
      PClockView = ^TClockView;
      TClockView = object(TView)
        Refresh: Byte;
        LastTime: DateTime;
        TimeStr: string[13];
        constructor Init(var Bounds: TRect);
        procedure Draw; virtual;
        function FormatTimeStr(M, S: Word): String; virtual;
        procedure Update; virtual;
      end;

    function LeadingZero(w: Word): String;
    var s: String;
    begin
      Str(w:0, s);
      LeadingZero := Copy('00', 1, 2 - Length(s)) + s;
    end;

    constructor TClockView.Init(var Bounds: TRect);
    begin
      inherited Init(Bounds);
      FillChar(LastTime, SizeOf(LastTime), #$FF);
      TimeStr := '';
      Refresh := 1;
    end;

    procedure TClockView.Draw;
    var
      B: TDrawBuffer;
      C: Byte;
    begin
      C := GetColor(2);
      MoveChar(B, ' ', C, Size.X);
      MoveStr(B, TimeStr, C);
      WriteLine(0, 0, Size.X, 1, B);
    end;

    procedure TClockView.Update;
    var
      h,m,s,hund: word;
      AmPmStr : STRING;
      vTmpStr : STRING;
    begin
      GetTime(h,m,s,hund);
      if Abs(s - LastTime.sec) >= Refresh then
      begin
        with LastTime do
          begin
            IF ((H >= 12) AND (H < 24)) THEN
              AmPmStr := ' p.m.'
            ELSE
              AmPmStr := ' a.m.';
            IF H > 12 THEN
              H := H - 12;
            IF H = 0 THEN
              H := 12;
          end;
        Str(H : 2, vTmpStr);
        TimeStr := vTmpStr + FormatTimeStr(m, s) + AmPmStr;
        DrawView;
      end;
    end;

    function TClockView.FormatTimeStr(M, S: Word): String;
    begin
      FormatTimeStr := ':'+ LeadingZero(m) +
        ':' + LeadingZero(s);
    end;

[Back to DATETIME SWAG index] [Back to Main SWAG index] [Original]