Sabtu, 03 November 2012

Delphi – Membuat Jam Analog



Membuat jam digital di Delphi sangatlah mudah. Lalu bagaimana jika kita ingin membuat jam analog? Ikuti tutorial berikut ini!

Aplikasi yang akan kita buat, hampir mirip seperti Jam pada Windows. Hasilnya akan jadi seperti ini
Buat sebuah proyek baru pada Delphi
Buat variabel berikut di atas implementation (di bawah nama form)
  i:byte;

  Diameter:integer;

  Angka, JariJam, JariMenit, JariDetik, TebalGaris, UkuranHuruf : byte;
Karena angka akan dibuat secara otomatis, tambahkan unit StdCtrls pada uses (di bawah interface). Sehingga kita bisa menggunakan komponen TLabel dan konntrol standar Delphi lainnya
Tambahkan skrip/kode berikut pada event onCreate dari form
  Self.BorderStyle:=bsNone; //Agar form tidak memiliki border
{Setting untuk ukuran jam}
  ClientWidth := 150; {menentukan lebar form}
  ClientHeight:= ClientWidth; {menentukan tinggi form}
  Diameter := ClientWidth; {menentukan diameter jam}
  jariJam := 45; {menentukan panjang jarum jam}
  jariMenit := 60; {menentukan panjang jarum menit}
  JariDetik := 70; {menentukan panjang jarum detik}
//Tentukan posisi angka
  for i:=1 to 12 do
{diulang sebanyak angka jam yaitu 12}
  begin
    TLabel.Create(Self).Name:=’angka’+IntToStr(i);
    with TLabel(FindComponent(‘angka’+IntToStr(i))) do
    begin
      Height:=10;
      Width:=15;
      Parent:=Self;
      Font.Size:=6;
      Font.Color:=clBlack;
      Font.Style:=[fsBold];
      Alignment:=taCenter;
      Caption:=IntToStr(i);
      Transparent:=true;
      Left:=((Diameter-Width) div 2)-round((jariDetik-6)*sin(-i*pi/6));
      Top:=((Diameter-Height) div 2)-round((jariDetik-6)*cos(-i*pi/6));
    end;
  end;
//Buat form jadi bulat
  SetWindowRgn(self.Handle, CreateEllipticRgn(0,0,ClientWidth,ClientHeight), true);
Buat prosedur GerakJarumJam seperti ini :
procedure TForm1.GerakJarumJam;
var
  jam,menit,detik,milidetik:word;
begin
  self.Refresh; //merefresh form
  DecodeTime(Now,jam,menit,detik,milidetik);
{mendekode atau menjabarkan waktu sekarang menjadi jam, menit, detik dan milidetik}
//Untuk jarum detik
  Canvas.Pen.Color:=clRed;
  Canvas.Pen.Width:=2;
  Canvas.MoveTo(Diameter div 2,Diameter div 2);
  Canvas.LineTo(
    (Diameter div 2)-round(
    jariDetik*sin(-detik*pi/30)),
    (Diameter div 2)-round(
    jariDetik*cos(-detik*pi/30)));
// Untuk jarum menit
  Canvas.Pen.Color:=clBlack;
  Canvas.Pen.Width:=3;
  Canvas.MoveTo(Diameter div 2,Diameter div 2);
  Canvas.LineTo(
    (Diameter div 2)-round(
    jariMenit*sin(-menit*pi/30-detik*pi/1800)),
    (Diameter div 2)-round(
    jariMenit*cos(-menit*pi/30-detik*pi/1800)));
// Untuk jarum jam
  Canvas.Pen.Color:=clBlack;
  Canvas.Pen.Width:=4;
  Canvas.MoveTo(Diameter div 2,Diameter div 2);
  Canvas.LineTo(
    (Diameter div 2)-round(
    jariJam*sin(-jam*pi/6-menit*pi/360)),
    (Diameter div 2)-round(
    jariJam*cos(-jam*pi/6-menit*pi/360)));
end;
Tambahkan sebuah Timer dan masukkan skrip/kode berikut pada event onTimer dari Timer1
  GerakJarumJam; {memanggil procedure GerakJarumJam}
Jalankan aplikasi dengan menekan tombol F9
Adapun kode selengkapnya adalah sebagai berikut
unit UJam;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure GerakJarumJam;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  i:byte;
  Diameter:integer;
  Angka, JariJam, JariMenit, JariDetik, TebalGaris, UkuranHuruf : byte;
implementation
{$R *.dfm}
procedure TForm1.GerakJarumJam;
var
  jam,menit,detik,milidetik:word;
begin
  self.Refresh; //merefresh form
  DecodeTime(Now,jam,menit,detik,milidetik);
{mendekode atau menjabarkan waktu sekarang menjadi jam, menit, detik dan milidetik}
//Untuk jarum detik
  Canvas.Pen.Color:=clRed;
  Canvas.Pen.Width:=2;
  Canvas.MoveTo(Diameter div 2,Diameter div 2);
  Canvas.LineTo(
    (Diameter div 2)-round(
    jariDetik*sin(-detik*pi/30)),
    (Diameter div 2)-round(
    jariDetik*cos(-detik*pi/30)));
// Untuk jarum menit
  Canvas.Pen.Color:=clBlack;
  Canvas.Pen.Width:=3;
  Canvas.MoveTo(Diameter div 2,Diameter div 2);
  Canvas.LineTo(
    (Diameter div 2)-round(
    jariMenit*sin(-menit*pi/30-detik*pi/1800)),
    (Diameter div 2)-round(
    jariMenit*cos(-menit*pi/30-detik*pi/1800)));
// Untuk jarum jam
  Canvas.Pen.Color:=clBlack;
  Canvas.Pen.Width:=4;
  Canvas.MoveTo(Diameter div 2,Diameter div 2);
  Canvas.LineTo(
    (Diameter div 2)-round(
    jariJam*sin(-jam*pi/6-menit*pi/360)),
    (Diameter div 2)-round(
    jariJam*cos(-jam*pi/6-menit*pi/360)));
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  GerakJarumJam; {memanggil procedure GerakJarumJam}
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  Self.BorderStyle:=bsNone; //Agar form tidak memiliki border
{Setting untuk ukuran jam}
  ClientWidth := 150; {menentukan lebar form}
  ClientHeight:= ClientWidth; {menentukan tinggi form}
  Diameter := ClientWidth; {menentukan diameter jam}
  jariJam := 45; {menentukan panjang jarum jam}
  jariMenit := 60; {menentukan panjang jarum menit}
  JariDetik := 70; {menentukan panjang jarum detik}
//Tentukan posisi angka
  for i:=1 to 12 do
{diulang sebanyak angka jam yaitu 12}
  begin
    TLabel.Create(Self).Name:=’angka’+IntToStr(i);
    with TLabel(FindComponent(‘angka’+IntToStr(i))) do
    begin
      Height:=10;
      Width:=15;
      Parent:=Self;
      Font.Size:=6;
      Font.Color:=clBlack;
      Font.Style:=[fsBold];
      Alignment:=taCenter;
      Caption:=IntToStr(i);
      Transparent:=true;
      Left:=((Diameter-Width) div 2)-round((jariDetik-6)*sin(-i*pi/6));
      Top:=((Diameter-Height) div 2)-round((jariDetik-6)*cos(-i*pi/6));
    end;
  end;
//Buat form jadi bulat
  SetWindowRgn(self.Handle, CreateEllipticRgn(0,0,ClientWidth,ClientHeight), true);
end;
end.
Catatan :

Anda dapat menambahkan PopUp menu untuk menutup aplikasi. Anda juga dapat mengembangkannya menjadi sebuah aplikasi yang lebih kompleks lagi
Selamat mencoba!!

Tidak ada komentar:

Posting Komentar