quinta-feira, 9 de setembro de 2010

Criando um cronômetro no Delphi

Esse é um post básico, destinado a quem está iniciando a programação em Delphi ou Lazarus. Vamos criar um cronômetro.

Um cronômetro deve marcar horas, minutos, segundos e milésimos de segundos. Deve ter um botão para iniciar, um para parar e outro para zerar.

Crie a form preta com um label vermelho e três botões, e deixe-a como a figura acima. Coloque também um TTimer e deixe a propriedade interval em 1 milissegundo e a propriedade enabled como false, para ele começar desligado.

O DFM/LFM ficará assim:

object frmvisor: Tfrmvisor
  Left = 405
  Top = 209
  BorderIcons = [biSystemMenu, biMinimize]
  BorderStyle = bsDialog
  Caption = 'Cron'#244'metro'
  ClientHeight = 102
  ClientWidth = 314
  Color = clBlack
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  SnapBuffer = 1
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object lbTempo: TLabel
    Left = 8
    Top = 8
    Width = 294
    Height = 55
    Caption = '00:00:00.000'
    Font.Charset = ANSI_CHARSET
    Font.Color = clRed
    Font.Height = -48
    Font.Name = 'Microsoft Sans Serif'
    Font.Style = [fsBold]
    ParentFont = False
    Transparent = False
    WordWrap = True
  end
  object btInicio: TButton
    Left = 16
    Top = 72
    Width = 75
    Height = 25
    Caption = '&Iniciar'
    TabOrder = 0
    OnClick = btInicioClick
  end
  object btPara: TButton
    Left = 96
    Top = 72
    Width = 75
    Height = 25
    Caption = '&Parar'
    TabOrder = 1
    OnClick = btParaClick
  end
  object btZera: TButton
    Left = 224
    Top = 72
    Width = 75
    Height = 25
    Caption = '&Zerar'
    TabOrder = 2
    OnClick = btZeraClick
  end
  object crono: TTimer
    Enabled = False
    Interval = 1
    OnTimer = cronoTimer
    Left = 16
    Top = 16
  end
end




O código dessa form, o arquivo.pas segue abaixo:

unit visor;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, dateutils;

type
  Tfrmvisor = class(TForm)
    btInicio: TButton;
    btPara: TButton;
    btZera: TButton;
    crono: TTimer;
    lbTempo: TLabel;
    procedure cronoTimer(Sender: TObject);
    procedure btInicioClick(Sender: TObject);
    procedure btParaClick(Sender: TObject);
    procedure btZeraClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    fTempo: Ttime;
    fMomento: integer;
  end;

var
  frmvisor: Tfrmvisor;

implementation

{$R *.dfm}

procedure Tfrmvisor.cronoTimer(Sender: TObject);
begin
  ftempo := (GetTickCount - fmomento) * OneMillisecond;
  lbTempo.Caption := formatdatetime('hh:nn:ss.zzz', fTempo);
end;

procedure Tfrmvisor.btInicioClick(Sender: TObject);
begin
  fmomento := GetTickCount;
  crono.Enabled := true;
end;

procedure Tfrmvisor.btParaClick(Sender: TObject);
begin
  crono.Enabled := false;
end;

procedure Tfrmvisor.btZeraClick(Sender: TObject);
begin
  fTempo := 0;
  lbTempo.Caption := formatdatetime('hh:nn:ss.zzz', fTempo);
end;

procedure Tfrmvisor.FormCreate(Sender: TObject);
begin
  self.DouBleBuffered := True; //evitar o flick do relógio.
end;

end.


O principio é simples: Temos uma variavel chamada momento, do tipo inteiro, que armazena este exato momento através do método GetTickCount da API do windows, que traz a quantidade de milissegundos passada desde que se iniciou a máquina, e uma variável Tempo do tipo Time que a cada milissegundo do timer armazenará o GetTickCount de agora (a cada milsec) menos o que estava armazenado em Momento tudo isso multiplicado por OneMilliSecond, que é uma constante racional que armazena o valor de um milissegundo em relação a um dia. Isso porque no Delphi e Lazarus um dia é um inteiro e um milissegundo é uma fração de 1/milissegundos_de_um_dia.

O calculo é esse (GetTickCount - fmomento) * OneMillisecond;

Iniciar captura o momento e liga o timer. Parar simplesmente para o timer. Zerar atribui 0 ao Momento.

Esse foi um post básico do Delphi/Lázarus, mas não abordei como manusear as ferramentas para criar esses arquivos. Talvez em uma futura video - aula?

Você pode baixar o Lazarus aqui: http://sourceforge.net/projects/lazarus/files/ e o fonte deste projeto aqui.

Have Fun ;)

Nenhum comentário:

Postar um comentário

Postagens populares

Marcadores

delphi (60) C# (31) poo (21) Lazarus (19) Site aos Pedaços (15) sql (13) Reflexões (10) .Net (9) Humor (9) javascript (9) ASp.Net (8) api (8) Básico (6) Programação (6) ms sql server (5) Web (4) banco de dados (4) HTML (3) PHP (3) Python (3) design patterns (3) jQuery (3) livros (3) metaprogramação (3) Ajax (2) Debug (2) Dicas Básicas Windows (2) Pascal (2) games (2) linguagem (2) música (2) singleton (2) tecnologia (2) Anime (1) Api do Windows (1) Assembly (1) Eventos (1) Experts (1) GNU (1) Inglês (1) JSON (1) SO (1) datas (1) developers (1) dicas (1) easter egg (1) firebird (1) interfaces (1) introspecção (1) memo (1) oracle (1) reflexão (1)