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

    Delphi Timer Component
    Created by : Adam Chace, Apogee Information Systems, Inc.

    Description :
      This component enhances the Delphi timer component by allowing easier control over the interval function. Instead of having to provide the user with three separate edit boxes to control hours, minutes and seconds, developers can drop this visual component on their form. The user is provided with spin buttons that can be used by mouse or keyboard to set the integer. The developer can then call the "GetTotalSec" and get the total number of seconds represented by the time the user entered. No time conversion is necessary.

    Using the Component :
      The hours, minutes, or seconds can be set by clicking the spin button
    to increment/decrement, or by tabbing into the individual box and pressing
    either the up or down arrow key.  Values can be manually entered as well
    by highlighting the proper box and typing the desired value. The developer can then call the "GetTotalSec" and get the total number of seconds represented in this visual component.  You can then just set the timer's "interval" to this value, as the interval property for a ttimer needs to be in seconds.  The component performs conversion for the number of hours, minutes and seconds into seconds.

    It could also be used to allow users to easily enter any time, like the time a specific event occurred, the time a record was entered etc.  Simply drop this component onto the form and grab the data the user enters in it by accessing the hour, minute and second properties or by calling the GetTime method which returns the time the user entered as a TDateTime type.

    Key Properties :
        		Hour
                    ----
                      Integer value of the hour represented in the TaisHMSBox.
                    Minute
                    ------
                      Integer value of the minute represented in the TaisHMSBox.
                    Second
                    ------
                      Integer value of the second represented in the TaisHMSBox.

          Methods
          =======
                    GetHour: Integer;
                    ----------------
                      Returns the integer value of the hour(s) selected.

                    GetMinute: Integer;
                    -------------------
                      Returns the integer value of the minute(s) selected.

                    GetSecond: Integer;
                    ------------------
                      Returns the integer value of the second(s) selected.

                    GetTime: TDateTime;
                    -------------------
                      Returns the time chosen as a TDateTime;

                    GetTotalSec: longint;
                    ---------------------
                      Especially useful for setting timers, converts the
                      time to seconds and returns this value as a longint.

    Any feedback, comments, etc. are welcome.  Please reply to achace@apogeeis.com

    About Apogee Information Systems, Inc.

    Apogee is an elite consulting and development firm specializing exclusively in Delphi, IntraBuilder and Paradox.  We assist clients by creating scalable desktop, Client/Server and data-driven Web applications that meet critical business needs.  For more information on our services, contact us at:

    Phone: 	(508) 481-1400
    FAX:	(508) 481-3343
    Email:	dpainter@apogeeis.com

    Apogee Information Systems, Inc.
    5 Mount Royal Avenue
    Marlboro, MA 01752

    Visit Apogee Online at http://www.apogeeis.com

    ________________________ Copy From Here ________________________________
    {Copyright (c) 1996 Apogee Information Systems, Inc.}

    unit Aishms;

    interface

    uses
      SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
      Forms, Dialogs, ExtCtrls, StdCtrls, Spin;

    type
      TaisHMSBox = class(TCustomPanel)
      private
        FHourEdit: TEdit;
        FMinuteEdit: TEdit;
        FSecondEdit: TEdit;
        FSpin: TSpinButton;
        FTheOne: Char;
        function CreateEdit : TEdit;
        function CreateSpin: TSpinButton;
        function CreateLabel : TLabel;
        procedure SpinUp(Sender: TObject);
        procedure SpinDown(Sender: TObject);
        procedure EditOnEnter(Sender: TObject);
        procedure EditOnExit(Sender: TObject);
        procedure EditOnKeyDown(Sender: TOBject; var Key: Word; Shift: TShiftState);
        procedure IncHour;
        procedure IncMinute;
        procedure IncSecond;
        procedure DecSecond;
        procedure DecHour;
        procedure DecMinute;
        property IsTheOne : Char read FTheOne write FTheOne;
        { Private declarations }
      protected
        { Protected declarations }
      public
        fHour: Integer;
        fMinute : Integer;
        fSecond: Integer;
        constructor Create(AOwner: TComponent); override;
        procedure Paint; override;
        procedure SetHour(Value: Integer);
        procedure SetMinute(Value: Integer);
        procedure SetSecond(Value: Integer);
        function GetHour: Integer;
        function GetMinute: Integer;
        function GetSecond: Integer;
        function GetTotalSec: longint;
        function GetTime: TDateTime;
        { Public declarations }
      published
        property Color;
        property BorderStyle;
        property TabStop;
        property TabOrder;
        property Hour : Integer
          read GetHour write SetHour;
        property Minute: Integer
          read GetMinute write SetMinute;
        property Second : Integer
          read GetSecond write SetSecond;
        { Published declarations }
      end;

    procedure Register;

    implementation

    {Return the total seconds represented by the values in hour, minute and second}
    {Especially useful for use with timer components}
    function TaisHMSBox.GetTotalSec :longint;
    var
      tmp : longint;
    begin
      tmp := (fHour * 3600);
      tmp := tmp + (fMinute * 60);
      tmp := tmp + Second;
      Result := tmp;
    end;

    {Return the time represented in the aisHMSBox}
    function TaisHMSBox.GetTime: TDateTime;
    begin
      Result := EncodeTime(fHour, fMinute, fSecond, 0);
    end;

    procedure TaisHMSBox.EditOnEnter(Sender: TObject);
    begin
      If TEdit(Sender).Name = 'Hour' then
        begin
          TEdit(Sender).Color := clYellow;
          IsTheOne := 'H';
        end;
      If TEdit(Sender).Name = 'Minute' then
        begin
          TEdit(Sender).Color := clYellow;
          IsTheOne := 'M';
        end;
      If TEdit(Sender).Name = 'Second' then
        begin
          TEdit(Sender).Color := clYellow;
          IsTheOne := 'S';
        end;
    end;

    procedure TaisHMSBox.EditOnKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
      if (Ord(Key) = VK_UP) then
        begin
          Case IsTheOne of
           'H':     IncHour;
           'M':     IncMinute;
           'S':     IncSecond;
          end; {case}
        end;
      if (Ord(Key) = VK_DOWN) then
        begin
          Case IsTheOne of
           'H':     DecHour;
           'M':     DecMinute;
           'S':     DecSecond;
          end; {case}
        end;
    end;

    procedure TaisHMSBox.EditOnExit(Sender: TObject);
    var
     newval: integer;
    begin
      If TEdit(Sender).Name = 'Hour' then
        begin
          try
            newval :=StrToInt(TEdit(Sender).Text);
            SetHour(newval);
          except
            SetHour(fHour);
          end;
          TEdit(Sender).Color := clWhite;
          IsTheOne := 'N';
        end;
      If TEdit(Sender).Name = 'Minute' then
        begin
          try
            newval :=StrToInt(TEdit(Sender).Text);
            SetMinute(newval);
          except
           SetMinute(fMinute);
          end;
          TEdit(Sender).Color := clWhite;
          IsTheOne := 'N';
        end;
      If TEdit(Sender).Name = 'Second' then
        begin
          try
            newval := StrToInt(TEdit(Sender).Text);
            SetSecond(newval);
          except
            SetSecond(fSecond);
          end;
          TEdit(Sender).Color := clWhite;
          IsTheOne := 'N';
        end;
    end;

    procedure TaisHMSBox.IncHour;
    begin
      if (fHour > 23) then
        SetHour(0)
      else
        SetHour(fHour + 1);
    end;

    procedure TaisHMSBox.DecHour;
    begin
      if (fHour < 1) then
        SetHour(23)
      else
        SetHour(fHour - 1);
    end;

    procedure TaisHMSBox.IncMinute;
    begin
      if (fMinute > 58) then
        SetMinute(0)
      else
        SetMinute(fMinute + 1);
    end;

    procedure TaisHMSBox.DecMinute;
    begin
      if (fMinute < 1) then
        SetMinute(59)
      else
        SetMinute(fMinute - 1);
    end;

    procedure TaisHMSBox.IncSecond;
    begin
      if (fSecond > 58) then
        SetSecond(0)
      else
        SetSecond(fSecond + 1);
    end;

    procedure TaisHMSBox.DecSecond;
    begin
      if (fSecond < 1) then
        SetSecond(59)
      else
        SetSecond(fSecond - 1);
    end;

    procedure TaisHMSBox.SpinUp(Sender: TObject);
    begin
      Case IsTheOne of
           'H':     IncHour;
           'M':     IncMinute;
           'S':     IncSecond;
      end;
    end;

    procedure TaisHMSBox.SpinDown(Sender: TObject);
    begin
      Case IsTheOne of
           'H':     DecHour;
           'M':     DecMinute;
           'S':     DecSecond;
      end;
    end;

    procedure TaisHMSBox.SetHour(Value: Integer);
    begin
      fHour := Value;
      FHourEdit.Text := IntToStr(Value);
      FHourEdit.Repaint;
    end;

    function TaisHMSBox.GetHour: Integer;
    begin
      Result := fHour;
    end;

    function TaisHMSBox.GetMinute: Integer;
    begin
      Result := fMinute;
    end;

    function TaisHMSBox.GetSecond: Integer;
    begin
      Result := fSecond;
    end;

    procedure TaisHMSBox.SetMinute(Value: Integer);
    begin
      fMinute := Value;
      FMinuteEdit.Text := IntToStr(Value);
    end;

    procedure TaisHMSBox.SetSecond(Value: Integer);
    begin
      fSecond := Value;
      FSecondEdit.Text := IntToStr(Value);
    end;

    function TaisHMSBox.CreateLabel: TLabel;
    begin
      Result := TLabel.Create(Self);
      Result.Parent := self;
      Result.Alignment := taCenter;
      Result.Font.Name := 'MS Sans Serif';
      Result.Visible := True;
    end;

    function TaisHMSBox.CreateEdit: TEdit;
    begin
      Result := TEdit.Create(Self);
      Result.Color := clWhite;
      Result.Parent := Self;
      Result.Visible := True;
      Result.OnKeyDown := EditOnKeyDown;
      Result.OnEnter := EditOnEnter;
      Result.OnExit := EditOnExit;
    end;

    function TaisHMSBox.CreateSpin: TSpinButton;
    begin
      Result := TSpinButton.Create(Self);
      Result.Parent := Self;
      Result.OnDownClick := SpinDown;
      Result.OnUpClick := SpinUp;
    end;

    procedure Register;
    begin
      RegisterComponents('Samples', [TaisHMSBox]);
    end;

    constructor TaisHMSBox.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      BorderStyle := bsSingle;
      FHourEdit := CreateEdit;
      FMinuteEdit := CreateEdit;
      FSecondEdit := CreateEdit;
      FHourEdit.Name :='Hour';
      FMinuteEdit.Name :='Minute';
      FSecondEdit.Name := 'Second';
      FSpin := CreateSpin;
      fHour := 0;
      fMinute := 0;
      fSecond := 0;
    end;

    procedure TaisHMSBox.Paint;
    begin
      {inherited Paint;}
      self.caption := '';
      if self.width > 125 then self.width := 125;
      if self.height >40 then self.height := 40;
      FHourEdit.Width := (self.width div 5);
      FMinuteEdit.Width := (self.width div 5);
      FSecondEdit.Width := (self.width div 5);
      FHourEdit.Height := ((self.height * 4) div 6);
      FMinuteEdit.Height:= FHourEdit.Height;
      FSecondEdit.Height:= FHourEdit.Height;
      FHourEdit.Top := ((self.height div 2) - (FHourEdit.Height div 2));
      FMinuteEdit.Top := FHourEdit.Top;
      FSecondEdit.Top := FHourEdit.Top;
      FHourEdit.Left := 2;
      FMinuteEdit.Left := FHourEdit.Left + FMinuteEdit.Width + 4;
      FSecondEdit.Left := FMinuteEdit.Left + FSecondEdit.Width + 4;
      FHourEdit.Font.Name := 'MS Sans Serif';
      FMinuteEdit.Font.Name := 'MS Sans Serif';
      FSecondEdit.Font.Name := 'MS Sans Serif';
      FHourEdit.Font.Size := (FHourEdit.Height - (FHourEdit.Height * 2) div 3);
      FSecondEdit.Font.Size := FHourEdit.Font.Size;
      FMinuteEdit.Font.Size := FHourEdit.Font.Size;
      with FSpin do
        begin
          Width := FHourEdit.Width;
          Height := self.Height;
          Left := self.width - FSpin.Width;
          Align := alTop;
          Font.Size := FHourEdit.Font.Size;
          Visible := True;
        end;
    end;
    end.

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