Anda di halaman 1dari 11

Ronny Usman Santoso (04110431)

MAKING WINDOWS SCREENSAVER WITH


DE!HI
"a#$%&o'n(
Sebuah screensaver Windows secara umum hanya sebuah Windows executable
standar yang telah diberi nama kembali dengan sebuah ekstensi .SCR. Agar dapat
berhubungan dengan baik dengan Control Panel Desktop bagaimanapun beberapa
syarat harus dipenuhi. Secara umum program screeensaver tersebut harus!
"empunyai pengaturan optional
"enyediakan deskripsi dari program itu sendiri
Ada perbedaan antara mode akti# dan mode kon#igurasi
$idak mengi%inkan beberapa copy dari dirinya sendiri untuk ber%alan
secara bersamaan
&eluar saat user menekan sebuah tombol atau memindahkan mouse
G)tt*n% Sta&t)(
Screensaver yang akan kita buat akan mengosongkan layar dan memulai untuk
menggambar sebuah sphere pada lokasi yang acak pada layar secara periodik
menghapus dan memulai lagi untuk menggambar. Pengguna dapat menetukan %umlah
maksimum dari sphere yang akan digambar sebelum mulai menghapus dan %uga
menetukan ukuran dan kecepatan dari penggambaran.
'ntuk memulai buka sebuah pro%ect kosong yang baru dengan memilih (ew Pro%ect
dari menu )ile Delphi.
Con+*%'&at*on ,o&m
*al pertama yang dilihat kebanyakan orang dari sebuah sreensaver adalah setup
dialog. Pada dialog tersebut user menentukan nilai dari pilihan yang sesuai untuk
screensaver. 'ntuk membuat sebuah #orm seperti itu rubah properties dari )orm+
seperti di bawah ini!
BorderIcons [biSystemMenu]
biSystemMenu True
biMinimize False
biMaximize False
BorderStyle bsDialog
Caption Configuration
eig!t "#$
%ame CfgFrm
&osition poScreenCenter
'isible False
(idt! $##
&ita ingin agar dapat mengubah %umlah maksimum dari sphere yang digambar pada
layar ukuran dari sphere dan kecepatan penggambaran dari sphere. 'ntuk melakukan
ini tambahkan tiga Label (Standard Palette) dan SpinEdit (Sample Palette) ,catatan!
anada dapat menyorot teks di bawah ini copy ke dalam clipboard dan Paste ke atas
#orm kon#igurasi untuk membuat komponen-komponen di atas.
ob)ect *abel"+ T*abel
*eft , "#
Top , "-
(idt! , ./
eig!t , "#
0lignment , ta1ig!t2ustify
Caption , 3Sp!eres+3
end
ob)ect *abel$+ T*abel
*eft , 4"
Top , .-
(idt! , 55
eig!t , "#
0lignment , ta1ig!t2ustify
Caption , 3Size+3
end
ob)ect *abel5+ T*abel
*eft , $-
Top , --
(idt! , 4.
eig!t , "#
0lignment , ta1ig!t2ustify
Caption , 3Speed+3
end
ob)ect spnSp!eres+ TSpin6dit
*eft , /4
Top , ".
(idt! , .5
eig!t , $#
Max'alue , .77
Min'alue , "
Tab8rder , 7
'alue , .7
end
ob)ect spnSize+ TSpin6dit
*eft , /4
Top , ..
(idt! , .5
eig!t , $#
Max'alue , $.7
Min'alue , .7
Tab8rder , "
'alue , "77
end
ob)ect spnSpeed+ TSpin6dit
*eft , /4
Top , -.
(idt! , .5
eig!t , $#
Max'alue , "7
Min'alue , "
Tab8rder , $
'alue , "7
end
Akhirnya kita membutuhkan tiga tombol --/& Cancel dan $est. $ombol $est tidak
men%adi suatu keharusan untuk screensaver setup dialog tetapi hal tersebut sangat
tepat dan mudah untuk diimplementasikan. $ambahkan tiga tombol seperti di bawah
ini dengan menggunakan tombol BitBtn pada Additional palette!
ob)ect btn89+ TBitBtn
*eft , ".5
Top , ""
(idt! , /-
eig!t , 54
Tab8rder , 5
9ind , b:89
end
ob)ect btnCancel+ TBitBtn
*eft , ".5
Top , ."
(idt! , /-
eig!t , 54
Tab8rder , 4
9ind , b:Cancel
end
ob)ect btnTest+ TBitBtn
*eft , ".5
Top , -"
(idt! , /-
eig!t , 54
Caption , 3Test;;;3
Tab8rder , .
9ind , b:Ignore
end
Setelah kita mempunyai layout dari #orm kita perlu untuk menambahkan beberapa
kode agar dapat beker%a. Pertama-tama kita perlu membuatnya agar dapat load dan
menyimpan kon#igurasi yang telah ada. 'ntuk melakukannya kita harus
menempatkan nilai Sphere Si0e dan Speed ke dalam sebuah #ile initiali0ation ,1.2(2.
dalam directory Windows pengguna. /b%ek TiniFile milik Delphi sangat tepat untuk
hal ini.
Pada #orm Setup pindah ke code view ada tambahkan pernyataan uses seperti di
bawah ini ke bagian implementation dari unit #orm con#iguration!
uses
IniFiles<
&emudian tambahkan prosedur di bawah ini ke bagian private dari deklarasi
$C#g)rm!
procedure *oadConfig<
procedure Sa=eConfig<
Se:arang tamba!:an definisi prosedur di ba>a! ini setela! pernyataan
implementation+
const
CfgFile , 3S&616S;I%I3<
procedure TCfgFrm;*oadConfig<
=ar
inifile + TIniFile<
begin
inifile +, TIniFile;Create?CfgFile@<
try
>it! inifile do begin
spnSp!eres;'alue +, 1eadInteger?3Config3A 3Sp!eres3A .7@<
spnSize;'alue +, 1eadInteger?3Config3A 3Size3A "77@<
spnSpeed;'alue +, 1eadInteger?3Config3A 3Speed3A "7@<
end<
finally
inifile;Free<
end<
end< BTCfgFrm;*oadConfigC
procedure TCfgFrm;Sa=eConfig<
=ar
inifile + TIniFile<
begin
inifile +, TIniFile;Create?CfgFile@<
try
>it! inifile do begin
(riteInteger?3Config3A 3Sp!eres3A spnSp!eres;'alue@<
(riteInteger?3Config3A 3Size3A spnSize;'alue@<
(riteInteger?3Config3A 3Speed3A spnSpeed;'alue@<
end<
finally
inifile;Free<
end<
end< BTCfgFrm;Sa=eConfigC
3ang tersisa untuk #orm kon#igurasi adalah untuk merespon beberapa event agar dapat
me-load dan save kon#igurasi dengan baik. Pertama-tama kita perlu untuk me-load
kon#igurasi secara otomatis ketika program start-up. &ita dapat memakai event
/nCreate untuk melakukan hal ini. Double-Click event OnCreate di bagian event
pada ob%ect inspector dan masukkan kode di bawah ini!
procedure TCfgFrm;FormCreate?Sender+ T8b)ect@<
begin
*oadConfig<
end< BTCfgFrm;FormCreateC
4alu double-click tombol /&. &ita perlu menyimpan kon#igurasi yang telah ada dan
menutup window ketika /& ditekan %adi tambahkan kode di bawah ini!
procedure TCfgFrm;btn89Clic:?Sender+ T8b)ect@<
begin
Sa=eConfig<
Close<
end< BTCfgFrm;btn89Clic:C
'ntuk menutup #orm ,tanpa menyimpan. ketika tombol Cancel ditekan double-click
tombol Cancel dan tambahkan!
procedure TCfgFrm;btnCancelClic:?Sender+ T8b)ect@<
begin
Close<
end< BTCfgFrm;btnCancelClic:C
Pada akhirnya untuk mencoba screensaver kita akan menun%ukkan #orm screensaver
,yang belum kita buat.. Double-click tombol $est dan tambahkan kode berikut ini!
procedure TCfgFrm;btnTestClic:?Sender+ T8b)ect@<
begin
ScrnFrm;S!o><
end< BTCfgFrm;btnTestClic:C
S#&))nsa-)& ,o&m
Screensaver itu sendiri akan berupa tampilan yang luas hitam #orm yang tidak dapat
di-caption yang menutupi seluruh layar ketika ob%ek digambar. 'ntuk membuat #orm
kedua select (ew )orm dari menu )ile dan menun%ukkan sebuah 5#orm kosong6
ketika dilihat dari 7rowse 8alery.
BorderIcons []
biSystemMenu False
biMinimize False
biMaximize False
BorderStyle bs%one
Color clBlac:
FormStyle fsStay8nTop
%ame ScrnFrm
'isible False
'ntuk #orm ini tambahkan satu komponen 9sebuah $imer dari System Palette pada
Delphi Component Palette. Atur propertiesnya seperti di bawah ini!
ob)ect tmrTic:+ TTimer
6nabled , False
8nTimer , tmrTic:Timer
*eft , "--
Top , "$$
end
$idak ada komponen lain yang diperlukan untuk #orm ini. (amun kita akan
membutuhkan beberapa kode untuk menggambar sphere. Pindah ke kode window
milik Scrn)rm. Pada bagian private $Scrn)rm tambahkan deklarasi prosedur seprti di
bawah ini!
procedure Dra>Sp!ere?xA yA size + integer< color + TColor@<
Sekarang pada bagian implementation dari unit tambahkan kode untuk prosedur ini!
procedure TScrnFrm;Dra>Sp!ere?xA yA size + integer< color + TColor@<
=ar
iA d> + integer<
cxA cy + integer<
xy"A xy$ + integer<
rA gA b + byte<
begin
>it! Can=as do begin
BFill in t!e pen D brus! settings;C
&en;Style +, psClear<
Brus!;Style +, bsSolid<
Brus!;Color +, color<
B&repare colors for sp!ere;C
r +, Eet1'alue?color@<
g +, EetE'alue?color@<
b +, EetB'alue?color@<
BDra> t!e sp!ere;C
d> +, size di= "#<
for i +, 7 to ". do begin
xy" +, ?i F d>@ di= $<
xy$ +, size G xy"<
Brus!;Color +, 1EB?Min?r H ?i F /@A $..@A Min?g H ?i F /@A
$..@A
Min?b H ?i F /@A $..@@<
6llipse?x H xy"A y H xy"A x H xy$A y H xy$@<
end<
end<
end< BTScrnFrm;Dra>Sp!ereC
eperti yang dapt kamu lihat dari kode di atas kita memberikan koordinat ,xy. dari
sphere bagian atas po%ok kiri dan %uga diameter dan warna dasar. &emudian untuk
menggambar sphere kita mulai dengan peningkatan warna secara perlahan ,brush.
dari warna dasar yang diberikan. Dengan brush yang baru kita menggambar sebuah
lingkaran terpusat yang lebih kecil dengan yang sebelumnya.
Anda akan mendapatkan pesan yang akan tertu%u pada #ungsi Min(). 2ni adalah bukan
#ungsi standar dari delphi %adi kita harus menambahkannya ke dalam unit di atas
deklarasi untuk DrawnSphere().
function Min?aA b + integer@ + integer<
begin
if b I a t!en
1esult +, b
else
1esult +, a<
end< BMinC
'ntuk memanggil secara periodik #ungsi DrawnSphere() kita harus merespon pada
event OnTimer dari komponen $imer yang kita telah tambahkan pada S!rnFrm.
Double-Click komponen $imer pada #orm dan isi prosedur yang telah ada dengan
kode berikut!
procedure TScrnFrm;tmrTic:Timer?Sender+ T8b)ect@<
const
sp!count + integer , 7<
=ar
xA y + integer<
size + integer<
rA gA b + byte<
color + TColor<
begin
if sp!count J CfgFrm;spnSp!eres;'alue t!en begin
1efres!<
sp!count +, 7<
end<
Inc?sp!count@<
x +, 1andom?Client(idt!@<
y +, 1andom?Clienteig!t@<
size +, CfgFrm;spnSize;'alue H 1andom?.7@ G $.<
x +, x G size di= $<
y +, y G size di= $<
r +, 1andom?K/7@<
g +, 1andom?K/7@<
b +, 1andom?K/7@<
Dra>Sp!ere?xA yA sizeA 1EB?rA gA b@@<
end< BTScrnFrm;tmrTic:TimerC
Prosedur ini men%aga %umlah dari sphere yang akan digambar dalam "ph!o#nt dan
re#resh ,menghapus. layar ketika mencapai %umlah maksimum. Sementara itu
prosedur tersebut menghitung posisi random:acak ukuran dan warna untuk sphere
selan%utnya yang akan digambar. ,Catatan! cakupan warna dibatasi hanya paruh
pertama dari spektrum yang terang untuk memberikan kedalaman yang lebih besar
kepada pembentukan bayangan..
Seperti yang telah diberikan prosedur tmrTi!$Timer() mengacu pada C%gFrm untuk
menerima kon#igurasi. Agar hal tersebut dapat dikenali tambahkan ke pernyataan
uses ini ke bagian implementasi dari unit!
uses
Cfg<
Selan%utnya kita membutuhkan suatu cara untuk menonakti#kan screensaver ketika
sebuah tombol ditekan mouse dipindah atau screensaver kehilangan #okusnya. Satu
%alan untuk melakukan ini adalah membuat sebuah handler untuk event Application
OnMe""age yang berisi kondisi yang cukup untuk mengakhiri screensaver.
Pertama-tama tambahkan deklarasi variabel ini ke badian implementation dari unit!
=ar
crs + T&oint<
;ariabel ini akan digunakan untuk menyimpan posisi original dari kursor mouse
untuk perbandingan selan%utnya. Sekarang tambahkan deklarasi berikut ini ke bagian
private dari TS!rFrm&
procedure Deacti=ateScrnSa=er?=ar Msg + TMsg< =ar andled +
boolean@<
$ambahkan kode dibawah ini ke dalam implementation dari unit!
procedure TScrnFrm;Deacti=ateScrnSa=er?=ar Msg + TMsg< =ar andled +
boolean@<
=ar
done + boolean<
begin
if Msg;message , (MLM8MS6M8'6 t!en
done +, ?0bs?*8(81D?Msg;l&aram@ G crs;x@ J .@ or
?0bs?I(81D?Msg;l&aram@ G crs;y@ J .@
else
done +, ?Msg;message , (ML96ND8(%@ or ?Msg;message , (ML0CTI'0T6@
or
?Msg;message , (ML0CTI'0T60&&@ or ?Msg;message ,
(ML%C0CTI'0T6@<
if done t!en
Close<
end< BTScrnFrm;Deacti=ateScrnSa=erC
&etika sebuah window pesan 'M(MO)SEMO*E diterima kita membandingkan
koordinat baru dari mouse dengan koordinat sebelumnya. <ika telah dipindahkan lebih
dari batas yang kita tentukan ,= pixel untuk semua arah. kemudian kita menutup
screensaver. (amun %ika sebuah tombol ditekan dan window lainnya mengambil
#ocus screensaver tertutup.
Agar proses ini dapat ber%alan bagaimanapun kita memerlukan unuk mengatur
property Application.OnMe""age dan mendapatkan posisi awal dari kursor mouse.
$empat yang terbaik untuk melakukan hal ini adalah di OnShow event handler dari
#orm!
procedure TScrnFrm;FormS!o>?Sender+ T8b)ect@<
begin
EetCursor&os?crs@<
tmrTic:;Inter=al +, "777 G CfgFrm;spnSpeed;'alue F -7<
tmrTic:;6nabled +, true<
0pplication;8nMessage +, Deacti=ateScrnSa=er<
S!o>Cursor?false@<
end< BTScrnFrm;FormS!o>C
Disini kita %uga menentukan interval dari $imer dan mengakti#kannya %uga
menyembunyikan kursor mouse. 'ntuk melepaskan hal tersebut dilakukan dalam
event On+ide dari #orm!
procedure TScrnFrm;Formide?Sender+ T8b)ect@<
begin
0pplication;8nMessage +, nil<
tmrTic:;6nabled +, false<
S!o>Cursor?true@<
end< BTScrnFrm;FormideC
Pada akhirnya kita kita harus memastikan #orm screensaver akan mengisi seluruh
layar ketika dieksekusi. 'ntuk melakukannya tambahkan kode berikut ke event
OnA!ti,e pada #orm!
procedure TScrnFrm;Form0cti=ate?Sender+ T8b)ect@<
begin
(indo>State +, >sMaximized<
end< BTScrnFrm;Form0cti=ateC
Simpan unit S!rnFrm dengan nama 5SCR(.PAS6.
T.) S#&))nsa-)& D)s#&*/t*on
Anda dapat memberikan teks yang akan muncul di da#tar screensaver Control Panel
Desktop dengan menambahkan sebuah >?D teks@ directive pada pro%ect source #ile.
Directive ?D menyisipkan teks yang diberikan kedalam entry modul deskripsi pada
#ile executable. Agar Control Panel mengenali teks tersebut anda harus memulai
dengan kata ASCR(SA;BA yang diikuti dengan deskripsi.
Pilih Pro%ect Source dari menu Delphi ;iew %adi anda dapat meng-edit source #ile.
Dibawah directive A>?R 1.RBS@A tambahkan baris berikut!
BKD SC1%S0'6 Sp!eres Screen Sa=erC
$eks 5Sphere ScreenSaver6 akan muncul di dalam da#tar Control Panel dari
screensaver yang tersedia ketika kita menyelesaikan pro%ect ini.
A#t*-) V)&s's Con+*%'&at*on Mo()
Windows men%alankan screensaver dalam dua kondisi yang mungkin! +. ketika
screensaver diakti#kan dan C. ketika screensaver sedang dikon#igurasi. Pada kedua
kondisi tesebut Windows men%alankan program yang sama. Perbedaan antara kedua
mode dengan menambahkan sebuah commang line parameter 95:s6 untuk mode akti#
dan 5:c6 untuk mode kon#igurasi. 'ntuk screensaver kita untuk ber#ungsi dengan baik
dengan control panel hal tersebut harus memeriksa command line untuk switching
ini.
A#t*-) Mo()
&etika screensaver memasuki active mode ,:s. kitaperlu membuat dan memunculkan
#orm screensaver. &ita %uga perlu untuk membuat #orm kon#igurasi yang berisi semua
option kon#igurasi. &etika #orm screensaver tertutup seluruh program harus dapat
diakhiri ,terminate.. *al ini sesuai dengan de#inisi dari sebuah Delphi "ain )orm 9
sebuah #orm yang akam mulai ketika program start dan memberikan tanda akhir dari
aplikasi ketika #orm tertutup.
Con+*%'&at*on Mo()
&etika screensaver memasuki mode kon#igurasi ,:c. kita perlu membuat dan
menampilkan #orm kon#igurasi. &ita harus membuat #orm screensaver pada saat user
ingin mengu%i option kon#igurasi. 7agaimanapun ketika #orm kon#igurasi ditutup
seluruh program harus diakhiri ,terminate.. Pada kasus ini #orm kon#igurasi
memenuhi de#inisi dari main #orm.
D)+*n*n% t.) Ma*n ,o&m
2delanya kita ingin untuk mengidenti#ikasi Scrn)rm sebagai "ain )orm ketika
sebuah :s muncul pada command line dan C#g)rm sebagai main #orm ketika keadaan
sebaliknya. 'ntuk melakukannya membutuhkan pengetahuan atas #asilitas dari ob%ek
;C4 $Application yang tidak terdokumentasikan. "ain #orm adalah #orm pertama
yang dibuat dengan sebuah call ke Application Create)orm,.. <adi untuk
mende#inisikan "ain )orm yang berbeda berdasarkan kondisi saat aplikasi ber%alan
modi#ikasi pro%ect source seperti di bawah ini!
begin
if ?&aramCount J 7@ and ?MpperCase?&aramStr?"@@ , 3OS3@ t!en begin
BScrnFrm needs to be t!e Main Form;C
0pplication;CreateForm?TScrnFrmA ScrnFrm@<
0pplication;CreateForm?TCfgFrmA CfgFrm@<
end else begin
BCfgFrm needs to be t!e Main Form;C
0pplication;CreateForm?TCfgFrmA CfgFrm@<
0pplication;CreateForm?TScrnFrmA ScrnFrm@<
end<
0pplication;1un<
end;
*anya dengan mengubah urutan pembuatan kita dapat secara otomatis mengatur
"ain )orm sesuai untuk ke%adian tersebut. Sebagai tambahan main #orm akan secara
otomatis ditampilkan walaupun kita telah mengatur ;isible Properties men%adi )alse
untuk kedua #orm. Sebagai hasilnya kita mendapatkan e#ek yang kita mau dengan
hanya kode yang sedikit.
,catatan! untuk pernyataan 2) yang ada di atas option 5Complete boolean eval6 harus
dalam keadaan tidak tercentang pada Option"-Pro.e!t-Compiler Settings. <ika tidak
sebuah error akan muncul %ika program diberi masukan dengan parameter command
line yang kosong..
'ntuk menggunakan #ungsi Delphi )pperCa"e() S/")til" harus disertakan dalam
pernyataan uses pada pro%ect #ile!
uses
FormsA SysMtilsA
Scrn in 3SC1%;&0S3 BScrnFrmCA
Cfg in 3CFE;&0S3 BCfgFrmC<
"0o#$*n% M'0t*/0) Instan#)
Salah satu kesulitan dengan Windows screensaver adalah mereka harus mencegah
ber%alannya beberapa program:ke%adian secara bersamaan. Dengan kata lain
Windows akan terus men%alankan sebuah screensaver sesuai dengan %angka waktu
yang tersisa walaupun sebuah program yang sama %uga akti#.
'ntuk menghalangi beberapa screensaver kita ber%alan secara bersamaan modi#ikasi
#ile pro%ect source untuk menambahkan pernyataan 2) yangditun%ukkan di bawah ini!
begin
B8nly one instance is allo>ed at a time;C
if !&re=Inst , 7 t!en begin
if ?&aramCount J 7@ and ?MpperCase?&aramStr?"@@ , 3OS3@ t!en
begin
;;;
end<
0pplication;1un<
end<
end<
;ariabel hPrev2nst adalah global variabel yang dide#inisikan oleh Delphi untuk
menandai instance yang sebelumnya dari program yang ber%alan sekarang. (ilainya
akan nol %ika tidak ada instance sebelumnya yang sedang ber%alan.
Sekarang simpan pro%ect #ile sebagai 5SP*BRB.DPR6dan compile program tersebut.
Dengan hal tersebut anda seharusnya dapat men%alankan screensaver tersebut. $anpa
parameter command line apapun program seharusnya akan men%alankan
con#iguration mode secara de#ault. Dengan memberikan 5:s6 sebagai parameter
command line yang pertama anda dapat mengu%i active mode.
Insta00*n% t.) S#&))nsa-)&
Satelah anda telah mengu%i dan men-debug screensavermu anda telah
meng-installnya. 'ntuk melakukan cara lain copy #ile executable ,SP*BRB.BDB. ke
direktori Windows rubah ekstensi #ilename ke .SCR ,SP*BRB.SCR.. &emudian
%alankan Control Panel double-click pada Desktop dan pilih Screensaver E (ame.
Anda seharusnya telah melihat 5Spheres Screensaver6 pada da#tar screensaver yang
dapat digunakan.

Anda mungkin juga menyukai