Saltar al contenido

¿Cómo hacer un reloj digital en delphi7?

Si te encuentras con algún detalle que no comprendes puedes dejarlo en la sección de comentarios y te ayudaremos tan rápido como podamos.

Solución:

Ejercicio 1

Soltar un TLabel y un TButton en su formulario.

Haga doble clic en el botón y escriba

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := TimeToStr(Time);
end;

Ejercicio 2

Para tener tiempo para actualizar automáticamente, agregue un TTimer a su formulario y haga doble clic en él (puede quitar el botón si lo desea). A continuación, escribir

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Label1.Caption := TimeToStr(Time);
end;

Este código se ejecutará una vez por segundo (el intervalo predeterminado para un TTimer, que es perfecto para nosotros, por lo que no es necesario cambiarlo).

Ejercicio 3

Para hacer que el reloj sea más molesto, puede intentar esto: en la interfaz de su formulario, agregue un campo privado llamado FHighlight, como esto:

TForm1 = class(TForm)
  Button1: TButton;
  Label1: TLabel;
  Timer1: TTimer;
  procedure Button1Click(Sender: TObject);
  procedure Timer1Timer(Sender: TObject);
private
   Private declarations 
  FHighlight: boolean;
public
   Public declarations 
end;

Ahora puedes hacer

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Label1.Caption := TimeToStr(Time);
  if FHighlight then
  begin
    Label1.Color := clWhite;
    Label1.Font.Color := clBlack;
  end
  else
  begin
    Label1.Color := clBlack;
    Label1.Font.Color := clWhite;
  end;
  FHighlight := not FHighlight;
end;

Para que este efecto funcione, debe cambiar una de las propiedades del TLabel control (tiempo de diseño). Cambio Transparent para false, utilizando el Inspector de objetos, si aún no lo está.

Actualización (ejercicio 4)

Dado que Warren P piensa que es demasiado aburrido con un simple TLabel, así es como puedes lograr un ‘true’reloj digital de siete segmentos:

procedure TForm1.FormPaint(Sender: TObject);
type
  TDigitData = array[0..6] of boolean;
  TPhysDigit = array[0..7] of TRect;
const
  DIGIT: array[0..9] of TDigitData =
    (
      (true, true, true, true, true, true, false),
      (false, true, true, false, false, false, false),
      (true, true, false, true, true, false, true),
      (true, true, true, true, false, false, true),
      (false, true, true, false, false, true, true),
      (true, false, true, true, false, true, true),
      (true, false, true, true, true, true, true),
      (true, true, true, false, false, false, false),
      (true, true, true, true, true, true, true),
      (true, true, true, true, false, true, true)
    );
var
  PaddingW,
  PaddingH,
  UnitX,
  UnitY,
  DigitWidth,
  DigitHeight,
  BarLengthX,
  BarLengthY,
  DigitSeparation,
  FieldSeparation: integer;
  SEGMENTS: array[0..5] of TPhysDigit;
  i: Integer;

  function TranslatePhysDigit(const PhysDigit: TPhysDigit; const DX: integer; const DY: integer = 0): TPhysDigit;
  var
    i: Integer;
  begin
    for i := 0 to 7 do
    begin
      result[i].Left := PhysDigit[i].Left + DX;
      result[i].Right := PhysDigit[i].Right + DX;
      result[i].Top := PhysDigit[i].Top + DY;
      result[i].Bottom := PhysDigit[i].Bottom + DY;
    end;
  end;

  procedure DrawDigit(const Position, Value: integer);
  var
    i: integer;
  begin
    for i := 0 to 6 do
      if DIGIT[Value, i] then
        Canvas.FillRect(SEGMENTS[Position, i]);
  end;

  procedure DrawColon(const Position: integer);
  var
    ColonRect1: TRect;
    ColonRect2: TRect;
  begin
    ColonRect1 := Rect(PaddingW + Position*UnitX, PaddingH + UnitY,
      PaddingW + (Position+1)*UnitX, PaddingH + 2*UnitY);
    ColonRect2 := Rect(PaddingW + Position*UnitX, PaddingH + 3*UnitY,
      PaddingW + (Position+1)*UnitX, PaddingH + 4*UnitY);
    Canvas.FillRect(ColonRect1);
    Canvas.FillRect(ColonRect2);
  end;

var
  t: string;

begin
  PaddingW := Width div 20;
  PaddingH := Height div 20;
  UnitX := (ClientWidth - 2*PaddingW) div 27;
  UnitY := (ClientHeight - 2*PaddingH) div 5;
  DigitWidth := 3*UnitX;
  DigitHeight := 5*UnitY;
  BarLengthX := 3*UnitX;
  BarLengthY := 3*UnitY;
  DigitSeparation := 4*UnitX;
  FieldSeparation := 6*UnitX;
  SEGMENTS[0, 0] := Rect(0, 0, DigitWidth, UnitY);
  SEGMENTS[0, 1] := Rect(DigitWidth - UnitX, 0, DigitWidth, BarLengthY);
  SEGMENTS[0, 2] := Rect(DigitWidth - UnitX, 2*UnitY, DigitWidth, DigitHeight);
  SEGMENTS[0, 3] := Rect(0, DigitHeight - UnitY, DigitWidth, DigitHeight);
  SEGMENTS[0, 4] := Rect(0, 2*UnitY, UnitX, DigitHeight);
  SEGMENTS[0, 5] := Rect(0, 0, UnitX, BarLengthY);
  SEGMENTS[0, 6] := Rect(0, 2*UnitY, DigitWidth, 3*UnitY);
  SEGMENTS[0] := TranslatePhysDigit(SEGMENTS[0], PaddingW, PaddingH);
  SEGMENTS[1] := TranslatePhysDigit(SEGMENTS[0], DigitSeparation);
  SEGMENTS[2] := TranslatePhysDigit(SEGMENTS[1], FieldSeparation);
  SEGMENTS[3] := TranslatePhysDigit(SEGMENTS[2], DigitSeparation);
  SEGMENTS[4] := TranslatePhysDigit(SEGMENTS[3], FieldSeparation);
  SEGMENTS[5] := TranslatePhysDigit(SEGMENTS[4], DigitSeparation);
  Canvas.Brush.Color := clBlack;
  Canvas.FillRect(ClientRect);
  Canvas.Brush.Color := clBlack;
  Canvas.FillRect(Rect(PaddingW, PaddingH, ClientWidth - PaddingW,
    ClientHeight - PaddingH));
  Canvas.Brush.Color := clRed;
  t := FormatDateTime('hhnnss', Time);

  for i := 0 to 5 do
    DrawDigit(i, StrToInt(Copy(t, i+1, 1)));

  if odd(StrToInt(Copy(t, 6, 1))) then
  begin
    DrawColon(8);
    DrawColon(18);
  end;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  Invalidate;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Invalidate;
end;

Reloj digital de siete segmentos

Jugando con los pinceles GDI:

Reloj digital de siete segmentos

Descargue mi componente NLDDigiLabel de código abierto desde aquí, coloque tres de ellos en el formulario, coloque dos etiquetas comunes en el medio como separadores de tiempo y establezca el color de fondo del formulario. En este ejemplo, hice todo esto en un marco por conveniencia:

unit Unit2;

interface

uses
  Windows, SysUtils, Classes, Graphics, Controls, Forms, StdCtrls, ExtCtrls,
  NLDDigiLabel;

type
  TDigitalClock = class(TFrame)
    HoursLabel: TNLDDigiLabel;
    MinsLabel: TNLDDigiLabel;
    SecsLabel: TNLDDigiLabel;
    TimeSeparator1: TLabel;
    TimeSeparator2: TLabel;
    Timer: TTimer;
    procedure TimerTimer(Sender: TObject);
  private
    FTime: TTime;
    procedure SetTime(Value: TTime);
  public
    property Time: TTime read FTime write SetTime;
  end;

implementation

$R *.dfm

 TDigitalClock 

procedure TDigitalClock.SetTime(Value: TTime);
var
  Hours: Word;
  Mins: Word;
  Secs: Word;
  MSecs: Word;
begin
  if FTime <> Value then
  begin
    FTime := Value;
    DecodeTime(FTime, Hours, Mins, Secs, MSecs);
    HoursLabel.Value := Hours;
    MinsLabel.Value := Mins;
    SecsLabel.Value := Secs;
  end;
end;

procedure TDigitalClock.TimerTimer(Sender: TObject);
begin
  SetTime(FTime + 1/SecsPerDay);
end;

end.

Ahora, suelte ese marco en su formulario, et voilá:

procedure TForm1.FormCreate(Sender: TObject);
begin
  DigitalClock1.Time := Time;
end;

DigitalClock.png

Comentarios y valoraciones del tutorial

Si haces scroll puedes encontrar las crónicas de otros gestores de proyectos, tú asimismo tienes la habilidad dejar el tuyo si te gusta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *