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.