quinta-feira, 31 de maio de 2012

Olá pessoal, estou voltando a escrever no blogger...
- Venho agora mostrar como criar um componente;



  • Ações
- Criar componente cronometro regressivo, salvando as informações no registro do windows. 




- Imagem do componente;



- Imagem do registro do windows;




- Vou postar o fonte e explico passo-a-passo:


unit u_Cronometro;


interface


uses
  Windows, SysUtils, Classes, Controls, StdCtrls, Mask, ExtCtrls,     DateUtils, Dialogs,
  Forms, Registry;


type
  TCronometro = class(TWinControl)
  private
    { Private declarations }
    // Adicionando um componente Label. 
    _LabelTimer: TLabel;
    // Adicionando um componente MaskEdit. 
    _EditTimer: TMaskEdit;
    // Adicionando um componente Button. 
    _ButTimer: TButton;
    // Adicionando um componente Time.
    _Timer, _TimerS: TTimer;
    // Variável publica do tipo integer.
    vp_segundos : Integer;
    // Funções para retorna a quantidade de segundo, em um valor de tempo informado pelo usuário.
    function GetSegundos: Integer;
    function CalculaSegundo: Integer;
    // Procedure para configurar o evento click do botão.
    procedure _ButTimerClick(Sender: TObject);
    // Procedure para configurar o evento OnTime do componente Timer.
    procedure _TimerExecute(Sender: TObject);    
    // Procedure para configurar o evento OnTime do componente TimerS.
    procedure _TimerSExecute(Sender: TObject);
    // Função auxiliar para converter o tempo.
    function SecToTime(Sec: Integer): string;
  protected
    { Protected declarations }
    // Sobrecarregando o método SetBounds da classe ancestral. 
    procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  public
    { Public declarations }
    // Sobrecarregando o método Construtor da classe ancestral.
    constructor Create(AOwner: TComponent); override;
    // Sobrecarregando o método Destrutor da classe ancestral.
    destructor Destroy; override;
  published
    { Published declarations }
    // No próximo artigo incluiremos novas propriedades e eventos
  end;


procedure Register;


implementation


procedure Register;
begin
  // Metodo para registrar o componente
  RegisterComponents('Meu Componente', [TCronometro]);
end;


{ TCronometro }


function TCronometro.CalculaSegundo: Integer;
var
  vl_i,vl_f: TDateTime;
begin
  Result:= 0;
  vl_i:= StrToDateTime(FormatDateTime('dd/mm/yyyy', now)+ ' 00:00:00');
  vl_f:= StrToDateTime(FormatDateTime('dd/mm/yyyy', now)+ ' '+_EditTimer.Text+'');
  Result := SecondsBetween(vl_i,vl_f);
end;


constructor TCronometro.Create(AOwner: TComponent);
var
  vl_reg: TRegistry; // TRegistry utilizada para acessar o registro do windows >> Uses Registry
begin
  // Chama o construtor da Classe ancestral.
  inherited Create(AOwner);;
  _Timer:=  TTimer.create(self);   
  with _Timer do
  begin
    Enabled:= False;
    Interval:= 1000;
    OnTimer:= _TimerExecute;
  end;


  _TimerS:=  TTimer.create(self);
  with _TimerS do
  begin
    Enabled:= False;
    Interval:= 5000;
    OnTimer:= _TimerSExecute;
  end;


  _EditTimer:=  TMaskEdit.create(self);
  with _EditTimer do
  begin
    Parent:= Self;
    ParentFont:= False;
    EditMask := '99:99:99;1;_';
    SetBounds(0,0,80,21);
  end;


  _ButTimer:=   TButton.create(self);
  with _ButTimer do
  begin
    Parent:= Self;
    ParentFont:= False;
    Caption:= 'Iniciar...';
    OnClick:= _ButTimerClick;
    SetBounds(82,0,60,21);
  end;


  vp_segundos:= GetSegundos;


  if vp_segundos > 0 then
  _ButTimer.Click;


  _LabelTimer:= TLabel.create(self);
  with _LabelTimer do
  begin
    Parent:= Self;
    Caption:= '00:00:00';
    SetBounds(0,25,40,40);
  end;


end;


destructor TCronometro.Destroy;
var
  vl_chave: TRegistry;
begin
  // Metodo destrutor, antes de destruir salva o valor de tempo restante.
  vl_chave:= TRegistry.Create;
  try
    vl_chave.RootKey := HKEY_CURRENT_USER;
    vl_chave.OpenKey('Cronometro',True);
    // Salva a quantidade de segundos restantes.
    vl_chave.WriteInteger('Segundos',vp_segundos);
    // Salva o valor do tempo inicial.
    vl_chave.WriteString('Temp_ini',_EditTimer.Text);
    vl_chave.CloseKey();
  finally
    vl_chave.Free;
  end;


  // Libera os objetos da memoria.
  FreeAndNil(_LabelTimer);
  FreeAndNil(_EditTimer);
  FreeAndNil(_ButTimer);
  FreeAndNil(_TimerS);
  FreeAndNil(_Timer);
  // Chama do Destrutor da classe ancestral.
  inherited Destroy;
end;


function TCronometro.GetSegundos: Integer;
var
  vl_chave: TRegistry;
  vl_i,vl_f : TDateTime;
  vl_segundos: Integer;
begin
  Result:= 0;


  vl_chave:= TRegistry.Create;
  with vl_chave do
    begin
      RootKey := HKEY_CURRENT_USER;
      // Verifica se a chave existe, se não existir a mesma é criada.
      if not KeyExists('Cronometro') then
        begin
          OpenKey('Cronometro', true);
          WriteInteger('Segundos',0);
          WriteString('Temp_ini', '00:00:00');
          Result:= 0;
          _EditTimer.Text:= '00:00:00';
          CloseKey();
        end
          else
        begin
          // Se existir pego os valores constantes na mesma.
          OpenKey('Cronometro', true);
          Result:=  vl_chave.ReadInteger('Segundos');
          _EditTimer.Text:= vl_chave.ReadString('Temp_ini');
          CloseKey();
        end;
      Free;
    end;
end;


function TCronometro.SecToTime(Sec: Integer): string;
var
   vl_H, vl_M, vl_S: string;
   vl_ZH, vl_ZM, vl_ZS: Integer;
begin
   vl_ZH := Sec div 3600;
   vl_ZM := Sec div 60 - vl_ZH * 60;
   vl_ZS := Sec - (vl_ZH * 3600 + vl_ZM * 60) ;
   vl_H := IntToStr(vl_ZH) ;
   vl_M := IntToStr(vl_ZM) ;
   vl_S := IntToStr(vl_ZS) ;
   Result := vl_H + ':' + vl_M + ':' + vl_S;
end;


procedure TCronometro.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
  // Largura do componente.
  AWidth:= _EditTimer.Width + _ButTimer.Width + 2;
  // Altura do componente.
  AHeight:= _EditTimer.Height + _LabelTimer.Height + 2;
  // Chama o método da classe ancestral.
  inherited SetBounds(ALeft, ATop, AWidth, AHeight);
end;


// Método click do botão.
procedure TCronometro._ButTimerClick(Sender: TObject);
begin
  if vp_segundos <= 0 then
    begin
      vp_segundos:= CalculaSegundo;
    end;
  // Ativa os componentes TTime(s).
  _TimerS.Enabled:= True;
  _Timer.Enabled:= True;
  // Desativa o componente MaskEdit e o Button
  _EditTimer.Enabled:= False;
  _ButTimer.Enabled:= False;
end;


// Metodo OnTimer de (_Timer)
procedure TCronometro._TimerExecute(Sender: TObject);
var
  vl_chave: TRegistry;
begin
  vp_segundos:= vp_segundos - 1;
  _LabelTimer.Caption:= SecToTime(vp_segundos);
  if vp_segundos = 0 then
    begin
      try
        vl_chave:= TRegistry.Create;
        vl_chave.RootKey := HKEY_CURRENT_USER;
        vl_chave.OpenKey('Cronometro',True);
        vl_chave.WriteInteger('Segundos',vp_segundos);
        vl_chave.WriteString('Temp_ini','');
        vl_chave.CloseKey();
      finally
        vl_chave.Free;
      end;
      _Timer.Enabled:= False;
      MessageDlg('Fim de expediente...', mtInformation,[mbOK], 0);
      Application.Terminate;
    end;
end;


// Metodo OnTimer de (_TimerS)
procedure TCronometro._TimerSExecute(Sender: TObject);
var
  vl_chave: TRegistry;
begin
  vl_chave:= TRegistry.Create;
  try
    vl_chave.RootKey := HKEY_CURRENT_USER;
    vl_chave.OpenKey('Cronometro',True);
    vl_chave.WriteInteger('Segundos',vp_segundos);
    vl_chave.WriteString('Temp_ini',_EditTimer.Text);
    vl_chave.CloseKey();
  finally
    vl_chave.Free;
  end;
end;


end.