Delphi ile Analog Clock
Delphi ile Generic Clock örneği işinizi görmüştür umarım. Generic Clock projesinde yapacağımız küçük bir değişiklikle yeni projeler üretebiliriz aslında. Bilgisayar kullanıcılarının en çok tercih ettiği masaüstü araçlarından biri olan "Analog Clock" bu yazmının konusunu oluşturuyor. Siz Delphi kullanıcıları için elimden geldiği kadar sadeleştirmeye çalıştım. Başlayalım...
1. TASARIM
Delphi ile Analog Clock Tasarımı
Form tasarımı aşamasında dikkat edilmesi gereken birkaç ufak tefek ayrıntı var. Önceki örneklerde açıkladığım gibi öncelikle ana formun BorderStyle özelliğini bsNone olarak ayarlamalıyız. Diğer önemli kısım ise Sağ Tuş Menüsü eklemek. Programda görselliği bozmamak için "Kapat" düğmesi kullanmadım. Bu yüzden farenin sağ tuşuna bastığımızda içerik menüsüne ihtiyaç duyacağız. Burada programdan çıkış işlemini "Kapat Menüsü" yardımıyla yapacağız. Tasarım aşamasını şöyle özetliyebiliriz:
- Ama formun Client boyutları saat resminin boyutları ile aynı olacak (ClientWidth = 130, ClientHeight = 130)
- BorderStyle özelliği bsNone olarak ayarlanacak
- Ana forma Timer ve PopupMenu bileşenleri eklenecek
Tasarım kısmı bu kadar. Yukarıdaki ekran alıntısında örnek bir görüntü mevcut. Gelelim algoritma kısmına...
2. ALGORITMA
Algoritma kısmında temel çizim işlemlerinden bahsetmeyeceğim. Bu konulara daha önceki örnekte değinmiştim. Fakat açıklanması gereken önemli bir kısım var: Akrep, yelkovan ve saniye gibi saati oluşturan parçaların çizilmesi... Temel olarak bu parçalar belli bir eksen etrafında belirli açılarla dönerler. Bu açılar saatin kaç olduğuna göre değişmektedir. Örnegin Akrep çizimi için saatin 03:00:00 olduğu durumda 45 derecelik açı ile çizilmesi gerekmektedir. Bu hesaplamalar basit matematik işlemlerinden başkası değildir. Bu projede açı hesaplamalarını PaintElements prosedürü içine yerleştirdim. Aşağıdaki kod parçasını incelemekte fayda var sanırım.
procedure TForm1.PaintElements;
var
Hour, Minute, Second, MSec: Word;
State: GraphicsState;
Dx, Dy, Ox, Oy: Single;
AngleS, AngleM, AngleH: Single;
begin
{ Acilari su anki saate gore hesapla. }
DecodeTime(SysUtils.Now, Hour, Minute, Second, MSec);
AngleS := Second * 6;
AngleM := Minute * 6 + AngleS / 60;
AngleH := Hour * 30 + AngleM / 12;
{ Orta noktayi ekran genisligine gore bul. }
Dx := Self.Width / 2 - 1;
Dy := Self.Height / 2 - 1;
Ox := -6; // -13 div 2
Oy := -64; // -129 div 2
with FGraphics do
begin
{ Cizim alaninin durmunu sakla. }
State := Save();
{ Baslangic cizim noktasini formun ortasina konumlandir. }
TranslateTransform(Dx, Dy);
{ Saat parcasini ciz }
RotateTransform(AngleH);
DrawImage(FHour, Ox, Oy, 13, 129);
RotateTransform(-AngleH);
{ Dakika parcasini ciz }
RotateTransform(AngleM);
DrawImage(FMinute, Ox, Oy, 13, 129);
RotateTransform(-AngleM);
{ Saniye parcasini ciz }
RotateTransform(AngleS);
DrawImage(FSecond, Ox, Oy, 13, 129);
RotateTransform(-AngleS);
{ Nokta parcasini ciz }
DrawImage(FDot, Ox, Oy, 13, 129);
{ Cizim alaninin durumunu eski haline getir. }
Restore(State);
end;
end;
GDI+ ile belirli bir açıda resim çizme işlemi biraz karışıktır. Dikkat edilmesi gereken en önemli kısım çizim alanımızın başlangıç kooardinatlarının ayarlanması. Varsayılan olarak başlangış koordinatları (0, 0) sol üst köşe olarak seçilmiştir. Buradaki örnekte Dx, Dy değişkenleri formun orta noktasına işaret ediyor. GDI+ ile başlangış koordinatlarını değiştirmek için TranslateTransform fonksiyonunu kullanmamız gerekiyor. Başlangıç koordinatlarını (0, 0) noktasından (Dx, Dy) noktasına taşıyoruz. Açıklanması gereken önemli bir kısım ise resimlerin çizilirken başlangıç noktasına göre yeni koordinatlarının hesaplanması işlemi. Örneğimizde Ox ve Oy değişkenlerini bunun için kullanancağız. Akrep ve yelkovan resimlerimizin boyutları 13x129 piksel olduğundan bu resimlerin orta noktası tam sayı olarak (6,64) olacaktır. Fakat Transform işleminden dolayı resmin orta noktası (-6, -64) olacaktır. Açı hesaplamaları kaynak kod içinden anlaşılabilir durumda. Bu bölüme değinmeğe gerek yok sanırım. Eğer Transform ve Rotate işlemleri sırasında sorun yaşarsanız bana mail atabilirsiniz. Şimdilik bu proje hakkında söyleyeceklerim bu kadar. Analog Clock projesinin kaynak kodunu aşağıdaki linkten indirebilirsiniz.