- Venho agora mostrar como criar um componente;
- Ações
- 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.