如何在delphi7中制作数字时钟?

时间:2012-02-28 18:15:15

标签: delphi delphi-7 pascal

我是delphi的新手,并希望从简单的开始。 有人可以告诉我一个如何制作一个将“时间”(小时,分钟,秒)转移到标签的数字时钟的例子吗?或类似的东西

3 个答案:

答案 0 :(得分:42)

练习1

在表单上删除TLabelTButton

双击按钮,然后写

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

练习2

要获得自动更新的时间,请在表单中添加TTimer,然后双击它(如果愿意,可以删除按钮)。然后写

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

此代码将每秒运行一次(TTimer的默认间隔,这对我们来说非常合适,因此我们无需更改它。)

练习3

为了让时钟更烦人,您可以尝试这样做:在表单的界面中,添加一个名为FHighlight的私有字段,如下所示:

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;

现在你可以做到

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;

为了使此效果起作用,您需要更改TLabel控件的一个属性(设计时)。使用对象检查器将Transparent更改为false(如果尚未更新)。

更新(练习4)

由于Warren P认为它对于TLabel来说太无聊了,这就是你如何能够实现'真正的'七段数字时钟:

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;

Seven-segment digital clock

使用GDI画笔:

Seven-segment digital clock

答案 1 :(得分:15)

NLDDigiLabel下载我的开源here组件,将其中三个放在表单上,​​在两者之间放置两个常用标签作为时间分隔符,并设置表单的背景颜色。在这个例子中,为方便起见,我在框架上做了所有这些:

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.

现在,在你的表单上删除这样一个框架,etvoilá:

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

DigitalClock.png

答案 2 :(得分:0)

以下是我的时钟功能:

  1. 时间的准确度100%。
  2. 日期也被添加。
  3. 制作简单,不少于2分钟;只需创建一个计时器和2个标签,并在实现中写下:
  4. procedure TForm1.FormCreate(Sender: TObject);
    begin
      //Background,Clock's Settings
      form1.Caption:='Digital Clock';
      form1.Height:=260;
      form1.Width:=750;
      form1.BorderStyle:=bsToolWindow;
      form1.Color:=clbackground;
    
      //Label (Time,Date) Settings
      label1.Font.Size:=72;
      label1.Font.Color:=clred;
      label1.Caption:='Time';
      label1.Top:=0;
      label1.Left:=8;
    
      label2.Font.Size:=72;
      label2.Font.Color:=clblue;
      label2.Caption:='Date';
      label2.Top:=104;
      label2.Left:=8;
    end;
    
    //Create Clock,Calendar
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      label1.Caption:='Time: '+timetostr(time);
      label2.Caption:='Date: '+datetostr(date);
    
      timer1.Interval:=1; //100% Accuracy
    end;
    

    enter image description here