You are on page 1of 368

1

Uygulamalı
Genel
Programlama

Bilgi paylaştıkça...

Gecenin derinliğinde
Dinleyen bilir, h×Ģ×rt×lar×n
Ne kadar dinlendirici olduğunu

Tarık Bağrıyanık
2

İçindekiler
GiriĢ ve Kitab×n Kullan×m× .............................................................................................................................4
Yazar Hakk×nda ..........................................................................................................................................7
Yaz×l×m GeliĢtirme ve B™cek Ay×klama ............................................................................................................8

Bölüm 1 – Assembler ................................................................................................................................ 10


1. Mavi.txt (mavi renkli ekran) ................................................................................................................... 14
2. meraba.asm (merhaba džnya!) .............................................................................................................. 18
3. kucuk.asm (bžyžk harfe Œevirir) ............................................................................................................. 20
4. cizim.asm (klavye ile Œizim yapma) ......................................................................................................... 21
5. Fridge (intro yap×m×) ............................................................................................................................. 23

Bölüm 2 – Basic ........................................................................................................................................ 26


1. piyano.bas (mžzik) ............................................................................................................................... 26
2. kutu.bas (kutu Ģekli) ............................................................................................................................. 27

Bölüm 3 – C Dili ........................................................................................................................................ 29


1. s×ralama (balon, seŒerek ve h×zl× s×ralama) ............................................................................................... 35
2. makro.c (#define kullan×m×) ................................................................................................................... 38
3. unionreg.c (union tan×mlama)................................................................................................................. 39
4. mousetst.c (fare kullan×m×) .................................................................................................................... 40
5. klvy.c (klavye ile Œizim yapma) ............................................................................................................... 42
6. domgunu.c (tarihin gžnžnž bulma) ......................................................................................................... 44
7. saat.c (DOS saati) ................................................................................................................................. 46
8. Grafikli.c (fareli grafik ekran) .................................................................................................................. 48

Bölüm 4 – Pascal ...................................................................................................................................... 54


1. txtall.pas (metin dosyalar× aŒma) ............................................................................................................ 55
2. diyot1.pas (grafik ekrana Ģekil Œizme)...................................................................................................... 56
3. hesapmak.pas (hesap makinesi yap×m×) ................................................................................................... 58
4. matrice.pas (matrisler) .......................................................................................................................... 60

Bölüm 5 – Delphi ...................................................................................................................................... 62


1. Agent (Microsoft Agent kullan×m×) ........................................................................................................... 69
2. CD (g™rev Œubuğunda program Œal×Ģt×rma) ............................................................................................... 76
3. create (nesne oluĢturma) ....................................................................................................................... 81
4. Dergilerim (basit veritaban× uygulamas×) .................................................................................................. 84
5. DLL (Dynamic Linking Library) ................................................................................................................ 89
6. Meraba (resimli ekran koruyucusu) ......................................................................................................... 93
7. ParalelPort (Win9x iŒin paralel veriyolu kullan×m×) ................................................................................... 103
8. Saat (yuvarlak form ve Œizim yap×lmas×) ................................................................................................ 111
9. Sozluk (Ġngilizce TžrkŒe s™zlžk) ............................................................................................................ 115
10. surukle (nesne sžržkleme ve yaz×c× kullan×m×) ...................................................................................... 117
11. Thread (iĢlemciyi daha verimli kullanma) ............................................................................................. 120
12. Sysmenu (sistem menžsžne eleman eklenmesi) ................................................................................... 126
13. TuĢ Bas×m× (klavye ve fare bas×mlar×n× kontrol etme) ............................................................................. 127
14. 2 Boyutlu Oyun Yap×m× (TicTacToe, Pazl, Mayn oyunlar×) ........................................................................ 129
15. Gezgen (Windows Gezgini yap×m×) ....................................................................................................... 146
16. Dosya iĢlemi (Write ve Read komutlar× ile dosyalama) ........................................................................... 152
17. Dosya Listele (dosya bulma iĢlemleri) .................................................................................................. 155
18. think2 (kendiliğinden dizilen nesneler) ................................................................................................. 160
19. DirectX ve OpenGL programc×l×ğ× (grafik programc×l×ğ×) .......................................................................... 164
20. MS Peint (PaintBrush yap×m×) .............................................................................................................. 168
21. Say× Bulmaca Oyunu (4 haneli say×)..................................................................................................... 174
22. Veritaban× Grafik Analizi (DBChart kullan×m×) ........................................................................................ 176
23. Okul Ders Program× (Haftal×k ders program× yap×m×) .............................................................................. 179
24. Dolphin (mžzik yapma program×) ........................................................................................................ 191
25. Ofis (basit bir veritaban× uygulamas×)................................................................................................... 200
26. Tercuman (Ġngilizce‟den TžrkŒe‟ye Œeviri ve okuma program×)................................................................. 202
27. CGI kullan×m×(Common Gateway Interface) .......................................................................................... 208
28. „ğrenci Bilgi ĠĢleri (paradox veritaban× ™rnekleri) .................................................................................. 211
3

29. Bit Filtrele (8 bit bilgiden seŒim yapma) ............................................................................................... 213


30. Ekran izimi (ekrana Œizim yaparak, ders anlat×m×) ................................................................................ 215
31. Asans™r (4 kat binan×n asans™r simžlasyonu) ....................................................................................... 216

Bölüm 6 – Visual Basic ........................................................................................................................... 219


1. Sendkeys (diğer uygulamalara tuĢ bas×m× yollama) ................................................................................. 219
2. Final (hesap makinesi yap×m×) .............................................................................................................. 220
3. Listbox (Print ve Input komutlar× ile dosyalama) ..................................................................................... 225
4. Fractal (pset grafik komutu) ................................................................................................................. 228

Bölüm 7 – Diğer Diller ve çalışmalarım ................................................................................................... 231


1. Delphi ActiveX (web sayfas×nda ActiveX) ................................................................................................ 231
2. Excel yaziyla.xls (rakam× yaz×ya Œevirme) ............................................................................................... 234
3. Excel dosyalistesi.xls (dosya arama) ...................................................................................................... 236
4. Excel userform.xls (kullan×c× tan×ml× formlar) .......................................................................................... 238
5. Excel ile tarih d™kžmž (modžl kullan×m×)................................................................................................ 240
6. WSH ile say× toplama (*.vbs dosyalar) ................................................................................................... 242
7. WSH ile dosya listeleme (*.vbs ile Excel otomasyonu) ............................................................................. 244
8. kopyala komutu (batch ve Pascal dili kullanarak) .................................................................................... 245
9. JavaScript ile dosyalama (rasgele yaz× kayd×r×lmas×) ................................................................................ 249
10. JavaScript ve Flash (rasgele yaz× kayd×r×lmas×) ...................................................................................... 254
11. JavaScript ile arama (*.html iŒinde arama) ........................................................................................... 258
12. ASP ile misafir defteri (*.asp ve *.mdb veritaban×) ................................................................................ 259
13. Yunus Programlama Dili (TžrkŒe aŒ×k kaynak programlama projesi) ......................................................... 272
14. KžPro (Web tabanl× uygulama geliĢtirme) ............................................................................................. 281
15. MyBoard (Flash ile dijital devre tasar×m×) .............................................................................................. 284
16. SiPro (Web tabanl× s×nav program× geliĢtirme) ....................................................................................... 287
17. Denklemler (Excel ile denklem Œ™zžmž) ............................................................................................... 296
18. ASP.NET uygulamas× (Online Telefon Defteri) ........................................................................................ 299
19. okul3d (Sanal GerŒeklik „rneği - VRML) ............................................................................................... 314
20. Net Pazar (PHP ve MySQL ile internette bit pazar× kurmak) ..................................................................... 316
21. Trafik Simulasyonu (Flash Action Script) .............................................................................................. 319
22. Labirent Robotu Simulasyonu (Flash 8 Action Script) ............................................................................. 322
23. dbase uygulamalar× ........................................................................................................................... 325
24. Ev Kon (internet žzerinden ev kontrolž) ............................................................................................... 328
25. PIC (Peripheral Interface Controller) .................................................................................................... 334

Ek 1 – Algoritma Oluşturmak .................................................................................................................. 341

Ek 2 – SQL .............................................................................................................................................. 342

Ek 3 – ASCII Kod Tablosu ....................................................................................................................... 343

Ek 4 – InstallShield’in Kullanımı ............................................................................................................. 345

Ek 5 – CD’de Neler Var? .......................................................................................................................... 349

Ek 6 – Sözlük .......................................................................................................................................... 353

Dizin ....................................................................................................................................................... 357

Son söz ................................................................................................................................................... 366

Kaynaklar ............................................................................................................................................... 367


4

Giriş ve Kitabın Kullanımı

Kitap ve CD‟ deki ™rnekler, programc×l×ğa heveslenen insanlar×m×za basit, derine girmeden, ™z ve faydaland×r×c×
Ģekilde verilmeye Œal×Ģ×ld×. Ders kitab× olarak değil de, örnekler žzerine kurulu, pratik yapma, fikir verme, y™ntemler
g™sterme ve kendi programc×l×k felsefenizi oluĢturmaya yard×mc× olmak amac× ile haz×rlad×m. Akl×n×zda planlad×ğ×n×z
ama nas×l yap×ld×ğ×n× kestiremediğiniz programlama ™rneklerinin benzerlerini burada bulabilirsiniz. Kitaptaki ™rnekleri
CD‟den bağ×ms×z olarak da yapabilirsiniz. Bir tžrlž yapt×ğ×n×z program Œal×Ģm×yorsa, yaz×m hatalar×na ve kitapta verilen
tžm kodlara dikkatle bak×n×z. Her ne kadar hepsi Œal×Ģ×yor desem de donan×m, iĢletim sistemi ve yaz×l×m altyap×s× farkl×
sistemlerde sorunlar Œ×kabiliyor. Mesela NT tabanl× bilgisayarlarda Paralel Port ™rneği bir iĢe yaram×yor, Delphi 6 ile
yazd×ğ×m baz× programlar eski sžržmlerde Œal×Ģm×yor veya baz× GWBasic programlar× Qbasic ile aŒ×lam×yor gibi
problemler var.

Elimden geldiğince Türkçe‟mize de dikkat ederek kitab×n aŒ×k olmas×n× sağlamaya gayret ettim. Metin kelimesi
TžrkŒe kaynakl× m× bilmiyorum, fakat string ve text kelimeleri yerine metin kulland×m. Baz× Ġngilizce kelimelerin de
okunuĢlar×n× italik olarak belirttim, kitap sonundaki s™zlžk ile tak×ld×ğ×n×z kelimeleri bulabilirsiniz. Yine de siz
yak×n×n×zda bir s™zlžk bulundurun. Kod ve normal yaz×y× farkl× font – yaz× tipi ile belirgin hale getirmeye Œal×Ģt×m. Kod
yazarken tek t×rnak, Œift t×rnak ve boĢluklar×n rahat okunmas× iŒin Arial kulland×m. AŒ×klama sat×rlar×n× bu fontun kal×n
olmayan× Ģeklinde haz×rlad×m. Baz× durumlarda „ tek t×rnak, “ Œift t×rnak, 0 s×f×r, o harfi, I bžyžk ×, l kžŒžk le birbirine
benziyor. TuĢ birleĢimleri “Alt+Tab” deyimindeki gibi + ile birleĢtirilerek yazd×m. Menž komutlar× “” iŒinde aralar× * ile
ayr×larak “BaĢlat*al×Ģt×r...*msconfig” gibi kullan×l×yor. Baz× kodlar×n mavi renk olmas× onlara dikkat edilmesi gerektiği
anlam×nda kulland×m. Normal yaz×mda ise kenarlar× džzgžn olan Verdana yaz× tipini seŒtim. Baz× b™lžmlerde yer
tasarrufu iŒin iki kolon Ģeklinde b™ldžm. Fakat ilk kez okumada insan×n “bunun devam× nerede?” diye kafas× kar×Ģ×yor.
Ġlk kolonun devam× o sayfadaki ikinci kolondur, sonra diğer sayfan×n ilk kolonuna devam edilir.

Fakat hala program kodlar×nda birŒok hata ve aŒ×klanmas× gerekli konular var. Size hiŒbir yaz×l×m×n veya
žržnžn kusursuz olmad×ğ×n× belirtmek istiyorum. Bu sebeple devaml× yeni sžržm programlar yaz×l×yor. Kitap iŒine
yay×lm×Ģ birŒok ipuçları bulunuyor. Tek sorun bu ipuŒlar×na hemen ulaĢamaman×z. oğu ™rnekte, bu ™rnekte Ģu olay×
da siz yapabilirsiniz, gibi deyimlerle Œal×Ģman×z iŒin fikirler vermeye Œal×Ģt×m. Yanl×Ģ anlamay×n, tžm ™rnekler Œal×Ģ×r
olduğu halde muhakkak siz de keĢke Ģu ™zellik de olsayd× demiĢsinizdir.

Ġnsan×m×z×n kitap okuma al×Ģkanl×ğ× olmad×ğ× džĢžnžlžrse, ™rneklere dayal× pratik yapmak daha ilgi Œekici ve
ak×lda kal×c× olduğuna inan×yorum. Bol bol ™rneklerle her an dilleri birbiri iŒine girmiĢ Ģekilde kitaba aktard×m. Her
b™lžmž ad×m ad×m geŒmenize gerek yok. „zellikle kendi ™rneklerimin verirken geliĢmeye aŒ×k olmalar×na gayret ettim.
Tabii benden daha yetenekli olan programc×lar×m×z×n Œok daha ileriye gideceklerinden eminim. Belki de kitab× dil
çöplüğü olarak da g™rebilirsiniz. oğu zaman ™yle hissediyorum. Yani bir dili iyi bilmek de yeterli olur…

Belki de kafan×z× en Œok kar×Ģt×ran anlat×m stili, C dilinde bir ™rnek anlat×rken bu iĢlevi Pascal‟daki Ģu ™rnekte
de yapsak gibi, kod džnyalar× ayr× dillerde ayn× beklentiye sahip olmak. Sizce de bu kod d™nžĢžmleri olamaz m×?
„rneğin VBA makrolar×ndaki tam arad×ğ×n×z Ģeyi Delphi‟de de yapamaz m×s×n×z? C dilinde header, Pascal‟da unit‟ler,
Delphi‟de DLL ve ActiveX ile anlatmak istediğim ana džĢžnce, global kod oluĢturmakt×r. Ticari amaŒla žretilen
Microsoft Windows, aŒ×k kod sistemi ile geliĢtirilen C diline dayal× Unix de bu mant×ğa dayal× olarak devaml× ilerliyor.
Microsoft firmas×n×n hemen her y×l Œ×kard×ğ× versiyonlu Windows, Office, VB ve DirectX kendi versiyonlar× aras×nda bile
uyumsuz.

YaklaĢ×k 15 farkl× dilden birŒok ™rneği aŒ×klamalar× ile karĢ×laĢ×rken bžtžn bu dillerin bilmek zorunda değilsiniz.
ok dil bilmekten daha ™nemli olan Ģey elinizdeki imkanlar× en iyi Ģekilde değerlendirmektir. „rnekleri noktas×
virgžlžne komut komut aŒ×klayamayacağ×m. Yani bilmediğimiz, ezberlemediğimiz birŒok nokta olacak. Zaten buradaki
amaŒ size tam olarak bu dilleri ™ğretmek değil, fikir vermek. Ne ile ne yapabilirsiniz gibi. Dile g™re konu belirlemek
yerine, konuya g™re istediğimiz dilde program yazabilmek as×l hedefimiz. Ama genel olarak sitenize misafir defteri
yerleĢtirmek istediğinizi džĢžnžrsek, bunu ASP veya PHP dilleri ile yapabiliriz, hesap tablolar× ile ilgilenmek istiyorsak
Excel, Access bize uygun, ilgi alan×m×z donan×m ise Assembler, C ve API‟ler yeterlidir. Džnyaya sadece belli aŒ×lardan
bakarak değil hedefimize g™re uygun alet edevat seŒerek ilerlemek gerekli. Art×k yaz×l×mlarda internet ağ×rl×k
kazan×yor. Ġnternet destekli olmayan programlar yavaĢ yavaĢ eleniyor. Temel neden gžncellenebilirlik ve iletiĢim.
Ġnternet, bilgisayar dergileri, bilgisayar kitaplar× ve okul bizim bilgi kaynaklar×m×z. delphiturk.com,
programmersheaven.com, ve benzeri sitelerden her tžrlž kod ve programlama bilgisine, en gžncel haberlere ve
ipuŒlar×na dergileri takip ederek ulaĢabilirsiniz.

UğraĢacağ×m×z diller Microsoft Windows žzerine olacak. Donan×m olarak ilk kulland×ğ×m intel386‟dan beri hiŒbir
Pentium veya baĢka iĢlemcide sorun Œ×kt×ğ×m× g™rmedim. Ġlle de Ģu iĢletim sistemi ve iĢlemci olacak diye bir
sorunumuz yok. „zellikle notepad - not defteri en bžyžk yard×mc×m×z. “Windows\SendTo” iŒine not defterine k×sayolu
5

oluĢturarak, herhangi bir dosyay× sağ t×klay×p “G™nder*Notepad” yapabilirsiniz. Crimson Editor ise gžzel bir not defteri
alternatifi. Kod renklendirme, bol geri alma, bžyžk dosyalar× kolay aŒma gibi ™zellikleri bağ×ml×l×k yapabilir.

„rnek kodlar ne ile Œal×Ģacak?

 Assembler (*.asm) : Tasm.exe, TLink.exe ve bunlar ait dpmiload.exe ve dpmimem.dll. Borland firmas×na ait olan
Turbo Pascal veya Turbo C'niz var ise bu dosyalar× “\Bin” dizininde bulabilirsiniz. CD'mizde de “Ornekler\Asm”
dizininde bunlar var. Bu arada “Windows\Command” dizinindeki debug program× da *.com dosya oluĢturmam×za
yard×mc× oluyor. Edit™r olarak not defteri kullanacağ×z. {DOS programc×l×ğ×}

 Basic (*.bas) : Gwbasic.exe sadece sat×r numaral× olan *.bas dosyalar× okuyabiliyor. Genellikle QuickBasic, VB
dilinin *.bas dosyalar× hariŒ tžm *.bas dosyalar× iĢler. {DOS programc×l×ğ×}

 Visual Basic (*.mak veya *.vbp - proje dosyas×, *.frm - kodlar, *.bas - modžl bilgileri) : VB4 ve žzeri yeterli.
{Windows programc×l×ğ×}

 C (*.c, *.cpp) : Turbo C veya Borland C gerekli. {DOS programc×l×ğ×}

 Pascal (*.pas) : Turbo Pascal veya Borland Pascal gerekli. {DOS programc×l×ğ×}

 Delphi (*.dpr - proje dosyas×, *.pas - unitler bu dosyalarda, *.dfm - form bilgileri) : Delphi 3 veya žzeri
gerekiyor. {Windows programc×l×ğ×}

 Excel (*.xls) : Tabii ki Office 9x ve žstž ile makrolar× iĢleyebilirsiniz. {Windows programc×l×ğ×}

 Flash (*.fla, *.swf) : Flash ile tasar×m yapabilir, Internet Explorer ile ™n izleme yapabilirsiniz, isterseniz exe
olarak da sonuŒ elde edebilirsiniz. {Windows programc×l×ğ×}

 VB Script (*.vbs) : WSH (Windows Scripting Host - Windows Komut Dosyas× Sistemi) kurulu ise soyad× *.vbs
(Visual Basic Script) veya *.js (J-Script) olan dosyalar Œal×Ģt×r×labilir haldedir. “Windows\Samples\WSH”
dizinindeki ™rneklere bir g™z at×n. Not defteri ile džzenlenebiliyorlar. {Windows programc×l×ğ×}

 Web sayfas× (*.htm, *.html, *.asp, *.php) : Not defteri veya FrontPage, Dreamweaver gibi programlar ile
tasarlan×p, Internet Explorer, Mozilla veya Netscape ile izlenebilir. *.asp iŒin ayr×ca IIS kurmak gerekiyor. *.php
iŒin de Xampp tavsiyem. {Internet programc×l×ğ×}

 VRML (*.wrl) : Virtual Reality Markup Language. G™ržntžlemek iŒin cortvrml.exe gerekiyor. Internet Explorer'da
g™rebilirsiniz sonuŒlar×. “cd2utility\VRML” dizininde edit™r ™rnekleri bulabilirsiniz. isa10.zip‟i tavsiye ederim.
{Internet programc×l×ğ×}

Eğer hala değiĢik uzant×l× dosyalar g™ržrseniz, Ģimdilik onlar bizim iĢimize yaram×yor. Mesela *.bak, *.~dp gibi
dosyalar programlama dilinin kendi yedek ve yard×mc× dosyalar×.

Siz de sonuŒta sistem yazılımı – system software (bilgisayar×n Œal×Ģmas× ile ilgili iĢletim sistemi gibi),
mesleki ve ticari yazılımı – application software (muhasebe, kelime iĢlemci gibi kullan×c×lara yard×mc×), yardımcı
programlar – utility (CD Player, ince ayar program×, mp3 Œal×c× gibi iĢlemler yapan), görüntüsel yazılım –
animation (oyun programlama, eğlence), yapay zeka – artificial intelligence (džĢžnen, ak×ll× robotlar) žzerine bir
program yazman×z gerekebilir. Herhangi bir dilde bu isteğinizi baĢarabilirsiniz. Unutmay×n ki kulland×ğ×m×z tžm
programlar ve iĢletim sistemleri bir programlama dili ile programc×lar×n elinden geŒmiĢ yaz×l×mlard×r. O kadar,
uzayl×lar×n bu iĢlerle ilgileri yok... Tak×m Œal×Ģmas×n× da unutmamak gerekli. „rneğin tek baĢ×n×za bir oyun program×n×n
mžziğini, seslendirmesini, hikaye ak×Ģ×n×, harita, nesne tasar×m×, yard×m ve kurulumunu yapman×z zor değil mi?
Elinizden geldiğince proje arkadaĢlar× edinip kendinizi ve tak×m×n×z× geliĢtirin. Her ne kadar bencillikte bizi kimse
geŒemese de, tak×m halinde olman×n verdiği zevk tek baĢ×na Œal×Ģmaktan Œok Œok daha fazla.

ġu ad×mlar da program geliĢtirme s×ras×nda yaĢad×ğ×m×z aĢamalard×r:


1. Daha iyi tasar×m ve geliĢtirme iŒin programa baĢlamadan ™nce mevcut sistemi analiz ederek, altyap×
haz×rlan×r.
2. Problemin tan×m× yap×l×r, sistem elemanlar× ile bu elemanlar aras×ndaki iliĢki ak×Ģ diyagramlar× ile belirtilir.
3. Sistemdeki haz×r bilgiler, kullan×c×lar iŒin gerekli Œ×kt×lar, teknik, ekonomik araĢt×rma bilgileri değerlendirilerek
programa baĢlan×r.
4. Girdi ve Œ×kt×lar etkin kullan×m iŒin tasarlan×r, kullan×c× arabirimi iyileĢtirilir.
5. Yap×lan program test aĢamas×nda ihtiyac× g™ržp g™rmediği belirlenir.
6

6. Yeni isteklere ve eski sistemlere olan uyumluluk kontrol edilir.


7. Program paketlenir ve yard×m k×sm×, d™kžmantasyon iĢlemleri yap×l×r.

Her an akl×m×zda olmas× gereken kullan×c×n×n program×n×z karĢ×s×nda verebileceği tepkilerdir. Eğer kullan×c×
dostu olmak yerine kendi yap×n×zda ×srar ederseniz sonunuz iyi olmayabilir. Genel standartlara ve prensiplere uymaya
Œal×Ģmak en iyisidir.
7

Yazar Hakkında
1975 K×rĢehir Kaman doğumluyum. Ne Amiga ile ne de Commodore ile uğraĢt×m. Windows 3.1 bile doğru
džzgžn kullanmad×m, Windows genel platformum. Linux (linuks, linaks, laynaks diye okunur) ve BeOS (bi o es diye
okunur) kurma denemelerim oldu ama en iyisi Ģimdilik Windows XP iĢletim sistemi. Kurulumu kolay, oyun (DirectX) ve
g™rsel programlama iŒin uygun. Asl×nda bu s™zleri biraz iŒim burkularak s™ylžyorum, Œžnkž keĢke Linux veya Unix iŒin
bunlar× s™yleseydim.

Bir ara elime bir el bilgisayar× olan Casio FX-880P geŒmiĢti. ĠŒindeki 64KB belleğine fazla uzun bir Ģey
yaz×lam×yordu, ama yine de Basic benzeri dili ile Shell ad×nda TžrkŒe programlama dili, ark×felek, Say× bulma, Batak
kağ×t gibi oyunlar yapm×Ģt×m. Kitab×n×n d™kžmantasyonu Œok hoĢuma gitmiĢti. Sade ve tžm komutlar× ™rnekle
anlatma.

1991‟den bu yana, liseden itibaren programlama ile ilgileniyorum. Windows programc×l×ğ× ile 1997‟de Visual
Basic ile baĢlad×m. As×l ilgi alan×m Delphi olduğu iŒin daha Œok bu dilde programlar×m× size tan×tacağ×m. Ġlk ™ğrendiğim
programlama dili lisede (Bal×kesir Anadolu Ticaret Meslek Lisesi) 1991'de GWBasic. Yani altyap× olarak Visual Basic'ci
olmam gerekirken Delphi beni m×knat×s gibi Œekti.

1993'de Marmara Teknik Eğitim Fakžltesi Ġngilizce Bilgisayar „ğretmenliğini kazanarak 5 y×ll×k eğitimde
s×ras×yla QuickBasic, Pascal, C, Assembler (8088), PLC, dbase, microcontroller (8051), ve VB3.0 ™ğrendik. Son y×lda
1998'de yani tez ortağ×m Batur Baykan ile Delphi 3.0'da tez haz×rlamaya karar verdik. BirkaŒ ay iŒinde Okul Ders
Program× adl× program ile cebelleĢmeye baĢlam×Ģt×k ve bir y×l boyunca (yaklaĢ×k 750 saat) birŒok Ģeyi zevkle Œ™zdžk.
Burada “team work” yani tak×m Œal×Ģmas× ile ilgili olarak size diyebileceğim, ortak ile Œal×Ģman×n tek baĢ×na iĢ
yapmaktan daha zevkli ve faydal× olduğudur.

Okuldan sonra da ™ğretmen olunca ™ğrendiğim dillere pek yenisini eklemedim. C++, Java, veya C# ™ğrenmek
Ģimdilik benim iŒin Œok ağ×r. Delphi ile Visual C‟yi karĢ×laĢt×rmay× pek gerek yok, ama Delphi de VC kadar zengin
kžtžphanelidir. PIC žzerine uğraĢlar×m devam ediyor.

Seviye olarak okuyucular×n orta seviyede olmas× gerekiyor, birkaŒ dilde bir Ģeyler yazm×Ģ olman×z gerek. Yani
size s×f×rdan bžtžn ayr×nt×lar× ile bir dilde bir program nas×l yaz×l×r anlatmayacağ×m. Bunun iŒin sevdiğiniz dili
belirleyip ona ™zel kitab× alman×z veya kurs / okuldan bunu edinmelisiniz. Asl×nda "Hangi dili ™ğrenmeliyim?" sorusuna
cevap vermeye Œal×Ģacağ×z. C ve benzeri, sadece programc×l×ğa giriĢ dili olmal× bence. Daha sonra da VB, Delphi veya
VC‟ye geŒilir. Asl×nda Basic‟den uzak durulmas× da tavsiye ediliyor. žnkž insanlara k™tž al×Ģkanl×klar kazand×r×yormuĢ.

G™rsel programlama ile kod yazmaktan kurtulunuyormuĢ gibi zannedilse de iyi bir program yazd×ğ×n×zda belki
program×n×z yžzlerce, binlerce sat×rdan oluĢacak. Daha ilerisi de VB.NET gibi internet tabanl× Windows programlar×na
benzeyen ve veritaban× kullanabilen programlar olacakt×r.

Site : www.yunus.projesi.com
Mail : tbagriyanik@mynet.com
ġehir : Ġstanbul / Tžrkiye

BaĢlang׌ Tarihi : 21 Haziran 2001 PerĢembe


Son gžncelleme : 2 Haziran 2009 Sal×
Toplam harf say×s× : 639889 adet
Toplam kod sat×r× : 12000 žzeri
Toplam kaydetme : 275 defa
Toplam sžre : 9,38 saat
Resim say×s× : 228 adet (7,2 MB – resimler “dosyaya bağl×” Ģeklide eklendi)
Tasar×m araŒlar× : Microsoft Windows XP TžrkŒe SP2, Delphi 7, Delphi2005, Visual Basic 6, VB.NET2003,
Borland Pascal 7.0, Turbo C++ 3.0, Qbasic 4.5, Microsoft Office 2003 TžrkŒe, Adobe
Photoshop CE, Macromedia Dreamweaver 8 ve Flash 8
Donan×m : P4 2400, 512 DDRAM, 160 GB, 128 MB GeForceFx5200, 17” LG 775FT, USR ADSL, Dell
Inspiron 6000 notebook
8

Yazılım Geliştirme ve Böcek Ayıklama


Doğruluk
Ġyi bir program×n temel ™zellikleri; bunlar×n s×ras× sizin stilinizi belirler:
: Verilen g™revlerin tam olarak yerine getirilmesi.
 Dayanıklılık : Beklenmedik hatalardan dolay× program×n Œal×Ģmas× kesilmemeli.
 Genişleyebilme : Ġleri aĢamalarda g™revlerin değiĢikliği veya yenilerinin eklenmesi kolay olmal×d×r.
 Basitlik : KarmaĢ×k tasar×mlardan kaŒ×nmak gerekir.
 Modülerlik : Program kodlar× baĢka programlarda da kullan×labilmelidir.
 Uyumluluk : BaĢka bilgisayar ve sistemlerde Œal×Ģabilmelidir.
 Kontrol edilebilirlik : Hata olabilecek yerlere aŒ×klay×c× hata mesajlar× konulmal×d×r.
 Kolay kullanım : Kullan×c× arabirimi kolay olmal× ve rahat ™ğrenilebilmelidir.
 Parçalanabilirlik : Problemi kžŒžk parŒalara ayr×larak yazmak.
 Anlaşılırlık : BaĢkas×n×n yazd×ğ× program elden geŒirilirken rahatŒa okunabilmeli.
 Koruma : Modžller birbirlerine mždahale etmemelidirler.

 Bir program yazarken aĢağ×daki ™neriler iĢinize yarayabilir:


 Yaz×l×m×n×z ne kadar bžyžrse o kadar iŒinde bug – böcek bulunma ihtimali artar.
 B™cek oluĢmas×n× nas×l ™nleyebileceğinizi, otomatik olarak nas×l yakalayabileceğinizi džĢžnmelisiniz.
 Algoritman×z× oluĢtururken, kullanacağ×n×z dili tam olarak ™ğrenerek koĢullar×n×z× tamamlay×n×z.
 Birden fazla yol g™z ™nžne alarak alternatifler ekleyin.
 al×Ģma an×nda beliren b™cek sinyallerini g™z ard× etmeyin. Kendi kendilerine kaybolmazlar. Bunu beklerseniz
onlar daha da bžyžrler.
 DeğiĢkenlerinizin değerlerini takip edin ve ayk×r× değerler almalar× ne zaman ve nerede oluĢuyor debug – b™cek
ay×klama ile g™ržn.
 Eğer program×n×z× kontrol amac× ile ad×m ad×m iĢlemekten Œekinirseniz, tahmin etmediğiniz hatalarla kullan×c×
muhatap olmak zorunda kal×r.
 Denetlenmesi kolay adland×rma ve algoritmalar oluĢturun.
 H×zl× Œal×Ģan program yapmak iŒin dayan×ks×z kodlar oluĢturmay×n.
 Belki tasar×m×n×z× baĢtan tekrar oluĢturman×z gerekebilir ama yaz×l×m×n×z× her zaman test edin.
 Kestirme ve pratik programlama risklidir. Kendi ihtiyac×n×za g™re Œ™zžm žretin.
 Ara s×ra temizlik yaparak, art×k yani artan kodlar×n×z×n b™ceğe sebep olmamalar×n× sağlay×n.
 Goto deyiminden kaŒ×nmak, program×n karmaĢ×k dallanmalar×n× ™nler ve derleyicinin optimizasyonunu artt×r×r,
fakat yine de yerinde kullan×lan goto ile kod daha anlaĢ×l×r ve verimli olabilir.
 Yapt×ğ×n×z değiĢiklik Œok kžŒžk olabilir, ama hata oluĢturabileceğini de unutmay×n×z.
 Sžržmler oluĢturarak ilerleyin. Son ticari halinden hata ay×klama kodlar×n×z× Œ×kararak kžŒžlterek ilgililere teslim
edin.
 Program iŒine yerleĢtirdiğiniz aŒ×klama sat×rlar× az ve ™z olmal×, ya da hiŒ yazmay×n.
 Ġmkans×z olan bir girdi olabilir mi? Kullan×c× her zaman sizin gibi džĢžnmez. Bu ihtimallere de ™nlem almal×s×n×z.
Sorunlar× sessizce Œ™zen kodlar yazabilirsiniz.
 B™ceği gizlemekten Œok onu yok etmeye Œal×Ģ×n.
 Farkl× algoritma kullanarak b™ceklerin sebebini Œ™zebilirsiniz.
 Devaml× hata mesajlar× ile kullan×c×y× telaĢland×rmay×n×z.
 B™ceği aŒ×ğa Œ×karman×n y™ntemi, onu bulduğunuz anda ortadan kald×rmakt×r. B™cekleri tekrarlamaya zorlay×n.
 Yollar× kesmekle Ģehirdeki eĢk×yalar× yok edemezsiniz, sessizce bekleĢiyorlard×r. Evleri tek tek aramak eĢdeğeri
olan, program×n×zda b™cekleri aktif olarak arayan kodlar ekleyebilirsiniz.
 ok az say×da programc× kodlara kesme noktalar× ekleyerek, kod iŒinde ad×m ad×m ilerleme ve girdilerin Œ×kt×ya
d™nžĢtžğž yerlere bakma al×Ģkanl×ğ×na sahip. Bu iĢlemler angarya değildir.
 Kodunuzda ad×m ad×m ilerlerken veri ak×Ģ×na odaklan×n.
 Arabiriminizdeki aksakl×klar× bulup yok edin.
 Kaybolan bir b™ceği g™z ard× etmeyin, gizleniyor olabilir.
 Zaman×nda bulunan b™cek daha fazla b™cek oluĢmas×na engel olur.
 Belirtiyi değil, oluĢum nedenini džzeltin.
 Aptal b™cek yoktur. As×l sorun programc×n×n onu bulamam×Ģ olmas×d×r.
 Ayn× b™ceğin sizi iki kere sokmas×na izin vermeyin!


 Bilgisayar kullan×m× ile ilgili bir kaŒ ipucu:
Windows‟unuz devaml× g™Œžyor, mavi ekranla karĢ×laĢ×yorsan×z, bunun sebepleri ya o s×rada Œal×Ģan hatal× bir
program yada ucuz donan×m parŒalar×d×r. Markal× RAM ve iyi bir anakart al×n.
 Antiviržs program×n×z× devaml× Œal×Ģmas× gerekli. Klas™re ve dosyaya sağ t×klay×p da “Viržs kontrolž yap” diyebilen
antiviržs yaz×l×m× kullanabilirsiniz.
9

 Masažstžnde resim kullanmak yerine teal – yeĢil, siyah veya koyu mavi gibi tek renk kullanman×z genel
performans× olumlu etkiler. Yaz×lar×n okunakl× renklerde olmas× g™zž en az yoran fakt™rdžr. (sar× žzerine siyah
gibi...)
 Masažstžndeki gereksiz k×sayollar×n hepsini silin. B™ylece Windows bir de onlar× gžncellemekle uğraĢmaz. Zaten
Windows Gezgini (Win+E) yeterince kullan×Ģl× bir programd×r.
 Dosya uzant×lar×n×n “Klas™r SeŒenekleri*G™ržnžm*Bilinen dosya tžrlerinin dosya uzant×lar×n× gizle” seŒeneğini iptal
ederek g™zžkmelerini sağlay×n.
 Klavye k×sayollar× iyi bilgisayar kullananlar×n en bžyžk yard×mc×s×d×r. Fare yerine Alt+Tab, Win+D, gibi k×sayollar×
kullanmak daha h×zl×d×r. Kulland×ğ×n×z paket programlar×n da k×sayollar×n× en k×sa(!) zamanda ™ğrenin.
 Bir program× kullanmay× seviyor olabilirsiniz, ama alternatif programlar× da muhakkak deneyin. Yine geri
d™neceksiniz, fakat bazen iĢe yar×yor.
 Her Ģeyin son versiyonunu kullanmak zorunda değilsiniz. Elinizdekileri en iyi Ģekilde kullanma Œal×Ģ×n.
 Muhakkak elinizin alt×nda Ġngilizce s™zlžk bulunsun. WordWeb32, Moonstar program× Œok kullan×Ģl×.
 Devaml× haf×zada yer iĢgal eden gereksiz bžtžn programlar× aŒ×l×Ģtan – “BaĢlat*al×Ģt×r... *msconfig” ile iptal edin.
 Eğer gžzelce Œal×Ģan bir donan×m×n×z var, ve siz de “Dur Ģunu daha h×zland×ray×m!” diye yola Œ×km×Ģsan×z, bžyžk
bir ihtimalle elinize mahvolmuĢ bir Windows veya bilgisayar geŒer. „zellikle BIOS ve registry – Windows Kay×t
Veritaban× ayarlar× Œok tehlikelidir.
 Donan×m upgrade – gžncelleme iĢlemi ancak zaman×nda yap×l×rsa gžncellemedir, yoksa para kayb×d×r.
 Bilgisayarda radyo dinlemek, televizyon seyretmek gžzel Ģeyler, fakat en iyisi normal radyo teyp ve televizyondan
yararlanmak. MP3 dinlemek ve Winamp Shoutcast serbest neyse ki...
 Ġnternet‟e firewall – ateĢ duvar× program×n×z× Œal×Ģt×rmadan Œ×kmay×n. Norton Internet Security, ZoneAlarm ve Tiny
Personal Firewall tavsiyem.
 Ġnternet‟den sadece chat ve gereksiz siteleri dolaĢmakla faydalanmay×n.
 Vee oyunlar. Muhakkak oyun ile stres at×yorsunuzdur. Ama iĢyeri ile evi birbirine kar×Ģt×rmay×n.
 Bilgisayar kullan×rken boyun, el, bilek, s×rt ağr×lar× Œekiyorsan×z, bunlar×n kronikleĢmesine izin vermeden
sebeplerini giderin. Džzgžn masa, sandalye, ergonomik klavye ve fare, rahat g™rebileceğiniz monit™r ve ekran
Œ™zžnžrlžğž gibi...
 Bilgisayar×n×za ne kadar ™zen g™steriyorsan×z ayn× Ģekilde Œevrenizin de temiz ve džzenli olmas×n× sağlay×n.
Kitaplar×n×z×, CD/DVD ‟lerinizi y×pranmaktan koruyun. Park ve bahŒeleri de...

 Murphy‟nin Yasalar×:
Ters gidebilecek bir Ģey mutlaka ters gidecektir. Hatta tersliğin en az mžmkžn g™ržldžğž anda bile.

 Siz sžpermen değilsiniz.
 Aptalca g™ržnen bir Ģey iĢe yar×yorsa, o Ģey aptalca değildir.
 Emin değilsen silah×n× dolu kabul et.
 Eğer sald×r× iyi gidiyorsa, pusuya džĢmžĢsžndžr.
 Tžm beĢ saniyelik el bombalar× žŒ saniyeliktir.
 Kolay yol her zaman may×nlanm×Ģt×r.
 „nemli olan Ģeyler daima basittir.
 Basit olan Ģeyler daima zordur.
 Eğer džĢman menzil iŒinde ise sen de ™ylesindir.
 Dost ateĢi dostun ateĢi değildir.
 Yapabildiğin her Ģey vurulmana yol aŒabilir, hiŒ bir Ģey yapmaman da dahil.
 …stžne gelen džĢman ateĢinden daha isabetli olan tek Ģey, žstžne doğru gelen dost ateĢidir.
 Ġki taraf da kaybetmeye baĢlad×ğ×na inand×ğ× anda, ikisi de hakl×d×r.
 Profesyonellerin ne yapacağ×n× kestirebilirsiniz, ama džnya amat™rlerle doludur.
 Sžngž kanunu der ki, mermisi olan kazan×r.
 Kusursuz planlar, kusursuz değildir.
 SavaĢta žniformas× daha g™steriĢli olan taraf kaybeder.
 Eğer džĢman× g™rebiliyorsan o da seni g™rebilir.
10

Bölüm 1 – Assembler
Tžm dillerle doğal olarak uyumlu olan mikroiĢlemci programc×l×ğ× baz×lar× iŒin Œok ilgi Œekici olabilir. Hata
mesajlar×n× dikkatli okuman×z gerekiyor. MS-DOS da hiŒ hata mesaj× g™rmeden makineniz kilitlenebilir. Genellikle eliniz
kolunuz bağl× gibi hissedebilirsiniz. Yani mikroiĢlemci programc×l×ğ× bir fili emekleyerek veya sžržnerek avlamaya
benzer. Yine de avantajlar× da var. Ġleri b™lžmlerde Delphi ve diğer diller iŒinde bile hala Assembler kodlar×
kullan×ld×ğ×n× g™rebilirsiniz. žnkž Œok az kod yazarak donan×ma (grafik ekrana geŒmek, paralel bağlant× noktas×na
sinyal yollamak, ...), iĢlemciye eriĢebilir ve h×zl× (sžržnerek de olsa!?!) Œal×Ģan program yazabilirsiniz.

Alt katman×nda ikilik – binary (baynıri diye okunur) ve onalt×l×k – hexadecimal (heksadesimıl diye okunur) say×
sistemi vard×r. Yani s×rf 1 ve 0‟larla da yani bitlerle program yaz×labilir. Zaten bu programlama diline makine dili
programlama da deniliyor. Bu konuya yak×n olarak biraz elektronikten bahsetmek gerekirse, eğer bir buzdolab× gibi
y×llarca hep ayn× iĢlemleri yapacak bir devre tasarlama ihtiyac× duyarsak, hedeflediğimiz giriĢ ve Œ×k×Ģ değerlerini bir
ROM – Read Only Memory salt okunur belleğe yžkleyerek iĢimizi g™ržržz. Tabii hepimizin evinde b™yle bir EPROM –
erasable programmable read only memory silici ve yaz×c× olmad×ğ×na g™re, bu tip programlama sadece sanayi veya
fabrika ortam×nda yap×labilir. Novell Netware kullananlar bilirler, ağ kartlar×na boot – aŒ×l×Ģ EPROM tak×larak
terminallerin aŒ×lmalar×n× sağlanabiliyordu. Ayr×ca hala bilgisayarlar×m×z×n ilk donan×m bilgileri BIOS Œipinde saklan×yor.
BIOS da bir EPROM‟dur. AŒ×l×Ģta BIOS bilgileri daha h×zl× olan RAM‟in ilk megabyte‟×n×n žst k×sm×na yerleĢir. Ayr×ca ilk
megabyte g™ržntž belleği, Expanded – geniĢletilmiĢ; kalan tžm RAM ise Extended – uzat×lm×Ģ bellek olarak ayr×l×r.

PLA – Programmable Logic Array ile sadece and, or gibi devre elemanlar× ile istenen giriĢ değerleri ile istenen
Œ×k×Ģlar elde edilir. Logic gates – mant×k kap×lar× kullanarak Flip – Flop denilen en kžŒžk, yani bir bit saklayabilen
haf×za devresi yap×l×r. Toplay×c×, Œ×kar×c×, karĢ×laĢt×r×c×, encoder, decoder, multiplexor (Œoğullay×c× – mux),
demultiplexor, sayaŒ da mant×k kap×lar× kullan×larak yap×labilir.

And (Çarpma) Or (Toplama) Not XOr (Özel OR)


(Tersleme)
A B Sonuc=A.B A B Sonuc=A+B A B Sonuc=AB
0 0 0 0 0 0 A Sonuc 0 0 0
0 1 0 0 1 1 0 1 0 1 1
1 0 0 1 0 1 1 0 1 0 1
1 1 1 1 1 1 1 1 0

“CD2\programlama\pic\PLC” dizininde Programmable Logic Controller – programlanabilir mant×k denetleyicisi


(microcontroller) ile ilgili dosyalar bulabilirsiniz. PLC ise PLA‟n×n geliĢmiĢ halidir. MikroiĢlemci kodlar× gibi sat×r sat×r
programlanabilen, bilgisayar×n Œok kžŒžltžlmžĢ halidir. Ama mant×k olarak bilgisayar ayn× anda tek bir iĢlem
yžržtebilirken, PLC giriĢ bilgilerini paralel olarak iĢleyip Œ×k×Ģ darbeleri žretiyor. DC – direct current giriĢleri (24 Volt)
vard×r ve bu bilgileri programc× ladder diagram – merdiven diyagram× ile tasarlay×p istenen Œ×k×Ģ darbelerini Œ×k×Ģ
r™lelerine (220 Volt) aktar×r. Eğer biraz elektrik bilginiz varsa resimdeki giriĢ Œ×k×Ģlar× rahatl×kla anlayabilirsiniz. Eğer
bir nolu anahtara bas×l×rsa zamanlay×c× aktif hale gelip, 50 saniye sonra Œ×k×Ģ veriyor ve eğer iki numaral× anahtara da
bas×l×rsa lambam×z yan×yor. Zaman diyagram×nda 200 Œ×k×Ģ×n×n sadece 2 ve T5 yžksek değerde iken Œal×Ģt×ğ×n×
g™rebilirsiniz.

Resim 1 – idec FA-1j uygulamas×


11

Bilgisayar×m×z transist™r, direnŒ, kondansat™r gibi binlerce elektrik ve elektronik parŒalardan oluĢuyor. En
temel değer elektrik var “1”, elektrik yok “0” ‟d×r. Yani oyunlar, mžzik parŒalar×, programlar tamamen binary sistem
žzerine kuruludur, diğer deyimle dijitaldirler.

Bit kavram×n× biraz inceledikten sonra Ģimdi de biraz iĢlemcinin iŒ yap×s×nda bulunan register – saklay×c×lar×n
yap×s×na bakal×m. Resimde 32 ve 16 bit deyimleri ile bilgisayar×m×z×n eğer Pentium ise 32 bit, intel286 ise 16 bit
iĢlemci olduğunu anl×yoruz. Yak×n gelecekte (2006) 64 bit iĢlemcilerimiz ve iĢletim sistemlerimiz olacak. Bu h×z ve
performans ile ilgili. Genellikle 32 bit yaz×l×m 16 bit yaz×l×mdan daha h×zl× Œal×Ģ×r.

En basit saklay×c×lar 8 bit olan AL, AH, BL, BH, CL, CH, DL ve DH‟dir. Tžm matematiksel ve diğer iĢlemler AX,
BX, CX ve DX žzerinde yap×l×r. SS:SP, CS:IP, DS:SI ve ES:DI birlikte kullan×larak adres belirtirler. Segmentler 64KB
yer kaplayan ™zel alanlard×r. „rneğin CS 1A00H değerini, IP de 0200H değerini iŒeriyorsa iki yazmac× birleĢtirerek yani
normalleĢtirerek 1A200H adresini elde ederiz. CS ve IP 16 bit iken, sonuŒ 20 bit olmas× iŒin CS sonuna 0 eklenip IP ile
toplan×r. 8086 iĢlemcisinin 20 bit address bus – adres hatt× kapasitesi ile 220 1MB haf×zay× adresleme imkan× vard×r. AX
yazmac×n×n 80386 ve žzeri iŒin geliĢmiĢ 32 bit hali EAX‟dir. Buradaki E – extended uzat×lm×Ģ anlam×ndad×r.

1970 y×l×nda Œ×kan 4040 ve 8008 intel Œipleri sadece hesap makinelerinde kullan×ld×. Bunlar sadece 64 KB
adresleyebilen sekiz bit iĢlemcilerdi. ġu anda kulland×ğ×m×z intel iĢlemcilerimiz intel286 hatta 1978‟de piyasaya sžržlen
16 bitlik 4.77 MHz 8086 ile geriye uyumlu Œal×Ģmak zorunda olduğu iŒin yazmaŒ yap×lar× hala 16 ve 8 bit olarak da
Œal×Ģ×yor. Yeni bir program×n eski bir bilgisayarda Œal×Ģabilmesine hayret etmemek gerek. Fakat Pentium iĢlemcilerdeki
MMX, SSE, SSE2 ve SSE3(AMD‟de 3DNow!) komut kžmeleri geriye doğru uyumlu değildir.

CISC – Complex Instruction Set Computer (KarmaĢ×k komut kžmeli bilgisayar) y™ntemi ile programland×ğ× iŒin
intel, geniĢ komut kžmesi ile esnek fakat h×z× džĢžk iĢlemcidir. PowerPC gibi RISC – Reduced Instruction Set
Computer (azalt×lm×Ģ komut kžmeli bilgisayar) olan sistemler ise belli iĢlemleri Œok h×zl× bir Ģekilde yapabilen
iĢlemcilerdir, genellikle žzerlerinde ™zel iĢletim sistemleri Œal×Ģ×r. Ama art×k Mac iĢletim sistemi intel uyumlu.

Resim 2‟deki gibi yazmaŒlar×m×z bu kadar. Ama iĢlemci iŒinde sadece bunlar yok. Cache – ™n bellek, FPU –
floating point unit, giriĢ / Œ×k×Ģ yol arabirim mant×ğ×, code cache – kod ™n haf×za, tamsay× yžržtme birimleri, komut kod
Œ™zžcž, ve buna benzer žnitelerden oluĢur. ĠĢlemcinin anakart bağlant×lar× da iŒindekine benzer. D×Ģ cache, RAM –
Random Access Memory, sistem veri yollar×, giriĢ / Œ×k×Ģ yollar×, disk kontrolcžsž gibi b™lžmlere bağlan×r ve onlar×
y™netir. Donan×m ile ilgili baz× ™rneklerimizi ilerleyen b™lžmlerde bulabilirsiniz.

Resim 2 – intel x86 ailesinin iĢlemci yazmaŒlar×

„rnek mikroiĢlemci komutlar×:


12

mov ah, bh 8 bit (1 Byte) bh içeriği ah‟ye kopyalanır


mov [bx], ax 16 bit ax yazmaç değeri bx adresine kopyalanır
jmp ax ax adresine dallan
push ax ax‟i yığında sakla
pop bx yığına son atılan değeri bx‟e aktar
add al, cl al=al+cl
inc bp bp=bp+1
dec bp bp=bp-1
cmp al, cl sadece bayrakları etkileyen al-cl çıkarma işlemi
mul dl ax=al*dl
div cl al=ax/cl , kalan da ah yazmacında
and bl, 7 0111 ile bl maskeleniyor (çarpma), 4. bit sıfırlanıyor
or bl, 2 0010 ile bl‟nin 2. biti 1 haline getiriliyor
xor al, al al içi sıfırlanıyor, temizleniyor
not cl cl içi tersleniyor
shl cx cx‟in içi sola 1 bit kaydırılır (yani 2 katı alınır)
shr cx cx‟in içi sağa 1 bit kaydırılır (yani 2‟ye bölünür)
rol di di‟nin soldaki ilk biti sona, kalan bitler sola kayar
loop ETIKET ETIKET adresine cx 0 oluncaya dek döner (for gibi)
lahf ah‟ye flag – bayrak bilgilerini saklar
sahf ah‟den flag – bayrak yazmacına geri yükler
pushf bayraklar stack segment‟e itilir
popf bayraklar stack segment‟ten geri alınır

mov ax, 2000 ax = 2000


mov bx, 1000 bx = 1000
cmp ax, bx ax ile bx‟i karşılaştır
jb kucuk eğer ax küçükse kucuk etiketine git
buyuk: mov dx, ax dx = ax
sub dx, bx dx = dx - bx
jmp tamam koşulsuz tamam etiketine git
kucuk: mov dx, bx dx = bx
sub dx, ax dx = dx - ax
tamam: nop işlem yok

Yukar×daki Œ×karma iĢlemi yapan ™rneği “BaĢlat*al×Ģt×r...*debug” program× ile Ģ™yle yazabilirsiniz:
(Ornekler\Asm\asm.zip*cikarma.txt). Delphi dilinde ise adres belirtmeye gerek kalmadan @label Ģeklinde etiketler ile
loop, call ve jmp komutlar×n× kullanabiliriz. (Ornekler\Asm\delphi_asm.zip*Project2.dpr) Diğer ™rneklerde debug‟×n
komutlar×n× bulabilirsiniz.

-a
18A2:0100 B80020 MOV AX,2000 ; 18A2 adresi sizde farklı olabilir
18A2:0103 BB0010 MOV BX,1000
18A2:0106 39D8 CMP AX,BX
18A2:0108 7206 JB 0110 ; küçükse (jump if below)
18A2:010A 89C2 MOV DX,AX
18A2:010C 29DA SUB DX,BX
18A2:010E EB04 JMP 0114 ; son
18A2:0110 89DA MOV DX,BX
18A2:0112 29C2 SUB DX,AX
18A2:0114 90 NOP
-t 6 ; 6 satır trace – izle yani çalıştır

AX=2000 BX=1000 CX=0000 DX=F500 SP=FFEE BP=0000 SI=0000 DI=0000


DS=18A2 ES=18A2 SS=18A2 CS=18A2 IP=0103 NV UP EI NG NZ NA PE CY
18A2:0103 BB0010 MOV BX,1000

AX=2000 BX=1000 CX=0000 DX=F500 SP=FFEE BP=0000 SI=0000 DI=0000


DS=18A2 ES=18A2 SS=18A2 CS=18A2 IP=0106 NV UP EI NG NZ NA PE CY
18A2:0106 39D8 CMP AX,BX

AX=2000 BX=1000 CX=0000 DX=F500 SP=FFEE BP=0000 SI=0000 DI=0000


DS=18A2 ES=18A2 SS=18A2 CS=18A2 IP=0108 NV UP EI PL NZ NA PE NC
13
18A2:0108 7206 JB 0110

AX=2000 BX=1000 CX=0000 DX=F500 SP=FFEE BP=0000 SI=0000 DI=0000


DS=18A2 ES=18A2 SS=18A2 CS=18A2 IP=010A NV UP EI PL NZ NA PE NC
18A2:010A 89C2 MOV DX,AX

AX=2000 BX=1000 CX=0000 DX=2000 SP=FFEE BP=0000 SI=0000 DI=0000


DS=18A2 ES=18A2 SS=18A2 CS=18A2 IP=010C NV UP EI PL NZ NA PE NC
18A2:010C 29DA SUB DX,BX

AX=2000 BX=1000 CX=0000 DX=1000 SP=FFEE BP=0000 SI=0000 DI=0000


DS=18A2 ES=18A2 SS=18A2 CS=18A2 IP=010E NV UP EI PL NZ NA PE NC
18A2:010E EB04 JMP 0114
-t

AX=2000 BX=1000 CX=0000 DX=1000 SP=FFEE BP=0000 SI=0000 DI=0000


DS=18A2 ES=18A2 SS=18A2 CS=18A2 IP=0114 NV UP EI PL NZ NA PE NC
18A2:0114 90 NOP

AX BX‟den bžyžk olduğu iŒin 2000-1000 sonucu olan 1000 değeri DX yazmac×nda saklan×yor. Ġsterseniz AX‟e
2001, BX‟e 1975 değerini vererek de deneyebilirsiniz. SonuŒ neden 068C oldu da 26 olmad× acaba? Onalt×l×k say×
sisteminde olduğumuzu unutmayal×m. “Ornekler\Asm\delphi_asm.zip*Project2.dpr” ‟de ise sonuŒ onluk sisteme
Œevrildiğinden dolay× 26 elde edebilirsiniz.

-r ip çalışacak programın başlangıç adresi 100 olmalı


IP 0114
:100
-a 100 sadece iki satır değişecek
18A2:0100 mov ax,2001
18A2:0103 mov bx,1975
18A2:0106
-t 6
...

AĢağ×da baz× ™rnekler ise *.asm uzant×l×d×r. Bunlar× derlemek iŒin CD‟deki “Ornekler\Asm\tasm.zip” dizinindeki
dosyalar× (Tasm.exe, Tlink.exe, dpmiload.exe, dpmimem.dll) sabit diskinize kopyalay×n. Not defterinde ™rnek kodlar×
yaz×p kendi diskinizdeki bu dizine kaydedebilirsiniz. ġimdi yapacağ×n×z “exeyap.bat” a k×sayol oluĢturup, benim
yapt×ğ×m k×sayoldaki gibi, k×sayola sağ t×klay×p “„zellikler*Program*Komut Sat×r×:exeyap.bat ?” haline getirin. Bu “?”,
exeyap.bat dosyas×n×n Œal×Ģmadan ™nce bize parametre ile dosya ad×n× sormas×n× sağlayacak. K×sayolu Œal×Ģt×r×n ve
“dosyaadi” yaz×p Enter‟a bas×n. ĠĢte bitti, hemen hemen hiŒ MS-DOS komut isteminde bir iĢimiz olmad×. exeyap.bat ve
comyap.bat dosyalar×n×n iŒeriği Ģ™yle:

@echo off @echo off


tasm %1 tasm %1 /m
tlink %1 exeyap.bat olarak kaydedin tlink /t %1 comyap.bat olarak kaydedin
erase *.map erase *.map
erase *.obj erase *.obj
%1.exe %1.com

%1 deyimlerinin anlam× *.bat dosyaya parametre eklenebilmesi iŒindir. Bu sayede “c:\>exeyap.bat


deneme.asm ” komutu ile bir anda program×m×z eğer hata yoksa derleniyor. Windows‟ta da uygulamalar×n
k×sayollar×na ? ekleyerek aŒ×lmalar×ndan ™nce bize kžŒžk bir pencerede parametre giriĢi imkan× verebiliyoruz:
14

1. Mavi.txt (mavi renkli ekran)


(Ornekler\Asm\Diger.zip*Mavi.TXT)

Ġlk ™rneğimiz “Mavi.txt” dosyas×ndaki ™rnek. AĢağ×daki kodlar× not defteri ile yazabilirsiniz.

Resim 3 – Mavi.com

Doğrudan CD‟mizden denemek iŒin, bu ™rneği not defteri ile aŒ×p hepsini seŒin ve kopyalay×n.
“BaĢlat*al×Ģt×r...” ‟dan “debug” (dibag diye okunur) komutu verin. ×kan siyah komut isteminin pencere halinde
olmas× iŒin Alt+Enter yap×p, araŒ Œubuğundaki “Yap×Ģt×r” ile haf×zadaki bilgilerin yap×Ģmas×n× seyredin. ĠĢ bitmiĢtir, ilk
program×n×z× derlediniz. Masa žstžndeki mavi.com‟un tek yapt×ğ× Ģey mavi bir metin ekran oluĢturmak.

? iĢareti ile de isterseniz debug‟×n yard×m×na bakabilirsiniz.

Kod yazma kısmı: Açıklama kısmı:


-a 100 100‟ncü adresten itibaren kod yazıyoruz (a - assemble)
mov ah,12
mov bl,10
int 10
mov ax,40
mov ds,ax
mov ax,600
mov bh,1f
SUB CX,CX
mov dh,18
cmp bl,10
jz 11d
mov dh,[84]
mov dl,[4a]
dec dl
int 10
mov ah,2
mov bh,[62]
sub dx,dx
int 10
ret burada Enter yapıp kod yazmaktan çıkın

-n mavi.com programın ismi belirleniyor (n - name)


-r cx
30 30h = 48 Byte yer kaplayacağı belirtilir
-w Sabit diske kayıt (w - write)
-u 100 unassemble komutu ile kodlarımızı inceliyoruz
18A2:0100 B412 MOV AH,12
18A2:0102 B310 MOV BL,10
18A2:0104 CD10 INT 10
18A2:0106 B84000 MOV AX,0040
18A2:0109 8ED8 MOV DS,AX
...
-q debug‟dan çıkış (q - quit)

48 byte boyundaki mavi.com dosyam×z× bir hex – edit™r ile aŒarsak, bizim doğrudan bir Ģey anlamad×ğ×m×z Ģu
yaz×lar× g™rebilirsiniz:

00000 B4 12 B3 10 ¦ CD 10 B8 40 ¦ 00 8E D8 B8 ¦ 00 06 B7 1F ¦¦-©@.ÄÏ©.À
00010 29 C9 B6 18 ¦ 80 FB 10 74 ¦ 04 8A 36 84 ¦ 00 8A 16 4A )+Âǹtè6ä.èJ
15
00020 00 FE CA CD ¦ 10 B4 02 8A ¦ 3E 62 00 29 ¦ D2 CD 10 C3 ._--¦è>b.)Ê- +

Her komutun bir mikroiĢlemci kod Œevrimi vard×r. e yani enter komutu ile makine komutu, yaz× veya say× giriĢi
yapabiliriz. Sadece bu kodlar× kullanarak da program yazabiliriz. MOV AH,12 yazmak yerine Ģunu da deneyebilirsiniz:

-e 100 b4 12 100 adresinden itibaren kod girişi (e - enter)


-e 200 "Hafızaya bu yazılır$" 200 adresine bilgi yazar, $ string sonu demektir
-e eff 11 10 1c 33 45 eff adresinden itibaren beş sayı yazdık

BaĢka bir zaman tekrar debug‟da yazd×ğ×m×z bu program× yžklemek istersek L yani load komutunu verebiliriz:

-n mavi.com dosya adını belirtiyoruz


-l yükleme komutu (l - load)
-u 100
18CA:0100 B412 MOV AH,12
18CA:0102 B310 MOV BL,10
18CA:0104 CD10 INT 10
18CA:0106 B84000 MOV AX,0040
...

Tžm say×lar tamsay×d×r, negatif ve ondal×kl× yani virgžllž rakamlar bayraklar ve diğer yard×mc× yazmaŒlarla
kullan×l×yor. FPU – Floating Point Unit denilen b™lžm ile kayar noktal× iĢlemler daha h×zl× hesaplan×r. ĠĢlemci
yazmaŒlar×ndan olan bit boyutundaki sekiz adet bayrak ile iĢaret (negatif veya pozitif say×) sign – SF, s×f×r zero – ZF,
elde carry – CF, eĢlik parity – PF, y™n direction – DF, taĢma overflow – OF ile b™lme, Œarpma gibi iĢlemler yap×l×r.

-r f flag yazmaçlarını göster ve değiştir


NV UP EI PL NZ NA PO NC - komut bekler, Enter ile geçebilirsiniz

(11010.10110)2 = 24+23+21+2-1+2-3+2-4 = (26.6875)10


(11010.10110)2 = (1.101010110 * 25)2 olarak da kullan×labilir
(0,25)10 = 0.100 + 2.10-1 + 2.10-2
(A2.B)16 = A.161 + 2.160 + B.16-1 = 162.687

On taban×ndaki kayar noktal× bir say× herhangi bir say× sistemine Œevrilirken; tamsay× k×sm× 0 Œ×kana dek o say×
sistemine b™lžnžp kalanlar tersten yaz×l×r; kesirli k×s×m ise yine 0 Œ×kana dek o say× sistemi ile Œarp×larak tamsay× k×sm×
yanyana yaz×l×r:

(72.3)10 = (1001000.0100110)2
72/2 Kalan = 0 .3*2=.6 Tamsay×=0
36/2 Kalan = 0 .6*2=.2 Tamsay×=1
18/2 Kalan = 0 .2*2=.4 Tamsay×=0
9/2 Kalan = 1 .4*2=.8 Tamsay×=0
4/2 Kalan = 0 .8*2=.6 Tamsay×=1
2/2 Kalan = 0 .6*2=.2 Tamsay×=1
1/2 Kalan = 1 .2*2=.4 Tamsay×=0
0

“–” iĢareti debug‟×n komut istemidir. Burada a, n, r gibi tek harfli komutlar kullan×yoruz. a 100 ile 100 ncž
adresten itibaren yazmaya baĢlar×z. Buradaki 100 prensip olarak kullan×lan bir değerdir. Her program sat×r×ndan sonra
100 yada diğer adres art× komut boyutu kadar adresin ilerlediğini g™rebiliriz. Komutlar×n haf×zada kaplad×ğ× alan kadar
onlar×n iĢlemci iŒinde ne kadar zaman harcad×ğ× da ™nemlidir. Mesela div - b™lme komutu 80486 iŒin 24 saat darbesi
ile biterken, benzer g™revi yapan shr – sağa kayd×rma sadece 3 saat Œevrimine ihtiyaŒ duyar. Ġkiye b™lmek veya
Œarpmak iŒin en h×zl× ve pratik komutlar shl Œarpma ve shr b™lmedir. Fakat kayd×r×rken taĢan bitler yok olur.

mov ax, 8
shl ax, 1 // sola bir bit kaydır, ax artık 0010h olur 10h = 16, iki ile çarpmak gibi
...
mov ax, 4
shr ax, 1 // sağa bir bit kaydır, ax artık 0002h olur, ikiye bölmek gibi

Bu iĢlemleri mul ve div ile Ģ™yle yapabiliriz:

mov ax, 8
16
mov bx, 2
mul bx //ax = ax * bx sonuç = 0010h = 16 (üst byte dx‟te saklanır)
...
mov ax, 4
mov bx, 2
div bx //ax = ax / bx sonuç = 0002h (kalan dx‟te saklanır)

Eğer bir byte bir byte ile Œarp×l×rsa iki byte, iki byte iki byte ile Œarp×l×rsa da d™rt byte alan kaplayan say×
oluĢur. Bu sebeple eğer mul bl denilirse ax = al * bl olur, mul bx denilirse dx:ax = ax * bx olur. B™lmede de div bl gibi
bir byte b™lme yap×l×rsa (al = ax / bl ) sonuŒ al‟de kalan ah‟de olur. div bx denilirse de (ax = dx:ax / bx ) sonuŒ ax‟de,
kalan da dx‟de saklan×r.

-a 100
18A2:0100 mov ax,0011
18A2:0103 mov bx,2
18A2:0106 div bl
18A2:0108
-t 3

AX=0011 BX=0002 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 ;17 / 2


DS=18A2 ES=18A2 SS=18A2 CS=18A2 IP=0103 NV UP EI PL NZ NA PO NC
18A2:0103 BB0200 MOV BX,0002

AX=0011 BX=0002 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000


DS=18A2 ES=18A2 SS=18A2 CS=18A2 IP=0106 NV UP EI PL NZ NA PO NC
18A2:0106 F6F3 DIV BL

AX=0108 BX=0002 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 ;Kalan 01, Sonuç 08
DS=18A2 ES=18A2 SS=18A2 CS=18A2 IP=0108 NV UP EI PL NZ NA PO NC
18A2:0108 0000 ADD [BX+SI],AL DS:0002=00
-a 100
18A2:0100 mov ax,0100 ; 256 / 5 = 51, kalan 1 olur
18A2:0103 mov bx,05
18A2:0106 div bx
18A2:0108
-r ip ; program 100‟den itibaren çalışması gerekir
IP 0108
:0100
-t3

AX=0100 BX=0002 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000


DS=18A2 ES=18A2 SS=18A2 CS=18A2 IP=0103 NV UP EI PL NZ NA PO NC
18A2:0103 BB0500 MOV BX,0005

AX=0100 BX=0005 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000


DS=18A2 ES=18A2 SS=18A2 CS=18A2 IP=0106 NV UP EI PL NZ NA PO NC
18A2:0106 F7F3 DIV BX

AX=0033 BX=0005 CX=0000 DX=0001 SP=FFEE BP=0000 SI=0000 DI=0000 ; ax = 51(onluk sistemde), dx = 1
DS=18A2 ES=18A2 SS=18A2 CS=18A2 IP=0108 NV UP EI PL NZ NA PO NC
18A2:0108 0000 ADD [BX+SI],AL DS:0005=9A

„rneğin MOV AH,12 komutu 2 byte yer kaplayarak kod haf×zas×na b412 yaz×lmas×n× sağlad×. Tabii ki buradaki
12 say×s× bildiğimiz onluk sistemdeki 12 değil. Heksadesimal olarak džĢžnmeliyiz. 0 ile 9 aras× ve A 10, B 11, C 12, D
13, E 14, F de 15 rakam× olarak kullan×l×r.

12h = 161.1 + 160.2 = 18


FFh = 161.15 + 160.15 = 255
0Ch = 161.0 + 160.12 = 12
FF00h = 163.15 + 162.15 + 161.0 + 160.0 = 65280

Ġkilik sistemden de birkaŒ ™rnek yapal×m, genellikle yaz×mda d™rder d™rder ayr×l×rlar:

1100 = 0Ch = 23.1 + 22.1 + 21.0 + 20.0 = 12


1111 0001 = F1h = 27.1 + 26.1 + 25.1 + 24.1 + 23.0 + 22.0 + 21.0 + 20.1 = 241
17

Eminim 128, 256, 1.44, 65535, 1024 gibi rakamlar× bir yerlerde g™rmžĢsžnžzdžr. „rneğin RAM‟lerimiz
1024‟žn katlar× Ģeklindedir. 16 MB, 32 MB, 48 MB gibi... Eğer 128 MB RAM‟imiz var ise bilgisayar×n POST – Power On
Self Test ilk aŒ×l×Ģ×nda 131.072 KB gibi bir rakam g™ržrsžnžz. Nedeni megabyte ve kilobyte Œevriminden dolay×d×r.
Anakart veya bir ekran kart×n×n kitapŒ×ğ×n× incelemenizi tavsiye ederim. Kullan×lan terimler, deyimler ve k×saltmalar×n
anlamlar×na bak×n×z. (B byte, K kilo, M mega demektir). Binin katlar× Ģeklinde olmas× iŒin en yak×n say× 210 yani
1024‟džr.

1 B = 8 bit 1024 B = 210 B = 1 KB


1024 KB = 1 MB 131.072 KB = 128 MB

Temel birimler ise; tera T 1012, giga G 109, mega M 106, kilo K 103, hecto h 102, deci d 10, centi c 1, mili m
10-3, micro µ 10-6, nano n 10-9, pico p 10-12 diyebiliriz. Fakat gžn geŒtikŒe daha bžyžk ve daha kžŒžk birimlere
ihtiyac×m×z artt×ğ× iŒin değiĢik birimlerle karĢ×laĢacağ×z. Mesela perabyte PB 1015, eksabyte EB 1018 gibi...
18

2. meraba.asm (merhaba dünya!)


(Ornekler\Asm\asm.zip*meraba.asm)

Resim 4 – Assembler selam×

Bir metin edit™rž ile yazd×ğ×n×z kaynak dosya, Tasm – Turbo Assembler veya Masm - Microsoft Assembler ile
*.obj dosyas× oluĢturulur. Eğer hata kalmam×Ģ ise, Tlink veya Link ile *.exe veya *.com dosya haline gelir. *.com
dosya daha kžŒžktžr Œžnkž sadece MS-DOS geleneksel haf×za b™lgesi olan 1 MB iŒine yerleĢebilir, boyut olarak 64
kilobyte‟× geŒmezler; *.exe dosya ise RAM‟in herhangi bir yerine yerleĢir ve bžyžklžkleri mega byte‟larca olabilir. DOS
– Disk Operating System komut isteminde mem komutunu vererek, *.com dosyalar iŒin en fazla ayr×labilen boĢ alan×
g™rebilirsiniz. ġu kodlar× not defteri ile “meraba.asm” olarak yaz×p tasm ile derleyebilirsiniz:

.model small
.stack 100h
.data
selammesaji DB ‗Meraba Dunya!‘ ,13,10,‘$‘ ;‟$‟ metin dizi sonu belirteci

.code
start:
mov ax,@data
mov ds,ax
mov ah,9 ;DOS yazma fonksiyonu
mov dx,OFFSET selammesaji ;veriyi işaretle
int 21h ;yaz
mov ah,4ch ;DOS program sonu
int 21h ;program sonu
END start

meraba.exe dosya oluĢturmak iŒin, MS-DOS Komut isteminde Ģunlar× yapabilirsiniz. Eğer Tasm hata mesajlar×
veriyorsa bunlar× džzeltmeden meraba.obj oluĢamaz ve Tlink iĢe yaramaz.

c:\>tasm meraba.asm
Turbo Assembler Version 3.2i Copyright (c) 1988, 1992 Borland International
Serial No: Tester:

Assembling file: meraba.asm


Error messages: None
Warning messages: None
Passes: 1
Remaining memory: 393k

c:\>tlink meraba.obj
Turbo Link Version 5.1 Copyright (c) 1992 Borland International

c:\>_
19

Art×k “meraba” yaz×p Enter tuĢuna bas×nca ekrana gelen “Meraba Dunya!” yaz×s×n× g™rebilirsiniz. meraba.obj
260 byte, meraba.map 232 byte, meraba.asm 209 byte ve meraba.exe 544 byte olmal×.

„Meraba Dunya!‟ yaz×s×n×n yan×ndaki 13 ve 10 Enter ve sat×r besleme – Line Feed tuĢlar×n×n taklididir. CR –
Carriage Return Ģaryo / taĢ×ma d™nžĢž ASCII* kodu 13, LF – Line Feed sat×r besle ASCII kodu ise 10‟dur.

BirŒok int komutundan ™nceki ax veya ah yazmac×na at×lan değerlere g™re kesme iĢlemi uygulan×r. …stteki
programda iki adet int 21h komutu var, ama etkileri birbirinden Œok farkl×. Doğrudan int 21h komutu verilseydi
istediğimizi elde edemezdik.

int 09h klavye, int 10h ekran BIOS iŒinde tan×mlanm×Ģt×r, int 33h fare de mouse.sys ile belleğe yerleĢir. Bu
interrupt – kesmelerle ilgili ™rneklere kitab×n ilerleyen k×s×mlarda bulabilirsiniz.

256 adet 0-FFh aras× yaz×l×m kesmesi olabilir. Haf×zan×n ilk alan× interrupt bilgilerini taĢ×r ve her biri d™rt byte
dallan×lacak adres bilgisi olan yer kaplar. Bir kesmenin alt fonksiyonlar× AH yazmac× ile belirtilir. AH sekiz bit olduğu
iŒin en fazla 256 fonksiyon tan×mlanabilir. MikroiĢlemci interrupt komutu ald×ğ× anda, o anki yazmaŒ bilgilerini ve
program adresini saklar ve kesmeyi gerŒekleĢtirir. Kesme iĢlemi bitince ana program kald×ğ× yerden Œal×Ģmaya devam
eder. Donan×m kesmeleri de 15 adettir. Klavye, fare gibi donan×mlardan gelecek tetikleme ile Œal×Ģ×rlar. ĠĢletim
sisteminin s×f×ra b™lžm gibi hatalara karĢ× kulland×ğ× birŒok internal – iŒ kesmeleri de bulunur.

“Ornekler\Asm\asm.zip*user_interrupt.txt” ™rneğinde int 60‟× kendimiz programlay×p, belli bir haf×za b™lgesine
dallanmay× debug program×nda Ģ™yle sağl×yoruz:

60h x 4 = 180h adresi int 60‟×n baĢlang׌ adresidir. AĢağ×daki 00 00 00 00 bilgisi ile bu kesmenin boĢ
olduğunu anl×yoruz.

-d 0:180 L4 Length 4 byte göster (d - dump)


0000:0180 00 00 00 00 ....
-e 0:180 00 01 6d 18 186d:0100 adresine yönlendireceğiz
-e 186d:0200 "Tarık BAĞRIYANIK$" 0200 adresinde bilgi var, $‟a dikkat, string sonu
-a 186d:0100 bu adrese de kendi programımızı yazıyoruz
186D:0100 mov ax,186d offsetimiz 186d
186D:0103 mov ds,ax mov ds,186d hatalı kullanımdır
186D:0105 mov dx,0200 0200 adresindekileri ekrana yaz
186D:0108 mov ah,09
186D:010A int 21
186D:010C ret interrupt bitirme komutu (iret komutu da olabilirdi)
186D:010D Enter ile programı bitirin
-a 186d:1000 int 60‟ı çağıran başka bir program
186D:1000 int 60
186D:1002 mov ah,4c programı bitirme
186D:1004 int 21
186D:1006
-g =186d:1000 programı çalıştır (g - go)
Tarık BAĞRIYANIK ekrana bilgi yazıldı...

Asl×nda interrupt diye yapt×ğ×m×z bu ™rnek call komutu ile ayn× iĢi yap×yor. call ile alt programlar× Œağ×rabilir ret
komutu ile ana programa d™nžlebilir.

Assembler dilini donan×ma ulaĢmak iŒin bize yard×mc× olan dil olarak g™rebiliriz. Bu sebeple bilgisayar×m×z×
kilitleme ihtimalimiz bir hayli fazla, dikkatli yaz×n×z. Dediğim gibi tžm sat×rlar× tek tek aŒ×klamak Œok zor, Ģimdilik bu
bunlar×n op-code‟lar olduğu, bir Ģeylerin k×saltmas× olduğunu bilin, yeterli. Mesela mov, move yani sağdaki değeri al,
soldakine yap×Ģt×r demek. Yap×lan iĢlemler sanki matematiksel yani topla, Œ×kar, ekle, eksilt gibi değil mi? SonuŒta
haf×za veya yazmaŒlarla ilgili iĢlem yaparken hesap yapmay× da ™ğrenmemiz gerekiyor.

Eğer assembler‟da programlama yapmaya karar verdiyseniz on, on beĢ komutu iyi bilmeniz gerekiyor. CD‟deki
“CD2\Programlama\HelpPC\HelpPC.com” komutlar ve yazmaŒlar hakk×nda ayr×nt×l× bilgiler veriyor.

*
Ek 3 – ASCII Kod Tablosuna bak×n×z.
20

3. kucuk.asm (büyük harfe çevirir)


(Ornekler\Asm\Diger.zip*KUCUK.ASM)

Resim 5 – 10 karakteri bžyžk harfe Œeviren program (TžrkŒe karakterlere dikkat)

.MODEL SMALL
.STACK 100H
.DATA
buffer label byte
max_uzun db ?
katar db 10 dup(?)
girilen db ?
mesaj db "Cevrilecek cumle (10 karakter):$"
crlf db 10,13,'$'
.code
basla:
mov ax,@data
mov ds,ax
mov dx,offset mesaj ; mesaj değişkeni ekrana basılacak
mov ah,09h
int 21h
mov dx,offset buffer
mov buffer,10
mov ah,0ah
int 21h
xor si,si
xor cx,cx
mov cl,girilen
cmp cl,0
je son
buyuk:
cmp katar[si],'a'
jl devam
cmp katar[si],'z'
jg devam
sub katar[si],20h
devam:
inc si
loop buyuk
mov katar[si+1],'$'
goster:
mov dx,offset crlf
mov ah,09h
int 21h
mov dx,offset katar
mov ah,09h
int 21h
son:
mov ax,4c00h
int 21h
end basla

kucuk.exe dosyas× Œal×Ģt×ğ×nda kžŒžk harfli on karakter girin ve Enter‟a bas×n. On harfli olmas×na dikkat edin.
Program× değiĢtirebilmek iŒin edit veya not defteri ile kucuk.asm dosyas×n× aŒabilirsiniz. Ġlk kez not defterinde
aĢağ×daki program× yaz×p kaydederken de Œift t×rnak iŒinde “dosyaadi.asm” Ģeklinde yaz×p kaydedin, b™ylece sonu
*.txt kalmaz.
21

4. cizim.asm (klavye ile çizim yapma)


(Ornekler\Asm\Diger.zip*CIZIM.ASM)

Resim 6 – Grafik ekranda Œizim yapmak.

Klavyeden y™n tuĢlar×, Home, End, Page Up, Page Down ve Insert tuĢlar× ile Œizim yap×l×yor. Insert ile Œizim
yapma ve yapmama ayarlan×yor. Belki siz de yapt×ğ×n×z× kaydetmeyi eklemek istersiniz (tamam Print Screen tuĢu da
iĢi g™ržyor zaten)... Bu ™rneği de ™nceki ™rnekteki gibi derleyebilirsiniz. Ekran×n d×Ģ×na da Œ×kmaya Œal×Ģmay×n, garip
hatalar g™receksiniz.

kes.asm dosyas× da buna benzer bir ™rnek, renk seŒimi dahil edilmiĢ. Hatta bilgisayar×n×z× bile kilitleyen kay×t
bile var. Biraz inceleyin, belki sizin hoĢunuza gider.

Resim 7 – kes.asm‟nin ekran g™ržntžsž

.MODEL SMALL
.code cmp ah,53h
org 100H je del_t
basla:
jmp ilk cmp ah,47h
instusu db 0h je home
deltusu db 0h
ilk: cmp ah,48h
mov ah,00 je yukari
mov al,06
int 10h cmp ah,49h
xor cx,cx je pgup
xor dx,dx
tusal: cmp ah,4bh
xor ax,ax je sol
int 16h
cmp al,1bh cmp ah,4dh
jne ara je sag
mov ah,0
mov al,03 cmp ah,4fh
int 10h je endt
mov ax,4c00h
int 21h cmp ah,50h
ara: je asagi
cmp ah,47h
jl tusal cmp ah,51h
je pgdn
cmp ah,53h
jg tusal jmp tusal
ins_t:
cmp ah,52h not instusu
je ins_t jmp tusal
22
del_t: don:
not deltusu ret
jmp tusal noktanokta endp
home: noktakoy proc near
call noktanokta push es
dec cx push bx
dec dx push cx
jmp tusal push dx
yukari: push di
call noktanokta xor di,di
dec dx mov bx,0b800h
jmp tusal mov es,bx
asagi: MOV di,cx
call noktanokta shr di,1 L harfi değil, bir yazılır
inc dx shr di,1
jmp tusal shr di,1
sag: mov ax,dx
call noktanokta shr ax,1
inc cx mov bl,80
jmp tusal mul bl
sol: add di,ax
call noktanokta and dx,1
dec cx push cx
jmp tusal mov cl,13
endt: shl dx,cl
call noktanokta pop cx
dec cx add di,dx
inc dx and cx,7
jmp tusal mov bl,7
pgup: sub bl,cl
call noktanokta mov cl,bl
inc cx mov ah,1
dec dx shl ah,cl
jmp tusal mov al,es:[di]
pgdn: or al,ah
call noktanokta mov es:[di],al
inc cx pop di
inc dx pop dx
jmp tusal pop cx
pop bx
noktanokta proc pop es
cmp instusu,0h ret
jne don noktakoy endp
call noktakoy end basla
23

5. Fridge (intro yapımı)


(Ornekler\Asm\Frigde.zip*Fridge.asm)

Assembler dilinde yap×lm×Ģ hoĢ bir grafik efekti program×. GerŒekten kaliteli bir Œal×Ģma. *.com olarak
derlemeniz gerekiyor. Ġngilizce aŒ×klamalar× Œ™zebilirseniz siz de gžzel değiĢiklikler yapabilirsiniz. Siz de “buzdolab×n×
kapat” laf×n× rahatl×kla değiĢtirebilirsiniz:

Resim 8 – Fridge demosu

IDEAL
P386
MODEL tiny
CODESEG
ORG 100h
Start:
mov al,13h ; assume ah=0
int 10h ; set mode 13h

mov ah,09h
mov dx,OFFSET Msg
int 21h

mov ax,cs
add ah,10h ; ie. add cs,1000h
mov ds,ax ; setup buffer segment 1
add ah,10h ; ie. add cs,2000h
mov es,ax ; setup buffer segment 2

push 0A000h ; vga-mem ptr


pop fs

;------ clear water buffers -----


xor ax,ax
xor cx,cx
@@c: mov [di],al
stosb
loop @@c ; clear ds and es buffers

;---- Set Palette ------


mov dx,03C8h ; assume ax = 0
out dx,al
inc dx
@@p:
xor al,al
out dx,al ; red = 0
mov al,ah
shr al,2
24
out dx,al ; green = ah/4 (0->63)
neg al
inc al
out dx,al ; blue = -ah/4+1 (64->0)
inc ah
jnz SHORT @@p

pusha ; to decrease sp, and to store cx=0

;----------------------- Main loop begins ------------------------


Main:
;------ calculate water -------
xor di,di
mov cx,32768
@@w: mov ax,[di-512]
add ax,[di+512]
add ax,[di-2]
add ax,[di+2]
sar ax,1 ; /2

sub ax,[es:di]
mov dx,ax
sar dx,5
sub ax,dx
stosw ; mov [es:di],ax add di,2
loop @@w

;----- vertical retrace ----


mov dx,03DAh
@@vr1: in al,dx
test al,8
jz SHORT @@vr1

;----------- change water buffers --------


push ds
push es
pop ds
pop es ; exchange ds/es

;------- paint water -----------


xor si,si
mov di,02D20h ; y=36, x=32
@@o: inc ch ; assume cx=0, inc ch -> cx=256
@@i: mov dx,128
lodsw ; mov ax,[si] add si,2
sub ax,[si] ; x+1, ([si+510] for y+1)
sub dx,ax ; color = water[y][x]-water[y][x+1](should be y+1)

cmp dx,0
jnl SHORT @@d1
mov dl,0
@@d1: cmp dx,255
jng SHORT @@d2
mov dl,255
@@d2:

mov [fs:di],dl ; slow putpixel


inc di
loop @@i

add di,64
cmp si,0
jne SHORT @@o

;-------- add drops --------


popa ; pop regs from the stack
25
add ax,26500 ;.
rol ax,1 ; fake random generator
inc cx ; frame counter
pusha ; push changed regs to the stack

test cl,00000011b ; only 1 drops / 4 frames


jnz SHORT @@nd
mov di,ax
and al,00000111b ; drop height (0-7)
add [di],al
@@nd:
;------ add text -------
mov al,10
and ch,00000011b
mul ch
mov bh,al
push bx
cmp cl,100
ja SHORT @@skip

mov di,24641 ;(y=48,x=32)*2+1(1=for offset to second byte)


@@to: mov cx,64 ; x-pixels of text
@@t: mov al,[fs:bx]
cmp al,0
jz SHORT @@no
inc [BYTE es:di] ; add [WORD es:di],256 (256=height)
@@no:
inc bx
add di,8

loop @@t
inc bh ; add bx,(320-64)
add di,(256*3*2)
cmp di,41025 ; (y=48+32, x=32)*2 + 1
jb SHORT @@to
@@skip:
pop bx

;----- key check ---------


in al,60h ; read scancode
cbw ; clear ah, for later use
dec ax
jnz Main ; jmp if Esc not pressed
;------------------------ Main loop Ends ------------------------
mov al,03h ; ah assumed to be 0
int 10h ; set mode 03h
int 20h ; terminate program, safer than "ret" in win95

Msg DB "Close",13,10,"tha",13,10,"fridge",13,10,"!","$" ;ascii-$ string


;Msg DB "Be",13,10,"HaPpY",13,10,"dont",13,10,"WorrY","$" ; alternative
END Start

MikroiĢlemci ile ilgili notlar Ģimdilik bu kadar.


26

Bölüm 2 – Basic
Basic (Beginner‟s All Purpose Symbolic Instruction Code) dili ile oldukŒa uğraĢmama rağmen burada pek yer
vermeyeceğim. Pascal veya C dilini g™ržnce insan Basic‟i ad× gibi basit ve kaba buluyor. Tamam k×zmay×n Basic‟ciler.
Microsoft her iĢi kolaylaĢt×racağ×m derken kullan×c×n×n kendilerine ™zgž tasar×m yapmalar×na engel oluyorlar ve sanki
at g™zlžğž takm×Ģ gibi gitmemizi istiyorlar.

1. piyano.bas (müzik)
(Ornekler\VB\EskiBasic\GWBASIC.zip*piyano.bas)

Resim 1 – GWBasic ekran× ( y×l 1992 gibi... )

Bir metin – yaz× giriĢi ile nota Œal×n×yor. GWBasic ile yazd×m. Resimde g™ržldžğž gibi Basic Interpreter yaz×yor.
Yani programlar×m×z× *.exe yapam×yorduk o zamanlar.

10 COLOR 1,2:CLS
20 LOCATE 12,20:PRINT "BU BĠR PĠYANO PROGRAMIDIR"
30 T=RND*10000
40 SOUND T,5
50 FOR I=1 TO 10000
60 NEXT
70 CLS
80 LOCATE 12,20:INPUT "NOTANIZ(CDEFGA-F+ D+ A+ ...)=======";A$
90 PLAY A$
100 GOTO 80

GWBasic 3.2‟nin kullan×m× kolay. F1 program×n kod listesini pald×r kžldžr ekrana verir, eğer program uzunsa
yani. F2 Œal×Ģt×rma, F3 dosya yžkleme. Eğer dosya ad×n× hat×rlam×yorsan×z “files” komutu ile dosyalar× g™rebilirsiniz.
Ekranda renkler birbirine girerse F10 ile varsay×lan siyah beyaz ekrana geri d™nebilirsiniz. “cls” ekran× siler, “system”
GWBasic‟i kapat×r, program kilitlenirse Ctrl+Pause ile program× k×rabilirsiniz.

MikroiĢlemci komutlar× gibi sat×r numaralar× ile program Œal×Ģ×yor. Yani Goto komutu ile istediğiniz an
istediğiniz yere atlayabiliyorsunuz. Ne gžzel değil mi? Bu arada sanatmuz.bas bir Tžrk mžzikseverin yapt×ğ× GWBasic
ile program, “Ornekler\VB\EskiBasic\QBasic.zip*Examples” dizininde (Qbasic 4.5 ile rahat Œal×Ģ×yor). Muhakkak
inceleyin, gžzel mžzikler var.
27

2. kutu.bas (kutu şekli)


(Ornekler\VB\EskiBasic\QBASIC.zip*EXAMPLES\kutu.bas)

*.bas dosyalar× not defteri veya edit‟e atmay× denediniz mi? Diğer diller *.c, *.cpp, *.asm, *.pas, *.htm, *.asp
dosyalar× da d×Ģar×dan aŒ×l×p edit edebilirsiniz. Ctrl+X, Ctrl+C gibi k×sayollara al×Ģanlar, Ctrl+Ins, Shift+Ins gibi tuĢlara
al×Ģamayanlar bu Ģekilde program yazabilir.

DECLARE SUB KUTU (A!, B!, C!, D!)


CLS
KUTU 4, 5, 20, 70

LOCATE 4, 5: PRINT "X"


LOCATE 20, 70: PRINT "X"

SUB KUTU (A, B, C, D)

ORTX = (A + C) \ 2
ORTY = (B + D) \ 2
XX1 = ORTX
XX2 = ORTX + 2
YY1 = ORTY
YY2 = ORTY + 2

FOR XX2 = ORTX TO C - 1


XX1 = XX1 - 1: IF XX1 < A THEN XX1 = A
'------
LOCATE XX1, YY1: PRINT "╔"; STRING$(YY2 - YY1 - 1, "═"); "╗"
FOR SUTUN = XX1 + 1 TO XX2 - 1: LOCATE SUTUN, YY1: PRINT "║"; STRING$(YY2 - YY1 - 1, " "); "║": NEXT
LOCATE XX2, YY1: PRINT "╚"; STRING$(YY2 - YY1 - 1, "═"); "╝"
'------
FOR I = 1 TO 7000: NEXT
NEXT

FOR YY2 = ORTY TO D


YY1 = YY1 - 1: IF YY1 < B THEN YY1 = B
'------
LOCATE XX1, YY1: PRINT "╔"; STRING$(YY2 - YY1 - 1, "═"); "╗"
FOR SUTUN = XX1 + 1 TO XX2 - 1: LOCATE SUTUN, YY1: PRINT "║"; STRING$(YY2 - YY1 - 1, " "); "║": NEXT
LOCATE XX2, YY1: PRINT "╚"; STRING$(YY2 - YY1 - 1, "═"); "╝"
'------
FOR I = 1 TO 7000: NEXT
NEXT
END SUB

Asl×nda bu program×n pek bir ™zelliği yok fakat art×k burada ilk kez karĢ×laĢt×ğ×m×z “Sub” kavram× ortaya Œ×kt×.
F2 ile program iŒindeki alt programlara - subroutine ulaĢabilirsiniz. Ana modžlde (programda)
Sub deneme (degisken)
yazd×ğ×n×z anda kendinizi ayr× bir džnyada ana program d×Ģ×nda program yazmaya devam ettiğimizi
g™ržrsžnžz. Bu insanda bağ×ml×l×k yap×yor, Œžnkž diğer DOS programlama dillerinde tžm kod ayn× yerde oluyor.
Burada ise ayr× pencerede prosedžr veya fonksiyon oluĢturuyorsunuz.

Prosedžr iŒine veri yollanabilir fakat prosedžr değer d™ndžrmez. Oysa fonksiyon iŒine değer alabilir fakat her
zaman kendi ad× žzerine değer d™nderir. D™nen fonksiyon sonucunun değiĢken tipi metin, tamsay× veya kayar noktal×
olduğu muhakkak belirtilir. Bir alt program×n prosedžr mž yoksa fonksiyon olarak m× yaz×lacağ×na b™yle karar
veriyoruz.

FUNCTION kup (x AS INTEGER)


kup = x * x * x
END FUNCTION
28

“Run*Make EXE File...” 1 komutu da diğer dillerde yok. Oysa C ve Pascal‟da bunlar an×nda oluĢturuluyor ve
programc× ayr×ca *.exe (executable – Œal×Ģt×r×labilir) hale getirmeye uğraĢm×yor. VB‟nin de b™yle bir huyu var. Eğer ilk
kez kendi program×n×z× yaz×yorsan×z, bir sat×r× yar×m b×rak×p yada bilmeden hatal× yazarsan×z hemen hatan×n olduğu
yeri belirten mesajla karĢ×laĢ×rs×n×z. Yani an×nda Basic hata denetimi yap×yor. Bilmem ne kadar rahat…

Tžm bunlar×n sebebi Basic dilinin asl×nda interpreter – yorumlay×c×, diğer dillerin compiler – derleyici olarak
Œal×Ģmas×ndand×r. Yorumlamak demek tžm program× makine diline Œevirmek yerine sadece çalıştırmak, iĢlemek
demektir. Ne gerek varsa... Derleyiciler ise kaynak program× makine diline Œevirerek (™nce *.obj sonra hata
kalmay×nca *.exe) Œal×Ģt×r×rlar. *.obj dosyalar×n bir faydas× da birden fazla program×n birleĢtirilerek tek *.exe
oluĢmas×na izin vermeleridir. Ana program×n×z alt programlardan oluĢuyorsa TP (uses komutu ile) ve TC (#include
komutu ile) dilleri zaten onlar× birleĢtiriyor. Makine dili de zaten Ģu bildiğimiz *.exe ve *.com uygulama dosyalard×r.
Tabii ki o kadar bir ve s×f×r×n hangisi kod, hangisi rakam ve hangisi yaz× olduğunu ancak derleyici programlar
halledebilir.

Makine dili džĢžk seviyeli, assembly dilleri orta džzey ve Basic, C, Pascal gibi diller de yžksek seviyeli olarak
kabul ediliyor. Yžksek seviyede komutlar konuĢma diline yak×nd×r. Yžksek seviye dillerde program×n ilk yaz×ld×ğ× haline
kaynak program (source), makine diline ŒevrilmiĢ haline de amaŒ program (object) ad× verilir. Basic hem compiler
olarak yapabilir amaŒ programa Œevirebilir, hem de derlemeden interpreter olarak Œal×Ģt×rabilir. Interpreter halinde
program× Œal×Ģt×r×rken ilk karĢ×laĢt×ğ× hatada durup, hata tipini belirtir. Compiler halinde tžm hatalar giderilmeden
(mant×k hatalar× hariŒ) Œal×Ģt×r×lamaz.

Dili tam bilmemek ilk hatalar iken daha ileri seviye programc×l×kta mant×k hatalar× daha Œok g™ze Œarp×yor. En
iyi y™ntem algoritma oluĢturmak ve ak×Ģ diyagram× ile onu desteklemek. Elinizde kalem kağ×t olmadan karmaĢ×k
problemleri Œ™zmek Œok zordur. Tak×ld×ğ×n×z noktalar× kendi anlad×ğ×n×z y™ntemlerle de Ģekillendirip planlamak Œok
rahatlat×c×d×r. Genellikle ilham bilgisayar baĢ×nda değilken daha rahat geliyor. žnkž bilgisayar baĢ×nda iken komut
kargaĢas×, ilgiyi dağ×tan baĢka olaylar programa konsantre olmay× engelliyor. Hatalar× gidermekle de iĢ bitmiyor; yeni
istekler, gžncellemeler programc×lar×n daha Œok zaman harcad×klar× konulard×r. Zor bir problemi gidermek, bazen
kolay g™zžken bir iĢlemden daha k×sa sžrebiliyor. Algoritman×n diğer faydalar× da, daha az kodlama ile problem
Œ™zžmž sunmas×, komut hatalar×n× en aza indirmesi ve daha k×sa sžrede program oluĢturulmas×d×r.

„ğrenmek istediğiniz dilde değiĢken tan×mlama, (aritmetik) operat™rler, karĢ×laĢt×rmalar, sayaŒlar, d™ngžler
ve iĢlem ™ncelikleri konular×n× iyi anlamal×s×n×z.

1
QuickBasic 4.5 versiyonunda derleme imkan× var. Windows CD‟sindeki “\tools\oldmsdos\qbasic.exe” 1.1 versiyonu
ve derleme imkan× yoktur. Sadece edit™r ve Œal×Ģt×r×c×.
29

Bölüm 3 – C Dili
C ve C++ (si plas plas diye okunur) programc×l×ğ× temel programc×l×ktan bir seviye daha žsttedir.
Assembler‟dan sonra donan×ma en yak×n dil say×l×r. „ğrenilmesi en zor dillerdendir. ĠĢlemci, haf×za gibi kaynaklar×
istediğiniz gibi kullanabilirsiniz. Bu sebeple C dili kullan×larak 1978 y×l×nda Unix iĢletim sistemleri žretilebilmiĢtir. MS-
DOS‟da yazd×ğ×n×z kaynak kodunuzu al×p Unix‟de de derleyebilirsiniz. Microsoft da Office uygulama paketinin ve
Windows iĢletim sisteminin žretiminde C dili kullanm×Ģt×r.

Resim 1 – Office uygulamas× MS-VC++ ile yap×lm×Ģt×r

Assembler ve C programc×l×ğ×nda programc× ile donan×m aras×nda bir kontrol birimi yoktur. Hatalar×
programc×n×n bilerek yapt×ğ× kabul ediliyor. Bu sebeple en Œok bilgisayar× kilitleyen programlama dilleri bunlar×d×r. Tabii
ki program durup dururken bilgisayar× kilitlemez yada bilgisayar×n garip davranmas×na sebep olmaz. Yazd×ğ×m×z
programdaki yaz×m hatalar×, dili tam bilmeme ve dikkatsizlik ana sebeplerdir. GiriĢte yazd×ğ×m b™cek ay×klama ile ilgili
yaz× daha Œok bu diller iŒin geŒerli. Dilin okunakl×l×ğ× da Œok ™nemli. Eğer algoritmas×z, karmakar×Ģ×k kod yazarsak
kendimiz bile iĢin iŒinden Œ×kamay×z.

Hemen her dilin ayr×lmaz parŒas× olan metin iĢlem, giriĢ / Œ×k×Ģ ve ekran kontrol komutlar× C dilinde gizli
yerlerdedir. #include k×s×mlar×na bir Ģey yazmazsan×z ekrana basit bir uyar× bile Œ×karamazs×n×z. Library yani
kžtžphaneler iŒindeki komut kžmeleri ™yle zengindir ki iĢlevsel olarak program×n×zda hangisini kullanacaksan×z
seŒimde zorlanabilirsiniz. Mesela getchar() Enter tuĢunu bekleyen ekrana g™zžken tek tuĢ okuma, getch() Enter tuĢu
beklemeyen ekrana g™zžkmeyen tek tuĢ okuma, getche() Enter tuĢu beklemeyen ekrana g™zžken tek tuĢ okuma
fonksiyondur. scanf(), gets() gibi diğer standart veri giriĢ komutlar× da vard×r.

ok geliĢmiĢ program yap×s×na ve icra ak×Ģ kontrol komutlar×na sahiptir. Ayr×ca operat™r kžmesi de (+, -, *, /,
>, <, &, =, ++, %, !=, >>, ^, ->, ?:, sizeof() …) geniĢtir. …s almak iŒin pow (taban, žs); kullan×labilir. Makine dili
seviyesindeki tžm operasyonlar×n C dilinde karĢ×l×ğ× bulunur. Yani sistem programc×l×ğ× ve benzeri ileri seviye
programc×l×ğ×na elveriĢlidir.

Ana program main() iŒinde olmal×d×r. Eğer main() iŒinden Œağr×lmayan bir kod yazm×Ģsan×z asla o k×s×m
Œal×Ģt×r×lamaz. Pascal dilinde de end. deyiminden sonra yaz×lan k×s×mlar sadece aŒ×klama sat×r× gibi anlaĢ×l×r.

#include <stdio.h>
int main(int argsayi, char *args[ ])
{
int k;
for (k=0 ; k<argsayi; k++)
printf (―arg %d = %s\n‖, k, args[k]);
return 2001;
}

int main (int argumansayisi, char *argumanlar [ ]) Ģeklinde asl×nda bir fonksiyon olarak da kullan×labilir. Yani
program×n×z değer d™nderen, komut isteminden değer okuyan bir yap×da olabilir. void – boĢ ifadesi ile main() veya
baĢka fonksiyonlar×m×z×n değer almayacağ×n× veya değer d™ndžrmeyeceğini bildiririz. Birden fazla main fonksiyonu
tan×mlanamaz. Pascal dilinde ise prosedžrler değer d™ndžrebilmesi iŒin var deyimi kullan×l×r:

var x,y:integer; (*global x ve y değişkeni*)


procedure swapint (var x:integer; var y:integer);
30
var z: integer;
begin
z:=x; x:=y; y:=z;
end;
begin
x:=10; y:=20;
swapint(x,y); (*10 ve 20 prosedür içine atılıp, x ve y‟nin yeni değerleri gelir*)
writeln(x,y); (*ekrana 2010 yazar, var denilmeseydi 1020 derdi...*)
end.

Tžm değiĢkenler kullan×m alanlar×n×n žstžnde tan×mlanmak zorundad×rlar. Mesela tžm programda geŒerli
olacak değiĢkeni “main(){” deyiminden ™nce yazabilirsiniz. { } bloklar× iŒinde kullan×lacak değiĢkenler de “{”
iĢaretinden hemen sonra yaz×l×r. Statik – durağan tan×mlanan değiĢkenler data segment – veri b™lgesi, dinamik
değiĢkenler de stack segment – y×ğ×n b™lgesi denen haf×za k×s×mlar×nda saklan×r. Değer verilmemiĢ global değiĢken 0 –
s×f×r, lokal değiĢken ise haf×zadaki belli olmayan bir değere eĢittir. C++ dilinde :: operat™rž ile bir žst bloktaki ayn×
isimdeki değiĢkene ulaĢabilirsiniz.

Komutlar yaz×l×rken kžŒžk bžyžk karakter fark eder. (case sensitive – harf duyarl×) „rneklerdeki gibi aynen
kullanman×z gerekir. VB dilinde DenemeDeger tan×mlay×p sonra denemeDeger yazarsan×z tžm değiĢken adlar×n× son
değiĢikliğe g™re gžncellenir.

Bir Ģart eğer doğru ise 1, yanl×Ģ ise 0 değeri d™nderir. Bu sebeple Ģart ifadeleri hesap iĢlemlerinde
kullan×labilir.
kalan+=(notu<0.5); //unary işlemler
anlam× notu 0.5‟den kžŒžk ise kalana 1 ekle.

0 – s×f×r d×Ģ×ndaki tžm tam say×lar negatif de dahil TRUE (tru diye okunur) yani doğrudur, 0 da FALSE (fols
diye okunur) olarak yorumlan×r. Sadece boolean – mant×ksal değerler değil karakterler de say× olarak iĢlem
g™rebiliyor. ASCII karakterleri tamsay× olarak, mesela A‟n×n karĢ×l×ğ× olan 65 rakam×n× kullanabilirsiniz. „A‟ + 2 * „z‟
gibi… Bu arada „A‟<„a‟ iĢleminin sonucu 1 yani true Œ×kar. ASCII* kod tablosunda A‟n×n 65, a‟n×n 97 olduğu g™ržlebilir.
TžrkŒe karakterleri kullanmak iŒin ASCII kod tablosunun ikinci sayfas×ndan faydalanabilirsiniz.

if (ch>=‘a‘ && ch<=‘z‘||ch==‘ı‘||ch==‘ğ‘||ch==‘ü‘||ch==‘ç‘||ch==‘ö‘||ch==‘Ģ‘) {...}

ĠlginŒ kullan×mlar:

i = ( j =2 , j + 3 ); // i = 5 , j = 2 işlem yapılırken atama yapılıyor


a = b = c = 50 ; //hepsine 50 atanır
if(10<=x<=20) { } //kabul edilir fakat en iyisi alttaki gibi yapmaktır:
if(10<=x && x<=20) { } //&&, AND – ve anlamında
if( (ch=getchar() ) == ‗q‘) {...} //tuş basımı ch‟ye aktarılıp, q basılıp basılmadığına bakılır

DeğiĢkenler int – tamsay×, float (flout diye okunur) – real (riıl diye okunur) gerŒel say× , char (çar diye okunur)
– karakter veya metin Ģeklinde kullan×labilir. Eğer 16 karakterli bir metin ay×rm×Ģ isek, n-1 yani 15 karakterini biz
kullanabiliyoruz. Son karakter “\0” yani NULL olarak saklan×r. Demek ki metinler sonu “0” olan char dizileridir.
Metinlere “=” ile atama yap×lmaz; aĢağ×daki ™rnek gibi strcpy (degisken, deger); yap×l×r. KarĢ×laĢt×rmak iŒin de strcmp (
metin1, metin2 ) komutu kullan×l×r.

int x[6]; komutu haf×zada alt× adet iki byte tamsay× yer aŒ×l×r. x[0], x[1], x[2], x[3], x[4] ve x[5] Ģeklinde
kullanabiliriz. Haf×zada diziler peĢ peĢe oluĢturulurken, peĢ peĢe tan×mlanan değiĢkenlerin artarda olacağ× kesin
değildir. Bu sebeple Basic dilindeki gibi Dim a (n) Ģeklinde boyutu belli olmayan dinamik dizi C dilinde tan×mlanamaz.
Dizilerin sonland×r×c× sabitleri C dilinde int a[6]; gibi her zaman belirtilmek zorundad×r. Yani int a[ ]; olamaz. Ġndeks
numaralar× a[-5] gibi negatif de olamaz. Metinlerde ise char ad[ ] = “Ali”; olabilir.

Bu arada int değiĢkeni DOS ve Win3.1‟de 16 bit yer kaplarken, 32 bit ortam olan Windows 9x‟de 32 bit yer
kaplar. Yani tamsay× değiĢkenlerinizi kullan×rken iĢletim sistemi (Unix, Windows) ve iĢlemcinize g™re boyu farkl×
olabilir. Ayn× Ģekilde fakat daha az belirgin olarak da short ve long değiĢenlerde de birkaŒ farkl×laĢma vard×r. Bu
tžrlerdeki uyumsuzluklara rağmen, char değiĢkeni (bir Byte) kullanmak en pratik ve ekonomik hale geliyor.

Kesirli say×lar× saklayan float d™rt byte haf×za kullan×rken, kesirli k×s×m farkl× Ģekilde saklan×r. IEEE – The
Institute of Electrical and Electronics Engineers standard×na g™re kayar noktal× say×lar iĢaret k×sm×, kesir k×sm× ve žstel

*
Ek 3 – ASCII Kod Tablosuna bak×n×z.
31

k×s×m olarak parŒalar halinde saklan×r. Bu say×lar×n b™lme ve Œarpma gibi karmaĢ×k hesaplar× iĢlemcinin iŒindeki
matematik iĢlemci k×sm×nda yap×l×r.

„ğrenmek istediğiniz dildeki değiĢkenlerin haf×zada kaŒ byte yer kaplad×ğ×n× (C dilinde sizeof() operat™rž ile
bunu bulabilirsiniz), değer aral×klar×n× ve ŒeĢitlerini muhakkak inceleyin. DeğiĢkenlerin s×n×r aral×ğ×n× C dili kontrol
etmediğinden, Œal×Ģmalar×n×zda garip rakamlarla karĢ×laĢmaman×z iŒin boyutlar×na dikkat edin. Yard×m dosyalar×nda
ayr×nt×l× bilgi bulabilirsiniz. Tamsay×, gerŒel say× ve metin tipleri aras×ndaki d™nžĢžm komutlar×n×n kullan×m× da
™nemlidir.

auto, register, static, extern, const ve volatile gibi yer ve tžr bildirimleri vard×r. Genellikle biz bunlar×
kullanmadan değiĢkenlerimizi tan×mlar×z. Ġleri programc×l×lar değiĢkenlerini daha džzenli haz×rlarlar.

auto int a; //zaten yerel değişkenler auto olarak varsayılır, stack segment‟te tutulurlar
register int a; //hafıza yerine sınırlı sayıdaki işlemci yazmacı kullanan yerel değişken
volatile int a; //kesinlikle yazmaçlarda bu değişkeni bekletme, belleği kullan anlamındadır
static int a = 0; //yerel ise her çağrılışta tekrar oluşturulmaz, değerini korur, data segment‟te
extern int a; //birleştirilen diğer programda da aynı değişkeni kullanabiliriz, fonksiyonları da extern ile dışardaki
programdan alınacağı belirtilebilir
const int a = 10; //değeri asla değiştirilemeyen sabit tanımlama

#include <stdio.h>
#include <string.h>
union tip { unsigned char ad [16];
unsigned char soyad [16];
} kisiler;
main()
{
strcpy( kisiler.soyad, "Dere" );
strcpy( kisiler.ad, "Ahmet" );
printf ( "%s\n" , kisiler.soyad ); //print ef diye okunur
}

Siz ekrana soyad yazacak diye beklerken ad yaz×yor değil mi? Kaz× ayağ× demek ™yle değilmiĢ. union - birlik
sayesinde iki değiĢken ayn× haf×zay× kullan×yor. (Ornekler\C\union.c)

Type (C dilinde struct - structure) yani kullan×c× tan×ml× tip, yap× oluĢturma, Basic, C ve Pascal ortak ™zelliğe
sahip; kisiler.soyad gibi tipin alt eleman× aras×nda nokta iĢareti kullan×l×r. ĠŒ iŒe yap× tan×mlanabilir.

struct tarih{
int gun;
int ay;
int yil;
} eski_tarih, yeni_tarih; //eski_tarih hafızada 6 byte yer kaplar
struct tarih ara_tarih = {12,4,2001}; //ilk değer tanımlanması
struct tarih *deneme; //yapılar işaretçi de olabilir
...
gunler = yeni_tarih.gun – eski_tarih.gun;
(*deneme).ay = 12; //deneme->ay = 12; de denilebilir

Tžm değiĢkenler madem haf×zaya yerleĢiyor, onlara adres belirterek de ulaĢabilirsiniz. Bunun anlam× pointer –
iĢaretŒi. Bir değiĢkenin adresi bir pointer değiĢken ile saklanarak doğrudan pointer žzerinden iĢlemlerimizi
gerŒekleĢtirebiliriz. B™ylece yerel bir değiĢken tan×mlasak da pointer sayesinde global olarak değerlere eriĢebiliriz.
Yan×m×za kalan h×z ve bellek kazanc×. C dilinde yoğun olarak kullan×lan pointer yanl×Ģ kullan×ld×klar×nda Windows‟ta
mavi ekran Œ×kmas×na, geŒersiz iĢlem hatalar×na, DOS iŒin ise reset – tekrar baĢlatma gibi etkilere sebep olur.

 Bellek alan× ayr×lmadan bir pointer‟×n g™sterdiği alana veri yžklemeyin.


 Verileri saklarken ayr×lan alanlar×n bžyžklžklerine dikkat edin.
 Pointer değerlerinin geliĢi gžzel değiĢmelerine izin vermeyin.
 Dizilerin 1‟den değil 0‟dan baĢlad×ğ×n× unutmay×n.

Bu arada pointer da bir değiĢken olduğuna g™re ona da pointer (**), pointer pointer‟a da pointer
tan×mlanabilir. Neyse boĢ verin! Bu kadar× da fazla :) ĠĢaretŒiler genellikle char (bir byte), int (iki byte) ve float (d™rt
byte) tan×mlanabilir.
32
int k;
int i; //tamsayı i bellekte ayrılır
int *iptr; //tamsayı iptr – integer pointer, int *iptr = &i; de olabilirdi
iptr = &i; //artık iptr i‟nin adresine sahip
*iptr = 55; //aslında i‟ye 55 değeri aktarıldı
k = *iptr //aslında i‟nin değeri k‟ya aktarıldı
...
char *hata = ―Dosya yok!‖ //metin işaretçilere ilk değer atanabilir
...
iptr = (int *) 0x1b64; //Belli bir adres işaretçiye atanabilir, ama tehlikelidir (near pointer - yakın)
*iptr = 2001; //işaretçiye değer aktarımı
printf (―%p‖, iptr); //ekrana 1B64 yazar
printf (―%d‖, *iptr); //ekrana 2001 yazar
printf (―%x‖, &iptr); //ekrana fff2 yani işaretçinin adresini yazar
...
char far *cptr; //1 MB (0-FFFFF) içinde tanımlanabilen işaretçi (far pointer - uzak)
p = (char far *) 0x124532bc //1245 segment, 32bc offset adresidir
...
char far *ekran = (char far *) 0xb8000000; //B800 DOS‟un ekran bilgilerinin tutulduğu yerdir
*(ekran+20) = '.'; //metin ekranın ilk satırının 20. sütununa “.” karakterini basar
...
int a[3] = {12,55,88}; //üç elemanlı dizi (0, 1 ve 2 numaralı)
int *iptr; //int *iptr = a; da olabilirdi
iptr = a; //dizi başlangıç adresi & ile gösterilemez
printf ("\n%d",*(iptr+1)); //ekrana 55 yazar, 0 1 2 indeks numaralarıdır
printf ("\n%d", iptr[2]); //ekrana 88 yazar
...
void deneme (int *iptr) //fonksiyona bir değişkenin adresi gelecek
{ *iptr=100; } //işaretcinin gösterdiği yere değer aktarılır
void main(void)
{int x;
deneme (&x); //x değişkeninin adresi fonksiyona yollanır
printf (―%d‖, x);} //ekrana 100 yazar
...
char *ad_oku (void) //değer dönderen fonksiyon
{char s[50];
printf (―Adınız=‖);gets (s);
return s;} //okunan metin değer dönderilir
main()
{char *cptr;
cptr= ad_oku(); //dönecek değer ancak bir char işaretçiye aktarılabilir
printf(―%s‖, cptr);
}
...
main(){ // ”Ornekler\C\hafiza.c”
unsigned char far *cptr = (char far *) 0;
int k=0;
for (;;)
{if (k==0)
{putchar (―x ile çıkılır...\n ‖);
if (getch()==‘x‘) break;
printf (―%Fp‖, cptr);
k = 16;} //ekrana 16‟şar bellek kümesi gelir
printf (―%02x‖, *cptr);
--k;
++p;
}}

AĢağ×daki ?: Ģart deyiminde dikkat, VB iŒinde de tek sat×rda iif (mantıksal ifade, Doğru, YanlıĢ) komutu
bulunuyor:
#include <stdio.h>
main()
{int i=4; //i hem tanımlanır hem de ilk değeri atanır
printf("%d",i=4?4:5); //eğer i değişkeni 4‟e eşitse ekrana 4, değilse 5 yaz...
}
33

„zellikle menž haz×rlarken, birden fazla tuĢ okunmamas× iŒin klavye haf×zas×n×n boĢalt×lmas× gerekebilir:

fflush (stdin); //klavye belleği sıfırlanır

printf fonksiyonunda kullan×lan baz× sabitler:

\a zil sesi, ASCII kodu 7 %d tamsay× (char ve int)


\b boĢluk, ASCII kodu 8 %c tek karakter (char)
\t TAB – tabulator karakteri, ASCII kodu 9 %x tamsay×n×n heksadesimal hali (int)
\n yeni sat×r, ASCII kodu 10 %f kayar noktal× (float ve double)
\v džĢey TAB, ASCII kodu 11 %s metin (char)
\r sat×r baĢ×, ASCII kodu 13

scanf()‟de birden fazla veri giriĢi yap×labilir:

int a,b;
scanf(―%d%d‖,&a,&b); //Enter, Tab veya boşluk ile iki tamsayı okunur
scanf(―%d,%d‖,&a,&b); //10,4 gibi sadece virgül ile iki tamsayı girişi

scanf(―%s‖, ad); //metinlerde &ad gibi & işareti kullanılmasına gerek yoktur, okunan metinde boşluk varsa sadece ilk
kısım ad‟a atanır, eğer gets (ad); kullanılırsa böyle bir sorun olmaz

…Œ ŒeĢit fonksiyon olabilir:


1. Değer d™ndžrebilen:

int fonksiyon(void) //void - boş okunaklılığı artırır


{
...
return deger;
}

2. Değer alan ve / veya değer d™ndžrebilen: (pointer kullan×m× ile birden fazla değer d™nmesi sağlanabilir)

int fonksiyon(int a, int b) // ( int a,b ) olmaz


{
...
return deger;
}
3. Prosedžr gibi, ne değer alan ne de değer d™ndžrebilen:

void fonksiyon(void)
{
...
return;
}

Eğer fonksiyon main()‟den sonra yaz×lm×Ģ ise, main() ™ncesinde redeklere – tekrar tan×mlama yani prototip
tan×mlamas× yap×lmal×d×r. Ama genellikle fonksiyonlar×m×z× main()‟den ™nce yazmaya Œal×Ģmam×z al×Ģkanl×k olmal×d×r.

#include <stdio.h>
float bolme (double a, double b); //fonksiyon prototipi
main()
{
printf (―%f‖, bolme (12.4, 4.3));
}
float bolme (double a, double b)
{
return a / b;
}

Dinamik haf×za kullan×m× C iŒin Œok doğald×r: (Ornekler\C\malloc.c)

#include <stdio.h>
34

#include <stdlib.h>
#include <string.h>
void main (void)
{
char *yazi; //pointer yazi
register int t; //işlemci yazmacı kullan, daha hızlıdır, sadece int ve char için

yazi= (char *) malloc (80); //memory allocate - hafıza ayır, text ekran 80x25
if (!yazi)
{printf ("Yetersiz hafıza...\n"); exit(1);}
gets (yazi); //boşluk dahil metin okuma
for (t= strlen(yazi)-1; t>=0; t--)
putchar (yazi[t]);
free (yazi); //hafızayı serbest bırak
}

AĢağ×daki ™rnek belli bir say×y× bitsel iĢlemler kullanarak ikilik sisteme Œeviriyor:

#include <stdio.h>
void main(void)
{
int sayi = 25;
int k, bit;
for (k = 15 ; k>=0 ; --k) //k- - yapmanın bir farkı yoktur
{
bit = (sayi >> k) & 1; //Pascal karşığı: bit:= (sayi shr k) and 1;
printf(―%d‖, bit);
}
}

AĢağ×da žstteki ™rneğin k žŒ iken, yani sonuŒta ekrana gelecek olan 0001 1001 Œevriminin d™rdžncž
basamağ×n×n değerini bize veriyor. Son basamak s×f×r s×ra numaras×na sahip olduğu iŒin žŒžncž değil d™rdžncž
basamağa bak×n×z.

25 = (0001 1001)2 //mavi žŒ say× sağa shift ediliyor, kayd×r×l×yor


25 >> 3 = (0000 0011)2
(25 >> 3) & 1 = (0000 0011)2 & (0000 0001)2 = (0000 0001)2 = 1 //ekrana 1 yazar

ESC tuĢu bas×lana dek yaz×lanlar×n kelime, harf, paragraf ve sat×r say×s×n× hesaplar ve rapor eder. if deyimine
gžzel bir ™rnek. (Ornekler\C\okul\vizesoru.c)

#include <stdio.h>
#include <conio.h>
#include <string.h>
main()
{int harf=-1; int satir=1; int paragraf=1; int kelime=1; int harfsay; char karakter;
clrscr();
do{karakter=getch(); printf("%c",karakter);
if ((karakter!='.')&&(karakter!='\r')&&(karakter!=' ')) harf++;
harfsay++;
if ((karakter==' ')||(karakter==13)) kelime++;
if (karakter==13) {paragraf++;satir++;printf("\n");};
}while(karakter!=27);
printf("\n%d=kelime sayısı ",kelime);
printf("%d=harf sayısı ",harf);
printf("%d=paragraf sayısı ",paragraf);
printf("%d=satır sayısı \n ",satir);
getch();
}
35

1. sıralama (balon, seçerek ve hızlı sıralama)


(Ornekler\C\siralama\bubblsor.c, selecsor.c, quicksor.c)

Dizilerde s×ralama iŒin en Œok seŒerek – selection sort, h×zl× – quick sort ve balon – bubble sort kullan×l×yor.
Merge sort (birleĢtir s×rala), insertion sort (ekleme s×ralama) gibi algoritmalar da incelenebilir. Kullan×m amac×na g™re
h×z gereken yerde h×zl× s×ralama, basit birkaŒ say× s×ralanacak ise de balon s×ralamas× kullan×labilir. Balon s×ralamas×nda
iŒteki for‟dan geriye doğru giden bir tane daha yaz×larak Œift y™nlž – bi–directional balon s×ralamas× olarak
h×zland×r×labilir. Pascal, Basic dillerinde de algoritma değiĢmiyor. Delphi‟nin “Demo\Threads” dizininde gžzel bir ™rnek
var. Tabii ki s×raland×ktan sonra dizinin ilk eleman× en kžŒžk, son eleman× da en bžyžk rakam olur. Bu sayede
minimum ve maksimum kendiliğinden ortaya Œ×k×yor. Bžyžk veri y×ğ×nlar×nda yani veritabanlar×nda ise SQL* deyimleri
olan basit komutlar kullanarak istediğiniz alan× veya alanlar× s×ralayabilirsiniz.

Balon s×ralamas×: for (k = 9 ; k >= 0; --k) printf (" %d", a[k]);


}
#include <stdio.h>// “bubblsor.c”, basit ve yavaş algoritma
int a [10] = {33, 3, 6, 44, -3, 22, 12, 33, -4, 0}; H×zl× s×ralama:
void main (void)
{ #include <stdio.h> // "quicksor.c", karmaşık ve hızlı algoritma
int k, l, tampon; int a [10] = {33, 3, 6, 44, -3, 22, 12, 33, -4, 0};
for (k=0 ; k < 9 ; ++k) void QuickSort(int a[ ], int lo0, int hi0)
for (l = 0 ; l < 9 ; ++l ) {
if (a[l] > a[l+1]) //tüm sayılar karşılaştırılarak yer int lo = lo0; //lo0; le harfi, o harfi ve sıfır
değiştirilir int hi = hi0;
{ int mid, tampon;
tampon = a[l]; if ( hi0 > lo0)
a[l] = a[l+1]; {
a[l+1] = tampon; mid = a[ ( lo0 + hi0 ) / 2 ];
} while( lo <= hi )
for (k = 0 ; k < 10; ++k) printf (" %d", a[k]); {
while( ( lo < hi0 ) && ( a[lo] < mid )) ++lo;
} while( ( hi > lo0 ) && ( a[hi] > mid )) --hi;
if( lo <= hi )
SeŒerek s×ralama: {
tampon = a [lo];
#include <stdio.h> // “selecsor.c”, basit ve hızlı algoritma a [lo] = a [hi];
int a [10] = {33, 3, 6, 44, -3, 22, 12, 33, -4, 0}; a [hi] = tampon;
void main (void) ++lo; --hi;
{ }
int k, l, max, indis; }
for (k=0 ; k < 10 ; ++k) if( lo0 < hi )
{ QuickSort( a, lo0, hi );
max = a [k]; if( lo < hi0 )
indis = k; QuickSort( a, lo, hi0 );
for (l = k + 1 ; l < 10; ++l ) }
if (a[l] > max) //en büyük bulunarak başa atılır }
{
max = a[l]; void main(void)
indis = l; { int k;
} QuickSort (a, 0, 9); //0 ilk sıra, 9 son sıra numarası
a[indis] = a[k]; for (k = 0 ; k < 10; ++k) printf (" %d", a[k]);
a[k] = max; }
}

Ekrana Œ×kan sonuŒ:


-4 -3 0 3 6 12 22 33 33 44

Balon s×ralamas×n×n mikroiĢlemci kodlar× ise, Ģu Ģekilde not defterine yaz×l×p, debug‟a yap×Ģt×r×labilir:

r ip
100

*
Ek 2 – SQL k×sm×na bak×n×z.
36

r cs
1000
r ds
2000
e ds:100 33 3 6 44 3 22 12 33 4 0 negatif sayılar yazılamıyor
a 100
r ip
100
r cs
1000
r ds
2000
e ds:100 33 3 6 44 3 22 12 33 4 0
a 100
1000:0100 mov cx, 0009 Dizi boyutunun bir eksiği
1000:0103 mov si, 0100 Dizi başlangıç adresi
1000:0106 jmp 010d Alt programa git
1000:0108 loop 0106 Ana döngü
1000:010A int 20 Program sonu
1000:010C nop İşlem yok
1000:010D push cx cx değerini yeni döngüde koru
1000:010E mov cx,0009 İç döngü de 10 – 1, yani 9
1000:0111 mov si,0100 Dizi başlangıç adresi
1000:0114 mov al, [si] İlk değer
1000:0116 mov ah, [si+01] Bir sonraki değer
1000:0119 cmp al, ah İkisini karşılaştırır
1000:011B ja 011F Eğer al>ah (al büyükse) ise
1000:011D jmp 0126 Değilse dönmeye devam et
1000:011F xchg al,ah İkisini yer değiştir
1000:0121 mov [si] ,al Yeni değerleri güncelle
1000:0123 mov [si+01], ah Bir sonraki değer
1000:0126 inc si Bir sonraki adres
1000:0127 loop 0114 Alt döngü devam eder
1000:0129 pop cx Eski cx ne idi?
1000:012a jmp 0108 İkinci döngü bitiyor
g=cs:100 10a
d ds:100
2000:0100 00 03 03 04 06 12 22 33-33 44 00 00 00 00 00 00 ......"33D......
2000:0110 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

Mavi yaz×l× olan adresleri daha program× yazarken bilmemiz mžmkžn değil. Debug‟a yap×Ģt×rd×ktan sonra
adreslere bak×p buralar× džzeltiriz. Bu adres iĢlemi Microsoft Programmers Workbench adl× program ile veya baĢka dil
iŒinde asm kodlar× kullan×rken Label tan×mlanarak yap×l×yor. 0 – 255 aras×nda olan onalt×l×k say× sistemindeki
tamsay×lar× rahatl×kla s×ralayabiliyoruz. Bu alan yetmezse 0 – 65565 aras× değer alabilen ikiĢer byte‟l×k AX ve BX
yazmaŒlar×n× buradaki AL ve AH yerine kullanabiliriz. Fakat SI+1 yerine de SI+2 demek gerekecektir. C dilindeki
*(iptr+1) Ģeklindeki pointer art×r×m×nda kendiliğinden sonraki dizi eleman×na geŒilir.

Dizi s×ralamas×ndan sonraki en Œok karĢ×laĢ×lan problem aramad×r. Değer araman×n s×k kullan×lan žŒ ŒeĢidi
vard×r: linear (doğrusal), binary (ikilik) ve hashing (k×yma).

1- Doğrusal arama Œok basittir, ilk dizi eleman×ndan baĢlay×p bulana dek karĢ×laĢt×rmaya devam edilir. ok
bžyžk dizilerde bu y™ntem yavaĢt×r.

2- Ġkilik de ise sıralı olan bir dizide aranan değer ile dizinin ortas×ndaki değer karĢ×laĢt×r×l×r. Eğer dizi 1000
elemanl× ise 500 değer art×k elenmiĢ olur. Kalan yar×da da ortadaki eleman karĢ×laĢt×r×larak 250, daha sonra da 125
eleman kalacak Ģekilde d™ngž devam eder. Burada recursive (kendini Œağ×ran) veya iterative (tekrarlan) y™ntemler
kullan×labilir.

Recursive Binary Search Fonksiyonu: (Pascal versiyonu – BinSearch (x, 53, 1, 30); gibi kullan×l×yor)

type
x=array[1..100]of integer; // kendi tipimizi oluşturuyoruz

function BinSearch (var Table: x; Target: integer; First,Last: integer ) : integer;


var
37

middle: integer;

begin
middle:=(First+Last) div 2; //tamsayı olmalı
if First>Last then BinSearch:=0
else if Target = Table[middle] then BinSearch:=middle
else if Target < Table[middle] then BinSearch:= BinSearch (Table, Target, First, middle - 1)
else if Target = Table[middle] then BinSearch:= BinSearch (Table, Target, middle + 1, Last);
end;

Iterative Binary Search Fonksiyonu:

type
x=array[1..100]of integer; // kendi tipimizi oluşturuyoruz
function BinSearch (var Table: x; Target: integer; First,Last: integer ) : integer;
var
middle: integer;
found: Boolean;

begin
found := False;
While (First<=Last) and not(found) do //şart doğru olana dek aramaya devam et...
Begin
Middle:=(First+Last) div 2;
if Target = Table[middle] then found:= true
else if Target < Table[middle] then Last:= middle - 1
else if Target > Table[middle] then First:=middle + 1 ;
End;
if found then BinSearch:=middle
else BinSearch:=0; //bulunamadı
End;

3- Hashing Search s×ral× olmayan bžyžk dizilerde de bu y™ntem tercih edilir. Microsoft Access‟de bir tablo
oluĢturduğunuzda “primary key field” oluĢturay×m m× diye soruyor hat×rlarsan×z. Her kay×da verilen bir anahtar alan
sayesinde tek taramada istenen kayda ulaĢ×labiliyor ve tablolar× iliĢkilendirirmek kolaylaĢ×yor. Silinen kay×tlar×n s×ra
numaras× daha sonra gerŒek kay×tlar ile değiĢtiriliyor. S×f×r ile maksimum slot (kay×t) aras×nda her kayda bir hash
index (tek numara) veriliyor. Ayn× değerdeki kay×tlarda ise uygun algoritma oluĢturularak collision (Œak×Ģma/Œarp×Ģma)
meydana gelmesi ™nlenir.

Basitce Delphi ile doğrusal arama ve değiĢtirme ™rneği (metinBul.zip):


38

2. makro.c (#define kullanımı)


(Ornekler\C\ MAKRO.C)

#include <stdio.h>
int a,b;
main()
{
printf(―A sayısı:‖); scanf(―%d‖,&a);
printf(―B sayısı:‖); scanf(―%d‖,&b);
if (a>b) printf(―A Büyük‖); //Pascal‟dan farklı olarak “;” else öncesinde yazılabilir
else if (a<b) printf(―B Büyük‖);
else printf(―EĢitler‖);
}

…stteki program× TžrkŒeleĢtirebiliriz. Prensip olarak makrolar bžyžk harf yaz×l×r:

#include <stdio.h>
#define BASLA main() {
#define DUR }
#define EGER if
#define ISE //karşılığı yok...
#define DEGILSE else
#define YAZ printf
#define OKU scanf
int a,b;
BASLA
YAZ (―A sayısı:‖); OKU (―%d‖,&a);
YAZ (―B sayısı:‖); OKU (―%d‖,&b);
EGER (a>b) ISE YAZ (―A Büyük‖);
DEGILSE EGER (a<b) ISE YAZ (―B Büyük‖);
DEGILSE YAZ (―EĢitler‖);
DUR

Resim 2 – C dilinde basit makro yaz×m×

Ayr×ca makrolar fonksiyon veya prosedžr olarak da kullan×labilir:

#define dur() while (! kbhit()) //dur();


#define diskriminant (a,b,c) b*b–4*a*c //sonuc=diskriminant(1,y,4);
39

3. unionreg.c (union tanımlama)


(Ornekler\C\unionreg.c)

BirkaŒ konuyu bir araya getirirsek, iĢlemcimizin yazmaŒlar×na ulaĢmak iŒin Ģunu kullanabilirsiniz:

Resim 3 – Disket bilgilerinin g™ržntžlenmesi

#include <stdio.h>
#include <dos.h>
#include <conio.h>
union REGS bizimreg; //REGS yapısı dos.h içine tanımlı yapıdır.
double toplam, dolu, bos;
double topclus;
double bosclus;
double secsay;
main()
{
clrscr();
bizimreg.h.ah=0x36;
bizimreg.h.dl=0; //1,2,.. diger sürücülerdir.
intdos(&bizimreg,&bizimreg);

topclus= (unsigned) bizimreg.x.dx;


bosclus= (unsigned) bizimreg.x.bx;
secsay = (unsigned) bizimreg.x.ax;
toplam = 512.0 * topclus * secsay;
bos = 512.0 * bosclus * secsay;
dolu = toplam - bos;

printf("Toplam disk alani = %9.f B\n",toplam);


printf("Toplam dolu disk alani = %9.f B\n",dolu);
printf("Toplam bos disk alani = %9.f B\n",bos);
getch();
}

dl yada DL yazmac×na 0 değeri yollad×ğ×m×z zaman varsay×lan sžržcž olan “c:” raporlan×r. 2 GB žstž iŒin yanl×Ģ
rapor verebilir. Ġsterseniz 1 değeri atay×p, disket bilgileri ile program× test edin. Byte yerine kilo byte olmas× iŒin
değerleri 1024‟e b™lebilirsiniz. O zaman printf‟lerdeki “%9.f B” yerine “%9.2f KB” yazman×z gerekli.
40

4. mousetst.c (fare kullanımı)


(Ornekler\C\mousetst.c)

Bu program iki *.c dosyas×ndan oluĢuyor. mousetst.c ve mouse.c dosyas×. AĢağ×daki kod mousetst.c ‟dir.

Resim 4 – Fare testi

#include <conio.h>
#include <stdio.h>
#include "mouse.c"
void main ()
{
//Check whether a mouse is connected
if (!IfMouse) {
printf ("Mouse not installed\n");
return;
}
//Clear the screen
clrscr ();
//Activate the cursor
ShowMouse ();
do {
//Get the mouse status
ReadMouse ();
//Display the coordinates
gotoxy (1, 1);
printf ("X: %4d Y: %4f\n", MouseX, (float)MouseY*2.5);
//If MouseB & 1 == 1 then the left mouse button is down
printf ("Left : %d\n", (MouseB & 1) == 1);
//If MouseB & 2 == 2 then the right mouse button is down
printf ("Right : %d\n", (MouseB & 2) == 2);
//If MouseB & 4 == 4 then the middle mouse button is down
printf ("Middle : %d\n", (MouseB & 4) == 4);
//repeat that until both left and right buttons are down
} while (!kbhit());
//Disable the cursor
HideMouse ();
}

mouse.c ise;

unsigned int MouseX, MouseY, MouseB;


char IfMouse ();
void ShowMouse ();
void HideMouse ();
void ReadMouse ();
void SetMouseXY (unsigned int X, unsigned int Y);
void SetMinMaxX (unsigned int Min, unsigned int Max);
void SetMinMaxY (unsigned int Min, unsigned int Max);

//This procedure checks where a mouse is available


char IfMouse ()
{
unsigned int Result;
asm mov ax, 0
asm int 0x33
asm mov Result, ax
return Result;
41

//This procedure makes the mouse cursor visible


void ShowMouse ()
{
asm mov ax, 0x1
asm int 0x33
}

//This procedure makes the mouse cursor invisible


void HideMouse ()
{
asm mov ax, 0x2
asm int 0x33
}

//This procedure reads the location of the mouse cursor and the button press
//information
void ReadMouse ()
{
asm mov ax, 0x3
asm int 0x33
asm mov MouseB, bx
asm mov MouseX, cx
asm mov MouseY, dx
}

//This procedure sets the mouse cursor to another location


void SetMouseXY (unsigned int X, unsigned int Y)
{
asm mov ax, 0x4
asm mov cx, X
asm mov dx, Y
asm int 0x33
}

//This procedure sets the minimum and maximum values in horizontal range
void SetMinMaxX (unsigned int Min, unsigned int Max)
{
asm mov ax, 0x7
asm mov cx, Min
asm mov dx, Max
asm int 0x33
}

//This procedure sets the minimum and maximum values in vertical range
void SetMinMaxY (unsigned int Min, unsigned int Max)
{
asm mov ax, 0x8
asm mov cx, Min
asm mov dx, Max
asm int 0x33
}

Her iki program× da ayn× klas™re yazman×z gereklidir. Fakat mouse.c‟yi daha baĢka programlarda da kullanmak
isterseniz “TC\Include” dizinine bu dosyay× kopyalayabilir, ve baĢka program×n iŒine
#include <mouse.c>
diye ekleyebilirsiniz.

Pascal‟da da *.tpu unit oluĢturarak “TP\TPU” dizinine genel program prosedžr ve fonksiyonlar×
oluĢturabilirsiniz. diyot1.pas ™rneğine bakabilirsiniz. Asl×nda Ģunu yapmak mžmkžn; madem fareye mikroiĢlemci
kodlar× ile ulaĢ×l×yor, bunu al×p Basic ve Pascal iŒinde de kullanabilirsiniz. Yani Pascal ™rneğimiz olan hesapmak.pas
hesap makinesi fare ile de Œal×Ģsa ne gžzel olurdu... “Ornekler\C\Grafikli.zip*grafikli.c” tam istediğimiz gibi, fare ve
grafik ekran kullan×m× ile ilgili...
42

5. klvy.c (klavye ile çizim yapma)


(Ornekler\C\klvy.c)

Assembler b™lžmžndeki cizim.asm gibi bu da ekrana klavyeden Œizim yap×l×yor. w, a, s, d y™n iŒin, q Œ×k×Ģ, e
silme, r Œizim, f atlama, g bitiĢik pixel Œizme iŒin kullan×l×yor. Dikkat ettiyseniz her iki *.c ™rneğimizde asm sat×rlar×
var. Her dil donan×ma doğrudan komut yollayabilmek iŒin bu tip kodlanmaya gidiyor. Bu sayede grafik ekrana
(320*200 Œ™zžnžrlžk) geŒip renkli nokta bas×yoruz. cizim.asm ™rneğinden farkl× olarak ekran×n d×Ģ×na Œ×k×lmamas× iŒin
™nlemler al×nm×Ģ.

Resim 5 – Klavyeden Œizim yapmak

#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
typedef unsigned char BYTE; //artık BYTE‟ın anlamı unsigned char
typedef unsigned short WORD;
WORD SCREEN_WIDTH=320,SCREEN_ADDRESS=0xa000;
void putPixel(int x,int y,BYTE color)
{ asm mov ax,y
asm mul SCREEN_WIDTH
asm add ax,x
asm mov bl,color
asm xchg ax,bx
asm mov es,SCREEN_ADDRESS
asm mov es:[bx],al
}
main()
{ int x=10;int y=10;char ch;char erase,fast=1;
clrscr();
asm mov ax,13h
asm int 10h

putPixel(x,y,60);
do
{ch=getch();

if (ch=='w') {if(erase)putPixel(x,y,0);else putPixel(x,y,98);


if(fast)y=y-fast;else y--;
if(x<=0) x=0;
if(x>=300) x=300;
if(y<=0) y=0;
if(y>=200) y=199;
putPixel(x,y,60);
}
if (ch=='s') {if(erase)putPixel(x,y,0);else putPixel(x,y,98);
if(fast)y=y+fast;else y++;
if(x<=0) x=0;
if(x>=300) x=300;
if(y<=0) y=0;
if(y>=200) y=199;
putPixel(x,y,60);
}
if (ch=='a') {if(erase)putPixel(x,y,0);else putPixel(x,y,98);
if(fast)x=x-fast;else x--;
if(x<=0) x=0;
43

if(x>=300) x=300;
if(y<=0) y=0;
if(y>=200) y=199;
putPixel(x,y,60);
}
if (ch=='d') {if(erase)putPixel(x,y,0);else putPixel(x,y,98);
if(fast)x=x+fast;else x++;
if(x<=0) x=0;
if(x>=300) x=300;
if(y<=0) y=0;
if(y>=200) y=199;
putPixel(x,y,60);
}
if(ch=='q') {
asm mov ax,3
asm int 10h
exit(1);}
if(ch=='e') erase=1;
if(ch=='r') erase=0;
if(ch=='f') fast++;
if(ch=='g') fast=0;
}while(1); //sonsuz döngü

Eğer ekrana bir nokta basabilmiĢseniz, art×k Œizgi, žŒgen, daire, kare gibi Ģekiller, hatta kendi yaz× tipinizi
oluĢturabilirsiniz. Ama her Ģeyi de Œizerek yapmak yerine belli dokular× resim olarak alabilirsiniz. Mesela harfleri
d×Ģar×da haz×rlay×p, istediğiniz yere yaz×lar yazabilir, logo yapabilirsiniz. MSPaint veya Paintbrush ile zaten bu Œizim
iĢleri yapabiliyoruz. ×kan žržn bitmap – bit haritalama (sadece renk ve koordinat bilgileri saklan×r) tžržndedir.

CorelDraw, AutoCAD, Flash ise vekt™rel Œizim yapmam×z× sağlayan programlard×r. Vekt™rel Œizimin avantaj×
zoom yani bžyžtžlse bile bozulmamas×d×r ve matematiksel olarak Œizimler hesaplan×p kaydedildiği iŒin dosya olarak da
az yer kaplamalar×d×r. Yaz× yazmak iŒin kulland×ğ×m×z truetype font – gerŒek yaz× tipleri de asl×nda minik vekt™rel
resimlerdir. WYSIWYG – what you see is what you get ne g™ržrsen onu al×rs×n mant×ğ× ile yaz×c×m×zdan ekranda
g™rdžğžmžz yaz×lar× kžŒžltžp bžyžterek rahatl×kla alabiliyoruz. Bol bol iĢlemler geri al×nabilir, bu haf×zada fazla yer
iĢgal etmez. Flash ile ilgilenenlere Swish ve Flax programlar×n× da incelemelerini tavsiye ediyorum. Bitmap tabanl×
program olan Adobe Photoshop program× kaliteli g™ržntž žretir ve filtrelemelerle resimler žzerinde gerŒekŒi efektlerle
oynamam×z× sağlar. Layer tekniği ile katman olarak oluĢturulan resimlere mždahale etmek daha kolaylaĢ×yor.

Bilgisayardaki žŒ boyutlu džnya ise gittikŒe daha gerŒekŒi olmaya devam ediyor. Eskiden render – tekrar
oluĢturma komutu ile uzun sžrede elde edilebilen kaliteli iki boyutlu g™ržntžler, art×k real – time gerŒek zamanl×
olarak oyunlarda ve sinemalarda g™ržlebilir. Bump mapping – kabar×k haritalama, texture – doku kaplama,
×Ģ×kland×rma ve g™lgelendirme, environmental bump mapping – Œevresel haritalama, sis gibi ™zellikler art×k standart.
Fakat hala saŒ, toz, Œamur, bitkiler, dinamik ×Ģ×k etkisi, gerŒek zamanl× modifikasyonlar (eğilme, kopma, yanma,
erime), dinamik geometri hesab× bilgisayarlar×m×z× Œok zorluyor.

Internet‟te biraz araĢt×r×rsan×z oyun, t×bbi veya endžstriyel amaŒla, siz de kendi bedava žŒ boyut edit™rlerinizi
elde edebilirsiniz, Delphi gibi bir dilde ™rneğin GLScene nesneleri ile žŒ boyutlu tasar×m programlar× yapabilirsiniz.

Biraz incelediğim Ģu programlar× da, žŒžncž boyut ile ilgilenenlere Caligari TrueSpace, NewTek Lightwave,
Metacreations Ray Dream Studio programlar×n× incelemelerini tavsiye ediyorum. Tžmžnde animasyon haz×rlama ve
materyal džzenleme imkan× var. CD‟mizde bulabileceğiniz TrueSpace 3SE ile yerŒekimi, ržzgar, elastiklik, kat×l×k,
k×r×lganl×k gibi birŒok efekt uygulanabiliyor. Ayr×ca CD‟de Blender, Amapi ve Kashmir gibi bedava birkaŒ yaz×l×m daha
bulabilirsiniz. SonuŒta *.avi veya *.mov film elde etmek yan×nda Export komutlar× ile projeleri diğer programlar×n
desteklediği tžrlere d™nžĢtžrebiliriz. Bu arada Bryce 3D program× da gerŒekten Œok ™zgžn menžlere sahip bir render
ve animasyon program×. Macromedia Fireworks ile iki boyutta hoĢ yaz× efektleri elde edebilirsiniz.
44

6. domgunu.c (tarihin gününü bulma)


(Ornekler\C\okul\domgunu.c)

Okulda yapt×ğ×m×z haftan×n hangi gžnž doğduğunuzu bulan case, for, printf, scanf kullan×m×na bir ™rnek.

#include <stdio.h>
char ay[12]={31,0,31,30,31,30,31,31,30,31,30,31};
int gun,ayi,yil,i;
double tgun;
unsigned long mgun;
main()
{printf("dogum yiliniz=");scanf("%d",&yil);
printf("dogum ayiniz =");scanf("%d",&ayi);
printf("dogum gununuz=");scanf("%d",&gun);
ay[1]=(yil%4)?28:29;
tgun=(yil-1)*365.0+(yil-1)/4;
for(i=0;i<(ayi-1);i++) tgun+=ay[i];
tgun+=gun; mgun=tgun/7;i=tgun-mgun*7;
printf("dogdugunuz gun\n");
switch(i){ case 1:printf("pazar");break;
case 2:printf("pazartesi");break;
case 3:printf("sali");break;
case 4:printf("carsamba");break;
case 5:printf("persembe");break;
case 6:printf("cuma");break;
case 0:printf("cumartesi");break;
};
}

Sadece haftan×n gžnž değil iki tarih aras×ndaki gžn veya baĢka birimdeki fark da gerekli olabilir.
“Ornekler\Pascal\Staj\Ariza.pas” program×nda dakika cinsinden tarih fark× hesaplamak zorundayd×m. Bu programdan
hesap k×sm×n× Œ×kararak aĢağ×daki ™rneği oluĢturdum. As×l programda iki tarih aras×ndaki fark× tam olarak dakika
cinsinden alabiliyorken, ™rnekte gžn iŒinde de geŒen dakikalar hesaplanm×yor. Tarihler hatal× girilirse –111 gibi bir
rakam žretiliyor. (Ornekler\Pascal\Diger\gun.pas)

type aylar=array [1..12] of integer;


const ay:aylar=(31,0,31,30,31,30,31,31,30,31,30,31);

function gun_sayisi(a1,b1,c1,a2,b2,c2:integer):longint; {tamsayi gun sayisi bulur}


var i,j:integer;artik_gun,aradeg,arasay:integer;
begin
gun_sayisi:=0;aradeg:=0;
if (c1>c2)or((b1>b2)and(c1=c2))or((a1>a2)and(b1=b2)and(c1=c2)) then
begin gun_sayisi:=-111;exit; end; {tarih kontrolu}
if (c1=c2)and(b1=b2) then {yil & ay esit ise}
begin aradeg:=a2-a1;gun_sayisi:=aradeg;exit; end;
if c1-c2=0 then begin {ayni yil ise}
if b1=2 then if (c1 mod 4)<>0 then ay[2]:=28 else ay[2]:=29;
for j:=b1+1 to b2-1 do begin
if j=2 then begin
artik_gun:=c1 mod 4;
if artik_gun<>0 then ay[j]:=28 else ay[j]:=29;
end; {if}
aradeg:=aradeg+ay[j];
end; {for}
aradeg:=aradeg+ay[b1]-a1+a2;
gun_sayisi:=aradeg;exit;
end;
if c2-c1=1 then begin {bitisik iki yil}
if b1<>12 then begin for j:=b1+1 to 12 do begin
if j=2 then begin
artik_gun:=c1 mod 4;
if artik_gun<>0 then ay[j]:=28 else ay[j]:=29;
45

end; {if}
aradeg:=aradeg+ay[j];
end; {for}
aradeg:=aradeg+ay[b1]-a1;
end
else aradeg:=aradeg+ay[b1]-a1;
if b2<>1 then begin for j:=1 to b2-1 do begin
if j=2 then begin
artik_gun:=c2 mod 4;
if artik_gun<>0 then ay[j]:=28 else ay[j]:=29;
end; {if}
aradeg:=aradeg+ay[j];
end; {for}
aradeg:=aradeg+a2;
end
else aradeg:=aradeg+a2;
gun_sayisi:=aradeg;exit;
end;
if c2-c1>1 then begin {farkli yillar}
if b1<>12 then begin for j:=b1+1 to 12 do begin
if j=2 then begin
artik_gun:=c1 mod 4;
if artik_gun<>0 then ay[j]:=28 else ay[j]:=29;
end; {if}
aradeg:=aradeg+ay[j];
end; {for}
aradeg:=aradeg+ay[b1]-a1;
end
else aradeg:=aradeg+ay[b1]-a1;
for i:=1 to c2-c1-1 do begin for j:=1 to 12 do begin
if j=2 then begin
artik_gun:=(c1+i) mod 4;
if artik_gun<>0 then ay[j]:=28 else ay[j]:=29;
end; {if}
aradeg:=aradeg+ay[j];
end; {for j} end; {for i}
if b2<>1 then begin for j:=1 to b2-1 do begin
if j=2 then begin
artik_gun:=c2 mod 4;
if artik_gun<>0 then ay[j]:=28 else ay[j]:=29;
end; {if}
aradeg:=aradeg+ay[j];
end; {for}
aradeg:=aradeg+a2;
end
else aradeg:=aradeg+a2;
gun_sayisi:=aradeg;exit;
end;
end;

begin
writeln(gun_sayisi(30,7,2001,30,8,2001)*24*60); //24 saat 60 dakika ile çarpılıp kaç dakika olduğu bulunuyor
end.

Delphi ve VB iŒindeki haz×r tarih fonksiyonlar× zaten bu tžr karmaĢ×k mant×ktan bizi uzaklaĢt×r×yor. Bir iki sat×r
ile gžn say×s× bulunabilir veya daha değiĢik istekler giderilebilir. PHP de ise:

//Kullanıcının son login tarihi ile bugün arasında kaç gün varmıĢ?
$fark= floor( (mktime(0,0,0,date("m"),date("d"),date("y"))-
mktime(0,0,0, //saat kısmı
substr(mysql_result($result,$i,"sonGiris"),5,2), //ay
substr(mysql_result($result,$i,"sonGiris"),8,2), //gun
substr(mysql_result($result,$i,"sonGiris"),2,2)) //yıl
)/86400); //24*60*60
//Ġki tarihin aynı formatta olması için mktime() kullanılıyor
46

7. saat.c (DOS saati)


(Ornekler\C\TSR2 ve Ornekler\C\okul\SAAT.C)

mystr.c kodlar×n× baz× minik değiĢikliler ile TC‟de derleme imkan×m oldu. DOS haf×zas×nda kal×c× olarak Œal×Ģan
bu saati istediğiniz an kapatacak tuĢ ise Shift+F10. TSR – Terminate and Stay Resident mant×ğ× kar×Ģ×k gibi, ama belki
siz baz× değiĢiklikler yapabilirsiniz. Hafif C++ kokular× yžkseliyor... Windows XP‟de ise art×k TSR yok.

Resim 6 – TSR saat

#include <stdio.h>
#include <dos.h>
#include <string.h>
#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
void interrupt (*oldint8) (__CPPARGS);
void interrupt (*oldint9) (__CPPARGS);
int ch;
#define SH_F10 0x5D00 //kapatma tuşu Shift+F10
long far *tick = (long far *) 0x0000046c; //timer tick – saat tıklaması
char s[10] = {0,0,':',0,0,':',0,0,0,0};
long total_sec;
int sec, min, hour;

void _writes(int row, int col, char *str)


{ char far *scrp = (char far *) 0xb8000000; //0xb800 text ekran hafızası
scrp += row * 160 + col * 2;

while (*str != NULL)


{ *scrp = *str++;
scrp += 2;
}
}

int get_last_buffer(void)
{ char far *t1 = (char far *) 1050;
if (*t1 != *(t1+2))
{ t1 += *t1 - 26;
return *(int far *) t1;
}
return 0;
}

void f1(int a, char *str)


{ str[0] = a / 10 + '0';
str[1] = a % 10 + '0';
}

void interrupt newint8(__CPPARGS)


{ oldint8();
total_sec = *tick * 10 / 182;
sec = total_sec % 60L;
min = total_sec % 3600L / 60;
hour = total_sec / 3600;
f1(hour, s);
f1(min, s+3);
f1(sec, s+6);
47

_writes(0, 72, s);


}

void interrupt newint9(__CPPARGS)


{ oldint9();
ch = get_last_buffer();
if (ch == SH_F10)
{ setvect(0x9, oldint9);
setvect(0x8, oldint8);
freemem(_psp);
}
}

void main(void)
{ printf("TSR yüklendi...\n");
oldint8 = getvect(0x08);
oldint9 = getvect(0x09);
setvect(0x8, newint8);
setvect(0x9, newint9);
keep(0, 500); //program bitti, ama etki TSR biçimde
}

AĢağ×daki ™rnek de yap× struct – structure (strakçır diye okunur) oluĢturmak ile ilgili. Structure kullan×m×
Object Oriented Programming – nesneye dayal× programlama mant×ğ×na benziyor.

Resim 7 – Saat.c‟nin sonucu

#include "stdio.h"
#include <conio.h>
#include <stdlib.h>
struct my_time{int hours,minutes,seconds;};
void display(struct my_time *t);
void update(struct my_time *t);
void delay(void);

void main(void)
{struct my_time systime;
systime.hours=23;systime.minutes=59;systime.seconds=30;
for(;;){update(&systime);display(&systime);};
}
void update(struct my_time *t)
{char cik;
t->seconds++;
if(t->seconds==60){t->seconds=0;t->minutes++;};
if(t->minutes==60){t->minutes=0;t->hours++;};
if(t->hours==24)t->hours=0;
if(kbhit()) exit(0);
delay();
}
void display(struct my_time *t)
{int i;
clrscr();
printf("%2d:",t->hours); printf("%2d:",t->minutes); printf("%2d\a",t->seconds);
}
void delay(void)
{long int t;
for(t=1;t<15000000;++t); //15.000.000 değeri ile oynanabilir
}
48

8. Grafikli.c (fareli grafik ekran)


(Ornekler\C\grafikli\grafikli.C)

Resim 8 – Ekran g™ržntžsž

Fare ve grafik ekran komutlar×n× birleĢtirerek, basit bir uygulama iŒin gerekli form yap×s×n× oluĢturuyoruz.
Ayr×ca kendi yaz× tipimizi, label (etiket), button (džğme), edit (metin kutusu), memo (Œok sat×rl× veri giriĢi)
nesnelerimizi de modžler bir yap×da haz×rl×yoruz. Ana program olan grafikli.c dosyas×na faregraf.c, nesneler.c ve
yazitipi.c adl× žŒ program dahil edilerek yap×yoruz. Metin kutusu yaparken bayağ× zorland×m, ™zellikle basit string –
metin giriĢleri iŒin garip kodlar yazmak biraz zor geliyor. Metin kutular× daha esnek olabilir. Mesela oklarla iŒinde
dolaĢarak Delete, Insert, Home ve Backspace tuĢlar× daha etkili kullan×labilir. Džğmelere de bas×lma efekti verilebilir.
Daire gibi ™zellikler iŒin trigonometri komutlar× gerekebilir. Eski bir mžzik Œalma program×nda ekran×n scroll –
kayd×r×lmas× gibi ilginŒ bir kullan×m g™rmžĢtžm. Siz de fare ekran kenar×na geldiğinde kayd×rma ile dar ekrandan
s×n×rs×z ekrana ulaĢabilirsiniz. “Ornekler\Diger\Flash\hunt\hunting.fla” ™rneğinde ekran kayd×rma ile panoramik
g™ržntž efekti elde edebiliyoruz.

Ek olarak listbox (liste kutusu), combobox (aŒ×l×r kutu), checkbox (onay kutusu), radiobutton (radyo džğmesi)
ve benzeri yap×labilir. Sağ tuĢ menžsž (altta kalan b™lge getPixel (x,y) deyimi ile ™n belleklenebilir) ve ana menž gibi
daha profesy™nel nesneler de Œok hoĢ olabilir. Ġsterseniz d×Ģar×dan *.bmp, *.gif gibi dosyalar× da programa dahil
edilebilirsiniz. Yaz× tipleri iŒin ™lŒeklendirme ile daha kžŒžk veya daha bžyžk font bžyžklžkleri de elde edilebilir.
Buradaki ™rnekte yaz× tipleri bitsel iĢlemlerle oluĢturulurken, Œizgiler ve eğrilerle yapt×ğ×n×z kendi yaz× tipinizi
™lŒeklendirmeyi deneyebilirsiniz. Bir harf beĢ sžtun, sekiz sat×r bilgisinden oluĢuyor. Her sat×r×n ikilik džzendeki değeri
bulunarak pixel konulup konulmayacağ×na karar veriliyor. En alt sat×r alt Œizgi iŒin kullan×l×yor. Asl×nda alt Œizginin fontu
bir parŒas× olmas×, yeni font oluĢtururken iki kat daha fazla kod anlam×na geliyor. Ġsterseniz alt Œizgiyi sadece basit
ayr× bir Œizgi olarak da yapabilirsiniz. Bu arada ™zel karakterler ve kžŒžk harfleri eklemedim, bunlar× da siz
yapabilirsiniz. Windows yaz× tiplerini resim olarak kaydedip istediğiniz yere yazabilmenizi sağlayan programlar×
internetten bulabilirsiniz. Sadece bu yaz× tipi konusunu bile ilerletip, yaz× karakteri tan×ma, iris tan×ma, parmak izi
tan×ma gibi ticari konularda da kendinizi geliĢtirebilirsiniz.

Drag – drop (sžržkle b×rak) ™zelliği iŒin de ekrandan resim bilgisi olarak pixel okuyup tampon bellekte
saklamay× džĢžnebilirsiniz. Farenin etraf×nda oluĢan istenmeyen g™ržntžler iŒin de internetten fare temizleme
komutlar× bulabilirsiniz. Daha yžksek ekran Œ™zžnžrlžkleri ve yaz×c× kullan×m×n× ™ğrenebilirsiniz. Ġmlecin yan×p
s™nmesini yapamad×m ama bunu da siz yapabilirsiniz.

Sadece fare değil klavye k×sayollar× da etkin. Metin kutular× aras×nda TAB – tabulator (sekme) ile ve fare ile
t×klay×p dolaĢ×labiliyor. Džğmelerin TAB duraklar×n× oluĢturmad×m. ESC tuĢu ve Kapat džğmesi (Alt+K) program×
kapat×r. TurboHelp program× iŒinde ileri seviye klavye k×sayollar×n×n kodlar×n× ™ğrenebilirsiniz. Alt, Ctrl ve Shift tuĢlar×
49

tek baĢlar×na kod žretemezler. „nce s×f×r değeri, sonra da bas×lan diğer tuĢa g™re ikinci bir kod žretiliyor. Fare ile seŒili
olan metin kutusunun iŒ yaz×s×, Kopyala ve Yap×Ģt×r džğmeleri ile etiket deneme yaz×s×n×n olduğu yere yap×Ģt×r×labilir.
Alt k™Ģede farenin gerŒek x ve y koordinatlar× sžrekli gžncelleniyor. Ses ile geri besleme sağlad×m, ama yine de aĢ×r×ya
kaŒmamak gerekli. Her an bip sesleri zamanla s×kmaya baĢl×yor. Ama piyano yapabilirsiniz...

faregraf.c dosyas×: asm mov al,es:[bx]


return _AL; //return boşluk alt çizgi büyük harf AL
unsigned int MouseX, MouseY, MouseB; }
// fare ve grafik komutlarının dosyası void videoBekler(void)
void ShowMouse () { asm mov dx,0x3da
{ asm mov ax, 0x1 loop1:
asm int 0x33 asm in al,dx
} asm test al,8
void HideMouse () asm jnz loop1
{ asm mov ax, 0x2 loop2:
asm int 0x33 asm in al,dx
} asm test al,8
void ReadMouse () asm jz loop2
{ asm mov ax, 0x3 }
asm int 0x33
asm mov MouseB, bx void ses(int hertz, int sure)
asm mov MouseX, cx {
asm mov MouseY, dx sound (hertz);
} delay (sure);
void SetMouseXY (unsigned int X, unsigned int Y) nosound ();
{ asm mov ax, 0x4 }
asm mov cx, X nesneler.c dosyas×:
asm mov dx, Y struct etiket{
asm int 0x33 char *yazi; //iç yazı
} int basx; //baŞlangıçx
void SetMinMaxX (unsigned int Min, unsigned int Max) int basy; //baŞlangıç y
{ asm mov ax, 0x7 char renk; //yazı rengi
asm mov cx, Min short cerv;
asm mov dx, Max //çerceve var ise 1(arkaplan=mor), yok ise
asm int 0x33 0(arkaplan=transparan)
} };
void SetMinMaxY (unsigned int Min, unsigned int Max) struct dugme{
{ asm mov ax, 0x8 char *yazi; //iç yazı
asm mov cx, Min int basx; //baŞlangıç x
asm mov dx, Max int basy; //baŞlangıç y
asm int 0x33 int sonx; //son x
} int sony; //son y
void GrafikEkran(void) //320*200 ekran };
{ asm mov ax,13h struct metin{
asm int 10h char *yazi; //iç yazı
} int basx; //baŞlangıç x
void TekstEkran(void) //80*25 ekran int basy; //baŞlangıç y
{asm mov ax,3 char renk; //yazı rengi
asm int 10h short harfsayisi; //kaç harf var
} };
void EkranSil(void) struct memo{
{asm mov cx,32000 char *yazi; //iç yazı
asm mov es,ADRES int basx; //baŞlangıç x
asm sub di,di int basy; //baŞlangıç y
asm sub ax,ax char renk; //yazı rengi
asm cld short harfsayisi; //kaç harf var
asm rep stosw short satsay; //kaç satırlık
} };
char getPixel(int x, int y) void kutu2(int x1,int y1,int x2,int y2) //içi beyaz renkli
{asm mov ax,y { int i,j;
asm mul GENISLIK for (i=x1;i<=x2;i++) putPixel(i,y1,28); //-
asm add ax,x for (i=y1;i<=y2;i++) putPixel(x1,i,28); //|
asm mov bx,ax for (i=x1;i<=x2;i++) putPixel(i,y2,28); //_
asm mov es,ADRES for (i=y1;i<=y2;i++) putPixel(x2,i,28); // |
50

for (i=x1+1;i<x2;i++) case '9':harfBas(_9,basx+aralik,basy,renk);break;


for (j=y1+1;j<y2;j++) putPixel(i,j,15); case '0':harfBas(_0,basx+aralik,basy,renk);break;
} case '.':harfBas(_dot,basx+aralik,basy,renk);break;
void kutu1(int x1,int y1,int x2,int y2) //içi mor renk case ',':harfBas(_comma,basx+aralik,basy,renk);break;
{ int i,j; case '!':harfBas(_excl,basx+aralik,basy,renk);break;
for (i=x1;i<=x2;i++) putPixel(i,y1,15); //- case '?':harfBas(_ques,basx+aralik,basy,renk);break;
for (i=y1;i<=y2;i++) putPixel(x1,i,15); //| };
for (i=x1;i<=x2;i++) putPixel(i,y2,28); //_
for (i=y1;i<=y2;i++) putPixel(x2,i,28); // | void etiket_nesnesi1 (struct etiket et)
for (i=x1+1;i<x2;i++) {int i,aralik;
for (j=y1+1;j<y2;j++) putPixel(i,j,154); aralik=0;
} if(et.cerv==1) kutu1(et.basx-3,et.basy-
void kutu(int x1,int y1,int x2,int y2) //içi gri renkli 3,et.basx+(strlen(et.yazi)*7),et.basy+10);
{ int i,j; for(i=0;i<=(strlen(et.yazi));i++)
for (i=x1;i<=x2;i++) putPixel(i,y1,15); //- {
for (i=y1;i<=y2;i++) putPixel(x1,i,15); //| karakter_bas (et.yazi,et.basx, et.basy,i,aralik,et.renk);
for (i=x1;i<=x2;i++) putPixel(i,y2,28); //_ aralik+=7;
for (i=y1;i<=y2;i++) putPixel(x2,i,28); // | }
for (i=x1+1;i<x2;i++) }
for (j=y1+1;j<y2;j++)
putPixel(i,j,24); void etiket_nesnesi (char yazi[],int basx,int basy,char
} renk,short cerv)
void karakter_bas (char yazi[ ],int basx,int basy,int harfno, {int i,aralik;
int aralik,char renk) aralik=0;
{switch (yazi[harfno]) if(cerv==1) kutu1(basx-3,basy-
{ 3,basx+(strlen(yazi)*7),basy+10);
case 'A':harfBas(_A,basx+aralik,basy,renk);break; for(i=0;i<=(strlen(yazi));i++)
case 'B':harfBas(_B,basx+aralik,basy,renk);break; {
case 'C':harfBas(_C,basx+aralik,basy,renk);break; karakter_bas (yazi,basx, basy,i,aralik,renk);
case 'Ç':harfBas(_Ch,basx+aralik,basy,renk);break; aralik+=7;
case 'D':harfBas(_D,basx+aralik,basy,renk);break; }
case 'E':harfBas(_E,basx+aralik,basy,renk);break; }
case 'F':harfBas(_F,basx+aralik,basy,renk);break;
case 'G':harfBas(_G,basx+aralik,basy,renk);break; void dugme_nesnesi1(struct dugme dug)
case 'Ğ':harfBas(_YG,basx+aralik,basy,renk);break; {
case 'H':harfBas(_H,basx+aralik,basy,renk);break; kutu(dug.basx,dug.basy,dug.sonx,dug.sony);
case 'I':harfBas(_I,basx+aralik,basy,renk);break; etiket_nesnesi(dug.yazi,dug.basx+2+7,dug.basy+5,11,0);
case 'Ġ':harfBas(_Ii,basx+aralik,basy,renk);break; }
case 'J':harfBas(_J,basx+aralik,basy,renk);break;
case 'K':harfBas(_K,basx+aralik,basy,renk);break; void metin_nesnesi1(struct metin met)
case 'L':harfBas(_L,basx+aralik,basy,renk);break; {
case 'M':harfBas(_M,basx+aralik,basy,renk);break; kutu2(met.basx-2,met.basy-
case 'N':harfBas(_N,basx+aralik,basy,renk);break; 2,met.basx+met.harfsayisi*7,met.basy+10);
case 'O':harfBas(_O,basx+aralik,basy,renk);break; etiket_nesnesi(met.yazi,met.basx,met.basy,met.renk,0);
case 'Ö':harfBas(_Oo,basx+aralik,basy,renk);break; }
case 'P':harfBas(_P,basx+aralik,basy,renk);break;
case 'R':harfBas(_R,basx+aralik,basy,renk);break; void memo_nesnesi1(struct memo me)
case 'S':harfBas(_S,basx+aralik,basy,renk);break; {int k,l,m,satno;
case 'ġ':harfBas(_Sh,basx+aralik,basy,renk);break; satno=1;m=1;
case 'T':harfBas(_T,basx+aralik,basy,renk);break; kutu2(me.basx-2,me.basy-
case 'U':harfBas(_U,basx+aralik,basy,renk);break; 2,me.basx+me.harfsayisi*7,me.basy+me.satsay*10);
case 'Ü':harfBas(_Uu,basx+aralik,basy,renk);break; if (strlen(me.yazi)<=12)
case 'V':harfBas(_V,basx+aralik,basy,renk);break; etiket_nesnesi(me.yazi,me.basx,me.basy,me.renk,0); else
case 'Y':harfBas(_Y,basx+aralik,basy,renk);break; {
case 'Z':harfBas(_Z,basx+aralik,basy,renk);break; for (l=0;l<strlen(me.yazi);)
case 'Q':harfBas(_Q,basx+aralik,basy,renk);break; {
case 'W':harfBas(_W,basx+aralik,basy,renk);break; for (k=l;k<(l+12);k++)
case 'X':harfBas(_X,basx+aralik,basy,renk);break; {
case '1':harfBas(_1,basx+aralik,basy,renk);break; m++;
case '2':harfBas(_2,basx+aralik,basy,renk);break; karakter_bas(me.yazi,me.basx+m*7-14,me.basy+satno*10-
case '3':harfBas(_3,basx+aralik,basy,renk);break; 10,k,0,me.renk);
case '4':harfBas(_4,basx+aralik,basy,renk);break; }
case '5':harfBas(_5,basx+aralik,basy,renk);break; satno++;l+=12;m=1;
case '6':harfBas(_6,basx+aralik,basy,renk);break; }
case '7':harfBas(_7,basx+aralik,basy,renk);break; }
case '8':harfBas(_8,basx+aralik,basy,renk);break; }
51

yazitipi.c dosyas×: 16 8 4 2 1
a=1;
if(n!=0) for(i=1;i<=n;i++) a*=2;
typedef int harfTip[8]; return a;
harfTip _A={14,17,17,31,17,17,0,0}; }
harfTip _B={30,17,30,17,17,30,0,0};
harfTip _C={14,17,16,16,17,14,0,0}; void harfBas(harfTip harf,int xx,int yy,char renk)
harfTip _Ch={14,17,16,16,17,14,4,0}; {int i,j,x;
harfTip _D={30,17,17,17,17,30,0,0}; for (i=0;i<=7;i++)
harfTip _E={31,16,30,16,16,31,0,0}; {x=0;
harfTip _F={31,16,30,16,16,16,0,0}; for (j=4;j>=0;j--)
harfTip _G={14,17,16,19,17,14,0,0}; _UK iŒin yaz× tipi {if((harf[i]&pow(j))>0) putPixel(xx+x,yy+i,renk);
harfTip _YG={14,31,16,19,17,14,0,0}; x++;
harfTip _H={17,17,31,17,17,17,0,0}; }
harfTip _I={14,4,4,4,4,14,0,0}; }
harfTip _Ii={4,14,4,4,4,14,0,0}; }
harfTip _J={3,1,1,1,17,14,0,0};
harfTip _K={17,18,28,18,18,17,0,0}; void imlec(int aktif,int harfx,int harfy,char renk)
harfTip _UK={17,18,28,18,18,17,0,31}; {int i;
harfTip _L={16,16,16,16,16,31,0,0}; switch (aktif)
harfTip _M={17,27,21,21,17,17,0,0}; {case 1:for(i=1;i<=7;i++)
harfTip _N={17,25,21,19,17,17,0,0}; putPixel(19+harfx*7,109+i,renk);break;
harfTip _O={14,17,17,17,17,14,0,0}; case 2:for(i=1;i<=7;i++)
harfTip _UO={14,17,17,17,17,14,0,31}; putPixel(19+harfx*7,129+i,renk);break;
harfTip _Q={14,17,17,17,21,14,1,0}; case 3:for(i=1;i<=7;i++)
harfTip _Oo={10,14,17,17,17,14,0,0}; putPixel(139+harfx*7,99+i+harfy*10,renk);break;
harfTip _P={30,17,30,16,16,16,0,0}; }
harfTip _R={30,17,30,18,17,17,0,0}; }
harfTip _S={14,16,14,1,17,14,0,0};
harfTip _Sh={14,16,14,1,17,14,4,0}; Ana program×m×z olan grafikli.c dosyas×:
harfTip _T={31,4,4,4,4,4,0,0};
harfTip _UT={31,4,4,4,4,4,0,31}; //320*200 grafik ekranda fare ve 4 tip nesne kullanılması
harfTip _U={17,17,17,17,17,14,0,0}; //--metin, etiket, düğme ve memo nesneleri--
harfTip _Uu={10,17,17,17,17,14,0,0}; #include <stdio.h>
harfTip _V={17,17,17,17,10,4,0,0}; #include <stdlib.h>
harfTip _Y={17,17,10,4,4,4,0,0}; #include <string.h>
harfTip _W={17,17,17,21,31,10,0,0}; #include <conio.h>
harfTip _X={17,10,4,10,17,17,0,0}; #include <dos.h>
harfTip _Z={31,17,2,4,9,31,0,0}; //alt programlarımız
harfTip _1={4,12,4,4,4,14,0,0}; #include "yazitipi.c"
harfTip _2={14,17,2,4,8,31,0,0}; #include "faregraf.c"
harfTip _3={14,1,14,1,17,14,0,0}; #include "nesneler.c"
harfTip _4={2,6,10,31,2,7,0,0}; int i,j,girilen_harf1,girilen_harf2
harfTip _5={31,16,30,1,17,14,0,0}; ,girilen_harf3,girilen_harf3x,girilen_harf3y;
harfTip _6={6,8,30,17,17,14,0,0}; char *metin1,*metin2,*metin3;
harfTip _7={31,17,2,4,4,14,0,0}; char tus,tus2;char ara1[5],ara2[5],ara3[1];
harfTip _8={14,17,14,17,17,14,0,0}; int aktif_nesne_no; char *bellek;
harfTip _9={14,17,15,1,2,4,0,0}; //alt yapı nesneleri
harfTip _0={14,17,21,21,17,14,0,0}; struct etiket etiket_1;
harfTip _dot={0,0,0,0,12,12,0,0}; //. struct dugme dugme_1;
harfTip _comma={0,0,0,0,12,12,24,0}; //, struct metin metin_1;
harfTip _excl={4,14,14,4,4,0,4,0}; //! struct memo memo_1;
harfTip _ques={14,17,2,4,4,0,4,0}; //?
short GENISLIK=320, ADRES=0xa000; void refresh(void)
{kutu1(0,70,319,199); //form boyutu
void putPixel(int x,int y,char color) //renkli nokta koymak for (i=10;i<=20;i++) for (j=1;j<=150;j++) putPixel(j,i,i+j); //renk
{ asm mov ax,y palet
asm mul GENISLIK dugme_1.yazi="KOPYALA";
asm add ax,x dugme_1.basx=230; dugme_1.basy=110;
asm mov bl,color dugme_1.sonx=280+20; dugme_1.sony=125;
asm xchg ax,bx dugme_nesnesi1(dugme_1);
asm mov es,ADRES dugme_1.yazi="YAPITIR";
asm mov es:[bx],al dugme_1.basx=230; dugme_1.basy=130;
} dugme_1.sonx=280+20; dugme_1.sony=145;
dugme_nesnesi1(dugme_1);
int pow(int n) dugme_1.yazi="KAPAT";
{int i,a; dugme_1.basx=250; dugme_1.basy=160;
52

dugme_1.sonx=280+20; dugme_1.sony=175; girilen_harf2=15;


dugme_nesnesi1(dugme_1); girilen_harf3=48;
harfBas(_UO,230+2+7*2,110+5,11); //altı çizili O girilen_harf3x=12;
harfBas(_UT,230+2+7*6,130+5,11); //altı çizili T girilen_harf3y=4;
harfBas(_UK,250+2+7,160+5,11); //altı çizili K GrafikEkran(0x13); //320*200*256 ekran
etiket_1.yazi="GRAF˜K EKRAN FARE DESTEKL˜ refresh();
KULLANICI ARAYšZš"; ShowMouse(); SetMouseXY(300,100);
etiket_1.basx=5; etiket_1.basy=30; do {
etiket_1.renk=80; etiket_1.cerv=1; videoBekler(); //kırpılmayı önler
etiket_nesnesi1(etiket_1); itoa(MouseX, ara1, 10);
etiket_1.yazi="™RNEK YAZIT˜P˜"; itoa(MouseY*2.5, ara2, 10);
etiket_1.basx=40; etiket_1.basy=50; strcat(ara1,",");strcat(ara1,ara2);
etiket_1.renk=90; etiket_1.cerv=0; kutu1(0,182,70,199); //status bar gibin
etiket_nesnesi1(etiket_1); etiket_1.yazi=ara1;
etiket_1.basx=10; etiket_1.basy=187;
etiket_1.yazi="ABC€DEFG¦HI˜JKLMNO™PRSTUšVYZXWQ etiket_1.renk=70; etiket_1.cerv=0;
1234567890!?.,"; etiket_nesnesi1(etiket_1);
etiket_1.basx=1; etiket_1.basy=60; ReadMouse ();
etiket_1.renk=100; etiket_1.cerv=0; if ((MouseB & 1) == 1 && MouseX>=38 && MouseX<=262
etiket_nesnesi1(etiket_1); &&
etiket_1.yazi="HIZLI KOMA YORULURSUN TERLERS˜N"; ((float)MouseY*2.5)>=272 && ((float)MouseY*2.5)<=300)
etiket_1.basx=40; etiket_1.basy=90; { ses(100,1);aktif_nesne_no=1; }
etiket_1.renk=93; etiket_1.cerv=1; if ((MouseB & 1) == 1 && MouseX>=38 && MouseX<=262
etiket_nesnesi1(etiket_1); &&
metin_1.yazi=metin1; ((float)MouseY*2.5)>=322 && ((float)MouseY*2.5)<=350)
metin_1.basx=20; metin_1.basy=110; { ses(100,1);aktif_nesne_no=2; }
metin_1.renk=9; metin_1.harfsayisi=16; if ((MouseB & 1) == 1 && MouseX>=278 && MouseX<=446
metin_nesnesi1(metin_1); &&
metin_1.yazi=metin2; ((float)MouseY*2.5)>=272 && ((float)MouseY*2.5)<=445)
metin_1.basx=20; metin_1.basy=130; { ses(100,1);aktif_nesne_no=3; }
metin_1.renk=9; metin_1.harfsayisi=16;
metin_nesnesi1(metin_1); if ((MouseB & 1) == 1 && MouseX>=462 && MouseX<=598
memo_1.yazi=metin3; &&
memo_1.basx=140; memo_1.basy=110; ((float)MouseY*2.5)>=277 && ((float)MouseY*2.5)<=310)
memo_1.renk=9; memo_1.harfsayisi=12; { ses(900,90); kopyala();}
memo_1.satsay=4; if ((MouseB & 1) == 1 && MouseX>=462 && MouseX<=598
memo_nesnesi1(memo_1); &&
imlec(1,girilen_harf1,0,5); ((float)MouseY*2.5)>=327 && ((float)MouseY*2.5)<=360)
imlec(2,girilen_harf2,0,15); { ses(900,90); yapistir();}
imlec(3,girilen_harf3x,girilen_harf3y,15); if ((MouseB & 1) == 1 && MouseX>=502 && MouseX<=598
} &&
((float)MouseY*2.5)>=402 && ((float)MouseY*2.5)<=435)
void yapistir(void) { ses(500,10); goto cikis; }
{
etiket_1.yazi=" "; if (kbhit()){
etiket_1.basx=40; etiket_1.basy=90; tus=getch();
etiket_1.renk=93; etiket_1.cerv=1; if (tus==0) //Alt tuŞu basılı olanlar için
etiket_nesnesi1(etiket_1); {tus=getch();
etiket_1.yazi=bellek; switch (tus)
etiket_1.basx=40; etiket_1.basy=90; {case 20: //ve T basılıysa (YapıŞtır)
etiket_1.renk=93; etiket_1.cerv=0; ses(900,90);yapistir();break;
etiket_nesnesi1(etiket_1); case 24: //ve O basılıysa (Kopyala)
} ses(900,90);kopyala();break;
case 37: //ve K basılıysa (Kapat)
void kopyala (void) ses(500,10);goto cikis;break;
{if (aktif_nesne_no==1) bellek=metin1; else bellek=metin2; }
} }
else
main() {
{aktif_nesne_no=1; ses(50,1); //tuŞ feedback
metin1="123456789012345"; if (tus==27) goto cikis; //ESCAPE
metin2="ABCÇDEFGĞHIĠJKL"; if (tus==9) //TAB
{
metin3="ABCÇDEFGĞHIĠABCÇDEFGĞHIĠABCÇDEFGĞHIĠA if (aktif_nesne_no==1) aktif_nesne_no=2; else
BCÇDEFGĞHIĠ"; if (aktif_nesne_no==2) aktif_nesne_no=3; else
girilen_harf1=15; if (aktif_nesne_no==3) aktif_nesne_no=1;
53

} else memo_1.renk=9; memo_1.harfsayisi=12;


if(tus==8) //BACKSPACE memo_1.satsay=4;
{ memo_nesnesi1(memo_1);
switch (aktif_nesne_no) }
{case 1: break;
if(girilen_harf1>0) }
{ metin1[--girilen_harf1]=' '; } //girilen_harf
metin_1.yazi=metin1; } //getch else'si
metin_1.basx=20; } //kbhit
metin_1.basy=110; if (aktif_nesne_no==1)
metin_1.renk=9; metin_1.harfsayisi=16; {imlec(1,girilen_harf1,0,5);
metin_nesnesi1(metin_1); imlec(2,girilen_harf2,0,15);
}; girilen_harf3x=girilen_harf3 % 12;
break; if (girilen_harf3>=1 && girilen_harf3<=12)
case 2: girilen_harf3y=1;
if(girilen_harf2>0) if (girilen_harf3>=13 && girilen_harf3<=24)
{ metin2[--girilen_harf2]=' '; girilen_harf3y=2;
metin_1.yazi=metin2; if (girilen_harf3>=25 && girilen_harf3<=32)
metin_1.basx=20; metin_1.basy=130; girilen_harf3y=3;
metin_1.renk=9; metin_1.harfsayisi=16; if (girilen_harf3>=33 && girilen_harf3<=48)
metin_nesnesi1(metin_1); girilen_harf3y=4;
}; imlec(3,girilen_harf3x,girilen_harf3y,15);
break; }
case 3: if (aktif_nesne_no==2)
if(girilen_harf3>0) {imlec(1,girilen_harf1,0,15);
{ metin3[--girilen_harf3]=' '; imlec(2,girilen_harf2,0,5);
memo_1.yazi=metin3; girilen_harf3x=girilen_harf3 % 12;
memo_1.basx=140; memo_1.basy=110; if (girilen_harf3>=1 && girilen_harf3<=12)
memo_1.renk=9; memo_1.harfsayisi=12; girilen_harf3y=1;
memo_1.satsay=4; if (girilen_harf3>=13 && girilen_harf3<=24)
memo_nesnesi1(memo_1); girilen_harf3y=2;
}; if (girilen_harf3>=25 && girilen_harf3<=32)
break; girilen_harf3y=3;
} if (girilen_harf3>=33 && girilen_harf3<=48)
} girilen_harf3y=4;
else imlec(3,girilen_harf3x,girilen_harf3y,15);
{ }
switch (aktif_nesne_no) if (aktif_nesne_no==3)
{case 1: {imlec(1,girilen_harf1,0,15);
if (girilen_harf1<15) imlec(2,girilen_harf2,0,15);
{ metin1[girilen_harf1++]=tus; girilen_harf3x=girilen_harf3 % 12;
metin_1.yazi=metin1; if (girilen_harf3>=1 && girilen_harf3<=12)
metin_1.basx=20; metin_1.basy=110; girilen_harf3y=1;
metin_1.renk=9; metin_1.harfsayisi=16; if (girilen_harf3>=13 && girilen_harf3<=24)
metin_nesnesi1(metin_1); girilen_harf3y=2;
} if (girilen_harf3>=25 && girilen_harf3<=32)
break; girilen_harf3y=3;
case 2: if (girilen_harf3>=33 && girilen_harf3<=48)
if (girilen_harf2<15) girilen_harf3y=4;
{ metin2[girilen_harf2++]=tus; if (girilen_harf3x>=1 && (girilen_harf3 % 12)==0 &&
metin_1.yazi=metin2; girilen_harf3!=48)
metin_1.basx=20; metin_1.basy=130; girilen_harf3y++;
metin_1.renk=9; metin_1.harfsayisi=16; if (girilen_harf3==48) girilen_harf3x=149;
metin_nesnesi1(metin_1); if (girilen_harf3==1) girilen_harf3x=1;
} imlec(3,girilen_harf3x,girilen_harf3y,5);
break; }
case 3: } while (1);
if (girilen_harf3<12*4) cikis:
{ metin3[girilen_harf3++]=tus; HideMouse ();
memo_1.yazi=metin3; TekstEkran();
memo_1.basx=140; memo_1.basy=110; }
54

Bölüm 4 – Pascal
“Ornekler\Pascal\Staj\Hakanin” dizinindeki Takip.pas, “Ornekler\Pascal\Staj” dizinindeki Ariza.pas ve
“Ornekler\Pascal\Prince3D” dizinindeki prince3d.pas dosyalar× žzerinde iyi Œal×Ģ×lm×Ģ projeler. Ġncelemenizi tavsiye
ederim.

Resim 1 – eĢitli Pascal ™rnek resimleri


55

1. txtall.pas (metin dosyaları açma)


(Ornekler\Pascal\okul\txtall.pas)

Resim 2 – Yaz× dosyalar×n×n g™steren program

program text_autoexec;
uses crt;
var dsy:text;hata:integer;satir:string[80];
yol:string;
begin
clrscr;
writeln('bat,txt,sys hangi dosya acilacak=');
readln(yol);
assign (dsy,yol); {'c:\autoexec.bat' gibi}
{$i-} reset(dsy); {$i+}
hata:=ioresult;
if hata<>0 then
begin
writeln('dosya yok...');writeln('g/ç kodu=',hata:4);
halt;
end;

while not eof(dsy) do


begin
readln(dsy,satir);
writeln(satir);
end;
close(dsy);
readln;
end.

Metin tabanl× dosyalar× aŒar ve iŒeriğini ekrana listeler. Uzun dosyalarda h×zla tžmžnž g™sterip sadece son
k×sm× ekrana geliyor. Bunu geliĢtirerek “dir |more” komutundaki gibi bekletmeler ekleyebilirsiniz.

Pascal‟×n yaz×m kurallar× C diline Œok benziyor. Sat×r sonlar×nda “;”, komutlar×n birbirine benzer yap×s× gibi.
Fakat C diline g™re Pascal daha kolay. Bir komut ile ilgili yard×m almak isterseniz TP – Turbo Pascal veya BP – Borland
Pascal edit™ržnde komut žzerine imleci getirerek Ctrl+F1 tuĢuna bas×n×z.
56

2. diyot1.pas (grafik ekrana şekil çizme)


(Ornekler\Pascal\okul\diyot1.pas)

Resim 3 – Grafik ekranda diyot Œizimi

AmaŒ grafik ekrana bir Ģekli Œizmek. Bu programda uses k×sm×nda kendi yapt×ğ×m×z “grafik” ad×nda unit
kullan×yoruz. Yani bu program da iki parŒadan oluĢuyor. Eğer bu Ģekilde istemezseniz “grafik.pas” dosyas×n×n iŒini
“diyot1.pas” iŒine kopyalar, uses k×sm×ndan da “grafik” unit‟ini de Œ×kar×rs×n×z. Ama bu sizin program×n×z×n bir anda
kocaman olmas×n× sağlar – Ģimdiki ™rnek iŒin bu geŒerli değil. Nereye ne yazd×ğ×n×z× iyi biliyorsan×z sorun yok. Compile
– derleme s×ras×nda zaten iki program otomatik olarak birleĢtiriliyor. Asl×nda uses k×sm×nda ne varsa (crt, graph...)
birleĢiyor.

program diyot_graph;
uses crt,graph,grafik;
begin
ekran;setcolor(3);
moveto(100,100);lineto(150,100);
moveto(150,75);lineto(150,125);
lineto(200,100);lineto(150,75);
moveto(200,75);lineto(200,125);
moveto(200,100);lineto(250,100);
repeat until keypressed;
closegraph;
end.

AĢağ×daki grafik.pas “Compile” (F9 tuĢu) edilince grafik.tpu haline geliyor. BGI Borland Graphic Interface –
Borland grafik arabirimi anlam×na geliyor. Grafik ekran×m×z×n Œ™zžnžrlžğž 640x450 pikseldir.

unit grafik;
interface
uses crt,dos,graph;
procedure ekran;
implementation
procedure ekran;
var graphdriver,graphmode:integer;
err:integer;
begin
graphdriver:=detect;
initgraph(graphdriver,graphmode,'c:\bp\units'); { egavga.bgi dosyanız nerede? }
err:=graphresult;
if err<>grok then
begin
writeln('grafik hatasi=',grapherrormsg(err));readln; halt;
end;
end;
begin
end.

Ayn× diyotu yatay olarak kayd×rmak iŒin aĢağ×daki programda grafik komutlar× olan Imagesize, Getimage ve
Putimage kullan×lm×Ģt×r. Eski g™ržntž xorput deyimi ile silinerek ilerlendiği iŒin biraz k×rp×l×yor. (Ornekler\Pascal\okul\
diyot3.pas)

program diyot_graph; {hafıza kullanılarak kaydırılır}


57

uses crt,graph,grafik;
type nokta=record x,y,c:integer;end;
noktalar=array [1..10] of nokta;
const diyot:noktalar=((x:100;y:100;c:0),(x:150;y:100;c:1),
(x:150;y:75;c:0), (x:150;y:125;c:1),
(x:200;y:100;c:1),(x:150;y:75;c:1),
(x:200;y:75;c:0), (x:200;y:125;c:1),
(x:200;y:100;c:0),(x:250;y:100;c:1));
var i,j:integer;p:pointer;size:word;
begin
ekran;setcolor(4);setbkcolor(2);setcolor(blue);
for i:=1 to 10 do
begin
if diyot[i].c=0 then moveto(diyot[i].x,diyot[i].y)
else lineto(diyot[i].x,diyot[i].y);
end;
size:=imagesize(100,75,250,125);
getmem(p,size); getimage(100,75,250,125,p^);
putimage(100,75,p^,xorput);
for j:=1 to 300 do
begin putimage(100+j,75,p^,xorput);putimage(100+j,75,p^,xorput); end;
putimage(100+j,75,p^,xorput);
repeat until keypressed;
closegraph;
end.

AĢağ×da da bir ok etraf×nda d™nderiliyor: (Ornekler\Pascal\okul\ok.pas)

program ok_doner;
uses graph,grafik,crt;
type nokta=record x,y,c:integer; end;
noktalar=array[1..8] of nokta;
const ok:noktalar=((x:300;y:200;c:0),(x:330;y:230;c:1),(x:330;y:210;c:1),
(x:380;y:210;c:1),(x:380;y:190;c:1),(x:330;y:190;c:1),
(x:330;y:170;c:1),(x:300;y:200;c:1));
centerx=340; centery=200;
var i,degree:integer;rotate:noktalar;rad:real;

function dr(deg:integer):real;
begin dr:=pi*deg/180; end;

begin
ekran;
for degree:=0 to 360 do
begin for i:=1 to 8 do
begin rad:=dr(degree);
rotate[i].x:=round((ok[i].x-centerx)*cos(rad)-(ok[i].y-centery)*sin(rad))+centerx;
rotate[i].y:=round((ok[i].x-centerx)*sin(rad)+(ok[i].y-centery)*cos(rad))+centery;
rotate[i].c:=ok[i].c;
end;
setcolor(white);
for i:=1 to 8 do {cizim}
if rotate[i].c=0 then moveto(rotate[i].x,rotate[i].y)
else lineto(rotate[i].x,rotate[i].y);
delay(1500);
setcolor(black);
for i:=1 to 8 do {silim}
if rotate[i].c=0 then moveto(rotate[i].x,rotate[i].y)
else lineto(rotate[i].x,rotate[i].y);
end;
setcolor(white);
outtextxy(10,100,'Çıkmak için bir tus...');
repeat until keypressed;
closegraph;
end.
58

3. hesapmak.pas (hesap makinesi yapımı)


(Ornekler\Pascal\okul\hesapmak.pas)

Resim 4 – Hesap makinesi

Hesap makinesi ™rneği. Yine žniversitede uğraĢt×ğ×m×z bir program. Hala baz× Ģeyler garip Œal×Ģ×yor. Mesela
say×lar× telefondaki gibi s×ralam×Ģ×m, oysa klavyemizdeki rakamlar×n s×ras× baĢka dikkat ederseniz. “.” tuĢunun
yan×ndaki “_” alt Œizginin bir fonksiyonu yok. Siz belki karek™k, kare, 1/x benzeri bir komut ekleyebilirsiniz.

program hesap_mak; (x1:26;y1:9;x2:29;y2:11;x3:28;y3:10;yazim:'*'),


uses crt; (x1:31;y1:9;x2:34;y2:11;x3:33;y3:10;yazim:'/'),
type kututip=array[1..6] of char;
tip=record x1,y1,x2,y2,x3,y3:integer;yazim:string[15]; (x1:26;y1:12;x2:33;y2:18;x3:29;y3:15;yazim:'cr'));
end;
kutu=array[1..19] of tip; procedure kutuciz(x1,y1,x2,y2:integer;kutu:kututip);
var i:byte;
var tus:char;tusl:string[1]; begin
sayi:string;sayi1,sayi2,sonuc:real; for i:=(x1+1) to x2-1 do
islem:char; begin
hane:byte;hata,i:integer; gotoxy(i,y1);write(kutu[1]);
nokta:boolean; gotoxy(i,y2);write(kutu[1]);
end;{for}
const kutu1:kututip=(#196,#179,#218,#191,#192,#217); for i:=(y1+1) to y2-1 do
kutu3:kututip=(#205,#186,#201,#187,#200,#188); begin
gotoxy(x1,i);write(kutu[2]);
kutucik:kutu=((x1:10;y1:1;x2:35;y2:19;x3:11;y3:2;yazim:'H gotoxy(x2,i);write(kutu[2]);
esap Makinesi'), end;{for}
(x1:11;y1:3;x2:34;y2:5;x3:33;y3:4;yazim:''), gotoxy(x1,y1);write(kutu[3]);
(x1:11;y1:6;x2:14;y2:8;x3:13;y3:7;yazim:'1'), gotoxy(x2,y1);write(kutu[4]);
(x1:16;y1:6;x2:19;y2:8;x3:18;y3:7;yazim:'2'), gotoxy(x1,y2);write(kutu[5]);
(x1:21;y1:6;x2:24;y2:8;x3:23;y3:7;yazim:'3'), gotoxy(x2,y2);write(kutu[6]);
(x1:11;y1:9;x2:14;y2:11;x3:13;y3:10;yazim:'4'),
(x1:16;y1:9;x2:19;y2:11;x3:18;y3:10;yazim:'5'), end;{pro-kutuciz}
(x1:21;y1:9;x2:24;y2:11;x3:23;y3:10;yazim:'6'),
(x1:11;y1:12;x2:14;y2:14;x3:13;y3:13;yazim:'7'), procedure ses;
(x1:16;y1:12;x2:19;y2:14;x3:18;y3:13;yazim:'8'), begin sound(720);delay(150);nosound; end;
(x1:21;y1:12;x2:24;y2:14;x3:23;y3:13;yazim:'9'),
(x1:11;y1:15;x2:14;y2:17;x3:13;y3:16;yazim:'0'), procedure sonucyaz(son:real);
(x1:16;y1:15;x2:19;y2:17;x3:18;y3:16;yazim:'.'), begin
(x1:21;y1:15;x2:24;y2:17;x3:23;y3:16;yazim:'_'), gotoxy(13,4);write(' ');gotoxy(14,4);
(x1:26;y1:6;x2:29;y2:8;x3:28;y3:7;yazim:'+'), write(son:20:10);
(x1:31;y1:6;x2:34;y2:8;x3:33;y3:7;yazim:'-'), end;
59

ses;sayi:=sayi+'.';nokta:=true;
procedure sinyal(x1,y1,x2,y2,tusdeg:integer); kutuciz(16,15,19,17,kutu3);
begin end; {if}
kutuciz(x1,y1,x2,y2,kutu1);gotoxy(x2-1,y2-1); end;{begin}
textbackground(red);write(' '+':begin
',tusdeg);textbackground(blue); kutuciz(26,6,29,8,kutu3);nokta:=false;ses;
sayi:=sayi+tusl;gotoxy(12,4);write(sayi:22); val(sayi,sayi1,hata);
ses;delay(150);kutuciz(x1,y1,x2,y2,kutu3); gotoxy(12,4);write('+');
end; sayi:='';islem:='+';delay(150);hane:=0;
sonucyaz(0);kutuciz(26,6,29,8,kutu1);
procedure yaz(yazi:char); end;
begin '-':begin
inc(hane); kutuciz(31,6,34,8,kutu3);nokta:=false;ses;
if hane<13 then val(sayi,sayi1,hata);
begin gotoxy(12,4);write('-');
case tus of sayi:='';islem:='-';delay(150);hane:=0;
'1':sinyal(11,6,14,8,1); sonucyaz(0);kutuciz(31,6,34,8,kutu1);
'2':sinyal(16,6,19,8,2); end;
'3':sinyal(21,6,24,8,3); '*':begin
'4':sinyal(11,9,14,11,4); kutuciz(26,9,29,11,kutu3);nokta:=false;ses;
'5':sinyal(16,9,19,11,5); val(sayi,sayi1,hata);
'6':sinyal(21,9,24,11,6); if sayi1=0 then exit;
'7':sinyal(11,12,14,14,7); gotoxy(12,4);write('*');
'8':sinyal(16,12,19,14,8); sayi:='';islem:='*';delay(150);hane:=0;
'9':sinyal(21,12,24,14,9); sonucyaz(0);kutuciz(26,9,29,11,kutu1);
'0':sinyal(11,15,14,17,0); end;
end;{case} '/':begin
end; {if} kutuciz(31,9,34,11,kutu3);nokta:=false;ses;
val(sayi,sayi1,hata);
end;{pro-yaz} if sayi1=0 then exit;
gotoxy(12,4);write('/');
begin sayi:='';islem:='/';delay(150);hane:=0;
textbackground(blue);clrscr; sonucyaz(0);kutuciz(31,9,34,11,kutu1);
repeat end;
begin #13:begin
gotoxy(1,21);write('ESC to quit...'); kutuciz(26,12,33,18,kutu3);ses;delay(150);
gotoxy(36,4);write(' '); gotoxy(12,4);write(' ');
for i:=1 to 19 do val(sayi,sayi2,hata);sayi:='';
begin kutuciz(26,12,33,18,kutu1);
if (i=1)or(i=19)or(i=18)or(i=17)or(i=16)or(i=15) then case islem of
'+':sonuc:=sayi2+sayi1;
kutuciz(kutucik[i].x1,kutucik[i].y1,kutucik[i].x2,kutucik[i].y2 '-':sonuc:=sayi1-sayi2;
,kutu1) '*':sonuc:=sayi2*sayi1;
else '/':sonuc:=sayi1/sayi2;
kutuciz(kutucik[i].x1,kutucik[i].y1,kutucik[i].x2,kutucik[i].y2 end;{case}
,kutu3); gotoxy(12,4);write('
gotoxy(kutucik[i].x3,kutucik[i].y3); ');gotoxy(22,4);write(sonuc:12:5);
write(kutucik[i].yazim);
end;{for} sonucyaz(sonuc);nokta:=false;sayi:='0';sayi1:=0;sayi2:=0;
gotoxy(1,24); tus:=readkey;tusl:=tus; sonuc:=0;hane:=0;
case tus of end;{case-begin}
'0'..'9': yaz(tus); end;{CASE}
'.':begin end;{repeat}
if nokta=false then begin until tus=#27;
kutuciz(16,15,19,17,kutu1);gotoxy(18,16); end.
textbackground(red);write('.');textbackground(blue);
60

4. matrice.pas (matrisler)
(Ornekler\Pascal\okul\matrice.pas)

Resim 5 – Matris veri giriĢ ve sonuŒlar×

SonuŒta matematik ile programlama Œok yak×n konular. Trigonometri, matris ve benzeri konular×, grafik veya
bilimsel iĢlemler iŒeren program žretirken kullanmam×z gerekiyor. Basit bir Œizginin etraf×nda d™nderilmesi iŒin sinžs
ve kosinžs fonksiyonlar×n× kullanarak yapabiliriz. Delphi ™rneklerindeki saat projesine bir g™z at×n×z. Ya da dizi ve
matris ile ayn× biŒimdeki bžyžk veri y×ğ×nlar× ile kolayca uğraĢabiliriz.

Ġki boyutlu olan a[1..4, 1..4] değiĢkenimiz iŒin klavyeden 16 değer giriyoruz. Ekrana tekrar bu say×lar× bize
g™steriyor. Sonra say× arama ve listeleme yap×l×yor. Ġki say×n×n değeri yer değiĢtirme – swap yap×larak program
bitiyor. Yaz×c× Œ×kt×s× verilen yer pasif halde, uses k×sm×ndaki printer komutuna da dikkat.

program matrice;
uses crt,printer;
const sat=4;sut=4;
var i,j,k,l,asayi,top,yed:integer;
a:array[1..sat,1..sut]of integer;

begin
clrscr;
writeln('matris elemanları girilir');
for i:=1 to sat do
begin
writeln;
61

for j:=1 to sut do


begin
write('matrisin [',i,',',j,'] elemanı');
read(a[i,j]);
end; {for}
end;
readln;
clrscr;
{ekran cıkısı}
for i:=1 to sat do
begin
writeln;
for j:=1 to sut do
write(' ','a[',i,',',j,']= ',a[i,j]);
end;{for}
{printer cıkısı
for i:=1 to sat do
begin
writeln;
for j:=1 to sut do
write(lst,'a[',i,j,']=',a[i,j]);
end;{for}
readln;
clrscr;
{eleman yeri bul}
write('aranılan elemani gir');
readln(asayi);
top:=0;
for i:=1 to sat do
for j:=1 to sut do
begin
if a[i,j]=asayi then
begin
inc(top);
writeln('aranan sayı ','a[',i,',',j,'] dır');
end;{if}
end;{for}
writeln(asayi,' sayisi toplam= ',top:4,' adet var');
{eleman yer degiĢtir}
readln;
clrscr;
writeln('yerleri degiĢecek sayılar');
write('1. sayının satırı=');readln(i);
write('1. sayının sutunu=');readln(j);
write('2. sayının satırı=');readln(k);
write('2. sayının sutunu=');readln(l);
writeln('A[',i,',',j,']sayı=',a[i,j]);
writeln('A[',k,',',l,']sayı=',a[k,l]);
yed:=a[i,j];
a[i,j]:=a[k,l];
a[k,l]:=yed;
writeln('A[',i,',',j,']sayı=',a[i,j]);
writeln('A[',k,',',l,']sayı=',a[k,l]);
readln;
end.
62

Bölüm 5 – Delphi
ĠĢte kitab×n ™zž buras× bence. Size faydal× olabilecek ™rnekleri aŒ×kl×yorum. Yar×s×ndan fazlas× kendi projelerim.

DOS programc×l×ğ×ndan farkl× olarak art×k sadece kod k×sm× yok. Ġhtiyac×m×z olan yeni Ģey form žzerinde de
neler olduğu. Bu bilgiler Delphi (*.dfm) ve VB‟de (*.frm) ayr× dosyalarda saklan×yor. Baz× programlarda o kadar Œok
nesne var ki, bu bilgiler bazen sayfalarca sžržyor. Eğer CD‟niz yok ise bu bilgilere bakarak programlar×n×z×
haz×rlayabilirsiniz.

Delphi‟yi yada Visual Pascal da diyebiliriz, ™ğrenmek iŒin Object Pascal dilini bilmeniz gerekiyor. Pascal temiz
ve džzenli Œal×Ģmay× sevenlerin dilidir. Bžyžk kžŒžk harfli kod kullan×lmas× fark etmiyor ama okunakl× olmas× aŒ×s×ndan
yazarken ya bžyžk harf, ya da kžŒžk harf kullanman×z× tavsiye ederim. Visual Basic, Delphi ve Visual C karĢ×laĢt×rmas×
yaparsak yaz×m ve okunakl×l×k olarak VB en basit, hatta Œocuksu, VC ve Java ise karmaĢ×k ve itici. Delphi tam
programc× dostu. Delphi‟nin yard×m ve iŒindeki ™rnek programlar× VB ve VC kadar geniĢ değil ama programc×y×
t™kezlemeden rahat bir ortam sunuyor. Pencerelere ve aptalca arabirimlerle programc×y× boğmadan tasar×m imkan×
veriyor.

Object Repository – Nesne deposu, yani “File*New...” menžsžnž incelerseniz application – uygulama,
component – nesne, DLL, ActiveX Form, Thread Object, Web Server Application gibi zengin nesneleri g™rebilirsiniz.

Borland Database Engine yani BDE ile paradox, dbase, Access, FoxPro ve Excel gibi SQL* – Structured Query
Language (Yap×land×r×lm×Ģ Sorgulama Dili)‟ne dayal× ODBC (Open Database Connectivity) kaynaklar×na eriĢebilirsiniz.

Delphi nesneleri yeterli olduğu halde, Visual Basic Custom Controls yani VBXs rahatl×kla Delphi iŒine
“Component*Import ActiveX Control...” menžsžnden entegre edilebilir.

Delphi IDE – Integrated Development Environment (Entegre GeliĢtirme Ortam×) ile h×zl× ve rahat biŒimde
™zgžn programlar žretebilirsiniz. VCL – Visual Component Library (G™rsel Nesne Kžtžphanesi) yani nesnelerimiz
kullan×m amaŒlar×na g™re ana menžmžzžn alt×nda grupland×r×lm×Ģlard×r. Standart, veritaban×, raporlama, internet ve
diğer yard×mc× konularda nesneler s×ralanm×Ģt×r. Geriye uyumluluk iŒin Win 3.1 ve Delphi1.0 uyumlu nesneleri vard×r.
Fakat art×k Microsoft bile, Win 3.1 ve Win 95 iĢletim sistemlerine destek vermiyor.

SpeedBar – h×zl× eriĢim Œubuğundaki komutlar× Office‟deki gibi ™zelleĢtirebilirsiniz. Mesela VB‟deki gibi, “Run
(F9)” džğmesinin yan×nda “Program Reset (Ctrl+F2)” da olsa ne iyi olur, değil mi? “Save All” džğmesinin yan×na
“Close All” da gžzel yak×Ģ×r. Eğer bileĢen paletinizde tžm sayfalar g™zžkmžyorsa tek yapabileceğiniz hile, bileĢen
paketlerinin adlar×n× k×saltmakt×r. Standart yerine Std, Internet yerine Net, ActiveX yerine AX gibi...

Object Inspector – nesne ™zellikleri k×sm×ndan seŒili olan nesne(ler)in ™zelliklerine - Properties ve olaylar×na –
Events eriĢebilirsiniz.

Kullan×c× arabiriminiz olan GUI – Graphical User Interface oluĢtururken, belli nesneleri sağa žste alta
bitiĢtirmek, Grow to largest – en bžyžğžne bžyžtmek, Send to Back – geriye yollamak, Space equally – yatay dikey
eĢit aral×k vermek kolayd×r. SeŒili nesneyi fare ile değil de klavyeden de konumland×rmak boyutland×rmak iŒin Ctrl
veya Shift ile y™n tuĢlar×n× deneyebilirsiniz.

Genellikle Delphi‟yi ilk kurduğumda “Tools*Environment Options” diyerek Ģunlar× iĢaretlerim; Show compiler
progress – Derleme iĢlemini g™sterir, Minimize on run – Program×m×z× Œal×Ģt×r×nca Delphi g™rev Œubuğuna kžŒžlžr,
Show component captions – Nesne baĢl×klar×n× g™sterir. Unit yani kod yazma yerine de sağ t×klay×p “Properties”; Undo
after save – Kay×ttan sonra geri al imkan× verir, Zoom to full screen – unitleri tam ekran g™rerek kod yazabilirsiniz,
Color : Classic – yani bildiğimiz Borland Pascal veya Turbo Pascal renkleri, Code Insight Delay : 0.5 sec – kod
tamamlamas× 0.5 saniye gecikmeli.

…zerine hiŒbir Ģey koymasan×z, hiŒ kod yazmasan×z da projenizin *.exe dosyas× Œok bžyžk olabilir. KžŒžk
olmas× iŒin “Project*Options*Packages” e gelerek, “Build with runtime packages” deyin. Dosyan×z 300 KB‟tan 14 KB‟a
džĢžverir. Fakat baĢka bilgisayarda Œal×Ģmas× iŒin vcl30.bpl (1.4 MB), vcl40.bpl (1.8 MB), vcl50.bpl (1.9 MB) gibi
sistem dosyalar×n×n da orada olmas× gerekir. Yine “Project*Options” k×sm×nda uygulaman×z×n simgesi, baĢl×ğ×, yard×m
dosyas×, hangi formun ana form olduğu gibi ayarlara ulaĢabilirsiniz. Projeniz Œok bžyžk de olsa compile - derleme
iĢleminin ne kadar h×zl× olduğunu g™rebilirsiniz. Oysa VB ve CBuilder‟da bu sžre daha uzundur.

*
Ek 2 – SQL k×sm×na bak×n×z.
63

K×sayol tuĢlar×m×z (Delphi 7‟den žst versiyonlarda değiĢiklikler var):

F9 : al×Ģt×r
Ctrl+F9 : Sadece hatalara bak ve derle...
Ctrl+F12 : Unit listemiz
Shift+F12 : Form listemiz
F11 : Object Inspector‟u g™sterir
F12 : Form ile unit aras×nda geŒiĢ yapar (toggle yapmak)
F8 ve F7 : Projeyi ad×m ad×m Œal×Ģt×r
Ctrl+F2 : al×Ģan program× resetler yani kapat×p ve form tasar×m×na d™ner
Ctrl+S : Aktfi penceredeki bilgileri kaydet
Ctrl+F ve R : Bul (Find) veya yer (Replace) değiĢtir
F1 : ĠmleŒ neredeyse onunla ilgili konuda yard×m ekrana gelir
Ctrl+Boşluk : En Œok kulland×ğ×m tuĢlardan biri, kodu tamamlamaya zorlar
Ctrl+J : Haz×r deyim kal×plar×n× listeler
Ctrl+Y : Pascal dilinden kalma sat×r sil komutu
Alt+F12 : Sžrpriz, form nesneleriniz art×k yaz× biŒiminde, ince iĢ yapanlara...

Tabii ki bir program×n Œal×Ģmas×n× belli bir sat×rda durdurmak iŒin F5 tuĢu ile o sat×ra durak noktas× koymam×z
gerekir. Eğer sadece belli durumda durak noktas×n×n Œal×Ģmas×n× istersek “Edit breakpoint*Condition” ile Ģart×m×z×
belirtebiliriz. F9 ile Œal×Ģt×rd×ğ×m×z program, k×rm×z× renkli bu durak noktas×na gelince bizi bekler. O zaman ne yapar×z?
Delphi 3.0 ve sonras× iŒin fly – by evaluation hints – fare ile bir değiĢkenin žzerine gelince ipucu olarak onu değerini
g™rebilir, F8 ile Œal×Ģmaya sat×r sat×r devam ederken değiĢkenlerimizin değerinin nas×l değiĢtiğini g™rebiliriz. Canl×
yay×n yani... Bu Ģekilde bilgi tarama zor gelirse “Run* Add Watch... (Ctrl+F5)” ile Watch List - seyretme listesine
değiĢkenleri ekleyebilirsiniz. Klavyeden Insert tuĢu ile yeni değiĢken ekleyebilir, Delete ile silebiliriz.

VB4 dizileri tamamen izlememize izin vermezken, VB5 ve žstžnde ise bu seyretme iĢi diziler iŒin Œok hoĢ bir
hale gelmiĢtir. Yani tžm dizideki elemanlara sadece dizi değiĢkeninin ad×n× “Debug*Add Watch” komutu ile Watches
k×sm×na eklemekle eriĢebilirsiniz. Ayr×ca VB‟de run time - Œal×Ģma durumunda immediate – an×nda penceresinde
? List1.ListCount + 5
gibi komut kullan×labiliyor. ?, Print komutu ile ayn× anlamdad×r. „rnek komut ekrana List1 nesnesinin liste
eleman say×s×na beĢ ekleyerek değerini yazar. Delphi‟de de “Run*Evaluate/Modify...” komutu ile istediğiniz nesne
değerine ulaĢ×p matematiksel iĢlem yapabilirsiniz. “View*Debug Windows*CPU” program×m×z×n disassembler edilmiĢ
halini verir. Bu Ģekildeki programlamaya reverse engineering – ters mžhendislik de denir.

Resim 1 – Saat projemizin iĢlemci iŒindeki hali

SonuŒ olarak Watch iĢlemi kurt programc×lar×n eli koludur, Œal×Ģt×ğ×n×z dilin b™cek ay×klama ad×mlar×n× iyi
™ğreniniz.
64

DeğiĢken tipleri integer (intecır diye okunur), real (riıl diye okunur), boolean (buuliın diye okunur), char (çar
diye okunur), string - metin ve variant‟d×r. Kulland×ğ×n×z her değiĢkeninizi var – variable (değiĢken) k×sm×na yazman×z,
tan×mlaman×z gerekiyor.

Her dilde olduğu gibi yaz×m kural× olarak TžrkŒe‟de kulland×ğ×m×z baz× kelimeleri kod yazmada deyim olarak
kullanamay×z: not, as, file, in, on, of, at, name, is, set, mod, var, nil...

Prosedžr ve fonksiyonlar×m×z× Unit (yunit diye okunur) – žnite denilen edit™r k×sm×na yazar×z. Baz×
programlarda sadece nesnelerin birkaŒ ™zelliği ile oynay×p hiŒ kod yazmadan da program yapabilirsiniz. Fakat Œoğu
zaman b™yle kolay olmuyor :) Pascal ™rneklerindeki diyot1.pas ™rneğinde kendi žnitemizi *.tpu olarak tan×mlamay×
g™ržyoruz. Delphi‟deki unit yap×s×na Œok benzer. Ama kullan×m olarak farkl×d×r. žnkž bunlar Delphi‟de soyad× *.pas
olan program kodlar×m×z×n tutulduğu aland×r. Pascal‟da unit sonuna Begin End. yazmak gerekli iken, Delphi‟de en
sonda bir begin‟i olmayan End. ile karĢ×laĢ×yoruz. Begin End. k×sm× ile DLL oluĢtururken karĢ×laĢt×racağ×z.

Program×m×za her form eklediğimizde o formun komut k×sm× Unit2, Unit3 Ģeklinde seri olarak oluĢur.
Birbirinden bağ×ms×z olarak formlar×n kodlar×n× yazar×z, fakat amaŒ bir projede birden fazla program yazmak değildir.
uses k×sm× ile birbirlerinden haberdar olmalar×n× sağlar×z. Program×m×z×n en žst k×sm×ndaki uses k×sm×na bazen el ile
yazd×ğ×m×z baĢka unit veya haz×r kžtžphaneleri eklememiz gerekebilir. Bunlar×n s×ralar× ™nemli değildir. Art×k ™rneğin
Unit2‟deki bir prosedžrž unit1 iŒinde kullanabiliriz. Dikkat ederseniz art×k Pascal‟×n crt žnitesi Windows ile yer
değiĢtirmiĢ.

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, inifiles, unit2, unit3;

Komut bloklar× C dilinde { ve } iken Pascal‟da begin ve end‟dir. C ile ayn× olarak sat×r sonlar×nda “;” kullan×l×r.
VB dilindeki end if veya end case deyimi Delphi‟de yoktur. Blok belirten begin ve end yeterlidir. End‟ler gittikŒe
kalabal×klaĢ×nca en iyisi daha yazarken end; // if (a<... gibi aŒ×klamalar eklemektir.

Bir nesneye kod yazmak iŒin “NesneAdiOlayAdi()” gibi ™rneğin, Button1‟in OnClick – t×kland×ğ×nda olay×
Button1Click() olarak oluĢur. Olay×n cinsine g™re ( ) parantez iŒindeki parametreler değiĢir. Dikkat ettiyseniz olaylar×n
baĢ×nda Procedure yaz×yor. Prosedžre değer yollanabilirken, onlardan değer d™nemez. Bunun iŒin Pascal dili ile ayn×
olarak Function tan×mlar×z. Bu sayede s×k kullan×lacak olan kod bloklar×n× bir yere toplay×p, daha k×sa ve h×zl× program
žretebiliriz. El ile yani manuel tan×tt×ğ×m×z fonksiyon ve prosedžrleri ™rneklerde g™rebilirsiniz:

...
procedure TaraDir(fdirName:string;fext:string);
...
function IsPrime (N: LongInt): Boolean;

Delphi„de en sevdiğim fonksiyonlar StrToInt gibi Œevrim yapanlar×. Fakat VB‟deki Left$(), Right$() ve Mid$() gibi
hoĢ metin iĢlem komutlar iŒin Delphi‟de biraz uğraĢmak gerekiyor. Bir de “^” operat™rž ile žs almak VB‟de doğal iken
Delphi‟de math unitini ekleyip power(x,y); demek gerekiyor. VB iŒin Œok basit bir hareket olan formun ShowInTaskbar
™zelliği ile g™rev Œubuğunda uygulaman×z×n g™zžkmemesi sağlan×yor. Bizim “Ornekler\Delphi\CD” ‟deki CD
™rneğimizde bu aranan bir ™zellik...

Eğer Pascal‟daki writeln(); gibi bir komut isterseniz, ™rneğin form iŒin bir džğmenin t×klanma olay×na Ģunlar×
yaz×n:

Var
F : TFont;
begin
F:=TFont.Create;
F.Name:='Tahoma';
F.Style:=[fsBold];
F.Size:=30;
Canvas.Font.Assign(F);
Canvas.Brush.Style := bsClear;
Canvas.TextOut( 30, 60, 'Program 1.0');
...
65

x ve y değerleri ile oynay×p kayan yaz× gibi bir Œal×Ģma yapabilirsiniz. Ayn× Ģekilde VB‟de de:

...
Fontname = ―Arial‖
FontBold = True
FontSize = 20
CurrentX = 700 „twip yani 1 inch = 1440 twip = 2,54 cm
CurrenY = 1400
Print ―Program 1.0‖
...

Boolean ifadeler Delphi‟de True 1, False 0 değerindedir. VB ve OLE otomasyonu iŒin ByteBool, WordBool ve
LongBool veri tiplerinde True –1, False 0‟d×r. …zerilerinde matematiksel iĢlem yap×labilir:

Caption:= IntToStr( Ord (1 < 6) + 4 ); // form başlığında 5 yazar


devam_mi:= not (sayi1=sayi2); //= karşılaştırma, := atama operatörüdür

VB‟de ise mant×ksal ifadelerde True –1, False 0 değerindedir. En az×ndan C, Pascal ve Basic False‟×n 0
olmas×nda ortaklar.

Caption = (1 < 6) + 4 „ form başlığına 3 yazar

Kžme iĢlemleri de kullan×Ģl× olabilir, in ile sayi değiĢkenimiz 1,5,20,23 dahil olarak 1‟den 5‟e veya 20‟den 23‟e
kadar olan s×n×r iŒinde ise iĢlem yap×l×r:

if sayi in [1..5, 20..23] then toplam:=toplam+sayi;

Genellikle Pascal‟da dosyalama konusunda karĢ×laĢt×ğ×m×z tip tan×mlamalar× aĢağ×daki Ģekilde yap×labilir.
Kullan×rken de değiĢkenler aras×na nokta konularak Tarih.Ay:=5; gibi yap×l×r.

type
Tarih = record
Yil: Integer;
Ay: 1..12;
Gun: 1..31;
end;

C dilindeki gibi variable typecast – değiĢken tipi atamalar× vard×r. Fakat bir tžrlž değiĢkenin tipine karar
verememiĢseniz, yavaĢ Œal×Ģan Variant tipi ile değiĢken tan×mlayabilirsiniz.

var karakter: char;


...
Shortint(karakter) := 122; // karakter:=‟z‟; eşdeğeri

Yine C dili ile benzer olarak break ve exit komutlar× Pascal‟da da kullan×r. break ile for, while gibi d™ngžlere
devam edilir, exit ile prosedžr veya fonksiyondan Œ×k×l×r.

Pointer - iĢaretŒi tan×mlama da Ģ™yledir:

var p: ^integer;
x: integer;
begin
p:= @x; //x‟in adresi
x:= 100;
if p <> nil then ShowMessage(inttostr(p^)); //aslında ekrana x, 100 gelir
...

Format fonksiyonu Œok gžŒlž metin biŒimleme yard×mc×m×zd×r. C dilindeki printf benzeri, d tamsay×, h onalt×l×k,
s metin, e žstel, f kayar noktal× anlam×ndad×r. %-8d yaz×m×n×n anlam× sola dayal× rakamd×r. Onluktan onalt×l×ğa veya
onalt×l×ktan onluk sisteme Œevirmek iŒin bu komut kullan×labilir.

caption := Format( ‗Ġlk %3d, son %3d‘, [ n1 , n2 ] );

Nesne ™zellikleri kžme iĢlemleri gibi kullan×l×r:


66

Memo1.Font.Style := Memo1.Font.Style – [fsBold] + [ fsItalic , fsUnderline ];


Button1.Font := Button2.Font; // font kopyalama
Label1.Alignment := taRightJustify;

Eğer bir uygulama projemiz varsa projemiz ile ilgili genel bir nesne ad×m×z var: Application
...
Caption := Application.Title; // uygulamanın başlığı yazılır
Caption := ExtractFilePath(Application.ExeName); // bulunduğu yol yazılır
...

VB‟de ise: App


...
Caption = App.EXEName
Caption = App.Path
...

Delphi‟de hata olmas× muhtemel yerlere try (tray diye okunur) – dene komutu ile gžvence verebilirsiniz.

...
try
Memo1.Font.Name:=‘Arial Tur‘;
Memo1.Font.Size:=18;
except
on Exception do ShowMessage(‗Fontta bir sorun var!‘);
end;
...

Veri giriĢi iŒin sadece basit bir InputQuery veya InputBox kullanmak daha faydal×:

var kelime:string;
begin
if inputquery (‗Aranan Kayıt‘, ‗Kelime giriniz:‘, kelime) then
begin
table1.locate('KELIME',kelime,[loCaseInsensitive, loPartialKey]);
end;
end;

Meraba.scr‟dekinden farkl× olarak program×m×z×n bir kere Œal×Ģmas×n× proje dosyam×za Ģu kodlar× ekleyerek
yapabiliriz:

program Tekcopy;

uses
Forms,Dialogs,Windows,
Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

var
Hwnd: THandle;

begin
Hwnd := FindWindow ('TForm1', 'BaĢlık');
if Hwnd = 0 then
begin
Application.CreateForm(TForm1, Form1);
Application.Run;
end
else
begin
MessageDlg ('Sadece 1 kere çalıĢtırılabilir...',mtInformation, [mbOk], 0);
SetForegroundWindow (Hwnd);
end
end.
67

Bir nesneyi (Button, Edit,...) basitŒe sžržklemek iŒin Ģu k×sa kod yeterlidir:

Procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);


const sc_DragMove=$F012;
begin
ReleaseCapture;
Button1.Perform(WM_SYSCOMMAND, sc_DragMove, 0);
end;

G™rev Œubuğundan program×n simgesini kald×rmak iŒin:

procedure TForm1.FormCreate(Sender: TObject);


begin
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
end;

Farenizi istediğiniz yere y™nlendirebilirsiniz, bu sayede fareyi belli koordinata da hapsedebilirsiniz:

procedure TForm1.Button1Click(Sender: TObject);


var nokta:TPoint;
begin
GetCursorPos(nokta); //farenin o anki koordinatı alınır
SetCursorPos(nokta.x+10,nokta.y+10); //10 piksel sağ aşağı çapraz hareket ettirilir
end;

Fare t×klamas×n×n taklit edilmesi, yani baĢka bir nesne – Edit1 t×klan×nca sanki džğme – Button2 t×klanm×Ģ gibi
yapmak:

procedure TForm1.Edit1Click(Sender: TObject);


begin
SendMessage(button2.handle, WM_LBUTTONDOWN, 0, 0);
SendMessage(button2.handle, WM_LBUTTONUP, 0, 0);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
MessageBeep(500); //bip sesi
end;

Standart dizin seŒme diyalog kutusu Ģu Ģekilde kullan×labilir:

uses FileCtrl; // uses da neresi demeyin.


procedure TForm1.Button1Click(Sender: TObject);
var
Result: integer;
Dir: string;
begin
Dir := 'C:\';
if SelectDirectory(Dir, [sdAllowCreate, sdPerformCreate, sdPrompt], Result) then
form1.Caption := Dir;
end;

Delphi‟de yaz×labilecek en kžŒžk program× (*.dpr) proje dosyas×na yazabilirsiniz:

program Beep;
uses
Windows;
begin
MessageBeep (0);
end.

Uygulaman×zda birŒok minik resim, simge gibi bitmap kaynaklar ve sabit metin dizisi varsa; resimleri Image
Editor program× ile *.res resource haline getirerek, metinleri de not defterinde kendiniz yazarak “Delphi\Bin”
dizinindeki brcc32.exe ile derleyerek daha h×zl× kullanabilirsiniz. Harici dosyalar× kullan×c×lara ayr×ca vermeniz
68

gerekirken, *.res kullanarak *.exe iŒine dahil etmiĢ olursunuz. TicTocToe ™rneğimizde sadece žŒ resim olduğu iŒin bu
y™ntemi kullanmad×m.

Grafik iŒin:

var
Form1: TForm1;
Bmp: TBitmap;
implementation
{$R *.DFM}
{$R BITMAPS.RES} //kaynak dosyamız (brcc32 ile elde edilen)
...
Bmp.Handle := LoadBitmap (HInstance, 'bitmap dosya adı');
DrawGrid1.Canvas.Draw (Rect.Left, Rect.Top, Bmp);
...

Metin iŒin:

STRINGTABLE
BEGIN
1, "Merhaba"
2, "String Tablo"
11, "Ġlk mesaj"
12, "Ġkinci mesaj"
13, "…Œžncž mesaj"
...
20, "Onuncu mesaj"
END

implementation
{$R *.DFM}
{$R tablo.res} //kaynak dosyamız (brcc32 ile elde edilen)
...
string_mesaj := LoadStr(1); //Merhaba
ShowMessage (string_mesaj);
...
string_mesaj := LoadStr(11); //İlk mesaj
ShowMessage (string_mesaj);
...

Not defteri ile bu yaz×lar× tablo.rc olarak kaydediniz. Komut sat×r×ndan “brcc32.exe –r tablo.rc” diyerek
tablo.res dosyas×n× elde ediniz. Sabit metin veri y×ğ×n×n× ™rneğin, menžlerimizin dilini Ġngilizce, TžrkŒe ve Almanca gibi
farkl× dillerde kullan×labilmesi iŒin oluĢturabiliriz. GWBasic dilindeki sat×r numaralar× gibi ™rneğin 1000 sonras× TžrkŒe,
2000 sonras× Ġngilizce gibi ayarlayabiliriz.

Casio FX-880P‟de Basic ile yapt×ğ×m kağ×t oyununda bilgileri Ģu Ģekilde program iŒine kaydedip kullanm×Ģt×m:

10 cls
20 restore data ilklenir
30 dim kagit$(52)
40 data ak,kk,qk,jk,tk,9k,8k,7k,6k,5k,4k,3k,2k ... diger kagit bilgileri
50 for i=1 to 52 : read kagit$(i) : next

data komutu ile yazd×ğ×m sabit bilgileri, read komutu ile kagit$ adl× diziye aktar×yordum. Bir Hex edit™r ile
*.exe dosyan×n iŒindeki bu bilgilere eriĢilerek, mesela kullan×c×lar×n bilmemesi gereken bilgiler g™ržlebilir. Tavsiyem bu
tip veriyi Ģifrelemenizdir. B™ylece 52 sat×rl×k kod yazmaktan kurtulmuĢtum. Asl×nda kağ×t bilgilerini Casio‟nun Memory
- yaz× yazma k×sm×nda dosya haline getirip Basic k×sm×ndan bunlar× okumay× denemiĢtim, ama bunu denerken karĢ×ma
Peek ve Poke komutlar× Œ×kt×. Sžrpriz olarak bu s×rada tžm bilgileri silen program da yazm×Ģ ve Œal×Ģt×rm×Ģt×m(?!). Tabii
yedekleme diye bir Ģey olmad×ğ× iŒin yapt×ğ×m tžm emeklerim silinmiĢti. “Ornekler\Basic\peek.bas” ™rneğini
inceleyiniz.

print peek (&h300) „300H adresi bilgilerini ekrana yazar


poke &h300,254 „300H adresine 255 yazar
69

1. Agent (Microsoft Agent kullanımı)


(Ornekler\Delphi\Agent\Project1.dpr)

Resim 2 – Microsoft Agent kullan×m×

Deneye deneye birŒok ™zellikleri buldum. Ġnternet‟ten araĢt×rarak eklentiler yap×labilir. Microsoft‟un sitesi olan
MSDN kžtžphanesi yeterince geniĢ.

Office 2000 ve žstž ile birlikte kurulan Microsoft Agent “Windows\MsAgent” klas™ržne yerleĢiyor. Robby,
Peedy, Genie ve Merlin gibi diğer karakterleri yžklerseniz “Windows\MsAgent\Chars” dizinine bunlar×n yerleĢtiğini
g™ržrsžnžz. microsoft.com‟dan da MSAgent yžkleyebilirsiniz. CD‟de “Diger\Extras” dizininde MsAgent.exe,
peedy.exe, genie.exe gibi dosyalar× bulabilirsiniz. Office 2000 veya XP‟nin karakterleri olan F1, Rocky, Cin de
kullan×labilirken, Office 97 karakterleri uyumsuz. “Ajan SeŒimi” džğmemiz ile “Windows\MsAgent\Chars” dizinindeki
veya baĢka bir yerdeki *.acs karakterleri aŒabiliriz. Office ajanlar×n× aŒabildiğimiz halde onlar×n hareket isimleri tam
buradaki gibi değil.

Ajanlar× Office VBA dili ile, web sayfas× iŒinde de VBScript veya JavaScript dilleri ile Œağ×rabilir ve kullanabiliriz.
ActiveX ile ilgili Diğer Diller adl× k×s×mda aŒ×klamalar bulabilirsiniz. Bilgisayar×m×zda MSAgent‟in kurulu olup olmad×ğ×n×
“Ornekler\Delphi\Agent\kurulu_mu.html” adl× dosyay× Œal×Ģt×rarak ™ğrenebilirsiniz:

<SCRIPT LANGUAGE=VBSCRIPT>

If HaveAgent() Then
document.write "<H2 align=center>MS Agent Kurulu...</H2>"
Else
document.write "<H2 align=center>MS Agent Bulunamadı...</H2>"
End If

Function HaveAgent()
Dim agent
HaveAgent = False
On Error Resume Next
Set agent = CreateObject("Agent.Control.1")
HaveAgent = IsObject(agent)
End Function

</SCRIPT>

Delphi‟de Agent kullanabilmek iŒin “Component*Import ActiveX Control...” dedikten sonra “Microsoft Agent
Control (Version 2.0)” gibi ifadeyi bulun, Palette page‟i ActiveX seŒerek Install deyin. ġapkal× bir vatandaĢ×n
nesnelerinize eklendiğini g™receksiniz. VB iŒin de ayn× Ģekilde ToolBox iŒine dahil edilebilir. Delphi ™rneği sonundaki VB
™rneğinde birden fazla karakterin de kullan×labildiğini g™rebilirsiniz.

Form žzerinde Ģunlar var:


70

object Form1: TForm1 Left = 202


Left = 271 Top = 72
Top = 104 Width = 129
ActiveControl = Button2 Height = 22
BorderStyle = bsNone Caption = '&Hareketi Uygula'
Caption = 'Microsoft Agent Kullanımı' TabOrder = 0
ClientHeight = 161 OnClick = Button1Click
ClientWidth = 416 end
Color = clWhite object Agent1: TAgent
Font.Charset = DEFAULT_CHARSET Left = 368
Font.Color = clMaroon Top = 56
Font.Height = -11 Width = 32
Font.Name = 'MS Sans Serif' Height = 32
Font.Style = [fsBold] Hint = 'asdasd'
OldCreateOrder = True ControlData = {000300004F0300004F030000}
Position = poScreenCenter end
ShowHint = True object ComboBox1: TComboBox
OnCreate = FormCreate Left = 64
OnMouseDown = FormMouseDown Top = 6
PixelsPerInch = 96 Width = 131
TextHeight = 13 Height = 21
object Label1: TLabel ItemHeight = 13
Left = 10 TabOrder = 2
Top = 35 Text = 'Read'
Width = 27 Items.Strings = (
Height = 13 'Greet'
Caption = 'Git x' 'Read'
end 'Write'
object Label2: TLabel 'Think'
Left = 106 'Confused'
Top = 35 'Announce'
Width = 27 'Search'
Height = 13 'Show'
Caption = 'Git y' 'Hide'
end 'Sad'
object Label3: TLabel 'Pleased'
Left = 8 'GestureRight'
Top = 8 'GestureLeft')
Width = 46 end
Height = 13 object Edit1: TEdit
Caption = 'Hareket' Left = 43
end Top = 32
object Label4: TLabel Width = 57
Left = 9 Height = 21
Top = 67 TabOrder = 3
Width = 34 Text = '150'
Height = 13 end
Caption = 'Yazısı' object Edit2: TEdit
end Left = 140
object Label5: TLabel Top = 32
Left = 8 Width = 57
Top = 120 Height = 21
Width = 155 TabOrder = 4
Height = 13 Text = '150'
Caption = 'Sol tıklayıp sürükle formu...' end
end object Edit3: TEdit
object SpeedButton1: TSpeedButton Left = 48
Left = 202 Top = 64
Top = 104 Width = 148
Width = 129 Height = 21
Height = 22 TabOrder = 5
Caption = 'A&jan Listele' Text = 'Hadi Bakalııım...'
OnClick = SpeedButton1Click end
end object Button2: TButton
object Button1: TButton Left = 336
71

Top = 8 item
Width = 75 Width = 50
Height = 25 end
Caption = '&Kapat' item
TabOrder = 6 Width = 50
OnClick = Button2Click end
end item
object Button3: TButton Width = 100
Left = 202 end>
Top = 40 SimplePanel = False
Width = 129 end
Height = 22 object Button4: TButton
Caption = '&Göster/Gizle' Left = 202
TabOrder = 7 Top = 8
OnClick = Button3Click Width = 129
end Height = 22
object CheckBox1: TCheckBox Caption = '&Ajan Seçimi'
Left = 11 TabOrder = 10
Top = 95 OnClick = Button4Click
Width = 137 end
Height = 17 object Timer1: TTimer
Caption = 'Ses Efektleri' Interval = 150
Checked = True OnTimer = Timer1Timer
State = cbChecked Left = 328
TabOrder = 8 Top = 56
OnClick = CheckBox1Click end
end object OpenDialog1: TOpenDialog
object StatusBar1: TStatusBar FileName = '*.acs'
Left = 0 Filter = 'Microsoft Agent Karakteri (*.acs)|*.acs|Tüm
Top = 142 Dosyalar (*.*)|*.*'
Width = 416 InitialDir = 'c:\windows\msagent\chars'
Height = 19 Options = [ofReadOnly, ofHideReadOnly,
Panels = < ofEnableSizing]
item Title = 'Ajan Seçiniz'
Width = 100 Left = 368
end Top = 96
item end
Width = 50 end
end

Kod k×sm× da Ģunlar:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, OleCtrls, AgentObjects_TLB, Spin, ComCtrls, ExtCtrls, Buttons;

type
TForm1 = class(TForm)
Agent1: TAgent;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
CheckBox1: TCheckBox;
ComboBox1: TComboBox;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
72

Label5: TLabel;
OpenDialog1: TOpenDialog;
SpeedButton1: TSpeedButton;
StatusBar1: TStatusBar;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Timer1Timer(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
c:widestring;d:OleVariant;
implementation
{$R *.DFM}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;


Shift: TShiftState; X, Y: Integer);
const
SC_DragMove = $F012;
begin
Begin
ReleaseCapture;
FORM1.perform(WM_SysCommand, SC_DragMove, 0);
End;
end;

procedure TForm1.Timer1Timer(Sender: TObject);


const
CapPanel = 1; NumPanel = 2;
ScrlPanel = 3; DatePanel = 4;
begin
with StatusBar1 do
begin
if GetKeyState(VK_CAPITAL) <> 0 then
StatusBar1.Panels[CapPanel].Text := ' CAP'
else
StatusBar1.Panels[CapPanel].Text := '';
if GetKeyState(VK_NUMLOCK) <> 0 then
StatusBar1.Panels[NumPanel].Text := ' NUM'
else
StatusBar1.Panels[NumPanel].Text := '';
if GetKeyState(VK_SCROLL) <> 0 then
StatusBar1.Panels[ScrlPanel].Text := ' SCRL'
else
StatusBar1.Panels[ScrlPanel].Text := '';
StatusBar1.Panels[DatePanel].Text := FormatDateTime(' mmmm D, YYYYY', now);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);


begin
c:='Merlin';
agent1.Characters.Load(c, 'merlin.ACS');
Agent1.Characters.Item[c].Set_AutoPopupMenu(True);
73

Application.HintColor:=claqua;
end;

procedure TForm1.Button1Click(Sender: TObject);


var a :OleVariant;
begin
agent1.Characters.Item[c].MoveTo(strtoint(edit1.text),strtoint(edit2.text),a);
agent1.Characters.Item[c].Play(ComboBox1.Text);
agent1.Characters.Item[c].Think(edit3.text);
end;

procedure TForm1.Button3Click(Sender: TObject);


begin
Agent1.Characters.Item[c].ShowPopupMenu
(left+button3.left,top+button3.top+button3.height);
end;

procedure TForm1.Button2Click(Sender: TObject);


begin
agent1.Characters.Unload(c);
close;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);


begin agent1.Characters.Item[c].Set_SoundEffectsOn(CheckBox1.Checked); end;

procedure TForm1.Button4Click(Sender: TObject);


var uzanti:string;i:byte;dosyaadi:string;
begin
OpenDialog1.FileName:='';
OpenDialog1.Execute;
if OpenDialog1.FileName<>'' then
begin
dosyaadi:=lowercase(OpenDialog1.FileName);
agent1.Characters.Unload(c);
uzanti:='';c:='';
i:=strlen(pchar(OpenDialog1.FileName));
while (dosyaadi[i]<>'.') do dec(i); //uzanti koparilir
dec(i); //nokta gidiyor
while (dosyaadi[i]<>'\') do begin //sadece adı lazim
uzanti:=dosyaadi[i]+uzanti;
dec(i);
end;
c:=uzanti;
agent1.Characters.Load(c, OpenDialog1.FileName);
end;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);


begin agent1.ShowDefaultCharacterProperties; end;

end.

Asl×nda sadece Agent değil, form sžržkleme yap×p, durum Œubuğunda Num Lock, Caps Lock ve Scroll Lock gibi
bilgileri de g™sterdik. Formu sol t×klay×p sžržkleme imkan× da veriyoruz.

Visual Basic dilinde de animasyon haz×rlamak kolayd×r. PeĢpeĢe komutlarla sanki bir olay× anlat×yorlarm×Ģ
g™ržntžsž verebiliriz. F×kra anlatmak veya bir Ģeyin tan×t×m× gibi... Art×k eksikler; seslendirme yani konuĢmalar× ve
bizim yazd×ğ×m×z veya mikrofondan konuĢduğumuz kelimeleri sentezlemeleri. Eğer MSDN Library kžtžphane sitesini
incelerseniz, orada speech – konuĢma ile ilgili Microsoft Voice Commands yeteneği, ayr×ca 18 MB‟l×k MS Agent
Software Development Kit program×n× indirebilir, kendi karakterinizi yapabilme gibi imkanlara kavuĢursunuz. ġu anki
kullan×m×m×z bilgilendirme d×Ģ×nda bir iĢimize yaram×yorlar. (Ornekler\VB\MSAgent\Project1.vbp)

VB iŒinde tasarlarken bir liste kutusu, d™rt džğme, žŒ metin kutusu, žŒ etiket ve bir agent nesnesi
kullan×yoruz. Merlin, Robby ve Genie‟yi kurmay× unutmay×n.
74

Dim GenieRequest merlin.Play "DoMagic2"


Dim RobbyRequest merlin.Play "Pleased"
Dim merlinRequest merlin.Play "Restpose"
Dim Genie merlin.Play "Suggest"
Dim Robby merlin.Speak "ġimdi bir önerim var!"
Dim merlin merlin.Speak "ĠĢte lamba ile bunu belirtirim..."
merlin.Play "Pleased"
Private Sub Command1_Click() „Fıkra merlin.Play "Restpose"
Genie.MoveTo 100, 100 merlin.Speak "Okuyabilir..."
Genie.Show merlin.Play "Read"
Robby.MoveTo 250, 100 merlin.Speak "ve yazabilirim."
Robby.Show merlin.Play "Write"
Genie.Play "Announce" merlin.Play "Pleased"
Set GenieRequest = Genie.Speak("Tavuk neden karĢıya merlin.Play "Restpose"
geçti?") merlin.Speak "TeĢekkürler"
Robby.Wait GenieRequest merlin.Play "Wave"
Robby.Play "Confused" merlin.Speak "Güle güle..."
Set RobbyRequest = Robby.Speak("Ne biliyim. Sence merlin.Hide
neden geçti?") End Sub
Genie.Wait RobbyRequest
Genie.Play "Pleased" Private Sub Command4_Click() „Kapat
Set GenieRequest = Genie.Speak("KarĢı tarafta olmak End
için...") End Sub
Robby.Wait GenieRequest
Robby.Play "Sad" Private Sub Form_Load() „İlk açılış
Robby.Speak "Hiç sormamalıydım!" Agent1.Characters.Load "Genie", "genie.acs"
End Sub Agent1.Characters.Load "Robby", "robby.acs"
Agent1.Characters.Load "Merlin", "merlin.acs"
Private Sub Command2_Click() „Cin‟in hareket
listesi Set Genie = Agent1.Characters("Genie")
List1.Clear Set Robby = Agent1.Characters("Robby")
For Each Animation In Genie.AnimationNames Set merlin = Agent1.Characters("Merlin")
List1.AddItem (Animation)
Next Genie.Get "State", "Showing"
End Sub Robby.Get "State", "Showing"

Private Sub Command3_Click() „Merlin‟in şovu Genie.Get "Animation", "Announce, AnnounceReturn,


Dim strName As String Pleased,PleasedReturn "
merlin.MoveTo 400, 100
merlin.Show Robby.Get "Animation", "Confused, ConfusedReturn,
merlin.Play "Greet" Sad, SadReturn"
merlin.Play "Restpose"
merlin.Speak "Merhaba!" Set Genie = Agent1.Characters("Genie")
merlin.Play "Announce" Set Robby = Agent1.Characters("Robby")
merlin.Speak "Ben Merlin." End Sub
merlin.Play "Pleased"
merlin.Speak "TanıĢtığımıza memnun oldum!" Private Sub List1_Click() „Cin‟e komut yollamak
merlin.MoveTo 250, 500 Genie.Stop
merlin.Speak "Size bazı Ģeyler göstereceğim..." Genie.MoveTo Text1.Text, Text2.Text
merlin.Play "Hide" Genie.Show
merlin.Play "Show" Genie.Play List1.Text
merlin.Speak "bazı hareketlerimi..." Genie.Speak Text4.Text
merlin.Speak "ĠĢte bir sihir numaram!" End Sub
merlin.Play "DoMagic1"
75

Resim 2.1 – VB‟de Agent nesnesinin kullan×m×, g™rev Œubuğundaki simgelere dikkat!

Eğer Office Asistan×m×za uygulamak istersek, Ģu kodlar× bir modžlžn iŒine yazabilirsiniz. VBA Džzenleyicisinde
iken “Tools*Preferences” listesinden “Microsoft Office 9.0 Object Library” kžtžphanesini ve Asistan× da Office
kurulumunda seŒmeyi unutmay×n. Buras× ille de Excel olmak zorunda değil, Word veya PowerPoint iŒinde de
deneyebilirsiniz. Bu dediklerimizi Office‟in karakterli olan her sžržmžnde kullanabiliriz:

Sub Assist ()
With Application.Assistant
.Visible = True
.Animation = msoAnimationGreeting
End With
End Sub

Resim 3 – Asistana komut yollamak


76

2. CD (görev çubuğunda program çalıştırma)


(Ornekler\Delphi\CD\Project1.dpr)

Bu programda g™rev Œubuğuna - taskbar simge ekleme, sžržcžden CD – compact disk Œ×karma, geri takma,
Windows‟u kapatma, yeniden baĢlatma komutlar×n× g™ržyoruz. Takma Œ×karma iĢlemi DVD - digital video disk iŒin de
geŒerli. En fazla 4 adet olabilen CD‟leri otomatik olarak bulup, resimdeki gibi g™steriyoruz.

Resim 4 – CD program×

Proje dosyam×z:

program Project1;

uses
formkapa in 'formkapa.PAS',
Forms,Windows,
Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

begin
Application.ShowMainForm := False;
IsLibrary := false;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

G™rev Œubuğundaki gereksiz program simgeyi yok etmek iŒin yazacağ×m×z unit:

unit formkapa;

interface

implementation

initialization
IsLibrary := True;

end.
Kodlar×m×z:

unit Unit1; Windows, Messages, SysUtils, Classes, Graphics,


Controls, Forms, Dialogs, Menus, MMSystem,
interface StdCtrls,ShellAPI, ExtCtrls, ShlOBJ, Psapi, tlhelp32;

uses const
wm_IconMessage = wm_User;
77

List.Add(ProcInfo.szExeFile);
type while (Process32Next(hSnapShot, ProcInfo)) do
TForm1 = class(TForm) List.Add(ProcInfo.szExeFile);
PopupMenu1: TPopupMenu; end;
N1CDA1: TMenuItem; CloseHandle(hSnapShot);
N2CDA1: TMenuItem; end;
Kapat1: TMenuItem; end;
WindowsuTekrarA1: TMenuItem;
N1: TMenuItem; procedure CreateWinNTProcessList(List: TstringList);
WindowsuKapat1: TMenuItem; var
N2: TMenuItem; PIDArray: array [0..1023] of DWORD;
Timer1: TTimer; cb: DWORD;
N2CDA2: TMenuItem; I: Integer;
N2CDA3: TMenuItem; ProcCount: Integer;
Belgelermensntemizle1: TMenuItem; hMod: HMODULE;
ProgramKapat1: TMenuItem; hProcess: THandle;
azele1: TMenuItem; ModuleName: array [0..300] of Char;
procedure Kapat1Click(Sender: TObject); begin
procedure N1CDA1Click(Sender: TObject); if List = nil then Exit;
procedure N2CDA1Click(Sender: TObject); EnumProcesses(@PIDArray, SizeOf(PIDArray), cb);
procedure FormCreate(Sender: TObject); ProcCount := cb div SizeOf(DWORD);
procedure FormClick(Sender: TObject); for I := 0 to ProcCount - 1 do
procedure WindowsuTekrarA1Click(Sender: TObject); begin
procedure WindowsuKapat1Click(Sender: TObject); hProcess :=
procedure Timer1Timer(Sender: TObject); OpenProcess(PROCESS_QUERY_INFORMATION or
procedure N2CDA2Click(Sender: TObject); PROCESS_VM_READ,
procedure N2CDA3Click(Sender: TObject); False,
procedure Belgelermensntemizle1Click(Sender: PIDArray[I]);
TObject); if (hProcess <> 0) then
procedure tikla(Sender: TObject); begin
procedure azele1Click(Sender: TObject); EnumProcessModules(hProcess, @hMod,
SizeOf(hMod), cb);
public GetModuleFilenameEx(hProcess, hMod, ModuleName,
procedure IconTray (var Msg: TMessage); SizeOf(ModuleName));
message wm_IconMessage; List.Add(ModuleName);
private CloseHandle(hProcess);
nid:TNotifyIconData; end;
end;
end; end;

var procedure GetProcessList(var List: TstringList);


Form1: TForm1; var
ac1:boolean=true; ovi: TOSVersionInfo;
ac2:boolean=true; begin
ac3:boolean=true; if List = nil then Exit;
ac4:boolean=true; ovi.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
cdler:array [0..4] of string; GetVersionEx(ovi);
cdsayisi:byte=0; case ovi.dwPlatformId of
VER_PLATFORM_WIN32_WINDOWS:
implementation CreateWin9xProcessList(List);
VER_PLATFORM_WIN32_NT:
{$R *.DFM} CreateWinNTProcessList(List);
end
procedure CreateWin9xProcessList(List: TstringList); end;
var
hSnapShot: THandle; procedure CDlistesi;
ProcInfo: TProcessEntry32; var buffer : array[0..500] of char;
begin temp : PChar;
if List = nil then Exit; typ,i,ara : integer;
hSnapShot := MyProcList: TstringList;
CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0); itme: TMenuItem;
if (hSnapShot <> THandle(-1)) then begin
begin cdsayisi:=0;
ProcInfo.dwSize := SizeOf(ProcInfo); GetLogicalDriveStrings( sizeof( buffer ), buffer );
if (Process32First(hSnapshot, ProcInfo)) then temp := buffer;
begin while temp[0] <> #0 do
78

begin mciSendString(pchar('open cdaudio!'+cdler[0]+': alias


typ := GetDriveType( temp ); drive'+cdler[0]), nil, 0, 0);
if typ = DRIVE_CDROM then mciSendString(pchar('set drive'+cdler[0]+' door open
begin wait'), nil, 0, 0);
cdler[cdsayisi]:= copy(temp,0,1); ac1:=False;
inc(cdsayisi); end else
end; begin
temp := StrEnd( temp ) + 1; mciSendString(pchar('set drive'+cdler[0]+' door closed
end; wait'), nil, 0, 0);
//ShowMessage(inttostr(cdsayisi)); ac1:=true;
//ShowMessage(cdler[0]+'.'+cdler[1]+'.' +cdler[2]); end;
if (inttostr(cdsayisi) = '0') then form1.N1.Visible:=false; end;
if (cdsayisi>=1) then form1.N1CDA1.Visible:=true;
if (cdsayisi>=2) then form1.N2CDA1.Visible:=true; procedure TForm1.N2CDA1Click(Sender: TObject);
if (cdsayisi>=3) then form1.N2CDA2.Visible:=true; begin
if (cdsayisi>=4) then form1.N2CDA3.Visible:=true; if ac2 then begin
mciSendString(pchar('open cdaudio!'+cdler[1]+': alias
if drive'+cdler[1]), nil, 0, 0);
(cdsayisi>=1)and(StrPos(pchar(form1.N1CDA1.caption),'(') mciSendString(pchar('set drive'+cdler[1]+' door open
=nil) then form1.N1CDA1.caption:=form1.N1CDA1.caption wait'), nil, 0, 0);
+' ('+cdler[0]+':)'; ac2:=False;
if end else
(cdsayisi>=2)and(StrPos(pchar(form1.N2CDA1.caption),'(') begin
=nil) then form1.N2CDA1.caption:=form1.N2CDA1.caption mciSendString(pchar('set drive'+cdler[1]+' door closed
+' ('+cdler[1]+':)'; wait'), nil, 0, 0);
if ac2:=true;
(cdsayisi>=3)and(StrPos(pchar(form1.N2CDA2.caption),'(') end;
=nil) then form1.N2CDA2.caption:=form1.N2CDA2.caption end;
+' ('+cdler[2]+':)';
if procedure TForm1.N2CDA2Click(Sender: TObject);
(cdsayisi>=4)and(StrPos(pchar(form1.N2CDA3.caption),'(') begin
=nil) then form1.N2CDA3.caption:=form1.N2CDA3.caption if ac3 then begin
+' ('+cdler[3]+':)'; mciSendString(pchar('open cdaudio!'+cdler[2]+': alias
drive'+cdler[2]), nil, 0, 0);
MyProcList := TStringList.Create; mciSendString(pchar('set drive'+cdler[2]+' door open
try wait'), nil, 0, 0);
GetProcessList(MyProcList); ac3:=False;
if MyProcList = nil then Exit; end else
ara:=Form1.ProgramKapat1.Count; begin
for i:=ara-1 downto 0 do mciSendString(pchar('set drive'+cdler[2]+' door closed
Form1.ProgramKapat1.Delete(i); wait'), nil, 0, 0);
for i := 0 to MyProcList.Count - 1 do begin ac3:=true;
if (copy(MyProcList.Strings[i],2,1)=':') then end;
begin
end;

//ShowMessage(MyProcList.Strings[i]+'*'+form1.ProgramKapat procedure TForm1.N2CDA3Click(Sender: TObject);


1.Items[0].Caption); begin
itme:=TMenuItem.Create(Form1.ProgramKapat1); if ac4 then begin
itme.Caption:=MyProcList.Strings[i]; mciSendString(pchar('open cdaudio!'+cdler[3]+': alias
itme.OnClick:=form1.tikla; drive'+cdler[3]), nil, 0, 0);
mciSendString(pchar('set drive'+cdler[3]+' door open
Form1.ProgramKapat1.Insert(Form1.ProgramKapat1.Coun wait'), nil, 0, 0);
t,itme); ac4:=False;
//itme.free; end else
end; begin
end; mciSendString(pchar('set drive'+cdler[3]+' door closed
finally wait'), nil, 0, 0);
MyProcList.Free; ac4:=true;
end; end;
end;
end;
function KillTask(ExeFileName: string): integer;
procedure TForm1.N1CDA1Click(Sender: TObject); const
begin PROCESS_TERMINATE=$0001;
if ac1 then begin var
79

ContinueLoop: BOOL; CDlistesi;


FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32; end;
begin
result := 0; procedure TForm1.IconTray(var Msg:TMessage);
var pt:Tpoint;
FSnapshotHandle := CreateToolhelp32Snapshot begin
(TH32CS_SNAPPROCESS, 0); if
FProcessEntry32.dwSize := Sizeof(FProcessEntry32); (msg.LParam=wm_rbuttondown)or(msg.LParam=wm_lbutt
ContinueLoop := Process32First(FSnapshotHandle, ondown) then
FProcessEntry32); begin
getcursorpos(Pt);
while integer(ContinueLoop) <> 0 do setforegroundwindow(Handle);
begin PopUpMenu1.Popup(Pt.x,Pt.y);
if end;
((UpperCase(ExtractFileName(FProcessEntry32.szExeFile) end;
)=
UpperCase(ExeFileName)) procedure TForm1.FormClick(Sender: TObject);
or (UpperCase(FProcessEntry32.szExeFile) = var msg:Tmessage;
UpperCase(ExeFileName))) then begin
Result := Integer(TerminateProcess(OpenProcess( icontray(msg);
PROCESS_TERMINATE, BOOL(0), end;
FProcessEntry32.th32ProcessID), 0));
ContinueLoop := Process32Next(FSnapshotHandle, procedure TForm1.WindowsuTekrarA1Click(Sender:
FProcessEntry32); TObject);
end; begin
if MessageDlg('Windows TEKRAR açılsın
CloseHandle(FSnapshotHandle); mı?',mtConfirmation, [mbYes, mbNo], 0) = mrYes Then
end; ExitWindows(EWX_REBOOT,0);
end;
procedure Tform1.tikla(Sender: TObject);
begin procedure TForm1.WindowsuKapat1Click(Sender:
if MessageDlg(ExtractFileName((sender as TObject);
Tmenuitem).caption)+#13+#13+'Bu program kapatılsın begin
mı?', if MessageDlg('Windows KAPANSIN mı?',mtConfirmation,
mtConfirmation, [mbYes, mbNo], 0) = mrYes Then [mbYes, mbNo], 0) = mrYes Then
KillTask(ExtractFileName((sender as ExitWindowsEx(EWX_SHUTDOWN,0);
Tmenuitem).caption)); end;
CDlistesi;
end; procedure TForm1.Timer1Timer(Sender: TObject);
begin
procedure TForm1.FormCreate(Sender: TObject); ShowWindow (handle, sw_hide);
var timer1.Enabled:=false;
i: Integer; end;
begin
procedure TForm1.Kapat1Click(Sender: TObject);
SetWindowLong(Application.Handle,GWL_EXSTYLE, begin
WS_EX_TOOLWINDOW); Shell_NotifyIcon(NIM_DELETE,@nid);
CreateMutex(nil,FALSE,'project1'); Application.Terminate;
if GetLastError = ERROR_ALREADY_EXISTS then Halt(0); end;

nid.cbSize:=sizeof(nid); procedure TForm1.Belgelermensntemizle1Click(Sender:


nid.Wnd:=Handle; TObject);
nid.uID:=1; begin
nid.uCallbackMessage:=wm_IconMessage; if MessageDlg('Belgeler TEMĠZLENSĠN
nid.hIcon:=application.Icon.Handle; mi?',mtConfirmation, [mbYes, mbNo], 0) = mrYes Then
nid.uFlags:=nif_Message or nif_Icon or nif_Tip; SHAddToRecentDocs(SHARD_PATH, nil);
shell_notifyicon(NIM_ADD,@nid); end;
strcopy(nid.sztip,pchar('CD Eject'));
Shell_NotifyIcon(NIM_ADD,@nid);
form1.Width:=0; procedure TForm1.azele1Click(Sender: TObject);
form1.height:=0; begin
top:=0; CDlistesi;
left:=0; end;

cdsayisi:=0; end.
80

Form žzerinde sadece bir Timer1 ve PopupMenu1 var. PopupMenu‟yž oluĢturmak iŒin žzerine Œift t×klay×n ve
s×rayla Windows‟u Tekrar AŒ, Windows‟u Kapat, 1.CD AŒ, 2.CD AŒ ve Kapat menžlerini ekleyin. Bu fare sağ tuĢ
menžsžnžn g™rev Œubuğuna Œ×kacak olan simgeye sağ t×klay×nca Œ×kmas×n× sağlayacağ×z.

Eksiklikler; CD‟lerin adlar×n× alamama, Œ×kart×lm×Ģ CD‟yi hissedememe, baĢka žlke dillerini destekleme, dinamik
kullan×c× tan×ml× komutlar…

DOS iŒin TSR, Win 3.1 iŒin simge halinde Œal×Ģma ve Windows 9x iŒin ise g™rev Œubuğunda simge olarak
devaml× Œal×Ģan hizmet programlar vard×r. XP, 2003 ve žstžnde de Hizmetler (Services) ile *.msc dosyalar× istersek
baĢlang׌ta Œal×Ģt×rabiliyor, istersek sonradan Œal×Ģt×rabiliyoruz. .NET kullanarak kendi *.msc dosyalar×m×z× yapabiliriz.
Art×k NT tabanl× sistemler yayg×n olmas×na rağmen, Œok az yaz×l×m bu arabirimi tercih ediyor. En basitinden bir
program×n her zaman baĢlang׌ta aŒ×lmas×n× isterseniz, “BaĢlat*Programlar*BaĢlang׌” menžsžne k×sayolunu ekleyin.

Siz de bu menžye dinamik olarak eklenebilen silinebilen program k×sayollar×, yard×mc× komutlar
ekleyebilirsiniz. Dinamik deyince, akla bu değiĢen bilgileri nerede saklayacağ×m×z geliyor. Registry‟e, veritaban×na,
metin dosyas×na veya *.ini – initiation (ilkleme) dosyalar×na kay×t yapabiliriz. Bunlar×n iŒinden bu tip basit programlar
iŒin en kullan×Ģl× olan× *.ini‟dir. Meraba.scr‟de bir ™rneğini g™rebilirsiniz. Registry gereksiz yere ĢiĢmesinden dolay×
kullanmaya gerek yoktur, ama Delphi‟de kay×t ve okuma desteği doğal olarak vard×r.
“Ornekler\Delphi\regis\project1.dpr” ™rneğinde Windows kay×tlar×n×n geniĢ kullan×m×n× g™rebilirsiniz. Veritaban×
kullanmak da basit iĢler iŒin ağ×r ve BDE‟den dolay× taĢ×nabilirliği azd×r. Metin dosyalar×n× okumak yerine *.ini
kullanmak daha hoĢ, Œžnkž istediğiniz sat×ra rahatl×kla gidebilir, yeni veri rahatl×kla ekleyebilirsiniz. Delphi‟nin žrettiği
*.dsk ve *.opt dosyalar×, msdos.sys, *.inf donan×m bilgisi dosyalar× da *.ini yap×s×ndad×r. XML - Extensible Markup
Language (GeniĢletilebilir ĠĢaretleme Dili) geleceğin internet ve yerel veritaban× olacak g™zžkžyor. HTML ile birlikte
Œal×Ģarak veya Delphi iŒine Microsoft XML, v3.0 (Version 3.0) nesnesi eklenerek kullanabiliriz.

*.csv comma delimited – virgžlle ayr×lm×Ģ bilgileri Excel‟de oluĢturabilir okuyabilirsiniz. *.csv normal metin
dosyas× olduğu iŒin, Delphi‟de uzun ve benzer bilgilerle dolu olan verilerinizi bu tip dosyalara kaydedebilirsiniz. Tabii
bilginin iŒeriğinde de “;” karakteri olmamal×d×r; ama “” iŒine istediğinizi yazabilirsiniz. “a;b;a”;333 gibi...

Resim 5 - *.csv dosyalar


81

3. create (nesne oluşturma)


(Ornekler\Delphi\create)

Bu ™rnek nesne oluĢturmak ile ilgili. al×Ģma zaman×nda fare ile form žzerine t×klan×nca džğme, metin kutusu
ve etiket nesnesi oluĢturuluyor. Tasar×mda kendi oluĢturduğumuz “Son Nesneyi Sil” džğmesi yani Button1 ile son
nesneyi siliyoruz. Form žzerinde ayr×ca PopupMenu1, Timer1, OpenFileDialog1 ve SaveFileDialog1 nesneleri vard×r.

Resim 6 – Nesne oluĢturmak ve silmek

object Form1: TForm1 Top = 8


Left = 271 Width = 113
Top = 104 Height = 25
Width = 696 Caption = 'Son Nesneyi &Sil'
Height = 480 TabOrder = 0
Caption = 'Form1' OnClick = Button1Click
Color = clBtnFace end
OldCreateOrder = False object ComboBox1: TComboBox
PopupMenu = PopupMenu1 Left = 8
OnCreate = FormCreate Top = 44
OnMouseDown = FormMouseDown Width = 113
PixelsPerInch = 96 Height = 21
TextHeight = 13 ItemHeight = 13
object Panel1: TPanel TabOrder = 1
Left = 8 Items.Strings = (
Top = 8 '<BoĢ>'
Width = 129 'Button'
Height = 169 'Label'
Cursor = crArrow 'Edit')
Hint = 'Tek tıklayıp nesne listesi görebilirsiniz...' end
ParentShowHint = False end
ShowHint = True object Timer1: TTimer
TabOrder = 0 Interval = 10
OnClick = Panel1Click OnTimer = Timer1Timer
object Label1: TLabel Left = 216
Left = 16 Top = 16
Top = 80 end
Width = 32 object OpenDialog1: TOpenDialog
Height = 13 DefaultExt = 'txt'
Caption = 'Label1' Title = 'Form Aç'
end Left = 360
object Button1: TButton Top = 16
Left = 8 end
82

object SaveDialog1: TSaveDialog end


DefaultExt = 'txt' object FormKaydet1: TMenuItem
Title = 'Form Kaydı' Caption = '&Form Kaydet'
Left = 432 OnClick = FormKaydet1Click
Top = 16 end
end object FormA1: TMenuItem
object PopupMenu1: TPopupMenu Caption = 'Form &Aç'
Left = 504 OnClick = FormA1Click
Top = 16 end
object Yeni1: TMenuItem end
Caption = '&Yeni' end
OnClick = Yeni1Click

Unit iŒine yaz×lacak kod:

unit Unit1;
interface procedure Tform1.tusbasimi (Sender: TObject; var Key:
uses Char);
Windows, Messages, SysUtils, Classes, Graphics, var temp:TEdit;
Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Menus, Grids; begin
temp:=sender as TEdit; caption:=temp.Text+key;
type //tuş okuyor ve aktarıyor
TForm1 = class(TForm) end;
Button1: TButton;
ComboBox1: TComboBox; procedure Tform1.tiklama (Sender: TObject);
FormA1: TMenuItem; begin
FormKaydet1: TMenuItem; if sender is TButton then
Label1: TLabel; ShowMessage('Düğme Tıklandı!...');
OpenDialog1: TOpenDialog; if sender is TLabel then
Panel1: TPanel; ShowMessage('Etiket Tıklandı!...');
PopupMenu1: TPopupMenu; end;
SaveDialog1: TSaveDialog;
Timer1: TTimer; procedure TForm1.FormMouseDown(Sender: TObject;
Yeni1: TMenuItem; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure FormMouseDown(Sender: TObject; Button: var Dugmemiz: TButton;Etiket:TLabel;Metin:TEdit;
TMouseButton; Shift: TShiftState; X, Y: Integer); begin
procedure Button1Click(Sender: TObject); if ssLeft in shift then begin
procedure Timer1Timer(Sender: TObject); case combobox1.ItemIndex of
procedure FormCreate(Sender: TObject); 1: begin Dugmemiz := TButton.Create (self);
procedure FormKaydet1Click(Sender: TObject); //yeni düğme oluşturuldu...
procedure FormA1Click(Sender: TObject); Dugmemiz.Parent:= self;
procedure Yeni1Click(Sender: TObject); Dugmemiz.Caption:='Deneme - ' + IntToStr (butt);
procedure Panel1Click(Sender: TObject); Dugmemiz.Top:= y;
private Dugmemiz.Left:= x;
{ Private declarations } Dugmemiz.Name:=TButton.ClassName+IntToStr
public (butt);
{ Public declarations } //Kendi olaylarımız burada Dugmemiz.OnClick:=tiklama;
procedure tiklama(Sender: TObject); end;
procedure tusbasimi(Sender: TObject; var Key: Char); 2: begin Etiket := TLabel.Create (self);
procedure metin_cikisi(Sender: TObject); //yeni etiket oluşturuldu...
procedure metne_giris(Sender: TObject); Etiket.Parent:= self;
end; Etiket.Caption:='Deneme - ' + IntToStr (labe);
var Etiket.Top:= y;
Form1: TForm1; Etiket.Left:= x;
butt,labe,edit:integer; //nesne sayıları Etiket.Name:=TLabel.ClassName+IntToStr (labe);
implementation etiket.OnClick:=tiklama;
{$R *.DFM} end;
3: begin Metin := TEdit.Create (self);
procedure TForm1.metin_cikisi(Sender: TObject); //yeni metin kutusu oluşturuldu...
begin caption:='Form1'; end; Metin.Parent:= self;
Metin.text:='Deneme - ' + IntToStr (edit);
procedure Tform1.metne_giris (Sender: TObject); Metin.Top:= y;
var temp:TEdit; Metin.Left:= x;
begin Metin.Name:=Tedit.ClassName+IntToStr (edit);
temp:=sender as TEdit; caption:=temp.Text; Metin.OnKeyPress:=tusbasimi;
end; Metin.OnEnter:= metne_giris;
83

Metin.OnExit:=metin_cikisi; end;
end; dosya.Free;
end; end;
end; end;
end;
procedure TForm1.Yeni1Click(Sender: TObject);
procedure TForm1.Button1Click(Sender: TObject); var i,nesnesayisi:integer;
//Son nesneyi siler begin
begin if form1.ComponentCount>11 then
if Form1.ComponentCount > 11 then //temel nesneler dışındakiler silinebilir
//temel nesneler dışındakiler silinebilir begin
begin nesnesayisi:=form1.ComponentCount-1;
Components[Form1.ComponentCount-1].Free; for i:=nesnesayisi downto 11 do
end; //ters yön olmazsa silinemez!...
end; Components[i].Free;
end;
procedure TForm1.Timer1Timer(Sender: TObject); end;
var i:integer;Temp: TComponent;
begin procedure TForm1.FormA1Click(Sender: TObject);
butt:=0;labe:=0;edit:=0; var dosya :TFileStream;nesne:TComponent;
for i:=0 to Form1.ComponentCount-1 do begin dugmemiz:TButton; etiket:TLabel; metin:TEdit;
Temp:=Components[i]; begin
if Temp is TButton then inc(butt); if OpenDialog1.Execute then
if Temp is TLabel then inc(labe); begin
if Temp is TEdit then inc(edit); Yeni1Click(self);
end;
label1.Caption:='Form üzerinde :'+#13+inttostr(butt)+' adet dosya:=TFileStream.Create(OpenDialog1.FileName,fmOpe
Button'+#13+inttostr(labe)+' adet nRead);
Label'+#13+inttostr(edit)+' adet Edit vardır' while dosya.Position<dosya.size do
+#13+inttostr(ComponentCount)+' Toplam Nesne'; begin
end; nesne:=dosya.ReadComponent(nil);
InsertControl(nesne as Tcontrol);
procedure TForm1.FormCreate(Sender: TObject); //sadece görünüm olarak varoluyor...?!
begin end;
ComboBox1.ItemIndex:=0; dosya.Free;
Application.HintColor:=claqua; end;
Application.HintHidePause:=3000; //hint bekleme zamanı end;
Application.HintPause:=300; //hint çıkma zamanı
end; procedure TForm1.Panel1Click(Sender: TObject);
var i:integer;nesneler:string;
procedure TForm1.FormKaydet1Click(Sender: TObject); begin
var dosya :TFileStream;i:integer; for i:=0 to form1.ComponentCount-1 do
begin nesneler:=nesneler+inttostr(i+1)+#9+Components[i].Name
if SaveDialog1.Execute then +' / '+Components[i].className+#13;
begin ShowMessage(nesneler);
// WriteComponentResFile(SaveDialog1.filename,Self); //*.dfm end;
olarak da kayıt yapmak mümkün
initialization
dosya:=TFileStream.Create(SaveDialog1.FileName,fmOpe //formdaki tüm nesne tipleri dosyalama için hazırlanıyor
nWrite or fmCreate); RegisterClasses ([TPanel, TCombobox, TLabel, TEdit,
for i:=11 to form1.ComponentCount-1 do TButton]);
begin end.
dosya.WriteComponent(Components[i]);

“Ornekler\Delphi\surukle” ve bu ™rnek iŒin eklemek gerekirse Label veya benzeri nesneleri kullan×c× program×
Œal×Ģt×r×rken oluĢturup silebilir. Nesne ™zellikleri *.txt veya *.dfm olarak bir dosyaya kaydedilerek değiĢik tiplerde
etiket d™kžmž al×nabilir. BaĢl×k, koordinat, yžkseklik, geniĢlik gibi belli baĢl× ™zelliklerini değiĢtirip kaydetmek
yeterlidir. Džğmeleri iŒin ise ayr×ca *.txt veya *.pas olarak kod k×s×mlar× kaydedilebilir. ġimdilik tekrar aŒt×ğ×m×z form
™ğeleri kod k×s×mlar×n× hissedemiyor, sadece g™ržnžm olarak var oluyorlar. Belki kendi dosya kaydetme y™ntemimiz ile
yapsayd×k daha rahat kontrolleri idare edebilirdik. „rnekle ayn× klas™rde Yunus isimli bir projem var. Burada birŒok
eksiği giderdim. Hatta minik bir TžrkŒe Delphi yapt×k da diyebilirim.

Asl×nda yavaĢ yavaĢ kendi Delphi component – nesnenizi oluĢturmaya da yaklaĢ×yoruz. Fakat nesne tasar×m×
ile hiŒ ilgilenmedim, burada ™rnek veremiyorum.
84

4. Dergilerim (basit veritabanı uygulaması)


(Ornekler\Delphi\Dergilerim\dergilerim.dpr)

AmaŒ, bilgisayar dergilerinde bulunan belli konulardaki yaz×lar× listelemek ve aramak. Veritaban×
uygulamam×z.

Bunun iŒin Delphi‟nin veritaban× y™neticisi olan BDE – Borland Database Engine Administrator program×n×
Œal×Ģt×r×p bir takma ad belirliyoruz. “dergiler” ad×nda, path – yol tan×m× projemizin olduğu dizin olan bir alias – takma
ad oluĢturuyoruz. Alias tan×mlamadan da veritaban× ile uğraĢabiliriz. Fakat daha sonra proje bitince setup - kurulum
haz×rlarken bize gerekli olmas×. Zaten tasar×m an×nda da bize faydas×, yeni bir table – tablo eklediğimizde
“Database=dergiler” deyince “TableName” iŒinde bir aŒ×l×r kutu iŒine o dizindeki tžm *.db ve *.dbf dosyalar× getirmesi.
B™ylece “C:\Belgelerim\Delphi\„rnek\deneme.db” gibi sabit bilgilere dayal× iĢlem yapm×yoruz.

…Œ veritaban× dosyam×z var. genel.db (paradox 4), adlari.db (paradox 4) ve veri.dbf (dbase IV tipinde).
Asl×nda b™yle farkl× farkl× tipte haz×rlamak mecburiyetinde değilsiniz. Tek veritaban× da iĢ g™ržr, fakat yeni dergi ad×
ekleme, silme iŒin adlari.db isminde veritaban×, genel k×sm× iŒin de genel.db oluĢturdum.

Dergi adlar×n×n hiŒ değiĢmeyeceğini džĢžnseydik, DBGrid‟in istediğimiz sžtunundaki bilgiye PickList ™zelliği
sayesinde sabit bilgiler girebilirdik. DBGrid‟e Œift t×klay×n, Œ×kan menžye sağ t×klay×p “Add All Fields” deyin. Eklenen
alan adlar×ndan istediğinizi seŒip PickList‟ini doldurun.

Yap×lar× oluĢturduktan sonra veri.dbf iŒinde bir iĢimiz daha kal×yor. Index – s×ralama oluĢturmak. Alan
adlar×ndan Genel, Y×l ve DergiAdi alanlar×na bağl× s×ralama tiplerimiz var. Y×l bu arada ™nce y×la sonra da aya g™re
karma indeks oluĢturmam×z× sağlayacak.

Paradox‟da Key sžtunundaki “*” belirteci ile primary index – birincil indeks, “Table Properties*Secondary
Index” ile de ikincil indeks oluĢturuyoruz. Key – anahtar k×sm×n×n bir amac× da ayn× kay×ttan bir daha yap×lamamas×n×
sağlamakt×r. Yani iki tane Ahmet ismi kaydedilemez. Secondary Index „de b™yle bir k×s×tlama yoktur.

Program×m×z× haz×rlarken de indeksler aras×nda geŒiĢ yapabilmek iŒin Combobox – aŒ×l×r kutu kullan×yoruz.
Combo combine – birleĢtir kelimesinden tžremiĢtir. Aramak iŒin de tablo filtreleme yap×yoruz. Aramak iŒin wind*
yaz×p, Enter tuĢuna bas×n, wind ile baĢlayan konular× filtrelendiğini g™rdžnžz. Maalesef *98* gibi yaz×p iŒinde 98 geŒen
konular× arayam×yoruz. Bu Ģekilde aramak isterseniz Query – sorgu nesnesi kullanman×z gerekiyor. SQL* iŒindeki Like
komutu tam bize g™re.

*
Ek 2 – SQL k×sm×na bak×n×z.
85

Resim 7 – Veritabanlar×n×n yap×lar×


86

Resim 8 – Dergilerim tasar×m g™ržnžmž

Hala iĢimiz bitmedi. žnkž DergiAdi ve Genel sžtunundaki bilgileri Combobox listesi Ģeklinde veri giriĢi
yapmam×z daha iyi. Zaten bu sebeple ayr× iki veritaban× da oluĢturduk. Dergi adlar×n× adlari.db dosyas×ndan, genel
sžtununun verilerini de genel.db dosyas×ndan okuyacak.

Table1 bizim ana verilerin tutulduğu yer. …zerine Œift t×klay×p “Add all fields” deyin. Ama buradaki DergiAdi ve
Genel bizi ilgilendirmiyor. žnkž kendi alan×m×z× oluĢturacağ×z. Yine ayn× yere sağ t×klay×p “New field...” deyin.
Amac×m×z Lookup field – arama alan× oluĢturmak. Ġlk alan×m×z “Ad” isminde, diğeri “Geneli”.
87

Resim 9 – Yeni alanlar tan×mlamak – Lookup Fields

unit dergiform; Table2: TTable;


Table2AY: TSmallintField;
interface Table2DERGIADI: TStringField;
Table2GENEL: TStringField;
uses Table2KONU: TStringField;
Windows, Messages, SysUtils, Classes, Graphics, Table2SAYFA: TSmallintField;
Controls, Forms, Dialogs, Table2YIL: TSmallintField;
Db, DBTables, ExtCtrls, DBCtrls, Grids, DBGrids, Table3: TTable;
StdCtrls, Buttons, Table3Adi: TStringField;
ComCtrls, Mask, ToolWin; Table4: TTable;
TabSheet1: TTabSheet;
type TabSheet2: TTabSheet;
TForm1 = class(TForm) TabSheet3: TTabSheet;
ComboBox1: TComboBox; ToolBar1: TToolBar;
DataSource1: TDataSource; ToolBar2: TToolBar;
DataSource2: TDataSource; procedure FormCreate(Sender: TObject);
DataSource3: TDataSource; procedure ComboBox1Change(Sender: TObject);
DataSource4: TDataSource; procedure Edit1KeyPress(Sender: TObject; var Key:
DBEdit1: TDBEdit; Char);
DBEdit2: TDBEdit; procedure SpeedButton1Click(Sender: TObject);
DBGrid1: TDBGrid; private
DBGrid2: TDBGrid; { Private declarations }
DBNavigator1: TDBNavigator; public
DBNavigator2: TDBNavigator; { Public declarations }
DBNavigator3: TDBNavigator; end;
Edit1: TEdit;
Label1: TLabel; var
Label4: TLabel; Form1: TForm1;
Label5: TLabel;
Label6: TLabel; implementation
PageControl1: TPageControl;
SpeedButton1: TSpeedButton; {$R *.DFM}
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton; procedure TForm1.FormCreate(Sender: TObject);
Table1: TTable; begin
Table1Ad: TStringField; table1.open;
Table1AY: TSmallintField; combobox1.ItemIndex:=0;
Table1DERGIADI: TStringField; end;
Table1GENEL: TStringField;
Table1Geneli: TStringField; procedure TForm1.ComboBox1Change(Sender: TObject);
Table1KONU: TStringField; begin
Table1SAYFA: TSmallintField; case combobox1.ItemIndex of
Table1YIL: TSmallintField; 0:table1.IndexName:='';
88

1:table1.IndexName:='Yil'; table2.Filteroptions:=[focaseinsensitive];
2:table1.IndexName:='DergiAdi'; table2.Filtered:=true;
3:table1.IndexName:='Genel'; end;
end; end;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
procedure TForm1.Edit1KeyPress(Sender: TObject; var begin
Key: Char); form1.Close;
begin end;
if key=#13 then begin end.
table2.Filter:='konu='''+edit1.Text+'''';
89

5. DLL (Dynamic Linking Library)


(Ornekler\Delphi\DLL\Project2.dpr)

Resim 10 – DLL ile Ģifre kontrolž

Dynamic Linking Library – dinamik bağ kžtžphanesi genellikle projemizin yard×mc× fonksiyonlar×n×n tutulduğu
yer olarak džĢžnebiliriz. C‟deki *.h (header - baĢl×k), Pascal‟daki *.tpu (unit) gibi. BaĢka bir programlama dili ile de
*.dll dosyan×z× kullanabilirsiniz. Delphi dilinde fark×nda olmadan birŒok Windows fonksiyonunu Œağ×r×yoruz. *.dll
Œağ×rmak ile Win32API Œağ×rmak bu sebeple ayn× anlamda da kullan×labilir. Fakat derleyiciye Œağ×racağ×n×z API
fonksiyonunun tžm parametreleri ve tipleri hakk×nda tam bilgi vermek gereklidir. Yanl×Ģ tan×t×lan bir tip
Windows‟umuzda bir GPF – General Protection Failure penceresi Œ×kmas×na sebep olur.

DLL‟ler haf×zadan tasarruf amac×yla kullan×labilir. žnkž bir kere yžklenen bir *.dll dosyay× birden fazla
program kullanabilir. Program×n×z× tekrar derlemek yerine sadece yeni bir *.dll sžržmž oluĢturmak yeterlidir. Yani
patch – yamalar demek ki bu Ģekilde yap×labiliyormuĢ. Ġkon, metin veya bitmap deposu olarak da kullan×labilir.
“Windows\System” dizinindeki pifmgr.dll, moricons.dll, iconlib.dll ve shell32.dll iŒinde birŒok simge g™rmžĢsžnžzdžr.

Eğer Windows programc×l×ğ× ile ilgili geniĢ bir kaynak ar×yorsan×z, tek yapman×z gereken Delphi Yard×m k×sa
yollar×ndaki MS SDK Help Files klas™ržnž incelemektir.

VB dilinde bir Win32API Œağ×rmak iŒin modžl iŒine Ģu Ģekilde yazabilirsiniz:

Declare Function GetDiskFreeSpace Lib "kernel32.dll" Alias "GetDiskFreeSpaceA" _


(ByVal lpRootPathName As String, _
ByVal lpSectorsPerCluster As Long, _
ByVal lpBytesPerSector As Long, _
ByVal lpNumberOfFreeClusters As Long, _
ByVal lpTotalNumberOfClusters As Long _
) As Long

Windows kernel – Œekirdek (kernel32.dll), user – kullan×c× (user32.dll) ve GDI – Graphical Device Interface
(gdi32.dll) merkezli olarak Œal×Ģ×r. Diğer kžtžphaneler ise denetimler, donan×m sžržcžsž, yaz× tipleri gibi uzant×lard×r.
Tžm Œal×Ģan programlar bu *.dll dosyalara bağl×d×r.

Delphi‟de Windows kžtžphanesinde Ģuna benzer API‟ler tan×mlanm×Ģt×r:

{$EXTERNALSYM Pie}
90

function Pie(DC: HDC; X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer): BOOL; stdcall;
...
const
...
kernel32 = 'kernel32.dll';
{$EXTERNALSYM version}
version = 'version.dll';
comctl32 = 'comctl32.dll';
gdi32 = 'gdi32.dll';
opengl32 = 'opengl32.dll';
user32 = 'user32.dll';
...
implementation
...
function CopyFile; external kernel32 name 'CopyFileA';
function CopyFileEx; external kernel32 name 'CopyFileExA';
function CreateConsoleScreenBuffer; external kernel32 name 'CreateConsoleScreenBuffer';
function CreateDirectoryA; external kernel32 name 'CreateDirectoryA';

…stteki Windows unit‟ine dikkat ederseniz tžm Windows fonksiyonlar×n×n elimizin alt×nda olduğunu
g™rebilirsiniz. Bir DLL‟de hangi fonksiyon veya prosedžrler var ™ğrenmek iŒin Dependency Walker
(Diger\Extras\DEPENDS.EXE) adl× program×n× kullanman×z× tavsiye ederim:

Resim 11A – Dependency Walker (Bağ×ml×l×k gezgini)

“rundll32.exe” DLL dosyalar× Œal×Ģt×rabiliriz. Rundll32 iŒin aĢağ×daki gibi, ™nce *.dll ad× ard×ndan virgžlle
fonksiyon ad× olacak Ģekilde bir k×sayol oluĢturabilirsiniz ve “BaĢlat*al×Ģt×r...” ile deneyebiliriz:

rundll32.exe shell32.dll, Control_RunDLL directx.cpl

Windows‟ta QuickView ile inceleyebiliriz. Proje1.dll dosyam×z×n Export Table b™lžmž:


91

Resim 11B – Export Table k×sm×

Ġki projemiz var. „nce birincisini derleyin (Ctrl+F9). Project1.dll dosyas×n× oluĢturdunuz. Diğer projede ise,
sadece bu *.dll dosyam×za Ģifreyi yollayan metin kutusu var.

“File*New...*DLL” komutu ile Project1.dpr ve “File*New...*Form” diyerek de dllsifre.pas dosyam×z×


oluĢturuyoruz :

library Project1; function sifredogrumu(sifreyial:string):boolean;export;


uses implementation
dllsifre in 'dllsifre.pas' {kontrolform};
exports {$R *.DFM}
sifredogrumu;
{$R *.RES} function sifredogrumu(sifreyial:string):boolean;
begin begin
end. result:=false;
kontrolform:=tform.create(application);
dllsifre.pas dosyam×z×n kodlar×: //aslında üstteki satır gereksiz, ama form create hoşunuza
gidebilir...
unit dllsifre; try
if (sifreyial='B') then
interface begin
// kontrolform.showmodal;
uses messagedlg('Doğru',mtInformation,[mbOk],0);
Windows, Messages, SysUtils, Classes, Graphics, result:=true;
Controls, Forms, Dialogs, end
StdCtrls; else
messagedlg('YanlıĢ',mtError,[mbOk],0);
type finally
TForm1 = class(TForm) kontrolform.free;
end;
private end;
{ Private declarations } end.
public
{ Public declarations } Diğer projemiz olan Project2.dpr ise normal
sifre:string; uygulama olarak oluĢturuyoruz:
end;
program Project2;
var uses
kontrolForm: TForm;
92

Forms, { Public declarations }


cagir in 'cagir.pas' {Form1}; end;
{$R *.RES}
begin var
Application.Initialize; Form1: TForm1;
Application.CreateForm(TForm1, Form1);
Application.Run; implementation
end.
{$R *.DFM}
cagir.pas dosyam×z×n kodlar×:
procedure TForm1.Button2Click(Sender: TObject);
unit cagir; begin
close;
interface end;

uses procedure TForm1.Button1Click(Sender: TObject);


Windows, Messages, SysUtils, Classes, Graphics, var tutacak:thandle;
Controls, Forms, Dialogs, sifresonuc:function(sifreyial:string):boolean;
StdCtrls; begin
try
type tutacak:=loadlibrary('project1.dll');
TForm1 = class(TForm) @sifresonuc:=getprocaddress(tutacak,'sifredogrumu');
Edit1: TEdit; sifresonuc(edit1.text);
Button1: TButton; finally
Button2: TButton; freelibrary(tutacak);
procedure Button2Click(Sender: TObject); end;
procedure Button1Click(Sender: TObject); end;
private
{ Private declarations } end.
public
93

6. Meraba (resimli ekran koruyucusu)


(Ornekler\Delphi\Meraba\Project1.dpr)

Windows Millennium iŒinde gelen “Resimlerim Ekran Koruyucusu” „na benzeyen bir ekran koruyucusu. Bizim
ekran koruyucumuz *.bmp ve *.jp*g dosya iŒeren bir klas™rdeki resimleri rasgele veya s×ral× g™steriyor.

Windows‟taki ekran koruyucusu Ģifresini alam×yor. ġifre “meraba.ini” dosyas×n×n iŒinde aynen g™ržlebilir,
gžvenlik geliĢmemiĢ. Program sonunda ek bir program olarak basit bir Ģifreleme algoritmas× veriyorum. Diğer resim
formatlar×, mžzik Œalmas×, resimlerin geŒiĢ efektlerini size b×rak×yorum. Hatta daha ileri gidip alt klas™rlerin de
resimlerini dahil etmek isteyebilirsiniz, makrolardaki dosyalistesi.xls ve Delphi‟deki Dosyalistesi ™rneklerinden
faydalanabilirsiniz.

Temel olarak bžtžn ekran koruyucular× normal *.exe dosyalar×d×r. Ayarlar× g™rmek iŒin “/c”, ™n izleme yapmak
iŒin “/s” parametresi isterler. “Windows” veya “Windows\System” klas™ržne kurulurlar. Ekran koruyucu dosyalar×na
sağ t×kland×klar×nda S×na, Yap×land×r ve Yžkle gibi seŒenekler Œ×kar.

Derlenince oluĢan Project1.exe‟yi ekrankoruyucum.scr gibi tekrar adland×r×n. Burada yine bir hata oluĢuyor.
…zerine Œift t×klan×nca meraba.ini eğer ayn× klas™rde yok ise hata mesajlar× ile ekran×n×z dolabilir. En iyisi “Windows”
iŒine *.scr dosyam×z× at×p, “Bilgisayar×m*Denetim Masas×*G™ržntž*Ekran Koruyucusu” „ndan *.scr‟mizi seŒip, Ayarlar
ile resim klas™ržmžzž belirtmek. B™ylece meraba.ini oluĢuyor ve sorun Œ×kmadan „nizleme yap×labiliyor. Asl×nda
meraba.ini‟yi silip de „nizleme komutunu verseniz kendi hata mesaj×m×z Œ×k×yor ve ekran koruyucu kendini kapat×yor.

Form1‟de resimler g™steriliyor, Form2 ayarlar, Form3 Ģifre ve AboutBox hakk×nda iŒin kullan×l×yor.

Proje dosyam×z:

program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2},
About in 'about.pas' {AboutBox},
Unit3 in 'Unit3.pas' {Form3};

{$R *.RES}

var a:string;
begin

Application.Initialize;
Application.Title := 'Meraba 1.0';
a:= paramstr(1);
if (a[2]='c') or (a[2]='C') then //eğer ayar yapılmak isteniyorsa sadece 2 form create edilecek
begin
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TAboutBox, AboutBox);
Application.Run;
end
else if (a='/s') or (a='/S') then //sadece çalıştırılacak ise ana form ve şifre kutusu create edilecek
begin
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm3, Form3);
Application.Run;
end;
end.

G™ržldžğž gibi program Œal×Ģmadan ™nce parametreye bağl× olarak ya Form1, ya da Form2 ekrana geliyor.
94

Form1‟in kodlar×:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, DIB, inifiles, StdCtrls, FileCtrl, jpeg, Mask;

type
TForm1 = class(TForm)
DirectoryListBox1: TDirectoryListBox;
DirectoryListBox2: TDirectoryListBox;
DirectoryListBox3: TDirectoryListBox;
FileListBox1: TFileListBox;
FileListBox2: TFileListBox;
FileListBox3: TFileListBox;
Image1: TImage;
Label1: TLabel;
ListBox1: TListBox;
MaskEdit1: TMaskEdit;
Panel1: TPanel;
Timer1: TTimer;
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
procedure FormShow(Sender: TObject);
procedure AyarOku;
procedure Timer1Timer(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private declarations }
htb:HWND;
public
{ Public declarations }
end;

var
Form1: TForm1;
duration,sayac,sayac_ic:integer;
95

directry:string;rndm,stret,pw:boolean;
fname,pws:string;mh:Thandle;
oldval:longint;

implementation

uses Unit3; //şifre kutusu

{$R *.DFM}

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;


Shift: TShiftState);
begin
if pw then
form3.show
else
begin
ShowWindow(htb,SW_SHOW);
SystemParametersInfo(97,word(false),@oldval,0);
close;
end;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;


Shift: TShiftState; X, Y: Integer);
begin
if pw then
form3.show
else
begin
ShowWindow(htb,SW_SHOW);
SystemParametersInfo(97,word(false),@oldval,0);
close;
end;
end;

procedure TForm1.AyarOku;
var dizin:string;
ayarini:TIniFile;
begin
dizin:=extractfilepath(application.ExeName)+'\Meraba.ini';
ayarini:=tinifile.create(dizin);
duration:=ayarini.readinteger('Meraba1.0','Duration',-99);
directry:=ayarini.ReadString('Meraba1.0','Directory','');
rndm:=ayarini.ReadBool('Meraba1.0','Random',True);
stret:=ayarini.ReadBool('Meraba1.0','Stretch',True);
pw:=ayarini.ReadBool('Meraba1.0','PW',True);
pws:=ayarini.ReadString('Meraba1.0','PWs','');
ayarini.Free;
end;

procedure TForm1.FormShow(Sender: TObject);


var i:integer;sayac1,sayac2,sayac3:integer;
dizin:string;
begin
dizin:=extractfilepath(application.ExeName)+'\Meraba.ini';
if FileExists(dizin) then begin
ShowWindow(application.Handle,SW_HIDE);
htb:=FindWindow('Shell_Traywnd',nil);
ShowWindow(htb,SW_HIDE);
SystemParametersInfo(97,word(true),@oldval,0);

form1.Cursor:=crNone;
ayaroku;
randomize;
96

timer1.Interval:=duration*1000;
timer1.Enabled:=true;
DirectoryListBox1.Directory :=directry;
DirectoryListBox2.Directory :=directry;
DirectoryListBox3.Directory :=directry;
MaskEdit1.Text:=pws;
image1.Stretch:=stret;
sayac:=0;
sayac1:=0;
sayac2:=0;
sayac3:=0;
FileListBox1.Mask:='*.bmp';
FileListBox1.Update;
FileListBox2.Mask:='*.jpg';
FileListBox2.Update;
FileListBox3.Mask:='*.jpeg';
FileListBox3.Update;
sayac1:=FileListBox1.Items.Count; //bmp
sayac2:=FileListBox2.Items.Count; //jpg
sayac3:=FileListBox3.Items.Count; //jpeg
listbox1.Clear;
if sayac1 <>0 then
for i:=0 to sayac1-1 do
ListBox1.Items.Add(FileListBox1.Items.Strings[i]);
if sayac2 <>0 then
for i:=0 to sayac2-1 do
ListBox1.Items.Add(FileListBox2.Items.Strings[i]);
if sayac3 <>0 then
for i:=0 to sayac3-1 do
ListBox1.Items.Add(FileListBox3.Items.Strings[i]);
sayac:=sayac1+sayac2+sayac3;
sayac_ic:=1;
if sayac=0 then
begin
timer1.Enabled:=false;
label1.Visible:=true;
label1.Caption:='Please choose a directory which has photos!'
end else begin
image1.Picture.LoadFromFile(listbox1.Items.Strings[0]);
image1.Update;
end;
end
else begin
timer1.Enabled:=false;
ShowWindow(htb,SW_SHOW);
SystemParametersInfo(97,word(false),@oldval,0);
if Application.MessageBox(
'You must choose your picture directory first'+#13+
'from Control Panel*Display*Screen Saver*Settings' ,
'Error', MB_OK) = IDOK then
begin
close;
end;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);


var fname:string;rastgele:integer;
begin
if rndm then
begin
rastgele:=random(listbox1.Items.Count);
fname:=directry+'\'+listbox1.Items.Strings[rastgele];
image1.Picture.LoadFromFile(fname);
image1.Update;
end
97

else
begin
if sayac_ic=listbox1.Items.Count then sayac_ic:=0;
fname:=directry+'\'+listbox1.Items.Strings[sayac_ic];
image1.Picture.LoadFromFile(fname);
image1.Update;
inc(sayac_ic);
end;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);


begin
if pw then
canclose:=false
else
canclose:=true;
end;

//program windows'da 1 kere çalışabilir


initialization
mh:=createmutex(nil,False,pchar(Application.title));
if getlasterror=ERROR_ALREADY_EXISTS then halt;
finalization
if mh<>0 then CloseHandle(mh);

end.

Form2‟nin kodlar×

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, FileCtrl, ExtCtrls, ComCtrls,IniFiles, Mask;

type
TForm2 = class(TForm)
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
DirectoryListBox1: TDirectoryListBox;
DriveComboBox1: TDriveComboBox;
98

FileListBox1: TFileListBox;
FilterComboBox1: TFilterComboBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
MaskEdit1: TMaskEdit;
Panel1: TPanel;
TrackBar1: TTrackBar;
procedure BitBtn1Click(Sender: TObject);
procedure AyarYaz;
procedure AyarOku;
procedure BitBtn2Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure CheckBox3Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

uses About;

{$R *.DFM}

procedure TForm2.BitBtn1Click(Sender: TObject);


begin
AyarYaz;
close;
end;

procedure TForm2.AyarOku;
var dizin:string;
duration:integer;directry,pws:string;
rndm,stret,pw:boolean;
ayarini:TIniFile;
begin
dizin:=extractfilepath(application.ExeName);
ayarini:=tinifile.create(dizin+'\Meraba.ini');
duration:=ayarini.readinteger('Meraba1.0','Duration',-99);
directry:=ayarini.ReadString('Meraba1.0','Directory','');
rndm:=ayarini.ReadBool('Meraba1.0','Random',True);
stret:=ayarini.ReadBool('Meraba1.0','Stretch',True);
pws:=ayarini.ReadString('Meraba1.0','PWs','');
if pws <>'' then pw:=ayarini.ReadBool('Meraba1.0','PW',True);

DirectoryListBox1.FileList.Directory:=directry;
TrackBar1.Position:=duration;
checkbox1.Checked:=rndm;
checkbox2.Checked:=stret;
checkbox3.Checked:=pw;
MaskEdit1.Text:=pws;

ayarini.Free;
end;

procedure TForm2.AyarYaz;
var dizin:string;
99

ayar:TIniFile;
begin
dizin:=extractfilepath(application.ExeName);
ayar:=TIniFile.Create(dizin+'\Meraba.ini');
ayar.WriteInteger('Meraba1.0','Duration',TrackBar1.Position);
ayar.WriteString('Meraba1.0','Directory',DirectoryListBox1.FileList.Directory);
ayar.WriteBool('Meraba1.0','Random',CheckBox1.Checked);
ayar.WriteBool('Meraba1.0','Stretch',CheckBox2.Checked);
if maskedit1.Text='' then CheckBox3.Checked:=false else CheckBox3.Checked:=true;
ayar.WriteBool('Meraba1.0','PW',CheckBox3.Checked);
ayar.WriteString('Meraba1.0','PWs',MaskEdit1.Text);
ayar.Free;
end;

procedure TForm2.BitBtn2Click(Sender: TObject);


begin
close;
end;

procedure TForm2.FormShow(Sender: TObject);


begin
ayaroku;
end;

procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word;


Shift: TShiftState);
begin
if key=VK_ESCAPE then close;
end;

procedure TForm2.CheckBox3Click(Sender: TObject);


begin
MaskEdit1.Enabled:=checkbox3.Checked;
end;

procedure TForm2.BitBtn3Click(Sender: TObject);


begin
aboutbox.show;
end;

end.

Form3‟žn kodlar×:

unit Unit3;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, Mask;

type
TForm3 = class(TForm)
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
MaskEdit1: TMaskEdit;
100

procedure BitBtn2Click(Sender: TObject);


procedure BitBtn1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
htb:HWND;
oldval:longint;
public
{ Public declarations }
end;

var
Form3: TForm3;

implementation
uses Unit1;
{$R *.DFM}

procedure TForm3.BitBtn2Click(Sender: TObject);


begin
close;
end;

procedure TForm3.BitBtn1Click(Sender: TObject);


var a,b:string;
begin
a:=form1.maskedit1.text;
b:=maskedit1.text;
if b=a then begin
ShowWindow(htb,SW_SHOW);
SystemParametersInfo(97,word(false),@oldval,0);
application.Terminate;
end;
end;

procedure TForm3.FormShow(Sender: TObject);


begin
htb:=FindWindow('Shell_Traywnd',nil);
form1.Cursor:=crDefault;
MaskEdit1.Text:='';
maskedit1.SetFocus;
end;

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);


begin
form1.Cursor:=crnone;
end;

end.
101

About – hakk×nda k×sm×n×n kodu:

unit About;
interface
uses Windows, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, ExtCtrls,SysUtils;
type
TAboutBox = class(TForm)
Comments: TLabel;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
OKButton: TButton;
Panel1: TPanel;
Panel2: TPanel;
ProductName: TLabel;
procedure OKButtonClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Label1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
procedure Label2MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
procedure Label2Click(Sender: TObject);
procedure Label1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
AboutBox: TAboutBox;
stop:boolean;
implementation
{$R *.DFM}

procedure TAboutBox.OKButtonClick(Sender: TObject);


begin close; end;

procedure TAboutBox.FormCreate(Sender: TObject);


var MS: TMemoryStatus;
begin
Application.ProcessMessages; GlobalMemoryStatus(MS);
label5.Caption := FormatFloat('#,###" KB"', MS.dwTotalPhys / 1024);
label6.Caption := Format('%d %%', [MS.dwMemoryLoad]);
end;

procedure TAboutBox.Label1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);


begin label1.Font.Color:=clblue; end;

procedure TAboutBox.Label2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);


begin label2.Font.Color:=clblue; end;

procedure TAboutBox.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);


begin label1.Font.Color:=clMaroon; label2.Font.Color:=clMaroon; end;

procedure TAboutBox.Label2Click(Sender: TObject);


begin
winexec(pchar('start http://www.tbagriyanik.com'),0);
end;

procedure TAboutBox.Label1Click(Sender: TObject);


begin
winexec(pchar('start mailto:tarik@tbagriyanik.com'),0); //mailto: Outlook ile mail atmamızı sağlar
102

end;
end.

ġifreleme iŒin basit bir y™ntem: (Ornekler\Delphi\Meraba\sifre\Project1.dpr)

procedure TForm1.Button1Click(Sender: TObject);


var i:integer;kelime:string;
begin
kelime:=edit1.text;
for i:=1 to Length (kelime) do kelime[i]:=chr(ord(kelime[i])+i); //Toplama ile anlamsızlaştırılıyor
label1.caption:=kelime;
end;

procedure TForm1.Button2Click(Sender: TObject);


var i:integer;kelime:string;
begin
kelime:=label1.Caption;
for i:=1 to Length (kelime) do kelime[i]:=chr(ord(kelime[i])-i); //Çıkarma ile eski haline geliyor
label2.caption:=kelime;
end;

Ord(tek_harf) ve Chr(ascii_deger) fonksiyonlar× sadece char tipli yani tek karakterlik iĢlemlerde kullan×l×r. Eğer
bir kelimenin tžmžnž say×sal değere d™nžĢtžrmek veya bir say×y× metin / alfa nžmerik tžre d™nžĢtžrmek isteseydik
StrToInt, IntToStr, StrToFloat veya FloatToStr gibi fonksiyonlar kullan×rd×k. Tžr d™nžĢžmleri ile ilgili Delphi yard×m×na
bakabilirsiniz.

ġifrelemenin daha geliĢmiĢ yap×lar× da var. AND, OR, XOR, kayd×rma, yer değiĢtirme, bu y™ntemlerin karma
kullan×m×, belli bir anahtar ile maskeleme gibi yap×labilir. Asla Random (rasgele) bir değeri anahtar olarak
kullanamay×z. žnkž daha sonra eski değerine d™ndžržlmesi imkans×z olur. Ters algoritma kullan×larak eski değere
aynen ulaĢ×labilmelidir. Fakat kolay algoritmalar× deneme yan×lma y™ntemi ile Œ™zmek kolayd×r. „rneğin bizim ™rnekte
kelime yerine 123 gibi bir rakam girildiğinde 246 elde edilmesi, Ģifre k×r×c×lar iŒin Œ™zžlmesi gerŒekten de kolay bir
y™ntem olduğu g™ržlebilir. Encrypt (enkript diye okunur – Ģifreleme / encode) edilince ayn× boyutta Ģifre elde etmek
sak×ncal×. GerŒek değer iŒine basamaklar aras×na rasgele ĢaĢ×rt×c× değerler sokulabilir. Kriptonun tersine decrypt
(dekript diye okunur – Ģifre Œ™zme / decode) denilir.

BaĢka bir ekran koruyucu ™rneği (ekrank.zip):


103

7. ParalelPort (Win9x için paralel veriyolu kullanımı)


(Ornekler\Delphi\ParalelPort\ledder.dpr)

Yaz×c× bağlant× noktas× olan LPT1 – Line Printer‟i bi-directional – Œift y™nlž yani veri yollamak veya almak iŒin
kullanabiliriz. Ad× žstžnde paralel bağlant× imkan× olduğu iŒin biz de ayn× anda iki led – light-emitting diode
kullanabiliyoruz. Ġsterseniz daha fazla bağlant× da yapabilirsiniz. Biraz da elektronik bilginiz varsa r™lelerle ev aletlerini
kontrol edebilirsiniz. Tžm pinler TTL – Transistor Transistor Logic seviyesindedir. Yžksek seviye 2.4V ile 5 V aras× iken,
džĢžk seviye 0V ile 0.8V aras× kabul edilir. Maksimum 2.6 mA ak×m verebilir. Dikkatli olun, paralel port led yakabiliyor
ama daha žst ak×m ve voltajlara dayanamaz. Bir buffer - tampon devresi gerekebilir. NT/2000 ve XP iŒin bu
anlat×lanlar geŒerli değildir. Ama XP‟nin Compatibility – Uyumluluk modu sayesinde Œal×Ģt×r×labilir. „rnek sonundaki
aŒ×klamalar× okuyunuz. “Ornekler\Delphi\ParalelPort\trafik\Project1.dpr” ™rneğinde de bu uygulaman×n bir benzeri
olan iki (yeĢil), žŒ (sar×) ve d™rdžncž (k×rm×z×) Œ×k×Ģ pinlerini kullanan, trafik ×Ģ×klar× olarak g™rebilirsiniz.

Resim 12 – Paralel port ile led kullanma

Form nesneleri:

object Form1: TForm1 end


Left = 492 object Label4: TLabel
Top = 111 Left = 58
Width = 305 Top = 46
Height = 139 Width = 37
Caption = 'Form1' Height = 13
Color = clWhite Caption = '2. Led'
Font.Charset = DEFAULT_CHARSET end
Font.Color = clRed object Button3: TButton
Font.Height = -10 Left = 194
Font.Name = 'MS Sans Serif' Top = 68
Font.Style = [fsBold] Width = 61
OldCreateOrder = True Height = 20
PixelsPerInch = 96 Caption = '&Kapat'
TextHeight = 13 TabOrder = 0
object Label1: TLabel OnClick = Button3Click
Left = 16 end
Top = 64 object ToolBar1: TToolBar
Width = 110 Left = 0
Height = 13 Top = 0
Caption = 'Port Bilgisi (0378H)' Width = 295
end Height = 41
object Label2: TLabel ButtonHeight = 37
Left = 16 ButtonWidth = 55
Top = 80 Caption = 'ToolBar1'
Width = 8 TabOrder = 1
Height = 13 object ToolButton1: TToolButton
Caption = '0' Left = 0
end Top = 2
object Label3: TLabel Caption = '1'
Left = 10 ImageIndex = 0
Top = 46 Style = tbsCheck
Width = 37 OnClick = ToolButton1Click
Height = 13 end
Caption = '1. Led' object ToolButton2: TToolButton
104

Left = 55 TickMarks = tmBoth


Top = 2 TickStyle = tsManual
Caption = '2' OnChange = TrackBar1Change
ImageIndex = 1 end
Style = tbsCheck object CheckBox1: TCheckBox
OnClick = ToolButton1Click Left = 232
end Top = 2
object TrackBar1: TTrackBar Width = 57
Left = 110 Height = 37
Top = 2 Caption = 'Timer'
Width = 122 TabOrder = 1
Height = 37 OnClick = CheckBox1Click
Hint = 'Timer1'#39'in 1-1000 ms süre ayarı' end
Max = 1000 end
Min = 1 object Timer1: TTimer
Orientation = trHorizontal Enabled = False
ParentShowHint = False Interval = 10
Frequency = 1 OnTimer = Timer1Timer
Position = 1 Left = 152
SelEnd = 0 Top = 56
SelStart = 0 end
ShowHint = True end
TabOrder = 0

Unit1.pas yani as×l program×n kodlar×:

unit Unit1;
procedure TForm1.ToolButton1Click(Sender: TObject);
interface var deger:word;
begin
uses
Windows, Messages, SysUtils, Classes, Graphics, if ToolButton1.Down and ToolButton2.Down then
Controls, Forms, Dialogs, begin
StdCtrls, ComCtrls, ExtCtrls, ToolWin; asm
mov dx,0378h
type mov ax,03h //yani 0011
TForm1 = class(TForm) out dx,ax
Button3: TButton; mov dx,0378h
CheckBox1: TCheckBox; in ax,dx
Label1: TLabel; mov deger,ax
Label2: TLabel; end;
Label3: TLabel; end;
Label4: TLabel;
Timer1: TTimer; if (ToolButton1.Down=false) and
ToolBar1: TToolBar; (ToolButton2.Down=false)then
ToolButton1: TToolButton; begin
ToolButton2: TToolButton; asm
TrackBar1: TTrackBar; mov dx,0378h
procedure Button3Click(Sender: TObject); mov ax,0h //yani 0000
procedure Timer1Timer(Sender: TObject); out dx,ax
procedure TrackBar1Change(Sender: TObject); mov dx,0378h
procedure ToolButton1Click(Sender: TObject); in ax,dx
procedure CheckBox1Click(Sender: TObject); mov deger,ax
private end;
{ Private declarations } end;
public
{ Public declarations } if (ToolButton1.Down) and (ToolButton2.Down=false)then
end; begin
asm
var mov dx,0378h
Form1: TForm1; mov ax,01h //yani 0001
degis:boolean=true; out dx,ax
mov dx,0378h
implementation in ax,dx
mov deger,ax
{$R *.DFM} end;
105

end; close;
end;
if (ToolButton2.Down) and (ToolButton1.Down=false)then
begin procedure TForm1.Timer1Timer(Sender: TObject);
asm begin
mov dx,0378h if degis then begin
mov ax,2h //yani 0010 asm
out dx,ax mov dx,0378h
mov dx,0378h mov ax,02h
in ax,dx out dx,ax
mov deger,ax end;
end; degis:=not(degis);
end; end else begin
label2.Caption:=IntToHex(deger,4); asm
end; mov dx,0378h
mov ax,01h
procedure TForm1.CheckBox1Click(Sender: TObject); out dx,ax
begin end;
timer1.enabled:=checkbox1.Checked; degis:=not(degis);
end; end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin procedure TForm1.TrackBar1Change(Sender: TObject);
asm begin
mov dx,0378h timer1.Interval:=TrackBar1.Position;
mov ax,0h end;
out dx,ax
end; end.

Paralel port‟un base – taban adresi 0378H. “Bilgisayar×m*Denetim Masas×*Sistem” „den yaz×c× bağlant×
noktan×z×n Kaynaklar k×sm×nda bu GiriĢ/×k×Ģ değeri g™rebilirsiniz. Ayn× yolu izleyerek klavye 0060H, birinci seri
bağlant× noktas× 03F8H ve ikinci seri port 02F8H adresine sahip olduğunu g™rebilirsiniz. XP iŒin ise
“System*Hardware*Device Manager” ile donan×m listesine ulaĢabilirsiniz.

Durum – Status Portu 2 led’in ilk bacakları buraya

13 1
8 7 6 5 4 3 2 1
Toprak Kontrol Portu

25 14
Resim 13 – 25 uŒlu paralel port bağlant× yerleri

Paralel Bağlant× Noktas× Bacak ĠĢlevleri:

1 Strobe ×k×Ģ 14 Otomatik besleme – Autofeed ×k×Ģ


2 Veri biti 1 ×k×Ģ 15 Hata – Error GiriĢ
3 Veri biti 2 ×k×Ģ 16 S×f×rla – Printer Reset ×k×Ģ
4 Veri biti 3 ×k×Ģ 17 Select in ×k×Ģ
5 Veri biti 4 ×k×Ģ 18 Toprak – Ground
6 Veri biti 5 ×k×Ģ 19 Toprak – Ground
7 Veri biti 6 ×k×Ģ 20 Toprak – Ground
8 Veri biti 7 ×k×Ģ 21 Toprak – Ground
9 Veri biti 8 ×k×Ģ 22 Toprak – Ground
10 Bilgi – Acknowledge GiriĢ 23 Toprak – Ground
11 MeĢgul – Busy GiriĢ 24 Toprak – Ground
12 Kağ×t bitti – Paper Out GiriĢ 25 Toprak – Ground
13 Select Out GiriĢ
106

Yaz×c×ya bir belge yollan×nca Ģu ad×mlar gerŒekleĢir: Strobe hatt×na en az 0.5 ms - mikrosaniye alŒak darbe
yollan×r, Autofeed hatt×na alŒak sinyali verilir, Init hatt×na en az 50 ms alŒak sinyal yollan×r, yaz×c×y× seŒmek iŒin
Select‟e alŒak sinyali yollan×r, kesme kabul edilince Acknowledge hatt× 0.5 ms kadar alŒak darbesi taĢ×r, yazma
baĢlayacağ× iŒin Busy yžkselir, sayfa sonlar×nda Paper Out (Paper End) hatt× yžkselir, hata anlar×nda Error yaz×c×
taraf×ndan alŒağa Œekilir, yaz×c× seŒili olunca Select in yžkseğe Œekilir.

Tabloda g™ržldžğž gibi on yedi sinyal hatt×n×n sekizi veri, d™rdž kontrol, beĢi de durum hatt× olarak kullan×l×r.
On iki veri Œ×k×Ģ× var iken beĢ hatt× da giriĢ iŒin kullanabiliriz. Led bacaklar× resimdeki bir ve ikinci noktalara tak×l×r,
diğer toprak bacaklar× istenirse kasaya değdirilebilir, istenirse ayn× resimde g™rdžğžnžz kahverengi renkli noktalara da
tak×labilir. Ġki led‟in de birbirine değmemesini sağlay×n. Eğer yanm×yorlarsa y™nlerini değiĢtirin.

Program×n mant×ğ× 2‟den fazla led iŒin pek uygun değil. žnkž 2 led iŒin 2 2=4 ihtimal olduğu iŒin if – eğer
bloğundan d™rt adet kullan×yorken, ™rneğin sekiz led iŒin, 2 8=256 ihtimal yani 256 if bloğu kullan×lamaz. Bu arada
akl×ma Assembler‟de “and” ve “or” komutlar× ile maskeleme kullan×m× geliyor, yani ilk led‟in durumu ne olursa olsun
ikinci led aŒ kapa yapabilmeniz ancak bu Ģekilde olabilir.

x86 Assembly Borland C Microsoft C


out port#, AL outportb(port#, byte) outp(port#, byte)
in AL, port# inportb(port#) inp(port#)

SPP – Standart Parallel Port : ISA uyumlu, AT tipli tek y™nlž standart.
EPP – Enhanced Parallel Port : GeliĢtirilmiĢ daha h×zl× paralel port (1 - 2 MB aras×). PS/2 portunu emžle
edebilen, paralel port ağ× oluĢturabilen Œift y™nlž bağlant× noktas×.
ECP – Extended Parallel Port : GeniĢletilmiĢ SPP – Standart Parallel Port yani Centronics modunun geliĢmiĢ
hali. ISA h×z×nda aktar×m yapabilir. DMA yeteneği sayesinde Œift y™nlž Œal×Ģabilir.

“BaĢlat*al×Ģt×r...*debug” komutu ile kurulu olan LPT port‟lar×n×n listesini elde edebiliriz:

-d 0040:0008 L4
0040:0000 78 03 00 00 x...

Haf×zadaki bu bilgilere g™re 1 adet yaz×c× portumuz 0378H adresinde. Ġkincisi olsayd× 00 00 yazan yerde 78 02
gibi bir rakam olmal×yd×. Tabii ki “Bilgisayar×m*Denetim Masas×*Sistem*Ayg×t Y™neticisi” ‟ne gelip, Bilgisayar simgesi
Œift t×klan×p, GiriĢ / ×k×Ģ (G/ veya Input / Output - I/O) iĢaretlenerek de kim hangi adresi kullan×yor g™rebilirsiniz.

0378H iŒin veri giriĢini, durum portu olan 0379H ve kontrol portu olan 037AH adreslerini programlay×p elde
edebiliriz. C dilindeki ™rnekte 0379H‟nin ilk biti giriĢ iŒin kullan×l×yor.

Ġsterseniz Delphi ve assembler dillerini veri giriĢ ve Œ×k×Ģ× iŒin daha modžler kullanal×m:

procedure PortOut(IOPort:word; value:byte);


assembler;
asm
xchg ax,dx
out dx,al
end;

function PortIn(IOPort:word):byte;
assembler;
asm
mov dx,ax
in al,dx
end;

Tek yapacağ×m×z bir porta veri yollamak iŒin


PortOut (portadresi, deger);
veri okumak iŒin
deger := PortIn (portadresi);

Pascal dilinde haz×r Port komutu kullanarak da paralel port‟ta d™rt adet ×Ģ×k kayd×rabiliriz:

uses crt;
var
107

lambalar : byte;
begin
lambalar:=1;
repeat
port[$378]:=lambalar;
lambalar:=(lambalar shl 1) mod 16;
delay(500);
until keypressed;
end.

C dilinde basit bir veri giriĢ Œ×k×Ģ ™rneği: (Ornekler\Delphi\ParalelPort\Led\led.c)

/* led.c*/
#include <stdio.h>
#include <dos.h> /*delay() komutu için*/

void main(void)
{
int in;

while(1)
{
in=inportb(0x0378 + 1);

if (((in^0x80) & 0x80) == 0) //düğme basılı mı? 1000 0000b ile data maskeleme
{
outportb(0x0378,0x00); /* led açık ON*/
delay(100);

outportb(0x0378,0x01); /* led kapalı OFF*/


delay(100);
}
else
{
outportb(0x0378,0x01); /* led kapalı OFF*/
}
}
}

…stteki led.c program×m×z iŒin devremizde iki direnŒ, birer adet Led ve anahtar bulunuyor. 330 , 10 K
direnŒ değerleridir.

330 Ohm +5V


2

Data 0 portu

+5V

Anahtar / Džğme
10 K
11

BUSY (terslenir)
18
Toprak / GND

Resim 14 – Paralel port veri okuma ve yollama devresi

Seri portumuz olan COM – communication (iletiĢim) portlar×ndan iletiĢim ise daha basit gibi g™zžkse de,
asl×nda paralel porta g™re daha kolay değildir. Akbil ve TOM (Touch Memory) gibi ayg×tlar seri iletiĢimle veri
al×ĢveriĢinde bulunuyor. RS-232 standard×na g™re hat say×s× 20 olmas×na rağmen, bize sadece TXD, RXD ve GND
toprak hatt× yeterlidir. …Œ hat ile Œal×Ģan kablolara Null (boĢ) Modem kablosu veya cross (Œapraz) kablo da denir.
Diğer hatlar ise gžvenlik ve daha h×zl× veri transferi iŒin kullan×l×yor. Fare veya d×Ģ modem gibi aletleri bilgisayar×m×z×n
108

arkas×ndaki bu 9 iğneli portlara takabiliriz. Bilgisayar×m×z 16550 adl× 115200 bps (bits per second) h×z×na imkan veren
UART – Universal Asynchronous Receiver Transmitter devreleri ile d×Ģ džnya ile veri al×ĢveriĢinde bulunur. Asl×nda bu
Œip seri iletiĢimi paralele Œevirir. COM1 iŒin 03F8H – 03FFH, COM2 iŒin de 02F8H – 02FFH adresleri aral×ğ×n×
kullanabiliriz. Veriler paket halinde peĢ peĢe yolland×ğ× iŒin veri g™ndermeden ™nce baĢlang׌ biti, 5 veya 8 bit veriden
sonra da bitiĢ biti ve parite biti yollan×r, bu bitlerin sinyal değerleri +12V ve –12V aras×ndad×r. Bu arada baĢka bir
kaynakta da değer aral×ğ× olarak –3 V ile +25 V aras× olduğunu g™rdžm. K×z×l™tesi (infrared) iletiĢim de ancak seri
olabilir. Modem‟in anlam× da modžlat™r, demodžlat™r yani sese Œevirip tekrar dijital bilgiye Œevirebilmedir, ki bu
iĢlemler seri iletiĢim sayesinde gerŒekleĢir. Veri ak×Ģ× bir saat sinyali ile kontrol edilir. Sinyali alan ile yollayan ayn× saat
darbesine (senkron iletiĢim) sahip olmal×d×r. Eğer baĢlang׌ ve son bit Ģeklinde veriler paketlenerek yollan×yorsa
asenkron iletiĢim yap×l×yor demektir. Modemin Œal×Ģ×rken Œ×kard×ğ× garip seslerin sebebi de iki iletiĢim biriminin
anlaĢmaya Œal×Ģmas×d×r. Belli bir protokol birliğine de var×nca iletiĢim devam eder. Tek y™nlž iletiĢime half duplex –
yar× iki y™n, her iki y™nde iletiĢime de full duplex – tam iki y™n denir.

Basic dilinde COM1‟e veri yollamak iŒin Ģu komutu kullanabiliriz:

Open ―com1:300,e,7,1‖ as #1 „300 baud hızında, parite even – çift, 7 bit veri, 1 stop – bitiş biti

Seri Bağlant× Noktas× Bacak ĠĢlevleri:

1 Carrier Detect 6 Data Set Ready


2 Bilgi Alma – Receive Data 7 Request to Send
3 Bilgi Yollama – Transmit Data 8 Clear to Send
4 Data Terminal Ready 9 Zil - Ring Indication
5 Toprak – Ground

Biraz konudan kay×yoruz ama benzer bir konu olarak, bilgisayar×m×z×n speaker – hoparl™ržnž kullanarak
basitŒe ses Œ×karabiliriz: (Ornekler\C\c.zip*speaker.c)

#include <dos.h>
#include <conio.h>
#define spkport 0x61
main()
{
unsigned char port;
port= inportb (spkport) & 0xFC; //0xFC = 1111 1100b
while (!kbhit())
{outportb (spkport, port | 2);
delay (1);
outportb (spkport, port);
delay (1); }
}

Daha gžzel bir ™rnek, PIT – Programmable Interval Timer kullan×m×: (Ornekler\C\speaker2.c)

#include <dos.h>
#include <conio.h>
#define spkport 0x61
#define pitkomut 0x43
#define pitsyc2 0x42
#define pitsaatfark 0x1234DD
typedef unsigned char byte;
typedef unsigned short word;

void spksound(word frekans)


{
word sayac;
sayac= (int) pitsaatfark / frekans;
outport (pitkomut , 0xB6); //0xB6 = 1011 0110b
outport (pitsyc2 , (byte) sayac & 255); //LSB
outport (pitsyc2 , (byte) (sayac >> 8)); //MSB
outport (spkport , inportb (spkport) | 3); // xxxx xx11 maskesi
}
109

void spkNosound()
{ outport (spkport , inportb (spkport) & 0xFC); // 1111 1100
}

main()
{word i;
for (i=20; i<=1500; i++)
{
spksound(i);
delay(1);
}
spkNosound();
return 0;
}

Eh, basit bip sesi Œ×kard×ktan sonra *.wav dosya da speaker kullanarak dinleyebiliriz: (Ornekler\C\speaker3.c)

#include <dos.h>
#include <conio.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#define spkport 0x61
#define pitkomut 0x43
#define pitsyc2 0x42
#define pitsaatfark 0x1234DD
typedef unsigned char byte;
typedef unsigned short word;
long beklemesuresi = 1200;

void sesiCal(byte *ses, word uzunluk)


{byte sayacdeger[256];
word i,bekle;

for (i=0; i<256; i++) sayacdeger[i] = i * 54 /255;

outport (pitkomut , 0x90); // 0x90 = 1001 0000b


outport (spkport , inportb (spkport) | 0x03); // xxxx xx11 maskesi
asm cli; // kesmeleri kapa

for (i=0; i<uzunluk; i++)


{ outport (pitsyc2 , sayacdeger[*ses]);
for (bekle=0; bekle<=beklemesuresi; bekle++);
outport (pitsyc2 , sayacdeger[*ses]);
for (bekle=0; bekle<=beklemesuresi; bekle++);
ses++;
}
asm sti; // kesmeleri ac
outport (spkport , inportb (spkport) | 0xFC);
outport (pitkomut , 0xB6);
}

main(int psayisi, char *parametre[ ])


{FILE *wavdosya;
long wavuzunlugu;
byte *wavses;

if (psayisi==3) beklemesuresi = atoi (parametre[2]);


wavdosya = fopen(parametre[1], "rb");
wavuzunlugu = filelength (fileno(wavdosya));
if (!wavdosya) {printf("Dosya bulunamadi...");exit(1);}
if (wavuzunlugu>60000) wavuzunlugu=60000;
wavses = (byte *) malloc (wavuzunlugu);
if (!wavses) {printf("Bellek yetersiz...");exit(1);}
fread (wavses, 1, wavuzunlugu, wavdosya);
sesiCal (wavses, wavuzunlugu);
110

free (wavses);
fclose (wavdosya);
return 0;
}

“c:\>speaker3 sesdosyasi.wav 5000” gibi kullan×m× var. H×z ile ilgili olan 5000 yerine 600 ile 5000 aras× bir
rakam ile ses daha net oluncaya dek deneyebilirsiniz. GerŒekte speaker sadece 1 ve 0 ile Œal×Ģ×rken biz *.wav
dosyas×n× 8 bit bilgilerini kullanarak sample – belli bir andaki ses ™rneği halinde dinliyoruz. Parametrik kullan×mdan
dolay×, isterseniz bir *.wav dosyay× program×n×z žzerine fare ile sžržkleyerek de deneyebilirsiniz. Kalite berbat ama
baz× ses dosyalar×nda hemen hemen iyi duyulabiliyor.

Genellikle ses kart×n×n žzerinde bulunan 15 pinlik Game Port (Midi Port) yani joystick portunu da
programlayabiliriz. Fakat seri port konusu gibi fazla detaya girmeden bu veri yolunu size tan×tay×m. Donan×m olarak
joystick žzerinde bilgisayar×m×za analog veri yollayan iki potansiyometre – değiĢken değerli direnŒ vard×r. Interrput
15H fonksiyon 01H, haf×zada ise 0200H ve 0207H adres aral×ğ×n× kullan×r. TuĢ bas×mlar×n× da 00H fonksiyonu ile AL
yazmac×ndan okuyabilirsiniz. Pot‟lar x ve y ekseni bilgilerini +5 volt žzerinden ADC – Analog to Digital Convertor
devresine verir ve bu değer 0 - 255 değerleri aras× olan 8 bit seviyesine iner. D×Ģ džnya analog olduğuna g™re ×s×, ses,
bas×nŒ ve ağ×rl×k gibi bilgileri ADC devreleri ile bilgisayar×m×za aktarabiliriz. Ses kartlar× bu iĢlemin tersi olan DAC –
Digital to Analog Convertor devresi ile ses sentezi yaparlar. Genellikle ya sekiz ya da on alt× bit ses kayd× yap×labilir.
Monit™rlerimize de RGB – Red Green Blue bilgileri DAC devreleri ile oluĢturulur.

Oyun Bağlant× Noktas× Bacak ĠĢlevleri:

1 +5 V DC 9 +5 V DC
2 ubuk 1, džğme 1 10 ubuk 2, džğme 1
3 ubuk 1 x değeri 11 ubuk 2 x değeri
4 Toprak – Ground 12 Toprak – Ground
5 Toprak – Ground 13 ubuk 2 y değeri
6 ubuk 1 y değeri 14 ubuk 2, džğme 2
7 ubuk 1, džğme 2 15 +5 V DC
8 +5 V DC

Windows iŒinde žŒ Ģekilde donan×ma (sabit disk, ses kart×, bağlant× noktalar×) eriĢilebilir: doğrudan giriĢ Œ×k×Ģ,
ayg×t sžržcžleri (*.vxd ve Kernel modu) ve API kullan×m×. Win 3.x/95/98/ME iŒin doğrudan giriĢ Œ×k×Ģ komutlar×
rahatl×kla kullan×labiliyorken, NT ve žzeri iŒin bu imkans×zd×r. Win 3.x/95/98/ME iĢletim sistemlerinde Œal×Ģmas×n×n
sebebi, bu sistemlerin donan×m ile yaz×l×m aras×nda bir katmana sahip olmamas×d×r. Ama ayn× anda Œal×Ģt×r×lan bileĢene
baĢka program eriĢemez veya eriĢse bile sorunlar Œ×kabilir. VXD (Virtual Device Driver) ile Win9x, Kernel modu
sžržcžler ile de NT/2000/XP žzerinde eriĢim hakk× vard×r. Windows API kullanarak da yapabiliriz fakat onun da
dezavantajlar× tžm ayg×tlar×n standart olarak fonsiyonlar×n×n olmamas× ve port eriĢiminin yap×lamamas×d×r. XP iĢletim
sisteminde *.exe dosyaya sağ t×klay×p, Compatibility – Uyumluluk sayfas×nda Windows 95, Windows 98 – ME,
Windows NT – 2000 ile uyumlu Œal×Ģmalar×n× sağlayabiliriz. Bu sayede XP‟nin hata verdiği komutlar× giderebiliyoruz.

Tabii ki geliĢmiĢ ses kartlar×m×z, ekran kartlar×m×z varken bu zavall× bileĢenleri neden programl×yoruz, diye
sorarsan×z asl×nda eskiden demo - demonstration veya intro - introduction žreten programc×lar×n neler yapt×klar×n×
g™rmek, diye bir cevap verebilirim. Delphi veya VB‟de haz×r nesneler ile ses dosyas× Œalmak veya yaz×c×ya bir bilgi
yollamak Œok daha zahmetsiz...
111

8. Saat (yuvarlak form ve çizim yapılması)


(Ornekler\Delphi\doner\Project1.dpr)

Sistem saati ve tarihini ekrana yuvarlak bir form iŒinde g™steren bir Delphi6 uygulamam×z.

Resim 15 – Saat projemiz

Resimde g™ržldžğž gibi Windows‟un Tarih/Saat menžsž ile birlikte, saatimizin değerleri karĢ×laĢt×rabilirsiniz.
Form žzerinde sadece Timer1, SavePictureDialog1 ve Image1 nesnesi bulunuyor.

object Form1: TForm1 Left = 0


Left = 271 Top = 0
Top = 104 Width = 411
BorderStyle = bsNone Height = 338
Caption = 'Çiko'#39's Saat' Align = alClient
ClientHeight = 338 OnMouseDown = Image1MouseDown
ClientWidth = 411 end
Color = clBtnFace object Timer1: TTimer
Font.Charset = DEFAULT_CHARSET Interval = 1000
Font.Color = clWindowText OnTimer = Timer1Timer
Font.Height = -11 Left = 48
Font.Name = 'MS Sans Serif' Top = 56
Font.Style = [ ] end
OldCreateOrder = False object SavePictureDialog1: TSavePictureDialog
Position = poDesktopCenter Filter = 'Bitmaps (*.bmp)|*.bmp'
OnCreate = FormCreate Left = 120
OnKeyPress = FormKeyPress Top = 56
PixelsPerInch = 96 end
TextHeight = 13 end
object Image1: TImage

Kodlar×m×z ise:

unit Unit1;

interface
112

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, Buttons, math, jpeg;

type
TTip = (FSekizGen, FDaire,FDefault,FRoundKare,FSinCos);
TForm1 = class(TForm)
Image1: TImage;
Timer1: TTimer;
procedure donder;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
Procedure SetForm;
procedure SetStyle(Value: Ttip);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
sonx,sony:integer;
FTip :TTip;
R :HRgn;
implementation
{$R *.DFM}
procedure tform1.donder;
var a,b:integer;
simdi: TDateTime;
Hour, Min, Sec, MSec: Word;
begin
simdi:=now;
DecodeTime(simdi, Hour, Min, Sec, MSec);

a:=round(sin(-(hour*30+min*0.5)*Pi/180)*50);
b:=round(cos(-(hour*30+min*0.5)*Pi/180)*50);
image1.Canvas.pen.color:=clteal;
image1.Canvas.moveTo(200,150);
image1.Canvas.pen.width:=4;
image1.Canvas.LineTo(200-a,150-b);

a:=round(sin(-min*6*Pi/180)*80);
b:=round(cos(-min*6*Pi/180)*80);
image1.Canvas.pen.color:=clteal;
image1.Canvas.moveTo(200,150);
image1.Canvas.pen.width:=2;
image1.Canvas.LineTo(200-a,150-b);

a:=round(sin(-sec*6*Pi/180)*95);
b:=round(cos(-sec*6*Pi/180)*95);
image1.Canvas.pen.color:=clred;
image1.Canvas.moveTo(200,150);
image1.Canvas.pen.width:=1;
image1.Canvas.LineTo(200-a,150-b);

end;

procedure TForm1.Timer1Timer(Sender: TObject);


var i,a,b:integer;
simdi: TDateTime;
Year, Month, Day: Word;
begin
simdi:= Now;
113

DecodeDate(simdi, Year, Month, Day);

for i:=0 to 60 do begin


a:=round(sin(-(i*6-1)*Pi/180)*105);
b:=round(cos(-(i*6-1)*Pi/180)*105);
image1.Canvas.pen.width:=1;
image1.Canvas.pen.color:=clgray;
image1.Canvas.moveTo(200,150);
image1.Canvas.LineTo(200-a,150-b);
end;
for i:=0 to 12 do begin
a:=round(sin(-(i*30-1)*Pi/180)*105);
b:=round(cos(-(i*30-1)*Pi/180)*105);
image1.Canvas.pen.width:=2;
image1.Canvas.pen.color:=clgreen;
image1.Canvas.moveTo(200,150);
image1.Canvas.LineTo(200-a,150-b);
end;
image1.Canvas.pen.width:=1;
image1.Canvas.pen.color:=clblack;
image1.Canvas.MoveTo(200,150);
image1.Canvas.Ellipse(100,50,300,250);
image1.Canvas.pen.width:=2;
image1.Canvas.pen.color:=clBlue;
image1.Canvas.TextOut(240,140,inttostr(day)+'/'+inttostr(month)+'/'+inttostr(year));
donder;
end;

procedure TForm1.FormCreate(Sender: TObject);


begin
SetStyle(FDaire);
image1.Canvas.brush.Color:=clLtGray;
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW); //Başlat çubuğunda gözükmez
end;

procedure TForm1.SetStyle(Value: Ttip);


begin
FTip := value;
SetForm;
end;

Procedure TForm1.SetForm;
begin
with form1 do begin
case ftip of
FDaire:
begin
R:=CreateEllipticRgn(90,40,310,260);
SetWindowRgn( Handle,R,True);
end;
end;
Update;
end;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;


Shift: TShiftState; X, Y: Integer);
const
SC_DragMove = $F012;
begin
if button = mbright then
begin
SavePictureDialog1.Execute;
if SavePictureDialog1.FileName<>'' then
image1.Picture.SaveToFile(SavePictureDialog1.FileName);
end
114

else begin
ReleaseCapture;
FORM1.perform(WM_SysCommand, SC_DragMove, 0);
end;
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);


begin if key=#27 then close; end;
end.

Image1‟in Canvas – yžzey ™zelliğini Form1.Canvas‟a g™re tercih etmemizin sebebi, daha kal×c× etki elde
etmemizdir. Eğer Form1.Canvas yapsayd×k, form žzerinden bir pencere geŒince yapt×ğ×m×z Ģekiller silinecekti, yada
saŒma Ģekillerle karĢ×laĢabilirdik. Windows her pencerenin žzerini resim olarak saklam×yor. 1280x1024x16 milyon
renk Œ™zžnžrlžkte 4MB haf×zay× bitmap g™ržntžye ay×rmak bžyžk haf×za kayb× olurdu. Biz de istersek formumuzu sağ
t×klad×ğ×m×zda saatimizi *.bmp olarak kaydedebiliyoruz. Saniye veya diğer Œizgilerin d™nmesini trigonometri ile
hallediyoruz. Timer1 her 1000 milisaniyede “donder” prosedžržnž Œağ×r×yor.

200-a,150-b

c
b
aŒ×
200,150
a
Resim 16 – Biraz trigonometri bilgisi

a = sin(aŒ×) . c x eksenindeki LineTo iŒin gerekli değer


b = cos(aŒ×) . c y eksenindeki LineTo iŒin gerekli değer

Hipotenžs yani c, ™rneğin akrep iŒin 50 piksel uzunluğunda olmas× gereken değerdir. c değeri her an ayn×
değerde olurken, a ve b kenarlar× her aŒ× iŒin ayr× değer kazan×yor. „yleyse a ve b‟yi hesaplamam×z yeterlidir.

360 derecede 12 saat olduğu iŒin, 360/12 sonucu olan 30 0 ile saati Œarp×yoruz. Fakat dakikan×n değeri saate
eklenmesi iŒin de, 30/60 yani 0.5 0 ile dakikay× Œarp×p saate ekliyoruz. Dakika ve saniyenin toplam aŒ×s×n× bulmak iŒin
360/60 = 60 rakam× iĢimize yar×yor.

a:=round(sin(-min*6*Pi/180)*80); //tamsayı x olması için round (real);


b:=round(cos(-min*6*Pi/180)*80);
image1.Canvas.pen.color:=clteal;
image1.Canvas.moveTo(200,150); //çizgi başlangıç noktası (x,y) olarak
image1.Canvas.pen.width:=2;
image1.Canvas.LineTo(200-a,150-b); //çizgi bitim koordinatı

Sin ve cos fonksiyonlar×n×n iŒini “-” negatif yaparak saat y™nžnde d™nmesi sağlar×z. Pi yani ∏ asl×nda system
unit‟inde tan×mlanm×Ģ bir fonksiyondur ve değeri 3.1415926535897932385‟dir. 180 0 = ∏ olduğuna g™re; 10 = ∏ / 180
olur. Bu radyal d™nžĢžmžnž istediğimiz aŒ×ya uygulayarak, doğru sinžs ve kosinžs değerlerini elde ediyoruz. Bir Œizgi
hareket ettirilirken ™nceki eski Œizgi silinmelidir. Fakat Canvas‟×n žzerine Œizdiğimiz elips sayesinde buna gerek kalmad×
ve flicker yani titreme olmadan rahatl×kla Timer1 ile iĢlemlerimizi hallettik.

-
y

y - (0,0) x
x
(0,0)
- x y
x -
y
Matematikteki ve bilgisayardaki x – y džzlemi karĢ×laĢt×rmas×, sadece y‟de farkl×l×k vard×r.
115

9. Sozluk (İngilizce Türkçe sözlük)


(Ornekler\Delphi\Sozluk\Sozluk.dpr)

Resim 17 – S™zlžk program×


Veritaban× kullan×m× ile ilgili Œok basit ve kullan×Ģl× bir program. Ġki veritaban× dosyam×z var. Kelime ve Ac
alanlar×ndan oluĢan, biri Ġngilizce‟den TžrkŒe‟ye, diğeri de TžrkŒe‟den Ġngilizce‟ye anlam bilgilerini saklayan tablo. Bu
tablolar× bedava s™zlžk olan Dictionary On-Top program×ndan ald×m.
Program×n kodlar× :
116

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, StdCtrls, ComCtrls, DBCtrls, Mask, ExtCtrls;

type
TForm1 = class(TForm)
Bevel1: TBevel;
Bevel2: TBevel;
DataSource1: TDataSource;
DataSource2: TDataSource;
DBEdit1: TDBEdit;
DBEdit2: TDBEdit;
DBNavigator1: TDBNavigator;
DBNavigator2: TDBNavigator;
DBRichEdit1: TDBRichEdit;
DBRichEdit2: TDBRichEdit;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Panel1: TPanel;
Panel2: TPanel;
Table1: TTable;
Table1AC: TMemoField;
Table1KELIME: TStringField;
Table2: TTable;
Table2AC: TMemoField;
Table2KELIME: TStringField;
procedure Edit1Change(Sender: TObject);
procedure Edit2Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}

procedure TForm1.Edit1Change(Sender: TObject);


begin if edit1.Text<>'' then table1.locate('KELIME',edit1.text,[loCaseInsensitive, loPartialKey]); end;

procedure TForm1.Edit2Change(Sender: TObject);


begin if edit2.Text<>'' then table2.locate('KELIME',edit2.text,[loCaseInsensitive, loPartialKey]); end;

end.

G™ržldžğž gibi sadece edit1 ve edit2 iŒine iki sat×r kod yazm×Ģ×z. AmaŒ iki veritaban× iŒinden kelime alan×na
dayal× arama yapmak. Basit bir tasar×m ile iĢlevsel bir s™zlžk elde ettik. Yeni kay×t yap×lmas×n× DBNavigator
nesnelerinde kapatt×m, asl×nda hiŒ gerek yok. Kullan×c× kendi s™zcžklerini de s™zlžğe ekleyebilir veya varolan
kelimelerde džzenlemeler yapabilir. KarĢ×laĢt×ğ×m en bžyžk sorun dbase‟e s™zlžğž aktar×rken TžrkŒe karakterlerin
garipleĢmesi idi. Biraz gayret ederek tablonun dilini TžrkŒe yap×nca sorun Œ™zžldž.
117

10. surukle (nesne sürükleme ve yazıcı kullanımı)


(Ornekler\Delphi\surukle\Project1.dpr)

Bu projede as×l amac×m yaz×c× Œ×kt×s×n× Œal×Ģma an×nda ™zelleĢtirmekti. ġimdilik sadece Label – etiketler rahatŒa
hareket ettirilebiliyor (drag and drop – sžržkle ve b×rak). Ġsterseniz kay×t ve yžkleme gibi yap×lan d™kžmž kaydetmeyi
de ekleyebilirsiniz, sadece d™rt etiket yetmez deyip RadioButton, CheckBox, Button... da yapabilirsiniz, bu arada
nesne create – oluĢturmay× da deneyebilirsiniz. “Ornekler\Delphi\Dolphin\Dolphin.dpr” ™rneğinde de ListView
nesnesinden StringGrid nesnesine sžržkle b×rak var. Program×n×za d×Ģar×dan dosya sžržklenmesi gibi kodlar× da
DelphiTurk.com sitesinden elde edebilirsiniz.

Kod k×sm× Œok uzun gibi. “case” komutu iŒin daha iyi bir Œ™zžm aranabilir. žnkž daha fazla nesne
eklendiğinde program gereksiz yere uzayacak. Label‟lara sağ t×kland×ğ×nda “Yaz× Tipi” ve “Renk” seŒimleri Œ×kacak olan
bir PopupMenu koyuyoruz. Yaz× tipi FontDialog1‟i, Renk de ColorDialog1‟i Œal×Ģt×r×yor.

„nizleme sayfas×na bir adet QuickRep ve d™rt adet de QRLabel koyman×z yeterli. Preview džğmesi ile
QuickRep‟i ™nizleme yapabiliyoruz. Delphi5 ve žzeri kullan×yorsan×z QuickRep veritaban×na bağl× değilse ™nizleme boĢ
Œ×kabilir. Ayr×ca QuickRep nesnesi žzerine QRLabel‟lerinizi boĢ bulduğunuz yere koymay×n, “Bands*HasColumnHeader”
i True yaparak baĢl×k k×sm×na koyabilirsiniz.

Resim 18 – Tasar×m ve Œal×Ģma an× g™ržntžleri


118

Kodlar:

unit Unit1; public


{ Public declarations }
interface end;

uses var
Windows, Messages, SysUtils, Classes, Graphics, Form1: TForm1;
Controls, Forms, Dialogs, suruklenen_no:byte;
ExtCtrls, StdCtrls, quickrpt, Qrctrls, ComCtrls, Menus;
implementation
type
TForm1 = class(TForm) {$R *.DFM}
Button1: TButton;
Button2: TButton; procedure TForm1.Button1Click(Sender: TObject);
Button3: TButton; begin
ColorDialog1: TColorDialog; quickrep1.Preview;
FontDialog1: TFontDialog; end;
Label1: TLabel;
Label2: TLabel; procedure TForm1.Button2Click(Sender: TObject);
Label3: TLabel; begin
Label4: TLabel; close;
PageControl1: TPageControl; end;
Panel1: TPanel;
PopupMenu1: TPopupMenu; procedure TForm1.Panel1DragDrop(Sender, Source:
QRLabel1: TQRLabel; TObject; X, Y: Integer);
QRLabel2: TQRLabel; begin
QRLabel3: TQRLabel; case suruklenen_no of
QRLabel4: TQRLabel; 1: begin
QuickRep1: TQuickRep; label1.Top:=y; qrlabel1.Top:=y;
Renk1: TMenuItem; qrlabel1.left:=x; label1.left:=x;
TabSheet1: TTabSheet; end;
TabSheet2: TTabSheet; 2: begin
YazTipi1: TMenuItem; label2.Top:=y; qrlabel2.Top:=y;
procedure Button1Click(Sender: TObject); qrlabel2.left:=x; label2.left:=x;
procedure Button2Click(Sender: TObject); end;
procedure Panel1DragDrop(Sender, Source: TObject; X, 3: begin
Y: Integer); label3.Top:=y; qrlabel3.Top:=y;
procedure Panel1DragOver(Sender, Source: TObject; X, qrlabel3.left:=x; label3.left:=x;
Y: Integer; end;
State: TDragState; var Accept: Boolean); 4: begin
procedure Label3MouseDown(Sender: TObject; Button: label4.Top:=y; qrlabel4.Top:=y;
TMouseButton; qrlabel4.left:=x; label4.left:=x;
Shift: TShiftState; X, Y: Integer); end;
procedure Button3Click(Sender: TObject); end;
procedure Label4MouseDown(Sender: TObject; Button:
TMouseButton; end;
Shift: TShiftState; X, Y: Integer);
procedure Label1MouseDown(Sender: TObject; Button: procedure TForm1.Panel1DragOver(Sender, Source:
TMouseButton; TObject; X, Y: Integer;
Shift: TShiftState; X, Y: Integer); State: TDragState; var Accept: Boolean);
procedure Label2MouseDown(Sender: TObject; Button: begin
TMouseButton; accept:=source is TLabel;
Shift: TShiftState; X, Y: Integer); case suruklenen_no of
procedure Label1StartDrag(Sender: TObject; 1: begin
var DragObject: TDragObject); label1.Top:=y; qrlabel1.Top:=y;
procedure Label2StartDrag(Sender: TObject; qrlabel1.left:=x; label1.left:=x;
var DragObject: TDragObject); end;
procedure Label3StartDrag(Sender: TObject; 2: begin
var DragObject: TDragObject); label2.Top:=y; qrlabel2.Top:=y;
procedure Label4StartDrag(Sender: TObject; qrlabel2.left:=x; label2.left:=x;
var DragObject: TDragObject); end;
procedure YazTipi1Click(Sender: TObject); 3: begin
procedure Renk1Click(Sender: TObject); label3.Top:=y; qrlabel3.Top:=y;
private qrlabel3.left:=x; label3.left:=x;
{ Private declarations } end;
119

4: begin
label4.Top:=y; qrlabel4.Top:=y; procedure TForm1.Label3StartDrag(Sender: TObject;
qrlabel4.left:=x; label4.left:=x; var DragObject: TDragObject);
end; begin suruklenen_no:=3; end;
end;
end; procedure TForm1.Label4StartDrag(Sender: TObject;
var DragObject: TDragObject);
procedure TForm1.Button3Click(Sender: TObject); // begin suruklenen_no:=4; end;
Güncelle düğmesi
begin procedure TForm1.YazTipi1Click(Sender: TObject);
qrlabel1.Font:=label1.Font; begin
qrlabel1.Top:=label1.Top; case suruklenen_no of
qrlabel1.left:=label1.left; 1: begin
qrlabel1.Color:=label1.color; FontDialog1.Font:=label1.Font;
FontDialog1.Execute;
qrlabel2.Font:=label2.Font; label1.Font:=FontDialog1.Font;
qrlabel2.Top:=label2.Top; end;
qrlabel2.left:=label2.left; 2: begin
qrlabel2.Color:=label2.color; FontDialog1.Font:=label2.Font;
FontDialog1.Execute;
qrlabel3.Font:=label3.Font; label2.Font:=FontDialog1.Font;
qrlabel3.Top:=label3.Top; end;
qrlabel3.left:=label3.left; 3: begin
qrlabel3.Color:=label3.color; FontDialog1.Font:=label3.Font;
FontDialog1.Execute;
qrlabel4.Font:=label4.Font; label3.Font:=FontDialog1.Font;
qrlabel4.Top:=label4.Top; end;
qrlabel4.left:=label4.left; 4: begin
qrlabel4.Color:=label4.color; FontDialog1.Font:=label4.Font;
end; FontDialog1.Execute;
label4.Font:=FontDialog1.Font;
procedure TForm1.Label3MouseDown(Sender: TObject; end;
Button: TMouseButton; end;
Shift: TShiftState; X, Y: Integer); end;
begin suruklenen_no:=3; end;
procedure TForm1.Renk1Click(Sender: TObject);
procedure TForm1.Label4MouseDown(Sender: TObject; begin
Button: TMouseButton; case suruklenen_no of
Shift: TShiftState; X, Y: Integer); 1: begin
begin suruklenen_no:=4; end; ColorDialog1.Color:=label1.color;
colorDialog1.Execute; label1.color:=ColorDialog1.Color;
procedure TForm1.Label1MouseDown(Sender: TObject; end;
Button: TMouseButton; 2: begin
Shift: TShiftState; X, Y: Integer); ColorDialog1.Color:=label2.color;
begin suruklenen_no:=1; end; colorDialog1.Execute; label2.color:=ColorDialog1.Color;
end;
procedure TForm1.Label2MouseDown(Sender: TObject; 3: begin
Button: TMouseButton; ColorDialog1.Color:=label3.color;
Shift: TShiftState; X, Y: Integer); colorDialog1.Execute; label3.color:=ColorDialog1.Color;
begin suruklenen_no:=2; end; end;
4: begin
procedure TForm1.Label1StartDrag(Sender: TObject; ColorDialog1.Color:=label4.color;
var DragObject: TDragObject); colorDialog1.Execute; label4.color:=ColorDialog1.Color;
begin suruklenen_no:=1; end; end;
end;
procedure TForm1.Label2StartDrag(Sender: TObject; end;
var DragObject: TDragObject);
begin suruklenen_no:=2; end; end.
120

11. Thread (işlemciyi daha verimli kullanma)


(Ornekler\Delphi\Thread\Project1.dpr)

Windows‟da dosya ararken vazgeŒerseniz, “Dur” džğmesine basars×n×z, *.wav dosyan×z× *.mp3‟e Œevirirken de
priority – iĢlem ™nceliği ile daha h×zl× Œevrim yapabilirsiniz. Bu tip iĢlemler Thread – kanallar ile yap×l×yor. Yani siz uzun
sžren bir iĢleminizi kanala atars×n×z, istediğiniz zaman duraksat×r, devam ettirir veya iptal edebilirsiniz, hatta ™nemine
g™re Time Critical, High, Normal, Low, Idle yani en žst, žst, orta, alt ve en alt seviye iĢlemci kullan×m× olarak
ayarlayabilirsiniz.

ĠĢletim sistemi o an Œal×Ģan process – iĢlemleri džzenlemekle g™revlidir. Prosesler sistem prosesi ve kullan×c×
prosesi olarak ikiye ayr×l×r. O anda Œal×Ģan uygulamalar sequential – s×ral× (veya time sharing – zaman paylaĢ×ml×)
olarak iĢlenir. Birbirleri aras×nda belli anlarda ™nceliklerine g™re geŒiĢ yap×l×r. Yeni prosesler haz×rda, beklemede veya
Œal×Ģma hallerini geŒerek sonland×r×lmay×, yok edilmeyi beklerler. Fiziksel kaynak paylaĢ×m× yani iĢlemci, RAM gibi
donan×m kullan×l×r, mant×ksal kaynak paylaĢ×m× ile ortak prosesler paylaĢ×l×r. Ana iĢlem, Œocuk iĢlemler bitene dek
bekler. Bir kanal ise iĢlemciyi kullan×m×n×n en basit birimidir. Kanallar iĢletim sistemi kaynaklar×n×n, haf×za adreslerini
ve program kodlar×n× paylaĢ×rlar. Multitasking – Œokg™revlilik sayesinde bir prosesin bitimini beklemek yerine, o proses
idle – boĢ konuma geŒtiği anda diğer proses uygulan×r.

Normal bir application – uygulama projemize kanal ™zelliği vermek iŒin “File*New...*New *Thread Object”
diyoruz. Deneme ismindeki kanal×m×z× renk bilgisi yollay×p da Œal×Ģt×r×yoruz. Yani parametreli. Baslik ismindeki kanal
ise bağ×ms×z, ana program×nda ne olduğu onu ilgilendirmiyor.

Form baĢl×ğ×nda devaml× değiĢen bir rakamla renkli noktalar basan thread‟×n bilgisayar× ne kadar meĢgul
ettiğini g™ržyoruz. Combobox değiĢtirildikŒe baĢl×ktaki bu rakamlar×n okunakl×l×ğ× değiĢiyor. Suspend – duraksama,
Resume – devam etme ve formun kenarlar×n× boyutland×r×nca da bu değiĢiklikleri g™rebilirsiniz. Tam ekran ve Highest
– en žst ™ncelikte bayağ× bilgisayar×n×z zorlan×r.

Eğer program×n×z Œok yoğun iĢlemlerle boğuĢacak ve siz de bilgisayar o iĢle uğraĢ×rken kilitlenmeden
iĢlemlerini yapmas×n× isterseniz en emin yol bu multi thread – Œoklu kanal kullan×m×d×r. Fakat g™rdžğžnžz gibi
karmaĢ×k kod ve bilgisayar× s™mžržrcesine kullanmas× dezavantajlar×d×r.

Farkl× y™ntemlerle de uzun sžrecek iĢlemlerimizi yapabiliriz, bu y™ntemlerle yap×lan programda iĢlemi iptal
etme gibi bir durum yoktur (Ornekler\Delphi\BACKPROC):

1) Fare imlecini hourglass – kumsaati haline getirerek, kullan×c×y× uyarmak. Tek yapacağ×n×z iĢlem kodunun baĢ×na
Screen.Cursor:=crHourglass; sonuna da Screen.Cursor:=crDefault; demek. Programa mždahale etmenin imkans×z
olduğunu unutmay×n.

procedure TForm1.Button1Click(Sender: TObject);


var
Number, NPrimes, Max: LongInt;
begin
Screen.Cursor := crHourglass; //işte kahramanımız
try
NPrimes := 0;
Max := SpinEdit1.Value;
HourLabel.Caption := 'Hesaplanıyor...';
for Number := 2 to Max do
begin
if IsPrime (Number) then //IsPrime‟in kodu üçüncü yöntemde
Inc (NPrimes);
ProgressBar1.Position := Number * 100 div Max;

// aşağıdaki ikinci yöntem için bu satırı aktif yapabilirsiniz...


// Application.ProcessMessages;

end;
HourLabel.Caption := IntToStr (NPrimes) + ' below ' + IntToStr (Max);
finally
Screen.Cursor := crDefault; //normale dönüş
end; end;
121

2) Uygulamay× yavaĢlatan ama hala mždahale imkan× kazand×ran, uygun bir yere Ģu tek sat×r× eklemek:
Application.ProcessMessages; Tžm iĢlemin bitmesini beklemeden tekrar Œal×Ģt×r×labilir ki bu bžyžk sorunlara yol
aŒabilir. „nlem olarak devam ad×nda bir boolean değiĢken oluĢturup tekrar Œal×Ģt×r×lmay× ™nleyebilirsiniz. Bu
y™ntem daha Œok Win 3.1 uygulamalar×nda kullan×l×yor.

3) Application nesnesinin OnIdle – at×l veya boĢ olduğu anlar× kollay×p, iĢlemleri yapan prosedžr oluĢturmak. YavaĢt×r
ama uygulamaya mždahale imkan× vard×r:

...
procedure IdleButtonClick(Sender: TObject);
private
IdleNumber, IdleNPrimes, IdleMax: LongInt;
public
procedure IdleProc (Sender: TObject; var Done: Boolean);
end;
var
Form1: TForm1;
implementation

{$R *.DFM}

function IsPrime (N: LongInt): Boolean;


var
Test: LongInt;
begin
IsPrime := True;
for Test := 2 to N - 1 do
begin
if (N mod Test) = 0 then
begin
IsPrime := False;
break;
end;
end;
end;

procedure TForm1.IdleButtonClick(Sender: TObject);


begin
IdleNPrimes := 0;
IdleMax := SpinEdit1.Value;
IdleNumber := 2;
Application.OnIdle := IdleProc; //atıl boş an çağrılır
ProgressBar4.Position := 0;
IdleLabel.Caption := 'Hesaplanıyor...';
end;

procedure TForm1.IdleProc (Sender: TObject; var Done: Boolean);


begin
if IdleNumber < IdleMax then
begin
if IsPrime (IdleNumber) then
Inc (IdleNPrimes);
Inc (IdleNumber);
Done := False;
End else begin
IdleLabel.Caption := IntToStr (IdleNPrimes) +
' below ' + IntToStr (IdleMax);
Done := True;
Beep;
Application.OnIdle := nil;
end;
ProgressBar4.Position := IdleNumber * 100 div IdleMax;
end;
end.
122

Resim 19 – Thread formumuz

Proje dosyam×z:

program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas',
Unit3 in 'Unit3.pas';

{$R *.RES}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Unit1.pas yani ana program×m×z:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Unit2, Unit3;

type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
ComboBox1: TComboBox;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
private
123

{ Private declarations }
public
{ Public declarations }
BenimThread:array [1..3] of TDeneme;
bslk:Baslik;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);


begin
Button1.Enabled := False;
Button2.Enabled := True;
Button3.Enabled := true;
Button4.Enabled := true;
ComboBox1.Enabled := true;
CheckBox1.Enabled := false;
CheckBox2.Enabled := false;
CheckBox3.Enabled := false;
if CheckBox1.Checked then BenimThread[1]:=Tdeneme.Create(clblue);
if CheckBox2.Checked then BenimThread[2]:=Tdeneme.Create(clred);
if CheckBox3.Checked then BenimThread[3]:=Tdeneme.Create(clyellow);
bslk:=baslik.Create(False);
end;

procedure TForm1.Button2Click(Sender: TObject);


begin
if CheckBox1.Checked then BenimThread[1].Free;
if CheckBox2.Checked then BenimThread[2].Free;
if CheckBox3.Checked then BenimThread[3].Free;
Button1.Enabled := True;
Button2.Enabled := False;
Button3.Enabled := false;
Button4.Enabled := false;
ComboBox1.Enabled := false;
CheckBox1.Enabled := true;
CheckBox2.Enabled := true;
CheckBox3.Enabled := true;
bslk.free;
Caption:='Form1';
form1.Refresh;
end;

procedure TForm1.Button3Click(Sender: TObject);


begin
if CheckBox1.Checked then BenimThread[1].suspend;
if CheckBox2.Checked then BenimThread[2].suspend;
if CheckBox3.Checked then BenimThread[3].suspend;
end;

procedure TForm1.Button4Click(Sender: TObject);


begin
if CheckBox1.Checked then BenimThread[1].resume;
if CheckBox2.Checked then BenimThread[2].resume;
if CheckBox3.Checked then BenimThread[3].resume;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);


begin
if CheckBox1.Checked then BenimThread[1].Suspend;
if CheckBox2.Checked then BenimThread[2].Suspend;
124

if CheckBox3.Checked then BenimThread[3].Suspend;


if ComboBox1.ItemIndex=0 then begin
if CheckBox1.Checked then BenimThread[1].Priority:=tpTimeCritical;
if CheckBox2.Checked then BenimThread[2].Priority:=tpTimeCritical;
if CheckBox3.Checked then BenimThread[3].Priority:=tpTimeCritical;
end;
if ComboBox1.ItemIndex=1 then begin
if CheckBox1.Checked then BenimThread[1].Priority:=tpHighest;
if CheckBox2.Checked then BenimThread[2].Priority:=tpHighest;
if CheckBox3.Checked then BenimThread[3].Priority:=tpHighest;
end;
if ComboBox1.ItemIndex=2 then begin
if CheckBox1.Checked then BenimThread[1].Priority:=tpHigher;
if CheckBox2.Checked then BenimThread[2].Priority:=tpHigher;
if CheckBox3.Checked then BenimThread[3].Priority:=tpHigher;
end;
if ComboBox1.ItemIndex=3 then begin
if CheckBox1.Checked then BenimThread[1].Priority:=tpNormal;
if CheckBox2.Checked then BenimThread[2].Priority:=tpNormal;
if CheckBox3.Checked then BenimThread[3].Priority:=tpNormal;
end;
if ComboBox1.ItemIndex=4 then begin
if CheckBox1.Checked then BenimThread[1].Priority:=tpLower;
if CheckBox2.Checked then BenimThread[2].Priority:=tpLower;
if CheckBox3.Checked then BenimThread[3].Priority:=tpLower;
end;
if ComboBox1.ItemIndex=5 then begin
if CheckBox1.Checked then BenimThread[1].Priority:=tpLowest;
if CheckBox2.Checked then BenimThread[2].Priority:=tpLowest;
if CheckBox3.Checked then BenimThread[3].Priority:=tpLowest;
end;
if ComboBox1.ItemIndex=6 then begin
if CheckBox1.Checked then BenimThread[1].Priority:=tpIdle;
if CheckBox2.Checked then BenimThread[2].Priority:=tpIdle;
if CheckBox3.Checked then BenimThread[3].Priority:=tpIdle;
end;
if CheckBox1.Checked then BenimThread[1].resume;
if CheckBox2.Checked then BenimThread[2].resume;
if CheckBox3.Checked then BenimThread[3].resume;
end;
end.

Unit2.pas renkli nokta basan thread kodlar×m×z:

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TDeneme = class(TThread)
private
{ Private declarations }
renk:integer;
protected
procedure Execute; override;
public
constructor Create(color:Tcolor);
end;

implementation

{ TDeneme }
125

uses unit1;

constructor Tdeneme.Create(color:Tcolor);
begin
renk:=color;
inherited Create(false);
end;

procedure TDeneme.Execute;
var
X, Y: Integer;
begin
Randomize;
repeat
X := Random (Form1.ClientWidth);
Y := Random (Form1.ClientHeight);
with Form1.Canvas do
begin
Lock;
try
Pixels [X, Y] := renk;
finally
Unlock;
end;
end;
until Terminated;
end;

end.

Unit3.pas formumuzun baĢl×ğ×na bilgi yazan thread:

unit Unit3;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,Unit2, ExtCtrls;

type
Baslik = class(TThread)
protected
procedure Execute; override;
end;

implementation

{ Baslik }
uses unit1;

var i:integer;

procedure Baslik.Execute;
begin
while not Terminated do begin
for i:=1 to 100 do
form1.caption:='Form1 i='+inttostr(i);
end;
end;

end.
126

12. Sysmenu (sistem menüsüne eleman eklenmesi)


(Ornekler\Delphi\sysmenu\Project1.dpr)

Sistem menžsžne kendi komutlar×n×z× eklemek iŒin Ģu ™rneği yapabilirsiniz. Fakat sağ tarafta aktif hale
getirebildiğimiz “Bu Nedir?” džğmesinin, Yard×m dosyan×z ile nas×l iliĢkilendirileceğinden burada bahsetmeyeceğim. Bu
ek BaĢlat Œubuğundaki program×n simgesindeki sistem menžsžnž etkilemiyor.

Resim 20 – Sistem menžsž

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure WMSysCommand (var msg:TWMSysCommand);
message wm_SysCommand;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);


begin
AppendMenu (GetSystemMenu (Handle, FALSE), MF_SEPARATOR, 0, '');
AppendMenu (GetSystemMenu (Handle, FALSE), MF_STRING, 1, '&Hakkında 1...');
AppendMenu (GetSystemMenu (Handle, FALSE), MF_STRING, 2, 'H&akkında 2...');
end;

procedure TForm1.WMSysCommand (var Msg: TWMSysCommand);


begin
if Msg.CmdType = 1 then ShowMessage ('Meraba!'); if Msg.CmdType = 2 then ShowMessage ('Selam!');
inherited;
end;
end.
127

13. Tuş Basımı (klavye ve fare basımlarını kontrol etme)


(Ornekler\Delphi\tusbasimi\Project1.dpr)

Resim 21 – Fare ve klavye bas×m× ™rneği

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
procedure Edit3KeyPress(Sender: TObject; var Key: Char);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormDblClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);


begin
if key=#13 then begin
key:=#0; Perform (CM_DialogKey, VK_TAB,0); //tab efekti
128

end;
if not (key in ['0'..'9',#8]) then begin //sadece rakam girişi
key:=#0; beep;
end;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;


Shift: TShiftState; X, Y: Integer);
begin
if button = mbleft then
if (ssCtrl in Shift) and (ssShift in shift) then
canvas.RoundRect(x-10, y-10, x+10, y+10 ,10, 10 )
else
if ssShift in Shift then
canvas.Rectangle (x-10, y-10, x+10, y+10)
else
if ssAlt in Shift then
canvas.Ellipse (x-10, y-10, x+10, y+10)
else
if ssCtrl in Shift then
canvas.Pie (x-10, y-10, x+10, y+10 ,x-10, y-10, x+10, y+10 );
end;

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);


begin
if key=#13 then begin
key:=#0; Perform (CM_DialogKey, VK_TAB,0);
end;
end;

procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);


begin
if key=#13 then begin
key:=#0; Perform (CM_DialogKey, VK_TAB,0);
end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,


Y: Integer);
begin
caption:=format('Koordinat X=%3d, Y=%3d',[x,y]);
end;

procedure TForm1.FormDblClick(Sender: TObject);


begin
repaint; // hem invalidate hem de update yapılır (=refresh)
end;

end.

Form žzerinde bir adet aŒ×klama Label1‟i ve žŒ adet de Edit nesnesi vard×r. Yine form žzerinde fare ve klavye
tuĢlar× bas×m× ile Ģekiller Œ×kart×l×yor. Editlerde ise Enter tuĢu bas×m× Tab efekti kazan×yor. MS Peint ™rneği fare ile Ģekil
Œizme iŒin daha kullan×Ģl×.
129

14. 2 Boyutlu Oyun Yapımı (TicTacToe, Pazl, Mayn oyunları)


(Ornekler\Delphi\tictoc\Project1.dpr)

Resim 22a – TicTacToe Oyunumuzun ekran g™ržntžsž

object Form1: TForm1 Font.Color = clBlue


Left = 365 Font.Height = -11
Top = 110 Font.Name = 'MS Sans Serif'
BorderIcons = [biSystemMenu, biMinimize] Font.Style = [ ]
BorderStyle = bsNone ParentFont = False
ClientHeight = 238 TabOrder = 0
ClientWidth = 246 Kind = bkClose
Color = clMaroon end
Font.Charset = DEFAULT_CHARSET object BitBtn2: TBitBtn
Font.Color = clWindowText Left = 13
Font.Height = -11 Top = 8
Font.Name = 'MS Sans Serif' Width = 75
Font.Style = [ ] Height = 25
OldCreateOrder = False Caption = '&New'
Position = poDesktopCenter Font.Charset = DEFAULT_CHARSET
OnCreate = FormCreate Font.Color = clBlue
OnMouseDown = FormMouseDown Font.Height = -11
PixelsPerInch = 96 Font.Name = 'MS Sans Serif'
TextHeight = 13 Font.Style = [ ]
object Label1: TLabel ParentFont = False
Left = 9 TabOrder = 1
Top = 222 OnClick = BitBtn2Click
Width = 224 Kind = bkIgnore
Height = 11 end
Alignment = taCenter object Panel1: TPanel
AutoSize = False Left = 8
Caption = ' ' Top = 40
Font.Charset = TURKISH_CHARSET Width = 229
Font.Color = clYellow Height = 179
Font.Height = -9 Caption = 'Ciko'#39's TicTocToe Game by E_xplorer
Font.Name = 'Small Fonts' 2001'
Font.Style = [fsBold] Font.Charset = TURKISH_CHARSET
ParentFont = False Font.Color = clGreen
Transparent = True Font.Height = -13
end Font.Name = 'Trebuchet MS'
object BitBtn1: TBitBtn Font.Style = [fsBold]
Left = 157 ParentFont = False
Top = 8 TabOrder = 2
Width = 75 object SpeedButton7: TSpeedButton
Height = 25 Left = 4
Font.Charset = DEFAULT_CHARSET Top = 119
130

Width = 73 end
Height = 57 object SpeedButton4: TSpeedButton
Flat = True Left = 4
OnClick = SpeedButton7Click Top = 61
end Width = 73
object SpeedButton8: TSpeedButton Height = 57
Left = 78 Flat = True
Top = 119 OnClick = SpeedButton4Click
Width = 73 end
Height = 57 object SpeedButton3: TSpeedButton
Flat = True Left = 152
OnClick = SpeedButton8Click Top = 3
end Width = 73
object SpeedButton5: TSpeedButton Height = 57
Left = 78 Flat = True
Top = 61 OnClick = SpeedButton3Click
Width = 73 end
Height = 57 object SpeedButton2: TSpeedButton
Flat = True Left = 78
OnClick = SpeedButton5Click Top = 3
end Width = 73
object SpeedButton6: TSpeedButton Height = 57
Left = 152 Flat = True
Top = 61 OnClick = SpeedButton2Click
Width = 73 end
Height = 57 object SpeedButton1: TSpeedButton
Flat = True Left = 4
OnClick = SpeedButton6Click Top = 3
end Width = 73
object SpeedButton9: TSpeedButton Height = 57
Left = 152 Flat = True
Top = 119 OnClick = SpeedButton1Click
Width = 73 end
Height = 57 end
Flat = True end
OnClick = SpeedButton9Click

Kodlar×m×z ise:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Buttons, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Label1: TLabel;
Panel1: TPanel;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
SpeedButton4: TSpeedButton;
SpeedButton5: TSpeedButton;
SpeedButton6: TSpeedButton;
SpeedButton7: TSpeedButton;
SpeedButton8: TSpeedButton;
SpeedButton9: TSpeedButton;
procedure BitBtn2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
131

procedure SpeedButton1Click(Sender: TObject);


procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButton3Click(Sender: TObject);
procedure SpeedButton4Click(Sender: TObject);
procedure SpeedButton5Click(Sender: TObject);
procedure SpeedButton6Click(Sender: TObject);
procedure SpeedButton7Click(Sender: TObject);
procedure SpeedButton8Click(Sender: TObject);
procedure SpeedButton9Click(Sender: TObject);
procedure kontrol;
procedure disable;
procedure toplam;
function topcheck: byte;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
basili: array [1..9] of char;
sirakimde:boolean;
toplamtop:byte;
wins,loses,deuces:byte;
implementation

{$R *.DFM}
procedure tform1.toplam;
var i : byte;
begin
toplamtop:=0;
for i:= 1 to 9 do begin
if basili[i] <> '-' then inc(toplamtop);
end;
end;

Function tform1.topcheck() : byte;


var a:byte;
begin
while true do begin
a:= random(9);
topcheck:=a; //recursive...
if basili[a]= '-' then exit;
end;
end;

procedure Tform1.disable;
begin
SpeedButton1.Enabled:=false;
SpeedButton2.Enabled:=false;
SpeedButton3.Enabled:=false;
SpeedButton4.Enabled:=false;
SpeedButton5.Enabled:=false;
SpeedButton6.Enabled:=false;
SpeedButton7.Enabled:=false;
SpeedButton8.Enabled:=false;
SpeedButton9.Enabled:=false;
end;

procedure Tform1.kontrol;
var pc:byte;
begin
if (basili[1]='x') and (basili[2]='x') and (basili[3]='x') then
begin
inc(wins);
132

label1.Caption:=format('%2d win(s), %2d lose(s), %2d deuce(s)',[wins,loses,deuces]);


Application.MessageBox('Win!',':))))',0);
disable;exit;
end;
if (basili[1]='x') and (basili[4]='x') and (basili[7]='x') then
begin
inc(wins);
label1.Caption:=format('%2d win(s), %2d lose(s), %2d deuce(s)',[wins,loses,deuces]);
Application.MessageBox('Win!',':))))',0);
disable;exit;
end;
if (basili[7]='x') and (basili[8]='x') and (basili[9]='x') then
begin
inc(wins);
label1.Caption:=format('%2d win(s), %2d lose(s), %2d deuce(s)',[wins,loses,deuces]);
Application.MessageBox('Win!',':))))',0);
disable;exit;
end;
if (basili[3]='x') and (basili[6]='x') and (basili[9]='x') then
begin
inc(wins);
label1.Caption:=format('%2d win(s), %2d lose(s), %2d deuce(s)',[wins,loses,deuces]);
Application.MessageBox('Win!',':))))',0);
disable;exit;
end;
if (basili[1]='x') and (basili[5]='x') and (basili[9]='x') then
begin
inc(wins);
label1.Caption:=format('%2d win(s), %2d lose(s), %2d deuce(s)',[wins,loses,deuces]);
Application.MessageBox('Win!',':))))',0);
disable;exit;
end;
if (basili[3]='x') and (basili[5]='x') and (basili[7]='x') then
begin
inc(wins);
label1.Caption:=format('%2d win(s), %2d lose(s), %2d deuce(s)',[wins,loses,deuces]);
Application.MessageBox('Win!',':))))',0);
disable;exit;
end;
if (basili[2]='x') and (basili[5]='x') and (basili[8]='x') then
begin
inc(wins);
label1.Caption:=format('%2d win(s), %2d lose(s), %2d deuce(s)',[wins,loses,deuces]);
Application.MessageBox('Win!',':))))',0);
disable;exit;
end;
if (basili[4]='x') and (basili[5]='x') and (basili[6]='x') then
begin
inc(wins);
label1.Caption:=format('%2d win(s), %2d lose(s), %2d deuce(s)',[wins,loses,deuces]);
Application.MessageBox('Win!',':))))',0);
disable;exit;
end;

toplam;
if toplamtop = 9 then
begin
inc(deuces);
label1.Caption:=format('%2d win(s), %2d lose(s), %2d deuce(s)',[wins,loses,deuces]);
Application.MessageBox('Deuce!','§±§±§',0);
disable;exit;
end;

pc:=0; //hiç top seçili değil


if toplamtop = 1 then pc:= topcheck() //daha oyunun başındayız
else begin
133

if (basili[1]='x') and (basili[2]='x') and (basili[3]='-') then pc:=3;


if (basili[2]='x') and (basili[3]='x') and (basili[1]='-') then pc:=1;
if (basili[4]='x') and (basili[5]='x') and (basili[6]='-') then pc:=6;
if (basili[5]='x') and (basili[6]='x') and (basili[4]='-') then pc:=4;
if (basili[7]='x') and (basili[8]='x') and (basili[9]='-') then pc:=9;
if (basili[8]='x') and (basili[9]='x') and (basili[7]='-') then pc:=7;
if (basili[1]='x') and (basili[4]='x') and (basili[7]='-') then pc:=7;
if (basili[4]='x') and (basili[7]='x') and (basili[1]='-') then pc:=1;
if (basili[2]='x') and (basili[5]='x') and (basili[8]='-') then pc:=8;
if (basili[5]='x') and (basili[8]='x') and (basili[2]='-') then pc:=2;
if (basili[3]='x') and (basili[6]='x') and (basili[9]='-') then pc:=9;
if (basili[6]='x') and (basili[9]='x') and (basili[3]='-') then pc:=3;

if (basili[1]='x') and (basili[5]='x') and (basili[9]='-') then pc:=9;


if (basili[5]='x') and (basili[9]='x') and (basili[1]='-') then pc:=1;
if (basili[3]='x') and (basili[5]='x') and (basili[7]='-') then pc:=7;
if (basili[7]='x') and (basili[5]='x') and (basili[3]='-') then pc:=3;

if (basili[1]='x') and (basili[3]='x') and (basili[2]='-') then pc:=2;


if (basili[1]='x') and (basili[7]='x') and (basili[4]='-') then pc:=4;
if (basili[3]='x') and (basili[9]='x') and (basili[6]='-') then pc:=6;
if (basili[7]='x') and (basili[9]='x') and (basili[8]='-') then pc:=8;

if (basili[4]='x') and (basili[6]='x') and (basili[5]='-') then pc:=5;


if (basili[2]='x') and (basili[8]='x') and (basili[5]='-') then pc:=5;

if (basili[1]='x') and (basili[9]='x') and (basili[5]='-') then pc:=5;


if (basili[3]='x') and (basili[7]='x') and (basili[5]='-') then pc:=5;
//---
if (basili[1]='o') and (basili[2]='o') and (basili[3]='-') then pc:=3;
if (basili[2]='o') and (basili[3]='o') and (basili[1]='-') then pc:=1;
if (basili[4]='o') and (basili[5]='o') and (basili[6]='-') then pc:=6;
if (basili[5]='o') and (basili[6]='o') and (basili[4]='-') then pc:=4;
if (basili[7]='o') and (basili[8]='o') and (basili[9]='-') then pc:=9;
if (basili[8]='o') and (basili[9]='o') and (basili[7]='-') then pc:=7;

if (basili[1]='o') and (basili[4]='o') and (basili[7]='-') then pc:=7;


if (basili[4]='o') and (basili[7]='o') and (basili[1]='-') then pc:=1;
if (basili[2]='o') and (basili[5]='o') and (basili[8]='-') then pc:=8;
if (basili[5]='o') and (basili[8]='o') and (basili[2]='-') then pc:=2;
if (basili[3]='o') and (basili[6]='o') and (basili[9]='-') then pc:=9;
if (basili[6]='o') and (basili[9]='o') and (basili[3]='-') then pc:=3;

if (basili[1]='o') and (basili[5]='o') and (basili[9]='-') then pc:=9;


if (basili[5]='o') and (basili[9]='o') and (basili[1]='-') then pc:=1;
if (basili[3]='o') and (basili[5]='o') and (basili[7]='-') then pc:=7;
if (basili[7]='o') and (basili[5]='o') and (basili[3]='-') then pc:=3;

if (basili[1]='o') and (basili[3]='o') and (basili[2]='-') then pc:=2;


if (basili[1]='o') and (basili[7]='o') and (basili[4]='-') then pc:=4;
if (basili[3]='o') and (basili[9]='o') and (basili[6]='-') then pc:=6;
if (basili[7]='o') and (basili[9]='o') and (basili[7]='-') then pc:=8;

if (basili[4]='o') and (basili[6]='o') and (basili[5]='-') then pc:=5;


if (basili[2]='o') and (basili[8]='o') and (basili[5]='-') then pc:=5;

if (basili[1]='o') and (basili[9]='o') and (basili[5]='-') then pc:=5;


if (basili[3]='o') and (basili[7]='o') and (basili[5]='-') then pc:=5;
end; //üst kısımda o harfi kullanıyoruz, sıfır değil...

if pc = 0 then pc:=topcheck();

if pc = 1 then
begin
basili[1]:='o';
beep;
134

SpeedButton1.Enabled:=false;
SpeedButton1.Glyph.loadfromfile('o.bmp');
end;
if pc = 2 then
begin
basili[2]:='o';
beep;
SpeedButton2.Enabled:=false;
SpeedButton2.Glyph.loadfromfile('o.bmp');
end;
if pc = 3 then
begin
basili[3]:='o';
beep;
SpeedButton3.Enabled:=false;
SpeedButton3.Glyph.loadfromfile('o.bmp');
end;
if pc = 4 then
begin
basili[4]:='o';
beep;
SpeedButton4.Enabled:=false;
SpeedButton4.Glyph.loadfromfile('o.bmp');
end;
if pc = 5 then
begin
basili[5]:='o';
beep;
SpeedButton5.Enabled:=false;
SpeedButton5.Glyph.loadfromfile('o.bmp');
end;
if pc = 6 then
begin
basili[6]:='o';
beep;
SpeedButton6.Enabled:=false;
SpeedButton6.Glyph.loadfromfile('o.bmp');
end;
if pc = 7 then
begin
basili[7]:='o';
beep;
SpeedButton7.Enabled:=false;
SpeedButton7.Glyph.loadfromfile('o.bmp');
end;
if pc = 8 then
begin
basili[8]:='o';
beep;
SpeedButton8.Enabled:=false;
SpeedButton8.Glyph.loadfromfile('o.bmp');
end;
if pc = 9 then
begin
basili[9]:='o';
beep;
SpeedButton9.Enabled:=false;
SpeedButton9.Glyph.loadfromfile('o.bmp');
end;
if (basili[1]='o') and (basili[2]='o') and (basili[3]='o') then
begin
inc(loses);
label1.Caption:=format('%2d win(s), %2d lose(s), %2d deuce(s)',[wins,loses,deuces]);
Application.MessageBox('Lose!',':(((((',0);
disable;exit;
end;
135

if (basili[1]='o') and (basili[4]='o') and (basili[7]='o') then


begin
inc(loses);
label1.Caption:=format('%2d win(s), %2d lose(s), %2d deuce(s)',[wins,loses,deuces]);
Application.MessageBox('Lose!',':(((((',0);
disable;exit;
end;
if (basili[7]='o') and (basili[8]='o') and (basili[9]='o') then
begin
inc(loses);
label1.Caption:=format('%2d win(s), %2d lose(s), %2d deuce(s)',[wins,loses,deuces]);
Application.MessageBox('Lose!',':(((((',0);
disable;exit;
end;
if (basili[3]='o') and (basili[6]='o') and (basili[9]='o') then
begin
inc(loses);
label1.Caption:=format('%2d win(s), %2d lose(s), %2d deuce(s)',[wins,loses,deuces]);
Application.MessageBox('Lose!',':(((((',0);
disable;exit;
end;
if (basili[1]='o') and (basili[5]='o') and (basili[9]='o') then
begin
inc(loses);
label1.Caption:=format('%2d win(s), %2d lose(s), %2d deuce(s)',[wins,loses,deuces]);
Application.MessageBox('Lose!',':(((((',0);
disable;exit;
end;
if (basili[3]='o') and (basili[5]='o') and (basili[7]='o') then
begin
inc(loses);
label1.Caption:=format('%2d win(s), %2d lose(s), %2d deuce(s)',[wins,loses,deuces]);
Application.MessageBox('Lose!',':(((((',0);
disable;exit;
end;
if (basili[2]='o') and (basili[5]='o') and (basili[8]='o') then
begin
inc(loses);
label1.Caption:=format('%2d win(s), %2d lose(s), %2d deuce(s)',[wins,loses,deuces]);
Application.MessageBox('Lose!',':(((((',0);
disable;exit;
end;
if (basili[4]='o') and (basili[5]='o') and (basili[6]='o') then
begin
inc(loses);
label1.Caption:=format('%2d win(s), %2d lose(s), %2d deuce(s)',[wins,loses,deuces]);
Application.MessageBox('Lose!',':(((((',0);
disable;exit;
end;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);


var i:byte;
begin
for i:= 1 to 9 do basili[i]:='-';
SpeedButton1.Glyph.LoadFromFile('bos.bmp');
SpeedButton2.Glyph.LoadFromFile('bos.bmp');
SpeedButton3.Glyph.LoadFromFile('bos.bmp');
SpeedButton4.Glyph.LoadFromFile('bos.bmp');
SpeedButton5.Glyph.LoadFromFile('bos.bmp');
SpeedButton6.Glyph.LoadFromFile('bos.bmp');
SpeedButton7.Glyph.LoadFromFile('bos.bmp');
SpeedButton8.Glyph.LoadFromFile('bos.bmp');
SpeedButton9.Glyph.LoadFromFile('bos.bmp');
SpeedButton1.Enabled:=true;
SpeedButton2.Enabled:=true;
136

SpeedButton3.Enabled:=true;
SpeedButton4.Enabled:=true;
SpeedButton5.Enabled:=true;
SpeedButton6.Enabled:=true;
SpeedButton7.Enabled:=true;
SpeedButton8.Enabled:=true;
SpeedButton9.Enabled:=true;
end;

procedure TForm1.FormCreate(Sender: TObject);


begin
Randomize;
BitBtn2.Click;
sirakimde:=true;
label1.Caption:=format('%2d win(s), %2d lose(s), %2d deuce(s)',[ wins , loses , deuces ] );
panel1.Caption:= 'TicTocToe Game by E_xplorer 2001';
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;


Shift: TShiftState; X, Y: Integer);
const
SC_DragMove = $F012;
begin
ReleaseCapture;
FORM1.perform(WM_SysCommand, SC_DragMove, 0);
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);


begin
basili[1]:='x';
beep;
SpeedButton1.Enabled:=false;
SpeedButton1.Glyph.loadfromfile('x.bmp');
sirakimde:=false;
kontrol;
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);


begin
basili[2]:='x';
beep;
SpeedButton2.Enabled:=false;
SpeedButton2.Glyph.loadfromfile('x.bmp');
sirakimde:=false;
kontrol;
end;

procedure TForm1.SpeedButton3Click(Sender: TObject);


begin
basili[3]:='x';
beep;
SpeedButton3.Enabled:=false;
SpeedButton3.Glyph.loadfromfile('x.bmp');
sirakimde:=false;
kontrol;
end;

procedure TForm1.SpeedButton4Click(Sender: TObject);


begin
basili[4]:='x';
beep;
SpeedButton4.Enabled:=false;
SpeedButton4.Glyph.loadfromfile('x.bmp');
sirakimde:=false;
kontrol;
end;
137

procedure TForm1.SpeedButton5Click(Sender: TObject);


begin
basili[5]:='x';
beep;
SpeedButton5.Enabled:=false;
SpeedButton5.Glyph.loadfromfile('x.bmp');
sirakimde:=false;
kontrol;
end;

procedure TForm1.SpeedButton6Click(Sender: TObject);


begin
basili[6]:='x';
beep;
SpeedButton6.Enabled:=false;
SpeedButton6.Glyph.loadfromfile('x.bmp');
sirakimde:=false;
kontrol;
end;

procedure TForm1.SpeedButton7Click(Sender: TObject);


begin
basili[7]:='x';
beep;
SpeedButton7.Enabled:=false;
SpeedButton7.Glyph.loadfromfile('x.bmp');
sirakimde:=false;
kontrol;
end;

procedure TForm1.SpeedButton8Click(Sender: TObject);


begin
basili[8]:='x';
beep;
SpeedButton8.Enabled:=false;
SpeedButton8.Glyph.loadfromfile('x.bmp');
sirakimde:=false;
kontrol;
end;

procedure TForm1.SpeedButton9Click(Sender: TObject);


begin
basili[9]:='x';
beep;
SpeedButton9.Enabled:=false;
SpeedButton9.Glyph.loadfromfile('x.bmp');
sirakimde:=false;
kontrol;
end;
end.

50x50 ™lŒeğinde x.bmp, o.bmp ve bos.bmp oluĢturuyoruz. Bunlar× isterseniz Delphi‟nin yard×mc×
programlar×ndan olan Image Editor ile rahatl×kla yapabilirsiniz. Webdings fontundaki  (r harfi) ve  (y harfi)
simgeleri de resim gibi kullan×labilir. Flat – džz ™zelliği nedeni ile 3x3 dizi halinde dokuz adet SpeedButton
kullan×yoruz. As×l oyunda kullan×c× ve bilgisayar×n Ģekilleri her oyunda yer değiĢtiriyor, fakat fazla uğraĢmadan
kullan×c×ya “x”, bilgisayara da “o” iĢaretini ay×rd×m. Kod k×sm× yine Œok uzun gelebilir. Bilgisayara iyi džĢžnmeyi
™ğretmek zordur, fakat ™ğrenince de o asla hata yapmaz. Eminim siz daha k×sa ve optimum kod žretebilirsiniz.

Yine benzer bir mant×k ile Puzzle isimli bir bulmaca oyunu yapabilirsiniz. Delphi 5 dili kullanarak yapt×ğ×m
projeyi CD‟de “Ornekler\Delphi\Pazl\Project2.dpr” ad× ile bulabilirsiniz. Temel mant×k boĢ hžcreyi kullanarak, rasgele
dizilmiĢ hžcreleri s×ralamak. Program k×sm× yine Œok uzun, fakat asl×nda sadece SpeedButton nesnelerinin Caption
™zellikleri ile oynay×p sonuca var×yoruz. Hangisi t×klanm×Ģ ise etraf×nda boĢ hžcre var m× Ģeklinde kontrol yap×s× var.
Ġsterseniz rakamlar× dizmek yerine bir resmi birleĢtirmek daha zevkli ve daha zorlay×c× olabilir. “Ornekler\Delphi\Pazl\
resim\Project2.dpr” bunun resimli hali diyebiliriz.
138

Resim 22b – Puzzle Oyunumuzun ekran g™ržntžsž

Form žzerinde 4x4 yani 16 adet SpeedButton oyun hžcresi iŒin, 2 adet SpeedButton menž iŒin ve bir adet de
Timer1 nesnesi var. Timer1 ile kazanma an× ve sžre kontrol ediliyor.

Kodlar×m×z:

unit Unit1; procedure SpeedButton12Click(Sender: TObject);


interface procedure SpeedButton5Click(Sender: TObject);
uses procedure SpeedButton6Click(Sender: TObject);
Windows, Messages, SysUtils, Classes, Graphics, procedure SpeedButton7Click(Sender: TObject);
Controls, Forms, Dialogs, ExtCtrls, Buttons, StdCtrls; procedure SpeedButton8Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
type procedure SpeedButton2Click(Sender: TObject);
TForm1 = class(TForm) procedure SpeedButton3Click(Sender: TObject);
Panel1: TPanel; procedure SpeedButton4Click(Sender: TObject);
SpeedButton1: TSpeedButton; procedure Timer1Timer(Sender: TObject);
SpeedButton2: TSpeedButton; private
SpeedButton3: TSpeedButton; { Private declarations }
SpeedButton4: TSpeedButton; public
SpeedButton5: TSpeedButton; { Public declarations }
SpeedButton6: TSpeedButton; end;
SpeedButton7: TSpeedButton; type //kendi değişken tipimizi oluşturuyoruz
SpeedButton8: TSpeedButton; hucre=record
SpeedButton9: TSpeedButton; deger:integer;
SpeedButton10: TSpeedButton; bos:boolean;
SpeedButton11: TSpeedButton; end;
SpeedButton12: TSpeedButton; var
SpeedButton13: TSpeedButton; Form1: TForm1;
SpeedButton14: TSpeedButton; dizi:array [1..16] of hucre; //16 adet hücre var
SpeedButton15: TSpeedButton; sayac:byte;
SpeedButton16: TSpeedButton; zaman:TTime;
SpeedButton17: TSpeedButton; implementation
SpeedButton18: TSpeedButton;
Timer1: TTimer; {$R *.DFM}
procedure SpeedButton16Click(Sender: TObject); procedure TForm1.SpeedButton16Click(Sender: TObject);
procedure SpeedButton17Click(Sender: TObject); begin close end;
procedure FormCreate(Sender: TObject);
procedure SpeedButton15Click(Sender: TObject); procedure tusdoldur;
procedure SpeedButton18Click(Sender: TObject); //rakamların sadece bir kere çıkabilmesi için
procedure SpeedButton14Click(Sender: TObject); var a:integer;
procedure SpeedButton13Click(Sender: TObject); begin
procedure SpeedButton9Click(Sender: TObject); repeat
procedure SpeedButton10Click(Sender: TObject); a:=random(15)+1;
procedure SpeedButton11Click(Sender: TObject); if dizi[a].bos then
139

begin begin
dizi[a].bos:=false; if SpeedButton12.Caption=' ' then
dizi[a].deger:=sayac; begin
inc(sayac); SpeedButton12.Caption:=SpeedButton18.Caption;
end SpeedButton18.Caption:=' ';
else tusdoldur; end
until sayac=16; else
end; if SpeedButton15.Caption=' ' then
begin
procedure TForm1.SpeedButton17Click(Sender: TObject); SpeedButton15.Caption:=SpeedButton18.Caption;
var i:integer; SpeedButton18.Caption:=' ';
begin end;
sayac:=1; end;
dizi[1].bos:=true;dizi[2].bos:=true;dizi[3].bos:=true;
dizi[4].bos:=true;dizi[5].bos:=true;dizi[6].bos:=true; procedure TForm1.SpeedButton14Click(Sender: TObject);
dizi[7].bos:=true;dizi[8].bos:=true;dizi[9].bos:=true; begin
dizi[10].bos:=true;dizi[11].bos:=true;dizi[12].bos:=true; if SpeedButton13.Caption=' ' then
dizi[13].bos:=true;dizi[14].bos:=true;dizi[15].bos:=true; begin
dizi[16].bos:=true; SpeedButton13.Caption:=SpeedButton14.Caption;
tusdoldur; SpeedButton14.Caption:=' ';
SpeedButton1.Caption:=inttostr(dizi[1].deger); end else
SpeedButton2.Caption:=inttostr(dizi[2].deger); if SpeedButton10.Caption=' ' then
SpeedButton3.Caption:=inttostr(dizi[3].deger); begin
SpeedButton4.Caption:=inttostr(dizi[4].deger); SpeedButton10.Caption:=SpeedButton14.Caption;
SpeedButton5.Caption:=inttostr(dizi[5].deger); SpeedButton14.Caption:=' ';
SpeedButton6.Caption:=inttostr(dizi[6].deger); end else
SpeedButton7.Caption:=inttostr(dizi[7].deger); if SpeedButton15.Caption=' ' then
SpeedButton8.Caption:=inttostr(dizi[8].deger); begin
SpeedButton9.Caption:=inttostr(dizi[9].deger); SpeedButton15.Caption:=SpeedButton14.Caption;
SpeedButton10.Caption:=inttostr(dizi[10].deger); SpeedButton14.Caption:=' ';
SpeedButton11.Caption:=inttostr(dizi[11].deger); end;
SpeedButton12.Caption:=inttostr(dizi[12].deger); end;
SpeedButton13.Caption:=inttostr(dizi[13].deger);
SpeedButton14.Caption:=inttostr(dizi[14].deger); procedure TForm1.SpeedButton13Click(Sender: TObject);
SpeedButton15.Caption:=inttostr(dizi[15].deger); begin
SpeedButton18.Caption:=' '; if SpeedButton9.Caption=' ' then
timer1.Enabled:=true; begin
zaman:=now(); SpeedButton9.Caption:=SpeedButton13.Caption;
end; SpeedButton13.Caption:=' ';
end else
procedure TForm1.FormCreate(Sender: TObject); if SpeedButton14.Caption=' ' then
begin begin
Randomize;Application.HintColor:=clyellow; SpeedButton14.Caption:=SpeedButton13.Caption;
end; SpeedButton13.Caption:=' ';
end;
procedure TForm1.SpeedButton15Click(Sender: TObject); end;
begin
if SpeedButton18.Caption=' ' then procedure TForm1.SpeedButton9Click(Sender: TObject);
//iki tek tırnak aralarını hep bir boşluk ile doldurun... begin
begin if SpeedButton5.Caption=' ' then
SpeedButton18.Caption:=SpeedButton15.Caption; begin
SpeedButton15.Caption:=' '; SpeedButton5.Caption:=SpeedButton9.Caption;
end else SpeedButton9.Caption:=' ';
if SpeedButton11.Caption=' ' then end else
begin if SpeedButton10.Caption=' ' then
SpeedButton11.Caption:=SpeedButton15.Caption; begin
SpeedButton15.Caption:=' '; SpeedButton10.Caption:=SpeedButton9.Caption;
end else SpeedButton9.Caption:=' ';
if SpeedButton14.Caption=' ' then end else
begin if SpeedButton13.Caption=' ' then
SpeedButton14.Caption:=SpeedButton15.Caption; begin
SpeedButton15.Caption:=' '; SpeedButton13.Caption:=SpeedButton9.Caption;
end; SpeedButton9.Caption:=' ';
end; end;
end;
procedure TForm1.SpeedButton18Click(Sender: TObject);
140

procedure TForm1.SpeedButton10Click(Sender: TObject);


begin procedure TForm1.SpeedButton5Click(Sender: TObject);
if SpeedButton6.Caption=' ' then begin
begin if SpeedButton1.Caption=' ' then
SpeedButton6.Caption:=SpeedButton10.Caption; begin
SpeedButton10.Caption:=' '; SpeedButton1.Caption:=SpeedButton5.Caption;
end else SpeedButton5.Caption:=' ';
if SpeedButton9.Caption=' ' then End else
begin if SpeedButton6.Caption=' ' then
SpeedButton9.Caption:=SpeedButton10.Caption; begin
SpeedButton10.Caption:=' '; SpeedButton6.Caption:=SpeedButton5.Caption;
end else SpeedButton5.Caption:=' ';
if SpeedButton11.Caption=' ' then End else
begin if SpeedButton9.Caption=' ' then
SpeedButton11.Caption:=SpeedButton10.Caption; begin
SpeedButton10.Caption:=' '; SpeedButton9.Caption:=SpeedButton5.Caption;
end else SpeedButton5.Caption:=' ';
if SpeedButton14.Caption=' ' then end;
begin end;
SpeedButton14.Caption:=SpeedButton10.Caption;
SpeedButton10.Caption:=' '; procedure TForm1.SpeedButton6Click(Sender: TObject);
end; begin
end; if SpeedButton2.Caption=' ' then
begin
procedure TForm1.SpeedButton11Click(Sender: TObject); SpeedButton2.Caption:=SpeedButton6.Caption;
begin SpeedButton6.Caption:=' ';
if SpeedButton7.Caption=' ' then End else
begin if SpeedButton5.Caption=' ' then
SpeedButton7.Caption:=SpeedButton11.Caption; begin
SpeedButton11.Caption:=' '; SpeedButton5.Caption:=SpeedButton6.Caption;
End else SpeedButton6.Caption:=' ';
if SpeedButton10.Caption=' ' then End else
begin if SpeedButton7.Caption=' ' then
SpeedButton10.Caption:=SpeedButton11.Caption; begin
SpeedButton11.Caption:=' '; SpeedButton7.Caption:=SpeedButton6.Caption;
End else SpeedButton6.Caption:=' ';
if SpeedButton12.Caption=' ' then End else
begin if SpeedButton10.Caption=' ' then
SpeedButton12.Caption:=SpeedButton11.Caption; begin
SpeedButton11.Caption:=' '; SpeedButton10.Caption:=SpeedButton6.Caption;
End else SpeedButton6.Caption:=' ';
if SpeedButton15.Caption=' ' then end;
begin end;
SpeedButton15.Caption:=SpeedButton11.Caption;
SpeedButton11.Caption:=' '; procedure TForm1.SpeedButton7Click(Sender: TObject);
end; begin
end; if SpeedButton3.Caption=' ' then
begin
procedure TForm1.SpeedButton12Click(Sender: TObject); SpeedButton3.Caption:=SpeedButton7.Caption;
begin SpeedButton7.Caption:=' ';
if SpeedButton8.Caption=' ' then End else
begin if SpeedButton6.Caption=' ' then
SpeedButton8.Caption:=SpeedButton12.Caption; begin
SpeedButton12.Caption:=' '; SpeedButton6.Caption:=SpeedButton7.Caption;
End else SpeedButton7.Caption:=' ';
if SpeedButton11.Caption=' ' then End else
begin if SpeedButton8.Caption=' ' then
SpeedButton11.Caption:=SpeedButton12.Caption; begin
SpeedButton12.Caption:=' '; SpeedButton8.Caption:=SpeedButton7.Caption;
End else SpeedButton7.Caption:=' ';
if SpeedButton18.Caption=' ' then End else
begin if SpeedButton11.Caption=' ' then
SpeedButton18.Caption:=SpeedButton12.Caption; begin
SpeedButton12.Caption:=' '; SpeedButton11.Caption:=SpeedButton7.Caption;
end; SpeedButton7.Caption:=' ';
end; end;
141

end; begin
SpeedButton2.Caption:=SpeedButton3.Caption;
procedure TForm1.SpeedButton8Click(Sender: TObject); SpeedButton3.Caption:=' ';
begin End else
if SpeedButton4.Caption=' ' then if SpeedButton4.Caption=' ' then
begin begin
SpeedButton4.Caption:=SpeedButton8.Caption; SpeedButton4.Caption:=SpeedButton3.Caption;
SpeedButton8.Caption:=' '; SpeedButton3.Caption:=' ';
End else End else
if SpeedButton7.Caption=' ' then if SpeedButton7.Caption=' ' then
begin begin
SpeedButton7.Caption:=SpeedButton8.Caption; SpeedButton7.Caption:=SpeedButton3.Caption;
SpeedButton8.Caption:=' '; SpeedButton3.Caption:=' ';
End else end;
if SpeedButton12.Caption=' ' then end;
begin
SpeedButton12.Caption:=SpeedButton8.Caption; procedure TForm1.SpeedButton4Click(Sender: TObject);
SpeedButton8.Caption:=' '; begin
end; if SpeedButton3.Caption=' ' then
end; begin
SpeedButton3.Caption:=SpeedButton4.Caption;
procedure TForm1.SpeedButton1Click(Sender: TObject); SpeedButton4.Caption:=' ';
begin End else
if SpeedButton2.Caption=' ' then if SpeedButton8.Caption=' ' then
begin begin
SpeedButton2.Caption:=SpeedButton1.Caption; SpeedButton8.Caption:=SpeedButton4.Caption;
SpeedButton1.Caption:=' '; SpeedButton4.Caption:=' ';
End else end;
if SpeedButton5.Caption=' ' then end;
begin
SpeedButton5.Caption:=SpeedButton1.Caption; procedure TForm1.Timer1Timer(Sender: TObject);
SpeedButton1.Caption:=' '; begin
end; form1.Caption:='Puzzle - ' + TimeToStr(now-zaman);
end; if (SpeedButton1.Caption='1')and
(SpeedButton2.Caption='2')
procedure TForm1.SpeedButton2Click(Sender: TObject); and(SpeedButton3.Caption='3')and
begin (SpeedButton4.Caption='4')
if SpeedButton1.Caption=' ' then and(SpeedButton5.Caption='5')and
begin (SpeedButton6.Caption='6')
SpeedButton1.Caption:=SpeedButton2.Caption; and(SpeedButton7.Caption='7')and
SpeedButton2.Caption:=' '; (SpeedButton8.Caption='8')
End else and(SpeedButton9.Caption='9')and
if SpeedButton3.Caption=' ' then (SpeedButton10.Caption='10')
begin and(SpeedButton11.Caption='11')and
SpeedButton3.Caption:=SpeedButton2.Caption; (SpeedButton12.Caption='12')
SpeedButton2.Caption:=' '; and(SpeedButton13.Caption='13')and
End else (SpeedButton14.Caption='14')
if SpeedButton6.Caption=' ' then and(SpeedButton15.Caption='15')and
begin (SpeedButton18.Caption=' ')
SpeedButton6.Caption:=SpeedButton2.Caption; then begin
SpeedButton2.Caption:=' '; timer1.Enabled:=false;
end; form1.Caption:='Puzzle - ' + TimeToStr(now-zaman);
ShowMessage('Finished!..');
end; end;
end;
procedure TForm1.SpeedButton3Click(Sender: TObject);
begin end.
if SpeedButton2.Caption=' ' then

S×rada Windows ile gelen oyunlardan May×n Oyunu‟na benzer bir oyunumuz var. Tek eksiği boĢ hžcrelerin
etraf×ndaki boĢ olan diğer hžcreleri patlatmamak. Form žzerinde 5x5 yani 25 adet SpeedButton, bit Timer1 ve bir
MainMenu1 bulunuyor. SpeedButton‟a resim, oyuna da ses efektleri eklenebilir. Sžre ™lŒžmž ve buna g™re
oynayanlar×n rekor sžrenin s×ralanmas× da oyunu daha hoĢ hale getirir. Delphi 5 dili kullanarak yapt×ğ×m projeyi CD‟de
“Ornekler\Delphi\Mayn\mayn.dpr” ad× ile bulabilirsiniz. Tžm SpeedButton‟lar×n OnClick olay× SpeedButton1‟e
y™nlendirilmiĢ durumda. “Form1.Components” komutu iŒin gžzel bir uygulama...
142

Resim 22c – May×n Oyunumuzun ekran g™ržntžsž

Kodlar:

unit Unit1; procedure Timer1Timer(Sender: TObject);


private
interface { Private declarations }
public
uses { Public declarations }
Windows, Messages, SysUtils, Classes, Graphics, end;
Controls, Forms, Dialogs, type
Menus, ExtCtrls, Buttons, StdCtrls; hucre=record
deger:integer;
type bos:boolean;
TForm1 = class(TForm) end;
Panel1: TPanel;
SpeedButton1: TSpeedButton; var
Timer1: TTimer; Form1: TForm1;
MainMenu1: TMainMenu; dizi:array[1..25] of hucre;
SpeedButton2: TSpeedButton; sayac,b:byte;
SpeedButton3: TSpeedButton; zaman:TTime;
SpeedButton4: TSpeedButton;
SpeedButton5: TSpeedButton; implementation
SpeedButton6: TSpeedButton;
SpeedButton7: TSpeedButton; {$R *.DFM}
SpeedButton8: TSpeedButton;
SpeedButton9: TSpeedButton; procedure tusdoldur;
SpeedButton10: TSpeedButton; var a:integer;
SpeedButton11: TSpeedButton; begin
SpeedButton12: TSpeedButton; repeat
SpeedButton13: TSpeedButton; a:=random(24)+1;
SpeedButton14: TSpeedButton; if dizi[a].bos then
SpeedButton15: TSpeedButton; begin
SpeedButton16: TSpeedButton; dizi[a].bos:=false;
SpeedButton17: TSpeedButton; dizi[a].deger:=a;
SpeedButton18: TSpeedButton; inc(b);
SpeedButton19: TSpeedButton; inc(sayac)
SpeedButton20: TSpeedButton; end
SpeedButton21: TSpeedButton; else
SpeedButton22: TSpeedButton; tusdoldur;
SpeedButton23: TSpeedButton; until (sayac=25) or (b=5);
SpeedButton24: TSpeedButton; end;
SpeedButton25: TSpeedButton;
Dosya1: TMenuItem; function adrakam(ad:string):integer;
Yeni1: TMenuItem; var gecici:string;i:integer;
Kapat1: TMenuItem; begin
Label1: TLabel; for i:=length(ad) downto 0 do begin
BitBtn1: TBitBtn; if ad[i] in ['0'..'9'] then
procedure Kapat1Click(Sender: TObject); gecici:=ad[i]+gecici;
procedure SpeedButton1Click(Sender: TObject); end;
procedure FormCreate(Sender: TObject); adrakam:=strtoint(gecici);
143

end;
13:toplam:=ord(dizi[7].deger<>0)+ord(dizi[8].deger<>0)+
procedure TForm1.Kapat1Click(Sender: TObject); ord(dizi[9].deger<>0)+ord(dizi[12].deger<>0)+
begin ord(dizi[14].deger<>0)+ord(dizi[17].deger<>0)+
close ord(dizi[18].deger<>0)+
end; ord(dizi[19].deger<>0);

function kontrol(gecici:string):integer; 14:toplam:=ord(dizi[8].deger<>0)+ord(dizi[9].deger<>0)+


var toplam:integer; ord(dizi[10].deger<>0)+ord(dizi[13].deger<>0)+
begin ord(dizi[15].deger<>0)+ord(dizi[18].deger<>0)+
toplam:=0; //komşuların boş olanları kaç adet? ord(dizi[19].deger<>0)+
case strtoint(gecici) of ord(dizi[20].deger<>0);

1:toplam:=ord(dizi[2].deger<>0)+ord(dizi[6].deger<>0)+ 15:toplam:=ord(dizi[9].deger<>0)+ord(dizi[10].deger<>0)+
ord(dizi[7].deger<>0); ord(dizi[14].deger<>0)+ord(dizi[19].deger<>0)+
ord(dizi[20].deger<>0);
2:toplam:=ord(dizi[1].deger<>0)+ord(dizi[6].deger<>0)+
ord(dizi[7].deger<>0)+ord(dizi[8].deger<>0)+ 16:toplam:=ord(dizi[11].deger<>0)+ord(dizi[12].deger<>0)+
ord(dizi[3].deger<>0); ord(dizi[17].deger<>0)+ord(dizi[21].deger<>0)+
ord(dizi[22].deger<>0);
3:toplam:=ord(dizi[2].deger<>0)+ord(dizi[4].deger<>0)+
ord(dizi[7].deger<>0)+ord(dizi[8].deger<>0)+ 17:toplam:=ord(dizi[11].deger<>0)+ord(dizi[12].deger<>0)+
ord(dizi[9].deger<>0); ord(dizi[13].deger<>0)+ord(dizi[16].deger<>0)+
ord(dizi[18].deger<>0)+ord(dizi[21].deger<>0)+
4:toplam:=ord(dizi[3].deger<>0)+ord(dizi[5].deger<>0)+ ord(dizi[22].deger<>0)+
ord(dizi[8].deger<>0)+ord(dizi[9].deger<>0)+ ord(dizi[23].deger<>0);
ord(dizi[10].deger<>0);
18:toplam:=ord(dizi[12].deger<>0)+ord(dizi[13].deger<>0)+
5:toplam:=ord(dizi[4].deger<>0)+ord(dizi[9].deger<>0)+ ord(dizi[14].deger<>0)+ord(dizi[17].deger<>0)+
ord(dizi[10].deger<>0); ord(dizi[19].deger<>0)+ord(dizi[22].deger<>0)+
ord(dizi[23].deger<>0)+
6:toplam:=ord(dizi[1].deger<>0)+ord(dizi[2].deger<>0)+ ord(dizi[24].deger<>0);
ord(dizi[7].deger<>0)+ord(dizi[11].deger<>0)+
ord(dizi[12].deger<>0); 19:toplam:=ord(dizi[13].deger<>0)+ord(dizi[14].deger<>0)+
ord(dizi[15].deger<>0)+ord(dizi[18].deger<>0)+
7:toplam:=ord(dizi[1].deger<>0)+ord(dizi[2].deger<>0)+ ord(dizi[20].deger<>0)+ord(dizi[23].deger<>0)+
ord(dizi[3].deger<>0)+ord(dizi[6].deger<>0)+ ord(dizi[24].deger<>0)+
ord(dizi[11].deger<>0)+ord(dizi[12].deger<>0)+ ord(dizi[25].deger<>0);
ord(dizi[13].deger<>0)+
ord(dizi[8].deger<>0); 20:toplam:=ord(dizi[14].deger<>0)+ord(dizi[15].deger<>0)+
ord(dizi[19].deger<>0)+ord(dizi[24].deger<>0)+
8:toplam:=ord(dizi[2].deger<>0)+ord(dizi[3].deger<>0)+ ord(dizi[25].deger<>0);
ord(dizi[4].deger<>0)+ord(dizi[7].deger<>0)+
ord(dizi[9].deger<>0)+ord(dizi[12].deger<>0)+ 21:toplam:=ord(dizi[16].deger<>0)+ord(dizi[17].deger<>0)+
ord(dizi[13].deger<>0)+ ord(dizi[22].deger<>0);
ord(dizi[14].deger<>0);
22:toplam:=ord(dizi[16].deger<>0)+ord(dizi[17].deger<>0)+
9:toplam:=ord(dizi[3].deger<>0)+ord(dizi[4].deger<>0)+ ord(dizi[18].deger<>0)+ord(dizi[21].deger<>0)+
ord(dizi[5].deger<>0)+ord(dizi[8].deger<>0)+ ord(dizi[23].deger<>0);
ord(dizi[10].deger<>0)+ord(dizi[15].deger<>0)+
ord(dizi[13].deger<>0)+ 23:toplam:=ord(dizi[17].deger<>0)+ord(dizi[18].deger<>0)+
ord(dizi[14].deger<>0); ord(dizi[19].deger<>0)+ord(dizi[22].deger<>0)+
ord(dizi[24].deger<>0);
10:toplam:=ord(dizi[4].deger<>0)+ord(dizi[5].deger<>0)+
ord(dizi[9].deger<>0)+ord(dizi[14].deger<>0)+ 24:toplam:=ord(dizi[18].deger<>0)+ord(dizi[19].deger<>0)+
ord(dizi[15].deger<>0); ord(dizi[20].deger<>0)+ord(dizi[23].deger<>0)+
ord(dizi[25].deger<>0);
11:toplam:=ord(dizi[6].deger<>0)+ord(dizi[7].deger<>0)+
ord(dizi[12].deger<>0)+ord(dizi[16].deger<>0)+ 25:toplam:=ord(dizi[19].deger<>0)+ord(dizi[20].deger<>0)+
ord(dizi[17].deger<>0); ord(dizi[24].deger<>0);
end;
12:toplam:=ord(dizi[6].deger<>0)+ord(dizi[7].deger<>0)+ kontrol:=toplam;
ord(dizi[8].deger<>0)+ord(dizi[11].deger<>0)+ end;
ord(dizi[13].deger<>0)+ord(dizi[16].deger<>0)+
ord(dizi[17].deger<>0)+ procedure TForm1.SpeedButton1Click(Sender: TObject);
ord(dizi[18].deger<>0); var ad,gecici:string;i,sil:integer;
144

begin (sender as TSpeedButton).caption:='X';


if timer1.Enabled=false then begin MessageBeep(11);
timer1.Enabled:=true; for i:=0 to ComponentCount-1 do
zaman:=now(); begin
end; if components[i] is TSpeedButton then begin
ad:=(sender as Tspeedbutton).name; (components[i] as TSpeedButton).enabled:=false;
//basılan tuşun numarasını al... sil:=adrakam( (components[i] as
for i:=length(ad) downto 0 do begin TSpeedButton).name);
if ad[i] in ['0'..'9'] then if dizi[sil].bos=false then (components[i] as
gecici:=ad[i]+gecici; TSpeedButton).caption:='X';
end; end;
end;
if dizi[strtoint(gecici)].deger=0 then timer1.Enabled:=false;
//mayına mı bastın? label1.caption:='Kaybettin...';
begin end;
if kontrol(gecici)=0 then //patlat... end;
begin
//under construction !?! procedure TForm1.FormCreate(Sender: TObject);
end; var i:integer;
(sender as begin
TSpeedButton).caption:=inttostr(kontrol(gecici)); randomize;
MessageBeep(1111); b:=0;
sil:=0; sayac:=0;
for i:=0 to ComponentCount-1 do label1.Caption:='';
//kaç tane boş kaldı? for i:=1 to 25 do begin
if components[i] is TSpeedButton then dizi[i].bos:=true;
if (components[i] as TSpeedButton).caption='' then dizi[i].deger:=0;
inc(sil); end;
if sil=5 then begin tusdoldur;
label1.caption:=label1.caption+#13+'KAZANDIN...'; for i:=0 to ComponentCount-1 do
timer1.Enabled:=false; begin
for i:=0 to ComponentCount-1 do //iş bitti if components[i] is TSpeedButton then begin
begin (components[i] as TSpeedButton).caption:='';
if components[i] is TSpeedButton then begin (components[i] as TSpeedButton).enabled:=true;
(components[i] as TSpeedButton).enabled:=false; end;
sil:=adrakam( (components[i] as end;
TSpeedButton).name); end;
if dizi[sil].bos=false then (components[i] as
TSpeedButton).caption:='X'; procedure TForm1.Timer1Timer(Sender: TObject);
end; begin
end; label1.caption:=timetostr(now()-zaman);
end; end;
end
else end.
begin

Dikkat ederseniz 3x3, 4x4 ve 5x5 hžcreler halinde yapabileceğimiz oyunlardan son oyundaki hžcre say×s×n×n
5x5 ile en fazla olmas×na rağmen kod sat×r say×s× en az. „ğrenmeye Œal×Ģt×ğ×m×z dile ne kadar hakim olabilirsek o
kadar gžzel programlar yazabiliriz. “Diger\Extras\codebankv2.zip” ile kurabileceğiniz Delphi Tžrk Kod Bankas×
program×ndaki say×y× yaz×ya Œevirme algoritmalar×na bakarsan×z, birden fazla ŒeĢit olduklar×n× g™rebilirsiniz. Hem k×sa
hem de gžvenilir kod žretmemiz gereklidir. Bu arada h×z iŒin gžvenlikten ™džn vermek birŒok b™ceğe sebep olabilir.
Hala bizim g™remediğimiz b™cekler, program iŒinde kullan×c×lar iŒin ortaya Œ×kabilir. Tek Œare bol bol tasar×m×m×z×
denemektir.

ark×felek ve birkaŒ tane daha say× bulma oyunu:


145

Resim 22d – Diğer oyunlar


146

15. Gezgen (Windows Gezgini yapımı)


(Ornekler\Delphi\gezgen\Project2.dpr)

Metin, HTML, *.avi ve resim dosyalar×n× g™steren, Windows Gezgini‟nin basit hali. *.tga, *.gif gibi dosyalar×
Image nesnesi desteklemediği halde isterseniz dosyaya sağ t×klay×p “HTML” komutu verebilir ve izleyebilirsiniz. Fakat
Internetten bulabileceğiniz Delphi nesneleri ile diğer dosya uzant×lar×na da (*.mp3, *.mov, *.mpg...) destek
sağlayabilirsiniz. Bir eksik de bul menžsžnžn olmamas×. Belli kriterde arama yaparak o dosyalar× sağ tarafta
kullan×c×ya sunsak iyi olurdu, Delphi ™rneklerinden Dosyalistesi adl× program da kullan×labilir.
“Ornekler\Delphi\Gezgin2\Project1.dpr” ile her iki program×m×z×n birleĢmiĢ halini yapt×k, incelemenizi tavsiye ederim.

Resim 23 – Basit bir gezgin Œal×Ģmas× iĢte...

Nesne ve kodlar×m×z:

object Form1: TForm1 PixelsPerInch = 96


Left = 279 TextHeight = 13
Top = 140 object Splitter1: TSplitter
Width = 579 Left = 177
Height = 481 Top = 0
Caption = 'Gezgen v 1.0 2001' Width = 5
Color = clBtnFace Height = 433
Font.Charset = DEFAULT_CHARSET Cursor = crHSplit
Font.Color = clWindowText Beveled = True
Font.Height = -11 Color = clScrollBar
Font.Name = 'MS Sans Serif' ParentColor = False
Font.Style = [ ] end
OldCreateOrder = False object PageControl1: TPageControl
OnCreate = FormCreate Left = 182
147

Top = 0 object TabSheet5: TTabSheet


Width = 387 Caption = 'Resim'
Height = 433 ImageIndex = 4
ActivePage = TabSheet1 object Image1: TImage
Align = alClient Left = 0
Style = tsFlatButtons Top = 0
TabOrder = 0 Width = 379
object TabSheet1: TTabSheet Height = 421
Caption = 'Text ' Align = alClient
object RichEdit1: TRichEdit end
Left = 0 end
Top = 0 end
Width = 379 object Panel1: TPanel
Height = 402 Left = 0
Align = alClient Top = 0
BorderStyle = bsNone Width = 177
ScrollBars = ssBoth Height = 433
TabOrder = 0 Align = alLeft
end BevelOuter = bvNone
end TabOrder = 1
object TabSheet2: TTabSheet object Splitter2: TSplitter
Caption = 'HTML' Left = 0
ImageIndex = 1 Top = 218
object WebBrowser1: TWebBrowser Width = 177
Left = 0 Height = 5
Top = 0 Cursor = crVSplit
Width = 379 Align = alTop
Height = 421 Beveled = True
Align = alClient Color = clScrollBar
TabOrder = 0 ParentColor = False
ControlData = { end
... object FileListBox1: TFileListBox
} Left = 0
end Top = 223
end Width = 177
object TabSheet3: TTabSheet Height = 196
Caption = 'AVI/Ses' Hint =
ImageIndex = 2 'Shift ve sol tıklayıp dıĢarıya dosyayı açabilirsiniz...|Shift
object Panel2: TPanel ve' +
Left = 0 ' sol tıklama veya sağ tıklayıp "DıĢarıda çalıĢtır" komutu
Top = 41 verebi' +
Width = 379 'lirsiniz.'
Height = 380 Align = alClient
Align = alClient Color = 12615680
BevelOuter = bvNone FileType = [ftReadOnly, ftHidden, ftSystem, ftVolumeID,
Color = clWindow ftArchive, ftNormal]
TabOrder = 0 Font.Charset = TURKISH_CHARSET
end Font.Color = clYellow
object ToolBar1: TToolBar Font.Height = -11
Left = 0 Font.Name = 'Tahoma'
Top = 0 Font.Style = [fsBold]
Width = 379 IntegralHeight = True
Height = 41 ItemHeight = 16
ButtonHeight = 30 ParentFont = False
Caption = 'ToolBar1' ParentShowHint = False
TabOrder = 1 PopupMenu = PopupMenu1
object MediaPlayer1: TMediaPlayer ShowGlyphs = True
Left = 0 ShowHint = True
Top = 2 TabOrder = 0
Width = 253 OnClick = FileListBox1Click
Height = 30 OnMouseDown = FileListBox1MouseDown
Display = Panel2 end
TabOrder = 0 object DirectoryListBox1: TDirectoryListBox
end Left = 0
end Top = 73
end Width = 177
148

Height = 145 Font.Style = [fsBold]


Align = alTop ParentFont = False
Color = 12615680 TabOrder = 0
FileList = FileListBox1 end
Font.Charset = TURKISH_CHARSET object DriveComboBox1: TDriveComboBox
Font.Color = clYellow Left = 0
Font.Height = -11 Top = 21
Font.Name = 'Tahoma' Width = 173
Font.Style = [fsBold] Height = 19
ItemHeight = 16 Hint = 'Sürücü seçimi'
ParentFont = False Color = 12615680
TabOrder = 1 DirList = DirectoryListBox1
OnChange = DirectoryListBox1Change Font.Charset = TURKISH_CHARSET
end Font.Color = clYellow
object CoolBar1: TCoolBar Font.Height = -11
Left = 0 Font.Name = 'Tahoma'
Top = 0 Font.Style = [fsBold]
Width = 177 ParentFont = False
Height = 73 TabOrder = 1
BandBorderStyle = bsNone TextCase = tcUpperCase
Bands = < end
item object CheckBox1: TCheckBox
Break = False Left = 0
Control = FilterComboBox1 Top = 40
FixedSize = True Width = 173
ImageIndex = -1 Height = 29
MinHeight = 21 Hint =
Width = 327 'Resim dosyalarının tam ekran yapma veya orjinal
end boyutunda bırakm' +
item 'a komutu'
Break = False Caption = '&Resimleri sıkıĢtır (stretch)'
Control = DriveComboBox1 ParentShowHint = False
FixedSize = True ShowHint = True
ImageIndex = -1 TabOrder = 2
MinHeight = 19 OnClick = CheckBox1Click
Width = 173 end
end end
item end
Break = False object StatusBar1: TStatusBar
Control = CheckBox1 Left = 0
FixedSize = True Top = 433
ImageIndex = -1 Width = 569
MinHeight = 29 Height = 19
Width = 173 Panels = <
end> item
object FilterComboBox1: TFilterComboBox Text = 'Selam...'
Left = 0 Width = 50
Top = 0 end>
Width = 327 SimplePanel = False
Height = 21 end
Hint = 'Dosya listesini sınırlandırma' object PopupMenu1: TPopupMenu
Color = 12615680 Left = 232
FileList = FileListBox1 Top = 147
Filter = object DosyayAadakiTiplereZorla1: TMenuItem
'Tüm Dosyalar (*.*)|*.*|Text (*.txt;*.rtf;*.ini;*.bat)|*.txt;*.rt' Caption = 'Dosyayı AĢağıdaki Tiplere Zorla'
+ Enabled = False
'f;*.ini;*.bat|HTML (*.htm;*.html)|*.htm;*.html|AVI end
(*.avi)|*.avi' + object Text1: TMenuItem
'|Ses (*.wav;*.mid)|*.wav;*.mid|Resim Caption = '&Text'
(*.bmp;*.jpg;*.jpeg;*.emf;*' + Hint = 'Seçili dosya metin olarak açılmaya zorlanır'
OnClick = Text1Click
'.wmf;*.dib;*.ico)|*.bmp;*.jpg;*.jpeg;*.emf;*.wmf;*.dib;*.ico' end
Font.Charset = TURKISH_CHARSET object HTML1: TMenuItem
Font.Color = clYellow Caption = '&HTML'
Font.Height = -11 Hint = 'Seçili dosya web sayfası olarak açılmaya zorlanır'
Font.Name = 'Tahoma' OnClick = HTML1Click
149

end object N1: TMenuItem


object AVISes1: TMenuItem Caption = '-'
Caption = '&AVI/Ses' end
Hint = 'Seçili dosya ses veya film olarak açılmaya zorlanır' object Daryaaltr1: TMenuItem
OnClick = AVISes1Click Caption = '&DıĢarıda çalıĢtır'
end Hint = 'Windows içinde kayıtlı dosya türü olarak açma
object Resim1: TMenuItem komutu'
Caption = '&Resim' OnClick = Daryaaltr1Click
Hint = 'Seçili dosya resim olarak açılmaya zorlanır' end
OnClick = Resim1Click end
end end

unit Unit1; //---------------kodlar, program buradan başlıyor-----

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Tabs, ComCtrls, ExtCtrls, StdCtrls, FileCtrl, MPlayer, ToolWin, OleCtrls,
SHDocVw, Menus, jpeg;

type
TForm1 = class(TForm)
AVISes1: TMenuItem;
CheckBox1: TCheckBox;
CoolBar1: TCoolBar;
Daryaaltr1: TMenuItem;
DirectoryListBox1: TDirectoryListBox;
DosyayAadakiTiplereZorla1: TMenuItem;
DriveComboBox1: TDriveComboBox;
FileListBox1: TFileListBox;
FilterComboBox1: TFilterComboBox;
HTML1: TMenuItem;
Image1: TImage;
MediaPlayer1: TMediaPlayer;
N1: TMenuItem;
PageControl1: TPageControl;
Panel1: TPanel;
Panel2: TPanel;
PopupMenu1: TPopupMenu;
Resim1: TMenuItem;
RichEdit1: TRichEdit;
Splitter1: TSplitter;
Splitter2: TSplitter;
StatusBar1: TStatusBar;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
TabSheet3: TTabSheet;
TabSheet5: TTabSheet;
Text1: TMenuItem;
ToolBar1: TToolBar;
WebBrowser1: TWebBrowser; //Delphi 3‟de HTML nesnesi bulunuyor...
procedure DirectoryListBox1Change(Sender: TObject);
procedure FileListBox1Click(Sender: TObject);
procedure FileListBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Text1Click(Sender: TObject);
procedure HTML1Click(Sender: TObject);
procedure AVISes1Click(Sender: TObject);
procedure Resim1Click(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure Daryaaltr1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ShowHint(Sender: TObject);
function uzantibul:string;
private
150

{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
{$R *.DFM}

function Tform1.uzantibul:string;
var uzanti:string;i:byte;dosyaadi:string;
begin
i:=strlen(pchar(FileListBox1.FileName));
dosyaadi:=lowercase(FileListBox1.FileName);
uzanti:='';
while (dosyaadi[i]<>'.') do
begin
uzanti:=dosyaadi[i]+uzanti;
dec(i);
end;
uzantibul:=uzanti;
end;

procedure TForm1.FileListBox1Click(Sender: TObject);


var
Flags: OLEVariant;
begin
caption:= 'Gezgen v 1.0 2001 - '+FileListBox1.Directory;
if (uzantibul='txt') or (uzantibul='rtf') or (uzantibul='bat') or (uzantibul='ini') then
begin
PageControl1.ActivePageIndex:=0;
RichEdit1.Lines.LoadFromFile(FileListBox1.FileName);
end else
if (uzantibul='htm') or (uzantibul='html') then
begin
PageControl1.ActivePageIndex:=1;
WebBrowser1.Navigate(WideString(FileListBox1.FileName), Flags, Flags, Flags, Flags);
//HTML1.RequestDoc(„file:///‟+ FileListBox1.FileName); Delphi 3 için gerekli kod böyle olabilir... 3 adet / kullanımına dikkat ediniz.
end else
if (uzantibul='avi') or (uzantibul='wav') or (uzantibul='mid') then
begin
PageControl1.ActivePageIndex:=2;
panel2.Repaint;
MediaPlayer1.AutoOpen:=false;
MediaPlayer1.Close;
MediaPlayer1.FileName:=FileListBox1.FileName;
MediaPlayer1.AutoOpen:=true;
MediaPlayer1.Open;
MediaPlayer1.Play;
end else
if (uzantibul='dib') or (uzantibul='jpg') or (uzantibul='jpeg') or (uzantibul='bmp') or (uzantibul='ico') or (uzantibul='wmf') or
(uzantibul='emf') then
begin
PageControl1.ActivePageIndex:=3;
Image1.Picture.LoadFromFile(FileListBox1.FileName);
end else
begin
caption:= 'Gezgen v 1.0 2001 - '+FileListBox1.Directory + ' - Pardon, Dosya izlenemiyor!';
end;
end;

procedure TForm1.DirectoryListBox1Change(Sender: TObject);


begin caption:= 'Gezgen v 1.0 2001 - '+FileListBox1.Directory; end;
151

procedure TForm1.FileListBox1MouseDown(Sender: TObject;


Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var dizin1:string;dizin2:pchar;
begin
if ssShift in Shift then
begin
dizin1:='start "'+FileListBox1.FileName+'"'; //kırmızı olanlar çift tırnaktır, XP için start yerine explorer yazınız.
dizin2:=pchar(dizin1);
winexec(dizin2,0);
end;
end;

procedure TForm1.Text1Click(Sender: TObject);


begin
if FileListBox1.FileName <> '' then begin
PageControl1.ActivePageIndex:=0;
RichEdit1.Lines.LoadFromFile(FileListBox1.FileName);
end;
end;

procedure TForm1.HTML1Click(Sender: TObject);


var
Flags: OLEVariant;
begin
if FileListBox1.FileName <> '' then begin
PageControl1.ActivePageIndex:=1;
WebBrowser1.Navigate(WideString(FileListBox1.FileName), Flags, Flags, Flags, Flags);
//HTML1.RequestDoc(„file:///‟+ FileListBox1.FileName); //Delphi 3 için gerekli kod böyle olabilir...
end;
end;

procedure TForm1.AVISes1Click(Sender: TObject);


begin
if FileListBox1.FileName <> '' then begin
PageControl1.ActivePageIndex:=2;
panel2.Repaint;
MediaPlayer1.AutoOpen:=false;
MediaPlayer1.Close;
MediaPlayer1.FileName:=FileListBox1.FileName;
MediaPlayer1.AutoOpen:=true;
MediaPlayer1.Open; MediaPlayer1.Play;
end;end;

procedure TForm1.Resim1Click(Sender: TObject);


begin
if FileListBox1.FileName <> '' then begin //iki bitişik tek tırnak
PageControl1.ActivePageIndex:=3; Image1.Picture.LoadFromFile(FileListBox1.FileName);
end; end;

procedure TForm1.CheckBox1Click(Sender: TObject);


begin image1.Stretch:=CheckBox1.Checked; end;

procedure TForm1.Daryaaltr1Click(Sender: TObject);


var dizin1:string;dizin2:pchar;
begin
dizin1:='start "'+FileListBox1.FileName+'"'; //buradaki tek tırnakların sayıları sıra ile 1, 3 ve 4 adet olacak
dizin2:=pchar(dizin1); winexec(dizin2,0);
end;

procedure TForm1.FormCreate(Sender: TObject);


begin Application.OnHint:=ShowHint; Application.HintColor:=claqua; end;

procedure Tform1.ShowHint(Sender: TObject);


begin statusbar1.simpleText:=Application.Hint; end;
end.
152

16. Dosya işlemi (Write ve Read komutları ile dosyalama)


(Ornekler\Delphi\dosya\Project1.dpr)

Pascal dilindeki gibi Writeln ve Readln komutar× ile metin dosya oluĢturuyoruz. Memo nesnesine LoadFromFile
ve SaveToFile komutlar×n× kullanmadan da sat×r ekleme ve kaydetme yapabiliriz. DOS programc×l×ğ×nda bu y™ntem s×k
kullan×l×yordu, Delphi‟de ise Œok kolay. CD ™rneğinde anlatt×ğ×m gibi *.ini, metin tabanl× dosya, veritaban× ve registry
defterine kay×t imkanlar×m×z vard×r. BaĢka bir bilgisayarda Œal×Ģt×rmak iŒin BDE‟nin de taĢ×nmas×na gerek kalm×yor.

Bu ™rnekte sadece bir boyut var, o da sat×r. Tablolaman×n en basit hali. Veri arama, değiĢtirme, s×ralama,
filtreleme gibi žst seviye veritaban× olaylar×n× eklemek oldukŒa uzun kod yazmam×za bağl× ve bu kodlar da hataya Œok
aŒ×k. Yani gžvencelerle Œal×Ģmak en iyisi olabilir:

try
dosya:=OpenDialog1.FileName;
caption:= 'Dosya ĠĢlemleri - '+dosya;
memo1.Clear;
AssignFile(f, dosya);
Reset(F);
while not Eof(f) do
begin Readln(f, satir); memo1.Lines.Add(satir); end;
finally
CloseFile(f);
end;

VB‟deki listbox ™rneği gibi biz burada da Memo yerine Listbox kullan×labiliriz. Memo1 nesnesinin bir avantaj×
Loadfromfile ve Savetofile gibi komutlar×d×r, fakat burada sadece Write ve Read komutlar×n× kullanmak zorunday×z.

Resim 24 – Basit dosya iĢlemleri

object Form1: TForm1 Font.Color = clWindowText


Left = 271 Font.Height = -11
Top = 104 Font.Name = 'MS Sans Serif'
BorderStyle = bsDialog Font.Style = [ ]
Caption = 'Dosya ĠĢlemleri - varsayilan.txt' OldCreateOrder = False
ClientHeight = 320 PixelsPerInch = 96
ClientWidth = 364 TextHeight = 13
Color = clBtnFace object Button1: TButton
Font.Charset = DEFAULT_CHARSET Left = 24
153

Top = 16 object Button4: TButton


Width = 75 Left = 152
Height = 25 Top = 48
Caption = '&Aç' Width = 75
TabOrder = 0 Height = 25
OnClick = Button1Click Caption = '&Satırı Ekle'
end TabOrder = 4
object Memo1: TMemo OnClick = Button4Click
Left = 8 end
Top = 80 object Button2: TButton
Width = 345 Left = 101
Height = 233 Top = 16
Lines.Strings = ( Width = 75
'Memo1 - salt okunur...') Height = 25
ReadOnly = True Caption = '&Farklı Kaydet'
TabOrder = 1 TabOrder = 5
end OnClick = Button2Click
object Button3: TButton end
Left = 256 object OpenDialog1: TOpenDialog
Top = 16 Filter = 'Tüm Dosyalar|*.*|Text (*.txt)|*.txt'
Width = 75 Title = 'DĠĢ - Aç'
Height = 25 Left = 88
Caption = 'K&apat' Top = 112
TabOrder = 2 end
OnClick = Button3Click object SaveDialog1: TSaveDialog
end DefaultExt = 'txt'
object Edit1: TEdit Filter = 'Tüm Dosyalar|*.*|Text (*.txt)|*.txt'
Left = 16 Title = 'DĠĢ - Kaydet'
Top = 50 Left = 168
Width = 121 Top = 112
Height = 21 end
TabOrder = 3 end
end

Kodlar×m×z:

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Edit1: TEdit;
Memo1: TMemo;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
f: TextFile;
satir:string;
154

dosya:string= 'varsayilan.txt';

implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
dosya:=OpenDialog1.FileName;
caption:= 'Dosya ĠĢlemleri - '+dosya;
memo1.Clear;
AssignFile(f, dosya);
Reset(F); //okumak için açıyoruz
while not Eof(f) do
begin
Readln(f, satir);
memo1.Lines.Add(satir);
end;
CloseFile(f);
end;
end;

procedure TForm1.Button3Click(Sender: TObject);


begin close; end;

procedure TForm1.Button4Click(Sender: TObject);


begin
if dosya <> 'varsayilan.txt' then begin
AssignFile(f, dosya);
Append(f); //kayıt eklemek için açıyoruz
Writeln(f, edit1.text);
Flush(f);
CloseFile(f);
memo1.Clear;
AssignFile(f, dosya);
Reset(F);
while not Eof(f) do
begin
Readln(f, satir);
memo1.Lines.Add(satir);
end;
CloseFile(f);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);


var i:integer;
begin
if SaveDialog1.Execute then
begin
dosya:= SaveDialog1.FileName;
caption:= 'Dosya ĠĢlemleri - '+dosya;
AssignFile(f, dosya);
Rewrite(f); //ilk kez dosya oluşturuyoruz
for i:=0 to memo1.Lines.Count-1 do
begin
Writeln(f, memo1.lines[i]);
Flush(f);
end;
CloseFile(f);
end;
end;
end.
155

17. Dosya Listele (dosya bulma işlemleri)


(Ornekler\Delphi\dosyalistele\Project1.dpr)

Resim 25 – Windows ME arama ekran× ve bizim arama program×m×z

DelphiTurk‟den indirdiğim kodlar ile Delphi 5 dilinde haz×rlad×ğ×m bu ™rneği, Windows‟un “Dosya Bul” program×
ile karĢ×laĢt×r×nca biraz daha h×zl× olduğunu g™rebiliriz. En az×ndan Œok uzun aramalarda kullan×c× Dur tuĢu ile aramay×
kesebiliyoruz. Bunun iŒin ProcessMessages komutu ile form canl× tutuluyor. Arama bitince de kaŒ dosya bulduğunu ve
toplam kaŒ kilo byte olduğu Label1‟e aktar×l×yor. *.* filtresi ile bir klas™ržn kaŒ KiloByte olduğunu da bulabilirsiniz.
Memo1 nesnesi yerine ListBox veya ListView gibi nesneler konulup, daha hoĢ listeler elde edilebilir. Ġsterseniz
elinizdeki CD iŒeriklerini, Memo1 nesnesine sağ t×klay×p Kaydet komutu sayesinde ayr× bir dosyaya kaydedip, bir
dosyay× bulmak iŒin o CD‟yi daha sonra tak×p Œ×karmaktan kurtulabilirsiniz. Windows komutlar×n× kullanarak da
istediğiniz klas™rž kopyalama, silme, taĢ×ma, karĢ×laĢt×rma gibi ™zellikler de ekleyebilirsiniz. Yedekleme yap×lan
klas™rdeki dosyalar× gžncelleme amaŒl× da olabilir.

object Form1: TForm1 Width = 623


Left = 250 Height = 160
Top = 132 Align = alTop
Width = 633 BorderStyle = bsNone
Height = 539 ParentFont = False
Caption = 'Dosya Bul' PopupMenu = PopupMenu2
Color = clBtnFace ScrollBars = ssBoth
KeyPreview = True TabOrder = 0
OldCreateOrder = False WordWrap = False
Position = poScreenCenter end
OnCreate = FormCreate object ListView1: TListView
OnKeyDown = FormKeyDown Left = 0
PixelsPerInch = 96 Top = 222
TextHeight = 13 Width = 623
object Splitter1: TSplitter Height = 288
Left = 0 Align = alClient
Top = 217 BorderStyle = bsNone
Width = 623 Color = 13695231
Height = 5 Columns = <
Cursor = crVSplit item
Align = alTop Caption = 'Ad'
Beveled = True Width = 150
Color = clBlue end
ParentColor = False item
end Alignment = taRightJustify
object Memo1: TMemo Caption = 'Boyut'
Left = 0 Width = 75
Top = 57 end
156

item TabOrder = 2
Caption = 'DeğiĢtirme' OnClick = Button1Click
Width = 120 end
end object Edit2: TEdit
item Left = 144
Caption = 'Klasörde' Top = 9
Width = 200 Width = 121
end> Height = 15
FlatScrollBars = True BorderStyle = bsNone
FullDrag = True TabOrder = 3
HotTrack = True Text = '*.doc'
HotTrackStyles = [htHandPoint] OnKeyDown = Edit2KeyDown
HoverTime = 10 end
IconOptions.AutoArrange = True object Edit1: TEdit
Items.Data = Left = 16
{1D0000000100000000000000FFFFFFFFFFFFFFFF000000000 Top = 9
000000000} Width = 121
ParentFont = False Height = 15
ParentShowHint = False Hint =
PopupMenu = PopupMenu1 'Çift tıklayıp baĢka bir yer seçebilirsiniz, sürücü seçmek
ShowHint = True için i' +
SortType = stData 'se metin kutusuna d: gibi yazıp çift tıklayınız...'
TabOrder = 1 BorderStyle = bsNone
ViewStyle = vsReport ParentShowHint = False
OnColumnClick = ListView1ColumnClick ShowHint = True
OnCompare = ListView1Compare TabOrder = 4
end Text = 'c:\belgelerim'
object Panel1: TPanel OnDblClick = Edit1DblClick
Left = 0 end
Top = 0 end
Width = 623 object PopupMenu1: TPopupMenu
Height = 57 Left = 240
Align = alTop Top = 104
TabOrder = 2 object BykSimge1: TMenuItem
object Label1: TLabel Caption = '&Büyük Simge '
Left = 432 GroupIndex = 1
Top = 5 RadioItem = True
Width = 85 OnClick = BykSimge1Click
Height = 13 end
Caption = 'Arama durumu' object KkSimge1: TMenuItem
end Caption = '&Küçük Simge'
object Button2: TButton GroupIndex = 1
Left = 360 RadioItem = True
Top = 2 OnClick = KkSimge1Click
Width = 70 end
Height = 25 object Liste1: TMenuItem
Caption = '&Kapat' Caption = '&Liste'
TabOrder = 0 GroupIndex = 1
OnClick = Button2Click RadioItem = True
end OnClick = Liste1Click
object Button3: TButton end
Left = 316 object Ayrntlar1: TMenuItem
Top = 2 Caption = '&Ayrıntılar'
Width = 41 Checked = True
Height = 25 Default = True
Caption = '&Dur' GroupIndex = 1
Enabled = False RadioItem = True
TabOrder = 1 OnClick = Ayrntlar1Click
OnClick = Button3Click end
end object Grid1: TMenuItem
object Button1: TButton Break = mbBarBreak
Left = 275 Caption = '&Grid'
Top = 2 GroupIndex = 1
Width = 41 OnClick = Grid1Click
Height = 25 end
Caption = '&Bul' end
157

object PopupMenu2: TPopupMenu object SaveDialog1: TSaveDialog


Left = 328 DefaultExt = 'txt'
Top = 104 Filter = 'Metin Dosyası|*.txt'
object Kaydet1: TMenuItem Title = 'Liste Kaydet'
Caption = 'Kaydet' Left = 152
OnClick = Kaydet1Click Top = 104
end end
end end

Kod k×sm×:

unit Unit1; { Private declarations }


interface public
uses { Public declarations }
Windows, Messages, SysUtils, Classes, Graphics, Controls, end;
Forms, Dialogs, StdCtrls, TLHelp32, ComCtrls, ExtCtrls,
Buttons, ShlObj, ShellAPI, CommCtrl, Clipbrd, Menus, var
ToolWin, ImgList, filectrl; Form1: TForm1;
//SelectDirectory diyalogu için filectrl gerekli dosyasayisi:integer;
boyut: longword;
type yeter:boolean;
TForm1 = class(TForm) ColumnToSort: Integer;yon:byte;
Ayrntlar1: TMenuItem;
Button1: TButton; implementation
Button2: TButton;
Button3: TButton; {$R *.dfm}
BykSimge1: TMenuItem; function GetShellImage(szFileName: string): Integer;
Edit1: TEdit; var
Edit2: TEdit; FileInfo: TSHFileInfo;
Grid1: TMenuItem; begin
Kaydet1: TMenuItem; SHGetFileInfo(PChar(szFileName), 0, FileInfo,
KkSimge1: TMenuItem; SizeOf(FileInfo), SHGFI_SYSICONINDEX or
Label1: TLabel; SHGFI_USEFILEATTRIBUTES);
Liste1: TMenuItem; Result := FileInfo.iIcon;
ListView1: TListView; end;
Memo1: TMemo;
Panel1: TPanel;
PopupMenu1: TPopupMenu; procedure TForm1.InitLVImageList(ListView: TListView);
PopupMenu2: TPopupMenu; var
SaveDialog1: TSaveDialog; FileInfo: TSHFileInfo;
Splitter1: TSplitter; ImageListHandle: THandle;
procedure Button1Click(Sender: TObject); begin
procedure FindFile(StartDir, FileMask: string); ImageListHandle := SHGetFileInfo('C:\', 0, FileInfo,
procedure Button2Click(Sender: TObject); SizeOf(FileInfo), SHGFI_SYSICONINDEX or
procedure Button3Click(Sender: TObject); SHGFI_SMALLICON);
procedure BykSimge1Click(Sender: TObject); SendMessage(ListView.Handle, LVM_SETIMAGELIST,
procedure KkSimge1Click(Sender: TObject); LVSIL_SMALL, ImageListHandle);
procedure Liste1Click(Sender: TObject);
procedure Ayrntlar1Click(Sender: TObject); ImageListHandle := SHGetFileInfo('C:\', 0, FileInfo,
procedure Grid1Click(Sender: TObject); SizeOf(FileInfo), SHGFI_SYSICONINDEX or
procedure Kaydet1Click(Sender: TObject); SHGFI_LARGEICON);
procedure ListView1ColumnClick(Sender: TObject;
Column: TListColumn); SendMessage(ListView.Handle, LVM_SETIMAGELIST,
procedure ListView1Compare(Sender: TObject; Item1, LVSIL_NORMAL, ImageListHandle);
Item2: TListItem; end;
Data: Integer; var Compare: Integer);
procedure FormCreate(Sender: TObject); procedure TForm1.FindFile(StartDir, FileMask: string);
procedure Edit1DblClick(Sender: TObject); var
procedure Edit2KeyDown(Sender: TObject; var Key: SR: TSearchRec;
Word; DirList: TStringList;
Shift: TShiftState); IsFound: Boolean;
procedure FormKeyDown(Sender: TObject; var Key: i: integer; ListItem: TListItem;tarih:variant;
Word; begin
Shift: TShiftState); if StartDir[length(StartDir)] <> '\' then
procedure InitLVImageList(ListView: TListView); StartDir := StartDir + '\';
private
158

IsFound :=FindFirst(StartDir+FileMask, faAnyFile-


faDirectory, SR) = 0; procedure TForm1.BykSimge1Click(Sender: TObject);
while IsFound and not(yeter)do begin begin
application.processMessages; BykSimge1.Checked:=true;
Memo1.Lines.Add(StartDir + SR.Name); ListView1.ViewStyle:=vsIcon;
with ListView1 do begin end;
ListItem:= items.Add;
ListItem.Caption:=sr.Name; procedure TForm1.KkSimge1Click(Sender: TObject);
ListItem.ImageIndex := GetShellImage(sr.Name); begin
ListItem.SubItems.Add(format('%10d KB',[(sr.size) div kkSimge1.Checked:=true;
1024])); ListView1.ViewStyle:=vsSmallIcon;
tarih:=FileDateToDateTime(sr.Time); end;
ListItem.SubItems.Add(DateTimeToStr(tarih));
ListItem.SubItems.Add(StartDir); procedure TForm1.Liste1Click(Sender: TObject);
end; begin
Inc(dosyasayisi); Liste1.Checked:=true;
boyut:=boyut+sr.Size; ListView1.ViewStyle:=vsList;
IsFound := FindNext(SR) = 0; end;
end;
FindClose(SR); procedure TForm1.Ayrntlar1Click(Sender: TObject);
begin
DirList := TStringList.Create; Ayrntlar1.Checked:=true;
IsFound := FindFirst(StartDir+'*.*', faAnyFile, SR) = 0; ListView1.ViewStyle:=vsReport;
while IsFound and not(yeter)do begin end;
if ((SR.Attr and faDirectory) <> 0) and
(SR.Name[1] <> '.') then procedure TForm1.Grid1Click(Sender: TObject);
DirList.Add(StartDir + SR.Name); begin
IsFound := FindNext(SR) = 0; Grid1.Checked:=not(Grid1.Checked);
end; ListView1.GridLines:=Grid1.Checked;
FindClose(SR); end;

for i := 0 to DirList.Count-1 do procedure TForm1.Kaydet1Click(Sender: TObject);


FindFile(DirList[i], FileMask); begin
DirList.Free; if SaveDialog1.Execute then
end; Memo1.Lines.SaveToFile(SaveDialog1.FileName);
end;
procedure TForm1.Button1Click(Sender: TObject);
var kb:real; procedure TForm1.ListView1ColumnClick(Sender:
begin TObject;
memo1.Clear; Column: TListColumn);
ListView1.Items.Clear; begin
yeter:=false; ColumnToSort := Column.Index;
button1.Enabled:=false; (Sender as TCustomListView).AlphaSort;
button3.Enabled:=true; yon:=-1*yon;
dosyasayisi:=0; end;
boyut:=0;
FindFile(edit1.Text,edit2.Text); procedure TForm1.ListView1Compare(Sender: TObject;
kb:=boyut/1024; Item1, Item2: TListItem;
label1.Caption:='Arama tamamlandı...'+#13+'Toplam dosya Data: Integer; var Compare: Integer);
sayısı: '+IntToStr(dosyasayisi)+' adet' var
+#13+'Toplam boyut: '+IntToStr(round(kb))+' KB'; ix: Integer;
button1.Enabled:=true; begin
button3.Enabled:=false; if ColumnToSort = 0 then
end; Compare :=
yon+CompareText(Item1.Caption,Item2.Caption)
procedure TForm1.Button2Click(Sender: TObject); else begin
begin ix := ColumnToSort - 1;
close Compare :=
end; yon+CompareText(Item1.SubItems[ix],Item2.SubItems[ix]);
end;
procedure TForm1.Button3Click(Sender: TObject); end;
begin
yeter:=true; procedure TForm1.FormCreate(Sender: TObject);
button1.Enabled:=true; begin
button3.Enabled:=false; yon:=1;
end; InitLVImageList(ListView1);
159

end; begin
if key=VK_RETURN then Button1Click(self); //bul
procedure TForm1.Edit1DblClick(Sender: TObject); end;
var result:string;
begin procedure TForm1.FormKeyDown(Sender: TObject; var
if SelectDirectory('Klasör Seç', Edit1.Text, Result) then Key: Word;
Edit1.Text := Result; Shift: TShiftState);
end; begin
if key=VK_ESCAPE then Button3Click(self); //dur
procedure TForm1.Edit2KeyDown(Sender: TObject; var Key: end;
Word;
Shift: TShiftState); end.
160

18. think2 (kendiliğinden dizilen nesneler)


(Ornekler\Delphi\think2\Project2.dpr)

Resim 26 – Otomatik olarak dizilen nesneler

Bu ™rnekteki amaŒ birbirlerine olan uzakl×ğ× ™lŒerek, en yak×n topa yaklaĢmaya Œal×Ģan nesnelerdir. Bu
denemeler sonucunda dairemsi olarak s×ralanmalar× gerekiyordu. Fakat her zaman renk dizilimleri koyudan aŒ×ğa
doğru bize g™re pek olmuyor. žnkž aralar×ndaki takipci Œizgilere bakarsan×z bazen birbiri žzerilerine geŒip
Œak×Ģ×yorlar. Tam olarak hedefim aral×klar× eĢit oluncaya dek birbirlerine doğru ilerlemeleri ve beĢ topun daire gibi
olmalar× idi. Java Development Kit 1.2.2‟nin demo dizininde GraphLayout adl× bir ™rnekte bizim ™rneğin tam Œal×Ģan×n×
g™rebilirsiniz.

En k×sa yol problemi ile ilk kez VB dilinde askerdeyken uğraĢt×ğ×m WinLines, adl× oyunumda karĢ×laĢt×m. Basit
9x9 boyutlar×ndaki grid – ×zgara dizilerinde bile bir topun hedefe en k×sa hangi yoldan gidebileceği beni bayağ×
zorlam×Ģt×. Asl×nda hala bu problemi tam olarak bilemiyorum. Bilgisayar oyunlar×n×n Œoğunda bu soruna benzer,
cisimlerin belli bir yere en insans×, ak×ll× gibi karar vererek gitmeleri bulunur. Artificial Intelligence – yapay zeka en
gžŒlž makineleri bile zorlayan bžyžk programc×l×k gžcž gerektiren bir konudur. Yine de bu konuda biraz kafa yormak
ve sonuŒta bir Ģeyler elde etmek Œok hoĢuma gidiyor. Hat×ralarsan×z TicTocToe ™rneğinde de bilgisayara s×ra gelince
hamlesini džĢžnmeyi ™ğretmek gerekmiĢti.

Nesnelerimiz:

object Form1: TForm1 Font.Style = [fsBold]


Left = 271 OldCreateOrder = False
Top = 104 Position = poScreenCenter
Width = 528 OnCreate = FormCreate
Height = 396 PixelsPerInch = 96
Caption = TextHeight = 13
'Kendiliğinden dizilen nesneler - B harfi BaĢlat, D object Shape1: TShape
Durdur için k' + Left = 96
'ullanılabilir...' Top = 168
Color = clWhite Width = 33
Font.Charset = TURKISH_CHARSET Height = 33
Font.Color = clMaroon Brush.Color = 10485760
Font.Height = -11 Shape = stCircle
Font.Name = 'Tahoma' end
161

object Shape2: TShape Height = 22


Left = 160 Caption = '&Kapat'
Top = 168 Flat = True
Width = 33 OnClick = SpeedButton3Click
Height = 33 end
Brush.Color = 13001472 object TrackBar1: TTrackBar
Shape = stCircle Left = 8
end Top = 32
object Shape4: TShape Width = 41
Left = 288 Height = 150
Top = 168 Hint = 'Hız (1-25 birim), aĢağısı daha büyük rakamdır...'
Width = 33 Max = 25
Height = 33 Min = 1
Brush.Color = 16767411 Orientation = trVertical
Shape = stCircle ParentShowHint = False
end Frequency = 1
object Shape5: TShape Position = 15
Left = 352 SelEnd = 0
Top = 168 SelStart = 0
Width = 33 ShowHint = True
Height = 33 TabOrder = 0
Brush.Color = 16775658 TickMarks = tmBoth
Shape = stCircle TickStyle = tsAuto
end OnChange = TrackBar1Change
object SpeedButton1: TSpeedButton end
Left = 15 object TrackBar2: TTrackBar
Top = 8 Left = 8
Width = 89 Top = 184
Height = 22 Width = 41
Hint = 'Hız' Height = 150
Caption = '&BaĢlat' Hint =
Flat = True 'Topların aralıkları (1-150 piksel), aĢağısı daha büyük
ParentShowHint = False rakamdır.' +
ShowHint = True '..'
OnClick = SpeedButton1Click Max = 150
end Min = 1
object SpeedButton2: TSpeedButton Orientation = trVertical
Left = 104 ParentShowHint = False
Top = 8 Frequency = 1
Width = 89 Position = 100
Height = 22 SelEnd = 0
Caption = '&Durdur' SelStart = 0
Flat = True ShowHint = True
OnClick = SpeedButton2Click TabOrder = 1
end TickMarks = tmBoth
object Shape3: TShape TickStyle = tsAuto
Left = 224 OnChange = TrackBar2Change
Top = 168 end
Width = 33 object Timer1: TTimer
Height = 33 Enabled = False
Brush.Color = 16756059 Interval = 250
Shape = stCircle OnTimer = Timer1Timer
end Left = 72
object SpeedButton3: TSpeedButton Top = 72
Left = 195 end
Top = 8 end
Width = 89

Kodlar×m×z:

unit Unit1; type


interface TForm1 = class(TForm)
uses Shape1: TShape;
Windows, Messages, SysUtils, Classes, Graphics, Shape2: TShape;
Controls, Forms, Dialogs, Shape3: TShape;
Buttons, ExtCtrls, ComCtrls; Shape4: TShape;
162

Shape5: TShape; procedure TForm1.TrackBar1Change(Sender: TObject);


SpeedButton1: TSpeedButton; begin hiz:=TrackBar1.Position; end;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton; procedure TForm1.TrackBar2Change(Sender: TObject);
Timer1: TTimer; begin aralik:=TrackBar2.Position; end;
TrackBar1: TTrackBar;
TrackBar2: TTrackBar; procedure TForm1.Timer1Timer(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject); var a1,b1,a2,b2,c1,c2:integer;
procedure FormCreate(Sender: TObject); deger11,deger12,deger21,deger22:integer;
procedure SpeedButton2Click(Sender: TObject); hareket_bitti:integer;
procedure TrackBar1Change(Sender: TObject); begin
procedure Timer1Timer(Sender: TObject); form1.refresh;
procedure TrackBar2Change(Sender: TObject); shape5.Top:=round (height/2);
procedure SpeedButton3Click(Sender: TObject); //son top uzay referansıdır
private shape5.left:=round (width/2);
{ Private declarations } //:=width DIV 2; de kullanılabilirdi
public hareket_bitti:=0;
{ Public declarations } with form1.Canvas do begin
end; a1:=shape2.left-shape1.left; //1 2
var b1:=shape2.top-shape1.top;
Form1: TForm1; c1:=round (sqrt(a1*a1+b1*b1));
devam: boolean; //dik üçgen formülü, c1 hipotenüs
hiz,aralik : integer; a2:=shape5.left-shape1.left; //1 5
baslangic,fark: TDateTime; b2:=shape5.top-shape1.top;
implementation c2:=round (sqrt(a2*a2+b2*b2));
{$R *.DFM} deger11:= round(a1/hiz);
procedure TForm1.SpeedButton1Click(Sender: TObject); deger12:= round(b1/hiz);
var mesafe:integer; deger21:= round(a2/hiz);
begin deger22:= round(b2/hiz);
mesafe:=66;
shape1.Top:=random(height-mesafe); if c1>=c2 then begin
shape2.Top:=random(height-mesafe); if c1>=aralik then begin
shape3.Top:=random(height-mesafe); shape1.left:=shape1.left+deger11;
shape4.Top:=random(height-mesafe); shape1.top:=shape1.top+deger12;
shape5.Top:=random(height-mesafe); end;
shape1.left:=random(width-mesafe); end else begin
shape2.left:=random(width-mesafe); if c2>=aralik then begin
shape3.left:=random(width-mesafe); shape1.left:=shape1.left+deger21;
shape4.left:=random(width-mesafe); shape1.top:=shape1.top+deger22;
shape5.left:=random(width-mesafe); end;
devam:=true; end;
SpeedButton2.Enabled:=true;
SpeedButton1.Enabled:=false; if (c1<aralik) and (c2<aralik) then
baslangic:=now(); inc(hareket_bitti);
timer1.Enabled:=true;
//kendiliklerinden dizilme komutu gibi a1:=shape3.left-shape2.left; //2 3
end; b1:=shape3.top-shape2.top;
c1:=round (sqrt(a1*a1+b1*b1));
procedure TForm1.FormCreate(Sender: TObject); //dik üçgen formülü, c1 hipotenüs anlamındadır
begin a2:=shape2.left-shape1.left; //1 2
randomize; b2:=shape2.top-shape1.top;
timer1.Enabled:=false; c2:=round (sqrt(a2*a2+b2*b2));
hiz:=TrackBar1.Position; aralik:=TrackBar2.Position; deger11:= round(a1/hiz);
SpeedButton2.Enabled:=false; deger12:= round(b1/hiz);
end; deger21:= round(a2/hiz);
deger22:= round(b2/hiz);
procedure TForm1.SpeedButton3Click(Sender: TObject);
begin close; end; if c1>=c2 then begin
if c1>=aralik then begin
procedure TForm1.SpeedButton2Click(Sender: TObject); shape2.left:=shape2.left+deger11;
begin shape2.top:=shape2.top+deger12;
timer1.Enabled:=false; end;
SpeedButton1.Enabled:=true; end else begin
SpeedButton2.Enabled:=false; if c2>=aralik then begin
end; shape2.left:=shape2.left+deger21;
shape2.top:=shape2.top+deger22;
163

end; c2:=round (sqrt(a2*a2+b2*b2));


end; deger11:= round(a1/hiz);
deger12:= round(b1/hiz);
if (c1<aralik) and (c2<aralik) then deger21:= round(a2/hiz);
inc(hareket_bitti); deger22:= round(b2/hiz);

a1:=shape4.left-shape3.left; //3 4 if c1>=c2 then begin


b1:=shape4.top-shape3.top; if c1>=aralik then begin
c1:=round (sqrt(a1*a1+b1*b1)); shape4.left:=shape4.left+deger11;
//dik üçgen formülü, c1 hipotenüs shape4.top:=shape4.top+deger12;
a2:=shape3.left-shape2.left; //2 3 end;
b2:=shape3.top-shape2.top; end else begin
c2:=round (sqrt(a2*a2+b2*b2)); if c2>=aralik then begin
deger11:= round(a1/hiz); shape4.left:=shape4.left+deger21;
deger12:= round(b1/hiz); shape4.top:=shape4.top+deger22;
deger21:= round(a2/hiz); end;
deger22:= round(b2/hiz); end;
if (c1<aralik) and (c2<aralik) then
if c1>=c2 then begin inc(hareket_bitti);
if c1>=aralik then begin if hareket_bitti=4 then
shape3.left:=shape3.left+deger11; begin
shape3.top:=shape3.top+deger12; SpeedButton2.Click; fark:=now()-baslangic;
end; Application.MessageBox(pchar('Sıralama bitti:
end else begin '+timetostr(fark)),'ĠĢlem tamam',0);
if c2>=aralik then begin end;
shape3.left:=shape3.left+deger21; MoveTo(shape1.left+15,shape1.top+15);
shape3.top:=shape3.top+deger22; LineTo(shape2.left+15,shape2.top+15);
end; MoveTo(shape2.left+15,shape2.top+15);
end; LineTo(shape3.left+15,shape3.top+15);
MoveTo(shape3.left+15,shape3.top+15);
if (c1<aralik) and (c2<aralik) then LineTo(shape4.left+15,shape4.top+15);
inc(hareket_bitti); MoveTo(shape4.left+15,shape4.top+15);
LineTo(shape5.left+15,shape5.top+15);
a1:=shape5.left-shape4.left; //4 5 MoveTo(shape5.left+15,shape5.top+15);
b1:=shape5.top-shape4.top; LineTo(shape1.left+15,shape1.top+15);
c1:=round (sqrt(a1*a1+b1*b1)); end;
//dik üçgen formülü, c1 hipotenüs end;
a2:=shape4.left-shape3.left; //3 4 end.
b2:=shape4.top-shape3.top;
164

19. DirectX ve OpenGL programcılığı (grafik programcılığı)


(Ornekler\Delphi\3Dfx dizini)

Kitab×n konular× iŒinde en ağ×r olan× bu k×sm×. Delphi dili Quake veya Half – Life oyunlar× benzeri, endžstriyel
robot tasar×m× veya t×p alan×nda g™rsel tasar×m oluĢturmak iŒin ideal... DelphiX ve GLScene nesnelerini tan×tarak basit
iki ™rnek yapacağ×z. KarĢ×laĢt×ğ×m sorunlar× g™rerek siz daha iyilerini tabii ki yapabilirsiniz. 3Dfx ile 1998 y×l×nda
Voodoo Banshee ekran kart×m varken uğraĢm×Ģt×m, ama art×k ATI ve GeForce ekran kartlar× Œok ucuz ve piyasaya
hakim. Daha yeni ekran kart×n×z olabilir, muhakkak DirectX ve OpenGL destekli olmal×. Microsoft DirectX kodlar× ile
daha h×zl× donan×ma (ses kart×, modem, ekran kart×, joystick...) eriĢen programlar yaz×labilirken, OpenGL‟in g™ržntž
kalitesi ve yetenekleri daha fazla. Bu arada oynad×ğ×n×z oyunlar×n kaliteleri sadece ekran kart×n×n geliĢmiĢliğine değil
iĢlemci, RAM, sabit disk, anakarta da bağl×d×r.

En az×ndan elimizde Delphi3 olmal×d×r. Delphi 3, 4 ve 5‟i destekleyen bu nesneleri “Diger\Component”


dizininde bulabilirsiniz. Delphi 6 ve žstž sžržmler iŒin ise internetten araĢt×rarak elde edilebilir. *.dpk uzant×l×
dosyalar×na Œift t×klayarak kurabiliriz. „rneğin Delphi 5 iŒin DelphiX 2000 Ģ™yle kurulabilir: *.zip dosyam×z× bir klas™re
aŒar×z, “DelphiX\Source” dizinindeki DelphiX_for5.dpk dosyas×n× Œift t×klar veya Delphi 5‟den “File*Open..” ile de bu
dosyay× aŒabiliriz. KarĢ×m×za Œ×kan Package - DelphiX_for5.dpk penceresindeki araŒ Œubuğundan Compile komutunu
veririz. Ard×ndan Install t×kland×ğ×nda karĢ×m×za hangi nesnelerin eklendiğini g™steren uyar× gelir. Component Palette‟in
en sonunda DelphiX‟i g™rebilirsiniz. Bir arkadaĢ×m×z bu nesnelerden sadece ses iŒin gerekeni programlar×nda mžzik
Œalmak iŒin kullan×yordu. Demek ki tžm nesneleri kullanmak zorunda değiliz. Son olarak da “File*Close All”
dediğimizde karĢ×m×za Œ×kan soruda, DelphiX nesnelerini Kaydet dememiz gerekiyor.

glscene.org sitesinden indirdiğiniz GLScene de bu Ģekilde kurulabilir. Ġsterseniz baĢka bir yol olan Ģu Ģekilde
de bu nesne paketini kural×m: Delphi‟yi aŒ×p, “File*Open...*GLScene5.dpk” komutu verelim. Compile ve Install
deyince art×k nesne listemizde GLScene de var olacakt×r. Eğer eskiden baz× nesne kurma denemeleriniz olup art×klar×
kalm×Ģsa hata mesajlar× ile karĢ×laĢabilirsiniz. Tek yapman×z gereken onlar× nesne listesinden sağ t×klay×p silmeniz.

Her iki pakette de bol ™rnek var. UŒak ve araba simulasyonlar× gžzel. Yine de sitelerine giderek yenilikleri ve
geliĢmiĢ ™rnekleri bilgisayar×n×za indirebilirsiniz. Tutorial – ™ğretici ve Sample – ™rnekler bir Ģeyler yapabilmemiz iŒin
genellikle yeterli. Size “Ornekler\ Delphi\ 3Dfx\ DX1\project1.dpr” ve “Ornekler\ Delphi \3Dfx \ Move
\ActorTwoCam.dpr” ™rneklerinden bahsedeceğim. “Ornekler \Delphi \3Dfx \tut2.dpr” sadece 3Dfx kart× desteklediği
iŒin hata mesaj× verebilir. Ama eğer kodlar×n× incelerseniz, istenen boyutta (orant×lanarak) Œizgilerle dijital rakam
yazma, kayan y×ld×zlar, d™nen bir alt×gen, Œ™zžnžrlžk değiĢtirme, frekans değiĢtirme gibi hoĢ kodlar bulabilirsiniz.

Bu arada yine de biraz 3DSMax kar×Ģt×rm×Ģ olmak gerekiyor. oğu yerde *.3ds ve *.x uzant×l× dosyalarla
karĢ×laĢ×yoruz. *.md2 ise Quake2 akt™r dosyas×d×r. Sadece akt™rler değil onlar×n silahlar× da *.md2 format×ndad×r.

Elimizde basit de olsa bir materyal edit™rž ve harita edit™rž gerekli. Sadece Delphi‟de maalesef arad×ğ×m×z×
bulam×yoruz. Terragen, Photoshop gibi programlarla yeryžzž Ģekilleri oluĢturmak, Lightwave veya Studio Max ile akt™r
ve malzeme haz×rlamak žst seviyeye Œ×kmasak da karĢ×laĢt×ğ×m×z ad×mlar. Bir sokak veya ev tasar×m×, mžzik, efektler,
yang×n, duman, sis, hareketli – animasyonlu nesneler (k×p×rdayan ağaŒlar, Ģelale, ×Ģ×k parlamalar×, parŒalanabilen
nesneler), su, ×Ģ×k, ayna, bulutlar×n hareket ettiği g™kyžzž, etkileĢimli nesneler (džğme, kol, may×n, tuzaklar, asans™r,
kap×, pencere, cam k×r×lmas×, delinebilen duvarlar, k×r×labilen tahta, sand×k), kamera aŒ×lar×, zoom – bžyžtme /
kžŒžltme, kar, yağmur, Œamur, yer Œekimi, uzay gibi bir Œok aĢ×lmas× gereken problem var. Bunlar× asl×nda eski DOS
oyunlar×nda bile g™ržyoruz. „yleyse art×k džnyada baz× standartlar oluĢmuĢ olmal×d×r. Tekrar Amerika‟y× keĢfetmek
yerine internetten arad×ğ×n×z ŒeĢitte ve y™ntemde bilgiye ulaĢabilirsiniz.

En az×ndan *.wrl yani VRML – Virtual Reality Markup Language (sanal gerŒeklik dili) ile uğraĢt×ğ×n×zda basit
collision – Œarpma, yer Œekimi, cam, aŒ×labilir kap×lar, džğmeler, madde tasar×m×, akt™r oluĢturmak, hikaye, zaman
Œizgisi, sahne, kare (Macromedia Flash‟da da art×k iki ve žŒ boyutlu tasar×mlar yapabiliriz) gibi deyimler daha tan×d×k
hale gelebilir. “CD2\3d\VRML\ISA10.ZIP, ISB30.ZIP, ICA3.ZIP” dosyalar×n× kurarak Internet Explorer‟da žŒ boyutlu
džnyaya kavuĢabilirsiniz. CORTVRML.EXE ile VRML plug-in – eklentisini elde ediyoruz. Daha profesy™nel edit™rler de
arayabilirsiniz. spazz_v24_full.exe program×n× da tavsiye ederim. Studio Max‟de de Export menžsžnden yapt×ğ×n×z
Œal×Ģmalar× *.wrl olarak kaydedebilirsiniz. AutoCAD‟de tasarlanm×Ģ nesneleri de *.wrl biŒimine d™nžĢtžrebilirsiniz.

Bir ™nerim de, 3DSMax gibi žst seviye bir programa geŒmeden ™nce basit edit™rleri kullanarak žŒžncž boyuta
×s×nmakt×r. „rneğin Quake, Half – Life Counter Strike iŒin modifikasyonlar yani haritalar yapabiliriz. Baz× oyun
CD‟lerinde kendi edit™rleri ile karĢ×laĢabilirsiniz. Bulamazsan×z internette muhakkak džĢžk boyutlu edit™r programlar×
bulabilirsiniz. “CD2\3d\Diger\worldcraft33.zip” ile basit CS haritalar× žretebilirsiniz. Program tasar×m dosyan×z×
165

3DSMax benzeri pencerelerde haz×rlaman×z× ve *.bsp, *.map uzant×l× dosyalara d™nžĢtžrme iĢini yap×yor.
“Ornekler\Diger\cs_maps.zip” ile yapt×ğ×m baz× haritalar× g™rebilirsiniz.

Resim 26 – HL-CS iŒin de_tersane haritam (kas×m 2001)

Resim 27 – GLScene ™rneği

Programlama k×sm× nerede olacak diye baĢlarda zorlanabiliriz, ™rneklerin yard×m× ile yavaĢ yavaĢ Œ™zžyoruz.
Art×k bildiğimiz form nesnelerini tamamen terkederek, menž, arabirim, ayarlar gibi k×s×mlar× yapabiliriz. Pencere
g™ržnžmžnden tam ekran g™ržntžye geŒebiliriz.

Her iki proje de tam bitmedi. Fakat elimden geldiğince basit Ģeyler elde etmeye Œal×Ģt×m. Ġlk ™rnekte, Ģimdilik
Doom oyunu benzeri klayveden oklarla ileri geri, fare ile de bžyžtme (scroll – kayd×rma tekerleği ile), Œevirme
iĢlemleri yap×labiliyor. F7 tepe kameras×, F8 ilk insan aŒ×s×, ESC kapatma, Shift ve ok tuĢlar× h×zl× ilerleme, nžmerik
klavyedeki s×f×r tuĢu ile eğilme, Enter ile ateĢ etme (?!?), boĢluk tuĢu ile z×plama (ses de kullan×yoruz), 1 tuĢu ile
waste.md2, 2 tuĢu ile erkek (cipher) tris.md2, 3 ile kad×n (Athena) tris.md2 ve 4 ile de cyborg (oni911) tris.md2
yžkleniyor. Ana menžden diğer akt™rler de g™ržlebilir. Ortadaki kutu gibi yere Œarparak hareket edememe gibi
duvarlara Œarp×nca iŒine girilmemesi sağlanabilir, ama titreme nas×l engellenebilir bilmiyorum. Ayr×ca kavun iŒi renkli
166

kžŒžk kžreye Œarpmay× baĢarabilirseniz patlad×ğ×n× g™rebilirsiniz. AteĢ etmek iŒin ×Ģ×n (ThorFX) kullanmak da saŒma
gelebilir, daha basit bir Œ™zžm bulamad×m. Bir de klavye tuĢlar× ayn× anda kullan×lam×yor, hem ateĢ hem eğilme gibi
kombine hareketler yok. Ġkinci ™rnekte ise Œ™zžnžrlžk değiĢtirme, renk ayarlar×, form ve fare ayarlar×, d™nen nesneler,
ekranda zaman, FPS – frames per second (saniyedeki kare say×s×), Œizgiler, daire Œizmek, resim yžklemek gibi
™zellikler bulabilirsiniz. Tžrk yap×m× oyun olan Pusu gibi bir Ģeyler de yapmak bizim iŒin Ģimdilik biraz zor. Tek
baĢ×m×za hikaye, harita tasar×m×, ses efektleri, gibi Ģeyleri halletmek bizi aĢ×yor. Basit oyun yapmak veya bu ™rnekle
d™nem ™devlerinizde yard×mc× olmak yeterli.

Her iki ™rnekteki kodlar× kitapta vermeyeceğim. Onun yerine form žzerindeki nesnelerden biraz
bahsedeceğim. Elinizde CD olmad×ğ×n× džĢžnžrsek zaten kod y×ğ×n×n×n hiŒbir anlam× olmaz. Ġlk program×m×z olan
ActorTwoCam ™rneğimiz iki formdan oluĢuyor. Ġlki as×l pencere ve diğeri oyuncu seŒme penceresi.

Temel nesneler GLSceneViewer1, GLScene1, GLCadencer1 ve CollisionManager1. Geri kalan


GLThorFXManager1 ve GLFireFXManager1 nesneleri GLScene1 žzerindeki herhangi bir nesneye atanabilen efektlerdir.
GLSoundLibrary1 nesnesi ile kžtžphaneye eklediğimiz ses dosyalar×n× Œalabilmemiz sağlan×yor. GLScene1 nesnesine
Œift t×kland×ğ×nda sahnedeki tžm maddelere, ×Ģ×klara, kameralara ulaĢabiliyoruz. GLSceneViewer1 ile Œal×Ģma an×nda
karĢ×laĢacağ×m×z sahneyi haz×rl×yoruz. GLCadancer1 ise zaman ayarlay×c×s×d×r. CollisionManager1 olmadan da iki
nesnenin birbirine değip değmediğini anlayamay×z. Kullanmad×ğ×m×z diğer
nesnelerin iĢe yaramad×ğ× anlam× Œ×kmas×n, AviRecorder, GLNavigator, BitmapFont
gibi faydal× nesneleri de siz keĢfedebilirsiniz.

Basit bir sahnede muhakkak GLSceneViewer1, GLScene1 ve GLCadencer1


nesnelerini bulundurmam×z gerekir. Daha sonra da GLSceneViewer1 (Align:alClient
yapsak daha iyi olur) ile Œ™zžnžrlžk, hangi kamera aŒ×s× olacak gibi ayarlar×
yapabiliriz. Kamera GLScene1 Œift t×kland×ğ×nda araŒ Œubuğundan eklenebilir. Ġki
kameram×z aĢağ×da belirtiliyor. Bu ™rnekteki sahne elemanlar× resimdeki gibidir:

AraŒ Œubuğu basit. Ayr× bir dosya olarak kaydedebilme ve aŒma ™zelliği var.
Kamera ve obje ekleme džğmesi, kes, kopyala, yap×Ģt×r, sil, yukar× hareket ettir,
aĢağ× hareket ettir ve OpenGL ™zellikleri džğmeleri bulunuyor. Nesnelere fare ile
sağ t×klay×p da ayn× menžlere ulaĢabilirsiniz. Mavi kžpler dikkatinizi ŒekmiĢtir.
Bunlar g™zžkmezler fakat bizim iŒin referans noktalar× ve gruplar oluĢtururlar.
DummyCube – Yapay Kžp‟ler olmadan nesnelerinizi yerleĢtirirseniz, uzayda
kaybolup gidersiniz. Onlar sayesinde ayağ×m×z yere(?) bas×yor. Scene objects –
sahne nesneleri ile GLCamera, GLLightSource, Sphere, Cube gibi nesneleri temel
olarak kullan×yoruz.

Ġsterseniz yeni nesne dediğiniz menždeki diğer iĢlevsel nesnelere de


bakal×m:
 Basic Geometry (basit geometrik Ģekiller) : izgi, poligon, kžre gibi nesneler
 Advanced Geometry (ileri geometrik Ģekiller) : oklu poligon, Revolution Solid
(d™nerek elde edilen kat× madde)
 Mesh Objects (bağ nesneleri) : Akt™r, serbest yap×
 Procedural Objects (formule bağl× nesneler) : partikžller, yeryžzž Ģekilleri
 Special Objects (™zel objeler) : g™kyžzž, boĢlukta yaz×, ok
 HUD Objects (Head up display – ™n panel nesneleri) : Ġki boyutlu olan yaz×
g™sterge bilgileri gibi iĢlevi olan nesneler
 Direct OpenGL : Doğrudan OpenGL render edilmesi
 Proxy Object : yetkili nesne, nesne kopyalamada kullan×labilir

Tek nesne iŒinde bu kadar ™zellik ilk kez g™ržyoruz. Alt elemanlar× t×klay×p ™zelliklerini kar×Ģt×rabilirsiniz,
zamanla bu ayarlar× Œ™zebilirsiniz. GLScene nesnesini anlad×ğ×n×zda tžm program× avucunuzun iŒinde bulabilirsiniz.
ChartFX nesnesi de gžzel ama bu gerŒekten daha yetenekli.

Nesnelerin s×ralar× ™nemli. …stte ve altta olmas× ™nceliği belirtir. Alt katmana eklenmesi de grubun iŒindeki
s×ray× belirler.

Daha x ve y boyutunu anlamadan, ekstra z boyutu bizi zorlayabilir. Bence burada nesnelerin koordinatlar×
daha kolaylaĢt×r×labilirdi. oğu zaman yerleĢtirdiğiniz nesneleri kaybedebiliyorsunuz. 3DSMax gibi programlara al×Ģ×k
olanlar fare ile nesneleri yerleĢtirmeyi daha Œok sevebilirler. Rakamsal olarak x, y ve z ile uğraĢmak biraz b×kt×r×yor.
Her nesnenin benzer ™zellikleri var. Material (renk ve doku bilgileri), Position (sahte kžp iŒindeki koordinat), Scale
(™lŒeklendirme), Up (koordinat bilgisi), Direction (koordinat bilgisi), Effects (efektler) gibi...
167

BaĢka bir boyut daha olan zaman olaylar× da TGLMovement, TGLMovementPath – yol ve TGLPathNode
mant×ğ× ile džzenleniyor. Mesela animasyon olarak bir uŒağ×n džĢmesi ve iŒinden canl× Œ×kan kahraman×n sahnesi gibi
džĢžnžlebilir. GLScene iŒinde Pathcontrol ad×ndaki bir ™rnekte belli bir yol žzerinde hareket eden kžp bulabilirsiniz.
Ayr×ca diğer ™rneklerde gerŒekten de Œok hoĢ alev, partikžl, ×Ģ×n ve ×Ģ×k efektleri bulabilirsiniz. Bir nesnenin Effects
™zelliğine ThorFX veya FireFX bağlamak kolay.

Programlama k×sm× ise hala biraz toz duman... žnkž yard×m sistemi pek yard×mc× olmuyor. FormCreate iŒine
ilk aŒ×l×Ģta GLActor1‟in yžklenmesi, silah×n×n yžklenip Actor1 ile senkron olmas×, yer Ģekillerinin dokular×n×n yžklenmesi
gibi olaylar× yaz×yoruz. Eğer CD‟den kodlar× incelerseniz, bir Œok yerde aŒ×klama sat×rlar× halinde kodlar g™rebilirsiniz.
Klavye tuĢ bas×mlar× ve fare tuĢlar× ayarland×ktan sonra projemizi Œal×Ģt×r×p denemelerde bulunabiliriz. GLCadencer1
nesnesinin tek olay× olan GLCadencer1Progress iŒine devaml× izlenen olaylar olan tuĢ bas×m× ve may×n kžremizin
kodlar×n× yaz×yoruz. Art×k bundan sonra, nesnelere Path - yol oluĢturmay× ™ğrenmek, daha etkin kod yazmak, bizim
hareketimizle tetiklenen diğer olaylar× yazmak, daha hoĢ ve gerŒekŒi materyaller elde etmek geliyor.

Ġkinci ™rnek platform (Mario benzeri) oyunlar× iŒin daha uygun. G™rsel olarak tasarlamak yerine herĢeyi
kodlarla yapman×z gerekli. Programlamay× sevenlere g™re... DXTimer ve DXDraw nesneleri bizim iŒin yeterli. Geri
kalan nesneler resim, mžzik kžtžphaneleri, joystick ve network – ağ ayarlar× gibi iĢlemleri yaparlar. Ġsterseniz sadece
iĢinizi g™ren ses kžtžphanesini veya ağ nesnesini baĢka programlarda kullanabilirsiniz. Tercuman program×mda bu
DXWavList nesnesini kullanabilirdim. Program×n bulunduğu dizindeki *.x uzant×l× dosyalar× 3DSMax veya Lightwave ile
haz×rlayabilirsiniz. Asl×nda *.3ds dosyalar×n× *.x format×na Œeviren programlar da var. Bu dosyalarda Mesh Object –
bileĢik nesne olarak haz×rlanm×Ģlard×r, yani sadece maddenin bžkžm, k™Ģe gibi bilgileri saklan×r.

D3DUtils.pas dosyas×n× incelerseniz poligon, Œizgi, vekt™rler, matrisler ile ilgili matematiksel kodlar
bulabilirsiniz. DX2 klas™ržndeki ™rneğimizde, saydam bir sand×ğ× klavye y™n tuĢlar× ile d™nderdiğimi, ileri geri hareket
ettirdiğimi g™rebilirsiniz. DXImageList kullanarak sand×ğ×n yžz dokular×n× yžklžyoruz.

Resim 28 – DirectX ™rneği (DX2 dizinindeki proje) ve tut2.exe (3Dfx Œal×Ģmas×)


168

20. MS Peint (PaintBrush yapımı)


(Ornekler\Delphi\Peint\MSPeint.dpr)

MSPaint veya diğer ad× ile PaintBrush program×na benzer bir program yaz×yoruz. *.bmp dosya tžržnde dosya
aŒma, kaydetme ve oluĢturma iĢlemleri yapabiliyoruz. Ayr×ca duvar kağ×d× olarak ayarlamak, saydam yap×Ģt×rmak,
renkleri ters Œevirmek, renk doldurmak, rengi baĢka bir renk ile değiĢtirmek, bžyžteŒ etkisi yapmak, boyutland×rmak
gibi iĢlevler de kazand×rabiliyoruz. Toolbar, MainMenu ve PopupMenu gibi nesneler de bize yard×mc× oluyor. Delphi 5
ile haz×rlad×ğ×m bu ™rnekte Toolbar‟lar×n sžržklenebildiği dikkatinizi Œekebilir. YerleĢtireceğiniz Panel‟lerin koordinesi ile
tekrar eski yerlerine almay× yapabilirsiniz. AraŒ Œubuklar×n×n Dock – g™mžlme ™zelliği Delphi‟de kod yazmaya gerek
kalmadan halledilebiliyor. MSPaint‟deki gibi Œevirme, uzatma, yazd×rma, taray×c× veya kameradan alma gibi
™zelliklerimiz yok. Dosya d™nžĢtžrme ve f×rŒa gibi araŒlar× siz de ekleyebilirsiniz. Geri al komutu yerinde yeller
esiyor...

Resim 29 – Peint Œal×Ģmam×z


169

Kodlar:

unit Unit1; ToolButton8: TToolButton;


interface ToolButton9: TToolButton;
uses Yaptr1: TMenuItem;
Windows, Messages, SysUtils, Classes, Graphics, Yaptr2: TMenuItem;
Controls, Forms, Dialogs, Menus, ToolWin, ComCtrls, Yardm1: TMenuItem;
ExtCtrls, ColorGrd, ExtDlgs, ImgList, StdCtrls, Spin,clipbrd; Yaztipi1: TMenuItem;
type Yaztipi2: TMenuItem;
TForm1 = class(TForm) Yeni1: TMenuItem;
A1: TMenuItem; procedure Image1MouseMove(Sender: TObject; Shift:
Aralar1: TMenuItem; TShiftState; X, Y: Integer);
Artr1: TMenuItem; procedure FormCreate(Sender: TObject);
Azalt1: TMenuItem; procedure Hakknda1Click(Sender: TObject);
Boyutlandr1: TMenuItem; procedure Kapat1Click(Sender: TObject);
Byt1: TMenuItem; procedure Yeni1Click(Sender: TObject);
Byte1: TMenuItem; procedure A1Click(Sender: TObject);
ColorDialog1: TColorDialog; procedure Kaydet1Click(Sender: TObject);
ColorGrid1: TColorGrid; procedure Yaztipi1Click(Sender: TObject);
Dosya1: TMenuItem; procedure Dahafazlarenk1Click(Sender: TObject);
DuvarKadOlarak1: TMenuItem; procedure Kopyala1Click(Sender: TObject);
Dzen1: TMenuItem; procedure Kes1Click(Sender: TObject);
FontDialog1: TFontDialog; procedure Yaptr1Click(Sender: TObject);
Hakknda1: TMenuItem; procedure ToolButton1Click(Sender: TObject);
Image1: TImage; procedure ToolButton2Click(Sender: TObject);
ImageList1: TImageList; procedure ToolButton3Click(Sender: TObject);
Kapat1: TMenuItem; procedure ToolButton4Click(Sender: TObject);
Kaydet1: TMenuItem; procedure ToolButton5Click(Sender: TObject);
Kes1: TMenuItem; procedure ToolButton6Click(Sender: TObject);
Kes2: TMenuItem; procedure Image1MouseDown(Sender: TObject; Button:
Klt1: TMenuItem; TMouseButton; Shift: TShiftState; X, Y: Integer);
Kopyala1: TMenuItem; procedure ColorGrid1Change(Sender: TObject);
Kopyala2: TMenuItem; procedure Image1MouseUp(Sender: TObject; Button:
MainMenu1: TMainMenu; TMouseButton; Shift: TShiftState; X, Y: Integer);
N1: TMenuItem; procedure Shape2ContextPopup(Sender: TObject;
N2: TMenuItem; MousePos: TPoint; var Handled: Boolean);
N4: TMenuItem; procedure Boyutlandr1Click(Sender: TObject);
OpenPictureDialog1: TOpenPictureDialog; procedure SeiliRengiburenkiledeitir1Click(Sender:
Panel1: TPanel; TObject);
PopupMenu1: TPopupMenu; procedure Renkler1Click(Sender: TObject);
Renk1: TMenuItem; procedure Siyahbeyaz1Click(Sender: TObject);
Renkler1: TMenuItem; procedure ToolButton11Click(Sender: TObject);
SavePictureDialog1: TSavePictureDialog; procedure ToolButton12Click(Sender: TObject);
SaydamYaptr1: TMenuItem; procedure Artr1Click(Sender: TObject);
Seiliblgeyiiftrenkdoldur1: TMenuItem; procedure Azalt1Click(Sender: TObject);
SeiliRengiburenkiledeitir1: TMenuItem; procedure Seiliblgeyiiftrenkdoldur1Click(Sender:
SeiliRengiFGdeeriiledeitir1: TMenuItem; TObject);
Shape1: TShape; procedure DuvarKadOlarak1Click(Sender: TObject);
Shape2: TShape; procedure Timer2Timer(Sender: TObject);
Siyahbeyaz1: TMenuItem; procedure SaydamYaptr1Click(Sender: TObject);
SpinEdit1: TSpinEdit; procedure Byt1Click(Sender: TObject);
StatusBar1: TStatusBar; procedure Klt1Click(Sender: TObject);
Timer2: TTimer; private
ToolBar1: TToolBar; { Private declarations }
ToolBar2: TToolBar; public
ToolButton1: TToolButton; { Public declarations }
ToolButton10: TToolButton; end;
ToolButton11: TToolButton; var
ToolButton12: TToolButton; Form1: TForm1;
ToolButton2: TToolButton; cizimtipi,basx,basy,thick:integer;
ToolButton3: TToolButton; renkal:TColor; kareSecim: TShape;
ToolButton4: TToolButton; gecici:TComponent; geciciResim:Timage;
ToolButton5: TToolButton; fname:string;
ToolButton6: TToolButton; implementation
ToolButton7: TToolButton;
170

{$R *.DFM} caption:='MS Peint - '+OpenPictureDialog1.FileName;


fname:=OpenPictureDialog1.FileName;
procedure TForm1.Image1MouseMove(Sender: TObject; end;
Shift: TShiftState; X, gecici:=Components[componentcount-1];
Y: Integer); //secimi tekrar aktif etmek için shape nesnesini siliyoruz
var renk:TColor;kalinlik:integer; if gecici is TShape then
begin gecici.free;
StatusBar1.Panels[1].text:='('+inttostr(image1.Picture.Graphi end;
c.Width)+':' + inttostr (image1.Picture.Graphic.height)+')
'+format('%d,%d',[x,y]); procedure TForm1.Kaydet1Click(Sender: TObject);
if (ssLeft in shift)and not(ssShift in shift) then begin begin
image1.Canvas.pen.color:=shape2.Pen.Color; SavePictureDialog1.Execute;
image1.Canvas.brush.color:=shape2.brush.Color; if SavePictureDialog1.FileName<>'' then begin
Image1.Canvas.pen.width:=SpinEdit1.Value; image1.Picture.SaveToFile(SavePictureDialog1.FileName);
if cizimtipi=1 then Image1.Canvas.LineTo(x,y) caption:='MS Peint - '+SavePictureDialog1.FileName;
else fname:=savePictureDialog1.FileName;
if cizimtipi=6 then begin end;
renk:=Image1.Canvas.pen.color; gecici:=Components[componentcount-1];
kalinlik:=Image1.Canvas.pen.width; if gecici is TShape then
Image1.Canvas.pen.color:=clWhite; gecici.free;
Image1.Canvas.pen.width:=SpinEdit1.Value; end;
Image1.Canvas.Rectangle(x,y,x+SpinEdit1.Value,y+SpinEdit
1.Value); procedure TForm1.Yaztipi1Click(Sender: TObject);
Image1.Canvas.pen.color:=renk; begin
Image1.Canvas.pen.width:=kalinlik; FontDialog1.Font:=image1.Canvas.Font;
end; FontDialog1.Execute;
end; image1.Canvas.Font:=FontDialog1.Font;
end; end;

procedure TForm1.FormCreate(Sender: TObject); procedure TForm1.Dahafazlarenk1Click(Sender: TObject);


begin begin
image1.Canvas.LineTo(0,0); ColorDialog1.Color:=Image1.Canvas.pen.Color;
image1.Canvas.brush.Style:=bssolid; if ColorDialog1.Execute then
cizimtipi:=1; thick:=5; Image1.Canvas.pen.Color:=ColorDialog1.Color;
Caption:='MS Peint - yeni resim'; end;
fname:='bos';
end; procedure TForm1.Kopyala1Click(Sender: TObject);
var i,j:integer;
procedure TForm1.Hakknda1Click(Sender: TObject); begin
begin gecici:=Components[componentcount-1];
MessageDlg('MS Peint 1.0'+chr(13)+'Kasım if gecici is TShape then begin
2001',mtCustom,[mbOk],0); geciciResim := Timage.Create (self);
end; geciciResim.Parent:= self;
geciciResim.Visible:=false;
procedure TForm1.Kapat1Click(Sender: TObject); geciciResim.Width:=kareSecim.Width;
begin close; end; geciciResim.height:=kareSecim.height;

procedure TForm1.Yeni1Click(Sender: TObject); for i:=0 to kareSecim.Width do


begin for j:=0 to kareSecim.height do
image1.Canvas.pen.Color:=clWhite; geciciResim.Canvas.Pixels[i,j]:=image1.Canvas.Pixels
image1.Canvas.brush.Color:=clWhite; [i+karesecim.left-toolbar1.Width,j+karesecim.top];
image1.Canvas.Rectangle(0,0,700,700); Clipboard.Assign(geciciResim.Picture);
Caption:='MS Peint - yeni resim'; geciciResim.free;
fname:='bos'; // gecici:=Components[componentcount-1];
gecici:=Components[componentcount-1]; // if gecici is TShape then gecici.free;
//secimi tekrar aktif etmek için shape nesnesini siliyoruz kareSecim.Visible:=false;
if gecici is TShape then end else
gecici.free; Clipboard.Assign(Image1.Picture);
end; end;

procedure TForm1.A1Click(Sender: TObject); procedure TForm1.Kes1Click(Sender: TObject);


begin var i,j:integer;
OpenPictureDialog1.Execute; begin
if OpenPictureDialog1.FileName<>'' then begin Kopyala1Click(Sender); //önce kopyala sonra sil...
image1.Picture.LoadFromFile (OpenPictureDialog1 gecici:=Components[componentcount-1];
.FileName); if gecici is TShape then begin
171

for i:=0 to kareSecim.Width do


for j:=0 to kareSecim.height do procedure TForm1.ColorGrid1Change(Sender: TObject);
image1.Canvas.Pixels[i+karesecim.left- begin
toolbar1.Width,j+karesecim.top]:=clwhite; Shape2.Pen.Color:=ColorGrid1.ForegroundColor;
end Shape2.Brush.Color:=ColorGrid1.backgroundColor;
else begin end;
image1.Canvas.pen.Color:=clWhite;
image1.Canvas.brush.Color:=clWhite; procedure TForm1.Image1MouseUp(Sender: TObject;
image1.Canvas.Rectangle(0,0,image1.Width,image1.height); Button: TMouseButton;
end; Shift: TShiftState; X, Y: Integer);
end; var metin:string;
begin
procedure TForm1.Yaptr1Click(Sender: TObject); image1.Canvas.pen.color:=shape2.Pen.Color;
var image1.Canvas.brush.color:=shape2.brush.Color;
Bitmap: TBitmap; if ToolButton11.Down then
begin image1.Canvas.brush.Style:=bsSolid;
if Clipboard.HasFormat(CF_BITMAP) then if ToolButton12.Down then
begin image1.Canvas.brush.Style:=bsclear;
Bitmap := TBitmap.Create; image1.Canvas.pen.width:=SpinEdit1.Value;
try if ssShift in shift then //shift ile seçim (kare)
Bitmap.Assign(Clipboard); begin
Image1.Canvas.Draw(0, 0, Bitmap); kareSecim := Tshape.Create (self);
finally kareSecim.Parent:= self;
Bitmap.Free; kareSecim.ShowHint:=true;
end; kareSecim.Hint:='Menüden kes, kopyala gibi iĢlemleri
end; yapabilirsiniz';
end; kareSecim.Pen.Style:=psDot;
kareSecim.Brush.Style:=bsClear;
procedure TForm1.ToolButton1Click(Sender: TObject); if x-basx<0 then
begin cizimtipi:=1; end; begin
kareSecim.Width:=basx-x;
procedure TForm1.ToolButton2Click(Sender: TObject); kareSecim.Left:= x+toolbar1.Width;
begin cizimtipi:=2; end; end else begin
kareSecim.Width:=x-basx;
procedure TForm1.ToolButton3Click(Sender: TObject); kareSecim.Left:= basx+toolbar1.Width;
begin cizimtipi:=3; end; end;
if y-basy<0 then
procedure TForm1.ToolButton4Click(Sender: TObject); begin
begin cizimtipi:=4; end; kareSecim.Height:=basy-y;
kareSecim.Top:= y;
procedure TForm1.ToolButton5Click(Sender: TObject); end else begin
begin cizimtipi:=5; end; kareSecim.Height:=y-basy;
kareSecim.Top:= basy;
procedure TForm1.ToolButton6Click(Sender: TObject); end;
begin cizimtipi:=6; end; end else begin
if cizimtipi=2 then image1.Canvas.LineTo(x,y);
procedure TForm1.Image1MouseDown(Sender: TObject; if cizimtipi=3 then image1.Canvas.Ellipse(basx,basy,x,y);
Button: TMouseButton; if cizimtipi=4 then image1.Canvas.Rectangle(basx,basy,x,y);
Shift: TShiftState; X, Y: Integer); if cizimtipi=5 then
var gecici:TComponent; begin
begin InputQuery('MS Peint','Metin giriĢi',metin);
basx:=x; image1.Canvas.TextOut(x,y,metin);
basy:=y; end;
Image1.Canvas.MoveTo(x,y); end;
if ToolButton7.Down then end;
begin
renkal:=Image1.Canvas.Pixels[x,y]; procedure TForm1.Shape2ContextPopup(Sender: TObject;
shape1.Brush.Color:=renkal; MousePos: TPoint;
shape1.pen.Color:=renkal; var Handled: Boolean);
end; begin
ColorDialog1.Color:=Image1.Canvas.pen.Color;
gecici:=Components[componentcount-1]; if ColorDialog1.Execute then
//secimi tekrar aktif etmek için shape nesnesini siliyoruz shape2.Pen.Color:=ColorDialog1.Color;
if gecici is TShape then
gecici.free; ColorDialog1.Color:=Image1.Canvas.Brush.Color;
end; if ColorDialog1.Execute then
172

shape2.brush.Color:=ColorDialog1.Color; //renk artırmak spinedit'e bağlı


end; var i,j:integer;
r,g,b:byte;
procedure TForm1.Boyutlandr1Click(Sender: TObject); begin
var for i:=0 to Image1.Picture.Graphic.Width do
genis,yuksek:string; for j:=0 to Image1.Picture.Graphic.height do
begin begin
InputQuery('GeniĢlik','Eski r:=getrvalue(image1.Canvas.Pixels[i,j])-SpinEdit1.Value;
değeri:'+inttostr(Image1.Picture.Graphic.Width)+', BoĢ g:=getgvalue(image1.Canvas.Pixels[i,j])-SpinEdit1.Value;
geçebilirsiniz',genis); b:=getbvalue(image1.Canvas.Pixels[i,j])-SpinEdit1.Value;
InputQuery('Yükseklik','Eski image1.Canvas.Pixels[i,j]:=RGB(r,g,b);
değeri:'+inttostr(Image1.Picture.Graphic.height)+', BoĢ end;
geçebilirsiniz',yuksek); end;
if genis<>'' then Image1.Picture.Graphic.Width :=
strtoint(genis); procedure TForm1.Azalt1Click(Sender: TObject);
if yuksek<>'' then Image1.Picture.Graphic.Height:= var i,j:integer;
strtoint(yuksek); r,g,b:byte;
end; begin
for i:=0 to Image1.Picture.Graphic.Width do
procedure TForm1.SeiliRengiburenkiledeitir1Click(Sender: for j:=0 to Image1.Picture.Graphic.height do
TObject); begin
var i,j:integer;buradakiRenk:Tcolor; r:=getrvalue(image1.Canvas.Pixels[i,j])+SpinEdit1.Value;
begin g:=getgvalue(image1.Canvas.Pixels[i,j])+SpinEdit1.Value;
buradakiRenk:=ColorGrid1.ForegroundColor; b:=getbvalue(image1.Canvas.Pixels[i,j])+SpinEdit1.Value;
for i:=0 to Image1.Picture.Graphic.Width do image1.Canvas.Pixels[i,j]:=RGB(r,g,b);
for j:=0 to Image1.Picture.Graphic.height do end;
begin end;
if image1.Canvas.Pixels[i,j]=renkal then
image1.Canvas.Pixels[i,j]:=buradakiRenk; procedure TForm1.Seiliblgeyiiftrenkdoldur1Click(Sender:
end; TObject);
end; var i,j,x1,y1:integer;renk1,renk2:TColor;artim:longint;
r,g,b:byte;
procedure TForm1.Renkler1Click(Sender: TObject); begin
var i,j:integer; gecici:=Components[componentcount-1];
begin if gecici is TShape then
for i:=0 to Image1.Picture.Graphic.Width do begin
for j:=0 to Image1.Picture.Graphic.height do x1:=kareSecim.Left;
begin y1:=kareSecim.Top;
image1.Canvas.Pixels[i,j]:=$02FFFFFF- for i:=0 to kareSecim.Width do
image1.Canvas.Pixels[i,j]; for j:=0 to kareSecim.height do
end; begin
end; r:=getrvalue(image1.Canvas.Pixels[i+x1-
toolbar1.Width,j+y1])-i;
procedure TForm1.Siyahbeyaz1Click(Sender: TObject); g:=getgvalue(image1.Canvas.Pixels[i+x1-
var i,j:integer; toolbar1.Width,j+y1])-i;
begin b:=getbvalue(image1.Canvas.Pixels[i+x1-
for i:=0 to Image1.Picture.Graphic.Width do toolbar1.Width,j+y1])-j;
for j:=0 to Image1.Picture.Graphic.height do image1.Canvas.Pixels[i+x1-
begin toolbar1.Width,j+y1]:=RGB(r,g,b);
if image1.Canvas.Pixels[i,j]>($FFFFFF/2) then end;
image1.Canvas.Pixels[i,j]:=clwhite else end;
image1.Canvas.Pixels[i,j]:=clBlack; end;
end;
end; procedure TForm1.DuvarKadOlarak1Click(Sender: TObject);
begin
procedure TForm1.ToolButton11Click(Sender: TObject); if fname<>'bos' then
begin SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0,
image1.Canvas.brush.Style:=bsclear; PChar(FName), SPIF_UPDATEINIFILE);
end; end;

procedure TForm1.ToolButton12Click(Sender: TObject); procedure TForm1.Timer2Timer(Sender: TObject);


begin begin
image1.Canvas.brush.Style:=bsSolid; StatusBar1.Panels[0].Text:=Application.Hint;
end; end;

procedure TForm1.Artr1Click(Sender: TObject); procedure TForm1.SaydamYaptr1Click(Sender: TObject);


173

var ZoomFactor: integer;


bmpXOR, bmpAND, bmpINVAND, bmpTarget: TBitmap; Kursor:TPoint;
oldcol: Longint;s:Tbitmap;trcol,clr:Tcolor; begin
begin GetCursorPos(Kursor);
if Clipboard.HasFormat(CF_BITMAP) then iWidth:=Image1.Width;
begin iHeight:=Image1.Height;
s := TBitmap.Create; Drect:=Rect(0,0,iWidth,iHeight);
s.Assign(Clipboard); { 2x kadar büyütür. 4x icin 2, ...}
trcol:=clwhite; //saydam renk ZoomFactor := 1;
try iTmpX:=iWidth / (ZoomFactor * 4);
bmpAND := TBitmap.Create; iTmpY:=iHeight / (ZoomFactor * 4);
bmpAND.Width := s.Width; Srect:=Rect(Kursor.x,Kursor.y,Kursor.x,Kursor.y);
bmpAND.Height := s.Height; InflateRect(Srect,Round(iTmpX),Round(iTmpY));
bmpAND.Monochrome := True; If Srect.Left<0 then OffsetRect(Srect,-Srect.Left,0);
oldcol := SetBkColor(s.Canvas.Handle, If Srect.Top<0 then OffsetRect(Srect,0,-Srect.Top);
ColorToRGB(TrCol)); If Srect.Right>(Screen.Width) then OffsetRect(Srect,-
BitBlt(bmpAND.Canvas.Handle, 0,0,s.Width,s.Height, (Srect.Right-Screen.Width),0);
s.Canvas.Handle, 0,0, SRCCOPY); If Srect.Bottom>(Screen.Height) then OffsetRect(Srect,0,-
SetBkColor(s.Canvas.Handle, oldcol); (Srect.Bottom-Screen.Height));
bmpINVAND := TBitmap.Create; C:=TCanvas.Create;
bmpINVAND.Width := s.Width; try
bmpINVAND.Height := s.Height; C.Handle:=GetDC(GetDesktopWindow);
bmpINVAND.Monochrome := True; Image1.Canvas.CopyRect(Drect,C,Srect);
BitBlt(bmpINVAND.Canvas.Handle, 0,0,s.Width,s.Height, finally
bmpAND.Canvas.Handle, 0,0, NOTSRCCOPY); C.Free;
bmpXOR := TBitmap.Create; end;
bmpXOR.Width := s.Width; end;
bmpXOR.Height := s.Height;
BitBlt(bmpXOR.Canvas.Handle, 0,0,s.Width,s.Height, procedure TForm1.Klt1Click(Sender: TObject);
s.Canvas.Handle, 0,0, SRCCOPY); var
BitBlt(bmpXOR.Canvas.Handle, 0,0,s.Width,s.Height, Srect,Drect,PosForme:TRect;
bmpINVAND.Canvas.Handle, 0,0, SRCAND); iWidth,iHeight,DmX,DmY:Integer;
bmpTarget := TBitmap.Create; iTmpX,iTmpY:Real; C:TCanvas;
bmpTarget.Width := s.Width; ZoomFactor: Integer; Kursor:TPoint;
bmpTarget.Height := s.Height; begin
BitBlt(bmpTarget.Canvas.Handle, 0,0,s.Width,s.Height, GetCursorPos(Kursor);
image1.Canvas.Handle, 1,1, SRCCOPY); iWidth:=Image1.Width;
BitBlt(bmpTarget.Canvas.Handle, 0,0,s.Width,s.Height, iHeight:=Image1.Height;
bmpAND.Canvas.Handle, 0,0, SRCAND); Drect:=Rect(0,0,iWidth,iHeight);
BitBlt(bmpTarget.Canvas.Handle, 0,0,s.Width,s.Height, ZoomFactor := 1;
bmpXOR.Canvas.Handle, 0,0, SRCINVERT); iTmpX:=iWidth / 1;
BitBlt(image1.Canvas.Handle, 1,1,s.Width,s.Height, iTmpY:=iHeight / 1;
bmpTarget.Canvas.Handle, 0,0, SRCCOPY); Srect:=Rect(Kursor.x,Kursor.y,Kursor.x,Kursor.y);
finally InflateRect(Srect,Round(iTmpX),Round(iTmpY));
bmpXOR.Free; If Srect.Left<0 then OffsetRect(Srect,-Srect.Left,0);
bmpAND.Free; If Srect.Top<0 then OffsetRect(Srect,0,-Srect.Top);
bmpINVAND.Free; If Srect.Right>(Screen.Width) then OffsetRect(Srect,-
bmpTarget.Free; (Srect.Right-Screen.Width),0);
end;{End of TRY section} If Srect.Bottom>(Screen.Height) then OffsetRect(Srect,0,-
image1.Invalidate; (Srect.Bottom-Screen.Height));
image1.repaint; C:=TCanvas.Create;
end; try
end; C.Handle:=GetDC(GetDesktopWindow);
Image1.Canvas.CopyRect(Drect,C,Srect);
procedure TForm1.Byt1Click(Sender: TObject); finally
var C.Free;
Srect,Drect,PosForme:TRect; end;
iWidth,iHeight,DmX,DmY:Integer; end;
iTmpX,iTmpY:Real;
C:TCanvas; end.
174

21. Sayı Bulmaca Oyunu (4 haneli sayı)


(Ornekler\Delphi\SayiBul2\Project1.dpr)

„ğrenci iken oynad×ğ×m×z say× bulma oyununun, bilgisayara karĢ× tek kiĢilik oynanan×. 4 haneden tutan rakam
olursa “+” artar, yeri hatal× bulunan rakamda da “–” artar. SonuŒta tžm haneler tutturulunca oyun bitiyor. Eski
yazd×ğ×n×z rakam× yandaki ListBox1 nesnesinde g™rebilirsiniz. En az say×da bilmek ™nemli, sžre tutulmas×na gerek
yoktur.

Tekrar rakam kullan×labilmesi de oyunun diğer seviyesi oluyor. Biraz daha zorlaĢt×r×p, basamak say×s× da
kullan×c×ya b×rak×labilirdi. Maskedit1 nesnesinin EditMask ™zelliğine !9999;1;+ yazabiliriz. Diğer nesnelerin ™zel bir
durumu yok.

Resim 30 – Say× Bulmaca


Kodlar:

unit Unit1; dizi2:array [0..9] of integer;


sayac,kere: integer;
interface implementation

uses {$R *.dfm}


Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, Mask, Buttons; procedure tusdoldur; //artık bu kod her yerde var
var a:integer;
type begin
TForm1 = class(TForm) if form1.CheckBox1.Checked then
BitBtn1: TBitBtn; repeat
BitBtn2: TBitBtn; a:=random(10);
BitBtn3: TBitBtn; if dizi[sayac]=-1 then
CheckBox1: TCheckBox; begin
ListBox1: TListBox; dizi[sayac]:=a;
MaskEdit1: TMaskEdit; inc(sayac);
StaticText1: TStaticText; end
StaticText2: TStaticText; else tusdoldur;
StaticText3: TStaticText; until sayac=5
StaticText4: TStaticText; else
procedure BitBtn2Click(Sender: TObject); repeat
procedure FormCreate(Sender: TObject); a:=random(10);
procedure BitBtn1Click(Sender: TObject); if dizi2[a]=-1 then
procedure BitBtn3Click(Sender: TObject); begin
procedure MaskEdit1KeyDown(Sender: TObject; var Key: dizi[sayac]:=a;
Word; dizi2[a]:=a;
Shift: TShiftState); inc(sayac);
private end
{ Private declarations } else tusdoldur;
public until sayac=5;
{ Public declarations } end;
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
var begin
Form1: TForm1; close //kapat
deneme: integer; end;
dizi:array [1..4] of integer;
175

procedure TForm1.FormCreate(Sender: TObject); if (strtoint(kullanici[1]) in [dizi[2],dizi[3],dizi[4]]) then


var i:integer; inc(bilinen);
begin if (strtoint(kullanici[2]) in [dizi[1],dizi[3],dizi[4]]) then
randomize; inc(bilinen);
deneme:=0; if (strtoint(kullanici[3]) in [dizi[1],dizi[2],dizi[4]]) then
kere:=1; inc(bilinen);
for i:=1 to 4 do dizi[i]:=-1; if (strtoint(kullanici[4]) in [dizi[1],dizi[2],dizi[3]]) then
for i:=0 to 9 do dizi2[i]:=-1; inc(bilinen);
sayac:=1; StaticText3.Caption:=inttostr(bilinen)+' - ;
tusdoldur; '+inttostr(tutulanyer)+' + ';
end; end
else
procedure TForm1.BitBtn1Click(Sender: TObject); StaticText3.Caption:=inttostr(tutulanyer)+' + ';
var kullanici:string; //Tamam düğmesi ListBox1.Items.Add(maskedit1.text+ ' '+inttostr(bilinen)+' - ;
bilinen, tutulanyer:byte; '+inttostr(tutulanyer)+' + ' );
begin if tutulanyer=4 then begin
kullanici:=MaskEdit1.Text; MaskEdit1.Enabled:=false;
bilinen:=0; StaticText2.Caption:='KAZANDIN';
tutulanyer:=0; end;
end;
if (kullanici[1]=' ')or(kullanici[2]=' ')or
(kullanici[3]=' ')or(kullanici[4]=' ') then procedure TForm1.BitBtn3Click(Sender: TObject);
begin var i:integer; //Yeni oyun
StaticText2.Caption:='Hatalı GiriĢ'; begin
exit; deneme:=0;
end; kere:=1;
if ((kullanici[1]=kullanici[2])or ListBox1.Clear;
(kullanici[1]=kullanici[3])or MaskEdit1.Enabled:=true;
(kullanici[1]=kullanici[4])or for i:=1 to 4 do dizi[i]:=-1;
(kullanici[2]=kullanici[3])or for i:=0 to 9 do dizi2[i]:=-1;
(kullanici[2]=kullanici[4])or sayac:=1;
(kullanici[3]=kullanici[4])) tusdoldur;
and (form1.CheckBox1.Checked=false) then begin MaskEdit1.Text:='';
StaticText2.Caption:='Hatalı GiriĢ'; StaticText4.Caption:='0';
exit; StaticText2.Caption:='Kere';
end; StaticText3.Caption:='0 - ; 0 + ';
end;
staticText4.Caption:=inttostr(kere);
inc(kere); procedure TForm1.MaskEdit1KeyDown(Sender: TObject; var
StaticText2.Caption:='Kere'; Key: Word; Shift: TShiftState);
if kullanici[1]=inttostr(dizi[1]) then inc(tutulanyer); begin
if kullanici[2]=inttostr(dizi[2]) then inc(tutulanyer); if key=VK_RETURN then BitBtn1.OnClick(self);
if kullanici[3]=inttostr(dizi[3]) then inc(tutulanyer); end;
if kullanici[4]=inttostr(dizi[4]) then inc(tutulanyer);
if CheckBox1.Checked = false then begin end.
176

22. Veritabanı Grafik Analizi (DBChart kullanımı)


(Ornekler\Delphi\grafik_Chart\DB\Project1.dpr)

Delphi nesnelerinde g™zat×nca Chart, VTChart, DBChart ve ChartFX gibi birŒok grafik nesnesi ile karĢ×laĢ×yoruz.
SonuŒta her tžrlž uygulamalarda basit de olsa bir veri dizisinin grafiğini kullanmam×z gerekebilir. Sabit veri giriĢlerinin
grafiğinin Œ×kar×lmas× iŒin oluĢturduğumuz “Ornekler\Delphi\grafik_Chart\Project1.dpr” ™rneğini inceleyebilirsiniz.
ġimdiki ™rneğin verileri ise database yani veritaban×ndan geliyor.

veri.db dosyam×z×n genel yap×s×:

Alan Ad× Tipi Bžyžklžğž


AdiSoyadi A 32
Yasi N
Cinsiyeti A 5
EgitimDurumu A 32
Meslek A 32
IlgiAlani A 32

Tabii ki cinsiyeti Bay/Bayan, eğitim durumunu Ortaokul, Lise, Yžksekokul gibi bir listeden almas× kullan×c×n×n
veri giriĢini daha kolaylaĢt×r×yor. Bunun iŒin DBGrid1 nesnesine Œift t×klayoruz, Œ×kan kžŒžk pencereye sağ t×klay×p “Add
All Fields” komutunu vererek istediğimiz alan×n PickList ™zelliğini dolduruyoruz.

Grafiğin temel fikri, bir tžr veride yžzde kaŒ giriĢ yap×lm×Ģ olduğunu Pie – pasta grafik Ģeklinde g™rmektir.
Diğer grafik tiplerine g™re Bar – Œubuk ve Pie – pasta daha anlaĢ×l×r. Bir grafiğin ™zelliklerine eriĢmek iŒin ona Œift
t×klay×n×z.

DBChart1 nesnesini Cinsiyeti iŒin kullan×rsak Ģ™yle yapabiliriz. Form žzerine att×ğ×m×z Query1 nesnesinin SQL
™zelliğine:

select cinsiyeti, count (cinsiyeti)


from veri
group by cinsiyeti

yaz×p, Active ™zelliğini True yap×yoruz. Bu deyim ile veri.db‟den bir alan× al×p, o alandan kaŒ adet olduğunu
bularak sžzmemizi sağl×yoruz. „rneğin Bay 3 adet, Bayan 4 adet gibi...

DBChart1, ad×ndan belli olduğu gibi verilerini bir tablo veya sorgudan al×yor. …zerine Œift t×klay×p, Chart
sayfas×nda Add džğmesine bas×yoruz. Eklediğimiz seriye Series sayfas×ndan Datasource iŒ sayfas×na t×klay×p, Dataset,
Query1, cinsiyeti, COUNT OF cinsiyeti s×ras× ile giriĢ yap×yoruz. Bunun iŒin aĢağ×daki Ģekile bak×n×z.

Resim 31a – DBChart1‟in seri bilgisi


177

Bundan sonra da yine resimlerdeki gibi bir grafik elde etmek isterseniz her tžrlž ayar bu Ģekilde sakl×. Form
tasar×m× zaman×m×z× al×rken, neredeyse hiŒ program yazmadan iĢimiz bitiyor. Sadece Timer1 ile veya Button2 ile
gžncellemek iŒin gerekli birkaŒ sat×r komut yaz×yoruz.

Resim 31b – Form tasar×m×

Kodlar:

unit Unit1; Dialogs, ComCtrls, ExtCtrls, DBTables, DB, DBCtrls,


Grids, DBGrids,
interface StdCtrls, TeEngine, Series, TeeProcs, Chart, DbChart;

uses type
Windows, Messages, SysUtils, Variants, Classes, TForm1 = class(TForm)
Graphics, Controls, Forms, Button1: TButton;
178

Button2: TButton;
CheckBox1: TCheckBox; implementation
DataSource1: TDataSource;
DBChart1: TDBChart; {$R *.dfm}
DBChart2: TDBChart;
DBChart3: TDBChart; procedure TForm1.Button1Click(Sender: TObject);
DBChart4: TDBChart; begin
DBGrid1: TDBGrid; close
DBNavigator1: TDBNavigator; end;
PageControl1: TPageControl;
PageControl2: TPageControl; procedure TForm1.Timer1Timer(Sender: TObject);
PieSeries1: TPieSeries; begin
Query1: TQuery; Button2Click(self);
Query2: TQuery; //böylece iki kat program yazmaktan kurtulduk
Query3: TQuery; end;
Query4: TQuery;
Series1: TPieSeries; procedure TForm1.Button2Click(Sender: TObject);
Series2: TPieSeries; begin
Series3: TPieSeries; Query1.close; //biraz aptalca ve yavaş...
Table1: TTable; Query1.Open;
TabSheet1: TTabSheet; Query2.close;
TabSheet2: TTabSheet; Query2.Open;
TabSheet3: TTabSheet; Query3.close;
TabSheet4: TTabSheet; Query3.Open;
TabSheet5: TTabSheet; Query4.close;
TabSheet6: TTabSheet; Query4.Open;
Timer1: TTimer; DBChart1.RefreshData;
procedure Button1Click(Sender: TObject); DBChart2.RefreshData;
procedure Timer1Timer(Sender: TObject); DBChart3.RefreshData;
procedure Button2Click(Sender: TObject); DBChart4.RefreshData;
procedure CheckBox1Click(Sender: TObject); end;
private
{ Private declarations } procedure TForm1.CheckBox1Click(Sender: TObject);
public begin
{ Public declarations } timer1.Enabled:=CheckBox1.Checked;
end; end;

var end.
Form1: TForm1;
179

23. Okul Ders Programı (Haftalık ders programı yapımı)


(Ornekler\Delphi\DersProg.zip ve orgun.zip)

1998 y×l×ndaki žniversite son s×n×f tezimiz. Bu program×n amac× Okul Ders Program× yapmakt×r. Okul Ders
Program× bir okulun ders kay×tlar×n×n tutulabileceği ve ders programlar×n×n haz×rlanabileceği bir programd×r. Bu
program ile Ģube, ™ğretim eleman× (™ğretmen) ve dershanelerin haftal×k ders program× kay×tlar× tutulabilir ve bunlar×n
d™kžmleri al×nabilir.

Batur Baykan arkadaĢ×m ile yapt×k, aradan uzun bir zaman geŒtiği iŒin art×k kitaba da ekleyebilirim diye
džĢžndžm. YaklaĢ×k 850 saatlik Œal×Ģma, 11000 sat×r olan kodlar×n× CD‟den bakman×z gerekli, burada sadece baz×
ekran g™ržntžleri ve algoritmas×n× ekledim. Delphi 7 ile tasarlad×ğ×m×z iŒin son sžržm QuickRep yžklž Delphi‟de
rahatl×kla aŒ×l×p değiĢiklikler yap×labilir.

Resim 32a– Ders Program× aŒ×l×Ģ penceresi


180

Resim 32b – Veri giriĢi

Resim 32c – Otomatik Program Haz×rlama


181
182

Resim 32d – El ile yerleĢim ve raporlama pencereleri

Bu sžržmžnž lise ders program×na g™re ™zelleĢtirdim. Yani žniversitede gžnlžk 12 ders var iken lisede 10 ders
saati var olacak Ģekilde değiĢiklik yapt×m. Cumartesi de ders yap×labiliyordu. B™yle tasarlamam×z daha ileriye d™nžk
bir Œal×Ģma olmas×n× sağlam×Ģ, ders saati, gžn eklemek zor olurdu.

O y×llarda TžrkŒe karakter, baz× bilgisayarlarda k™tž g™ržnžm veriyordu, baz× menžlerde TžrkŒe karakterler
var iken baz×lar×nda × yerine i kullan×nca biraz tuhaf olmuĢ. Elimden geldiğince bu hatalar× džzelttim. En bžyžk
sorunumuz ise 800x600 ekranda tasarlanan program×n yžksek Œ™zžnžrlžkte biraz yana kaymas×, ona benzer garip
pencereler olmas×na sebep oldu. Ama pencere ayarlar×n× akl×nda tutmas× sayesinde bu sorunu aĢ×yoruz. Genelde Teal
– koyu yeĢil renk ve Arial yaz×tipi kullan×ld×.

Bunun d×Ģ×nda yedekleme penceresinde “Geri Yžkleme”ye gžvenmemek laz×m. Program o s×rada Œal×Ģt×ğ× iŒin
veritabanlar× žzerine yeni dosyalar yžklemez. O yžzden en iyisi program kapal× iken, elle yedekleri geri almak.

Program yapmak iŒin 3 y™ntemimiz var. Otomatik, el ile 1 ve el ile 2. Otomatik yerleĢtirme ™ncesinde belli
™ğretmenlerin dersi programa kat×lmayabilir. Bu veri giriĢ penceresinde “Dahil etme” alan×nda yap×l×yor. Ġstenirse de el
ile 1‟de listeden bir ders sağ t×klan×p Otomatik yerleĢtirilebiliyor. Bu iki pencerede ders program× haz×rlama belli
kurallar iŒinde olduğundan, 3. y™ntemi kullanabiliyoruz. El ile 2‟de veriler tamamen serbestŒe değiĢtirilebilir. Yine de
arka planda ders kayd×nda sorun olup olmad×ğ×, eksiklik var m× diye bir kontrol de var. Bu durum Œubuğunda
belirtiliyor. Mesela „ğretmen ve Derslik‟e ders girilip de Ģubeye atanmam×Ģsa bu durum Œubuğunda rahatl×kla
g™ržlžyor. Ders kodlar×n×n tam yaz×lmas× gerekli. KžŒžk bžyžk harf fark× var. Mesela DĠJ9 aynen yaz×l×rsa d™kžm
kusurlu Œ×kt× vermiyor.
183

Bir derse birden fazla ™ğretmen de atanabiliyor. Ġleride gerekirse daha fazla da ekleyebiliriz. Yani 3 veya 4
™ğretmen de olabilir. Sadece Dershane d™kžmžnde iki ™ğretmen g™ržlžyor.

Program×n Œal×Ģmas×nda, aŒ×l×Ģ ekran×ndan veritabanlar×na kadar hiŒ gžvenlik ™nlemi al×nmam×Ģ. Yani veriler
Ģifreli değil, kullan×c× hesaplar× yok. Zaten en bžyžk eksiklik ağ desteğinin olmamas×. Program sadece bir bilgisayarda
Œal×Ģs×n diye džĢžnžldž. Excel‟e aktar×m ile birazc×k (tek y™nde) d×Ģ džnyaya da uyumlu hale geliyor.

S×k×Ģt×r×l×nca kaynak kod ile birlikte 870KB oluyor. ġu adresten ibinstall.defined.net indirlecek BDE kurulumu ile
hemen her Windows sžržmžnde program×m×z Œal×Ģ×yor. Kurulmadan ™nce toplam gereken alan 10MB ediyor. BDE
kurulunca el ile “orgun” alias× eklenir ve program Œal×Ģmaya haz×r hale gelir. Alias yap×l×rken program×n bulunduğu
yerdeki “I__C_DONEM” klas™rž belirtilir. Asl×nda Installshield ile kurulum haz×rlasayd×m, bu dert olmayacakt×. Neyse,
bedava iĢin desteği az oluyor iĢte.

“Kritik hata” mesajlar× sayesinde bžyžk hatalarda, program×n kapan×p gitmesi engelleniyor. Baz× hallerde veri
diske kaydedilemeden, program kapanabilir. Ve tžm yap×lan değiĢiklikler unutulabilir. O sebeple program belli
aral×klarla kapat×l×p tekrar aŒ×lmal×d×r.

Minimum gereklilikler: Win98, 32MB RAM, 10MB disk alan×, 4MB ekran kart×, fare, yaz×c×
Tavsiye Edilen: WindowsXP, 512MB RAM, 64MB ekran kart×, lazer yaz×c×

„zellikler:
1- Ders verilerini girme, ders atama, istenmeyen gžn ve saat seŒme
2- Ders b™lme, Ģube birleĢtirme, at™lye grubu oluĢturma,
3- a- Otomatik ders haz×rlama (farkl× ™nceliklere g™re,
Ģube ve derslik kapasitesine g™re bak×larak)
b- El ile džzenleme (sžržkle b×rak y™ntemi, tek dersi
otomatik yerleĢtirme)
c- Tamamen k×s×tlamas×z el ile mždahale ve džzeltme formu
Œ- ak×Ģma ve yerleĢmeyen bilgileri listeleme, renklendirme
4- Yaz×c× d™kžmž, tžm s×n×flar×n d™kžmž, Excel'e veri Œ×k×Ģ×
5- Teneffžs saatleri džzenlenebilir, okul ad×, ™ğrenim y×l× değiĢtirilebilir
6- Veri yedekleme, silme, arama, s×ralama, bak×m, grafik g™sterim
7- Windows standart g™ržnžmžnde rahat kullan×m ™zellikleri
(ipuŒlar×, k×sayollar, pencere boyutlar× saklama, basitlik, okunakl×l×k)
8- Kod olarak Cumartesi ve 12 ders saati desteği haz×rd×r. Ġstenirse tek programdan birŒok okul ve
b™lžm de yap×labilir.

Uyar×lar:
* Yaz×c× Œ×k×Ģ×n×n džzgžn olmas× iŒin bir yaz×c× tan×ml× olmal×d×r.
** Excel Œ×k×Ģ× Microsoft Excel kurulu ise Œal×Ģ×r.
*** Bilgisayar×n×zda o anda Œal×Ģan diğer programlar, performans× etkiler.

Okul Ders Programının Algoritması: (bu kısmı hiçbir değişiklik yapmadan aktardım)

Tžm programlama dillerinde bir uygulama geliĢtirmeye baĢlamadan ™nce yap×lacak program iŒin bir algoritma
haz×rlamak gereklidir. OluĢturulacak bu algoritma program yaz×lmaya baĢland×ğ×nda bžyžk fayda sağlar. Programc×
program×n neler yapmas× gerektiğini, program×n Œal×Ģma mant×ğ×n×, ilerleme s×ras×n× algoritmay× haz×rlarken
belirleyeceğinden program×n yaz×l×Ģ aĢamas× daha kolay ve h×zl× bir Ģekilde gerŒekleĢir. Bu nedenle bu b™lžmde Okul
Ders Program×n×n algoritmas× aŒ×klanm×Ģt×r.

Okul Ders Program× algoritmas× d™rt ana b™lžm halinde džĢžnžlmžĢtžr. Bu b™lžmler veri giriĢi, otomatik ders
program× haz×rlama, el ile ders program× haz×rlama ve raporlamad×r. Diğer b™lžmlerin dayand×ğ× temel b™lžm veri giriĢi
olduğundan ™nce bu b™lžmžn algoritmas× haz×rlanm×Ģt×r.

Veri Girişi Algoritması

Yukar×da belirtildiği gibi veri giriĢi b™lžmž temel b™lžmdžr. Bu b™lžmde diğer b™lžmlerin kullanacağ× ve
program×n g™revini yerine getirebilmesi iŒin gerekli bilgilerin bilgisayara girilmesi gerŒekleĢtirilir. Veri giriĢi b™lžmž de
kendi iŒinde iki k×sma ayr×l×r. Program okul ders program×n× haz×rlayacağ×na g™re ilk k×s×mda ™ğretim elemanlar×
bilgileri, Ģube bilgileri, dershane bilgileri ve ders bilgileri girilir. Bu k×sma genel veri giriĢi de denilebilir. Ġkinci k×s×mda
184

ise ilk k×s×mda girilen bilgiler kullan×larak ™ğretim elemanlar×n×n okutacaklar× dersler, bu dersleri alacak Ģubeler ve
dersin programa yerleĢmesinde istenecek baz× ™zel koĢullar belirlenir. Bu k×s×m da ™ğretim elemanlar× ders giriĢi
olarak adland×r×labilir. AĢağ×da bu k×s×mlar daha ayr×nt×l× olarak anlat×lm×Ģt×r.

Genel Veri Girişi

Yukar×da belirtildiği gibi bu k×s×mda temel veriler olan ™ğretim elemanlar×, Ģube, dershane ve ders bilgileri
girilir. Bu veriler oluĢturulan veritaban× tablolar×nda tutulur.

Öğretim Elemanları Verileri

Bu b™lžmde ™ğretim elemanlar×n×n ad ve soyadlar×, unvanlar×, isim ve soyadlar×n×n baĢ harfleri ve her ™ğretim
eleman× iŒin bir numara girilir. Ayr×ca her ™ğretim eleman×n×n tercihine g™re boĢ olmas×n× istediği saatleri
iĢaretleyebilmesi ve o saatlere ders program×nda ders konulmamas× sağlanabilir. Bu ders saati kilitleme iĢlemi ders
gžnleri olan Pazartesi, Sal×, arĢamba, PerĢembe, Cuma ve Cumartesi gžnleri iŒin 12 ders saati žzerinden
džĢžnžlmžĢtžr.

Ad Soyad Unvan No Baş Harfler Pazartesi Pazartesi ... Pazartesi 12 Salı 1 ... Cumartesi 12
1 2
Ali Aksoy 1 1 AA True True ... False False ... False
Ahmet Ok 4 2 AO False False ... False False ... False

Tablo 1 - „ğretim elemanlar× verileri tablo yap×s×

Yukar×daki veritaban× yap×s×na istenilen say×da kay×t girilebilir. Ad Soyad alan×na ™ğretim g™revlisinin tam ad×
girilir. Unvan alan×nda Prof.Dr. 1 ile, Doc.Dr. 2 ile, Yrd.Doc.Dr. 3 ile, „ğretim G™revlisi 4 ile ve AraĢt×rma G™revlisi 5 ile
belirtilir. Ders program× haz×rlan×rken ™ncelik yžksek unvanl× ™ğretim elemanlar×n×n derslerine tan×nacağ× iŒin unvan
alan× ™nemlidir. Kolayl×k sağlamas× aŒ×s×ndan her ™ğretim eleman×na bir numara verilir. BaĢ Harfler alan×nda ™ğretim
eleman×n×n ad ve soyad×n×n baĢ harfleri girilir. Ayn× baĢ harflere sahip birden fazla kay×t varsa soyad×n ikinci harfi de
baĢ harflerin sonuna eklenebilir. Pazartesi1‟den baĢlay×p Cumartesi12‟ ye kadar giden alanlar ise ™nceden belirtildiği
gibi ders saati kilitleme olanağ× sağlar. Bu alanlar Pazartesi, Sal×, arĢamba, PerĢembe, Cuma ve Cumartesi gžnlerinin
her biri iŒin 1‟ den 12‟ ye olmak žzere 12‟ Ģer adettir. ( Pazartesi1, Pazartesi2,...., Pazartesi12, Sal×1, Sal×2, .....,
Sal×12..... ) Bu alanlar mant×ksal değerler al×r ve varsay×lan değerleri Yanl×Ģ yani False‟ d×r. Bunun anlam× o saate ders
yerleĢtirilebilir demektir. Eğer alan×n değeri Doğru yani True ile değiĢtirilir ise o saate ders yerleĢtirilmesi ™nlenir.
„rneğin Tablo 1‟de g™ržldžğž gibi Ali Aksoy isimli ™ğretim g™revlisi iŒin Pazartesi1 ve Pazartesi2 alanlar×na True değeri
verilerek ders program× haz×rlan×rken ad× geŒen kiĢiye Pazartesi gžnž ilk iki saate ders konulmamas× sağlanabilir. Eğer
kiĢi tžm bir gžnž kilitlemek isterse o gžne ait 12 alana da True değeri verilerek bu sağlanabilir.

Bu tablo ile ™ğretim elemanlar×n×n bilgileri kay×tlar halinde tutulabilir. Ancak ders program× haz×rlan×rken her
bir ™ğretim eleman×n×n haftal×k ders programlar×n× ayr× ayr× tutacak baĢka bir tablo yap×s×na daha ihtiyaŒ vard×r. Yani
her bir ™ğretim eleman×n×n Pazartesi gžnž hangi saatte hangi dersi bulunuyor, yine Sal× gžnž hangi saatte hangi dersi
var gibi bilgileri tžm ders gžnleri iŒin tutan bir tablo daha oluĢturmak gereklidir.

Baş Ders Ders Ders Ders Ders Ders Ders Ders Ders Ders Ders Ders
Harfler Gün 1 2 3 4 5 6 7 8 9 10 11 12
AA Pazartesi
AA Sal×
AA arĢamba
AA PerĢembe
AA Cuma
AA Cumartesi
AO Pazartesi
AO Sal×
Tablo 2 - „ğretim eleman× ders program× tablosu

Bu ikinci tablo ilk tablo ile koordine olarak Œal×Ģmal×d×r. Yani ilk tabloya eklenen her bir ™ğretim eleman× iŒin
ikinci tabloda otomatik alt× ayr× kay×t aŒ×l×r. Bu alt× kay×t ilk tabloya girilen ™ğretim eleman×n×n baĢ harflerine dayan×r ve
her kay×t bir ders gžnž iŒin aŒ×l×r. Yine Tablo 2‟de g™ržldžğž gibi her bir kay×t on iki ders saati iŒerir. Bu iki tablo yap×s×
aras×ndaki iliĢki Tablo 3‟de daha iyi g™ržlebilir.

Ad Soyad unvan No Baş Harfler Pazartesi Pazartesi .. Pazartesi 12 Salı 1 .. Cumartesi 12


1 2 . .
Ali Aksoy 1 1 AA True True .. False False .. False
Ahmet Ok 4 2 AO False False .. False False .. False
185

Baş Ders Ders Ders Ders Ders Ders Ders Ders Ders Ders Ders Ders
Harfler Gün 1 2 3 4 5 6 7 8 9 10 11 12
AA Pazartesi
AA Sal×
AA arĢamba
AA PerĢembe
AA Cuma
AA Cumartesi
AO Pazartesi
Tablo 3 - „ğretim elemanlar× tablolar× aras×ndaki bağlant×

Tablo 3‟deki mant×ğa g™re ilk tabloda herhangi bir ™ğretim eleman×n×n kayd× silindiğinde, o kiĢinin ikinci
tablodaki alt× kayd× da silinir. B™ylece Œ×kabilecek kar×Ģ×kl×klar engellenir. Yine ayn× Ģekilde birinci tabloda bir kay×tta
yap×lacak baĢ harf değiĢikliği ikinci tablodaki ilgili kay×tlara da otomatik olarak uygulan×r. Ġkinci veritaban× tablosundaki
Ders1‟den Ders12‟ye kadar olan alanlara ders program× haz×rlan×rken ilgili ™ğretim eleman×n×n dersleri yerleĢtirilir. Bu
aĢama ileride aŒ×klanacakt×r.

Şube Verileri

ġube verileri b™lžmž ™ğretim eleman× verileri k×sm× ile hemen hemen ayn×d×r. Veriler yine iki ayr×
veritaban×nda tutulur. Ġlk tabloda Ģube ad×, Ģubenin mevcudu ve b™lžm bilgileri kay×tl×d×r. Yine ™ğretim elemanlar×
verilerinde olduğu gibi Ģubeler iŒin de ders saatleri kilitleme imkan× sağlanm×Ģt×r. Yani tžm ders gžnleri iŒin 12‟Ģer
mant×ksal alan ayr×lm×Ģt×r. Bu alanlar Pazartesi1‟den baĢlay×p Cumartesi12‟ye kadar gider.

Şube Adı Mevcut Bölüm Pazartesi Pazartesi 2 .... Pazartesi 12 Salı 1 .... Cumartesi 12
1
1BBK 45 Bilgisayar True True ... True True ... True
2B1 43 Bilgisayar False False ... False False ... False

Tablo 4 - ġube verileri yap×s×

ġube ad× alan×nda Ģubelerin isimleri tutulur. Mevcut alan× ders program× haz×rlan×rken uygun dershane
bulmakta kullan×l×r. B™lžm alan×nda ise Ģubenin dahil olduğu b™lžm belirtilir. B™lžm bilgisi ders program×n×n
raporlanmas× aĢamas× iŒin gereklidir. „ğretim eleman× verilerinde aŒ×kland×ğ× gibi Pazartesi1‟den Cumartesi12‟ye kadar
olan alanlara True değerleri verilerek ders program×nda ilgili Ģubenin o saatine ders konulmamas× sağlanabilir.

Ayn× Ģekilde her bir Ģubenin haftal×k ders program×n×n tutulacağ× ikinci bir tablo yap×s× da gereklidir. Bu yap× da
™ğretim elemanlar× verilerindeki ile ayn×d×r.

Ders Ders Ders Ders Ders Ders Ders Ders Ders Ders Ders Ders
Şube Gün 1 2 3 4 5 6 7 8 9 10 11 12
1BBK Pazartesi
1BBK Sal×
1BBK arĢamba
1BBK PerĢembe
1BBK Cuma
1BBK Cumartesi
2B1 Pazartesi
2B1 Sal×
Tablo 5 - ġubeler iŒin ders program× tablosu

Ġlk tabloya girilen her yeni Ģube iŒin ikinci veritaban×nda otomatik olarak alt× kay×t aŒ×l×r. Bu alt× kay×ttan her
biri bir ders gžnž iŒindir. Ġki veritaban× birbirine bağl×d×r. Yani ilk tablodan silinen bir Ģubenin kay×tlar× ikinci tablodan
da silinir. Ayn× Ģekilde ilk tabloda Ģube ad×nda yap×lan değiĢiklikler aynen ikinci veritaban×na da yans×r. Ders1‟den
Ders12‟ye olan alanlara ders program× haz×rlan×rken Ģubenin dersleri doldurulur.

Dershane Verileri

Dershane verilerinin algoritmas× da ™nceki iki b™lžm ile ayn×d×r. Birinci veritaban× tablosunda dershane kodu,
dershane mevcudu ve aŒ×klama bilgileri depolan×r. Dershane kodu dershanenin ad× olarak džĢžnžlebilir. Mevcut ders
program× oluĢturulurken Ģube mevcutlar× ile karĢ×laĢt×rmada kullan×l×r. AŒ×klama ise isteğe bağl×d×r. Dershane hakk×nda
aŒ×klay×c× bilgi vermekte kullan×l×r. „rneğin anfi veya laboratuarlar belirtilir. Ders saati kilitleme yine ayn×d×r.
186

Dershane Mevcut Açıklama Pazartesi Pazartesi 2 .... Pazartesi 12 Salı 1 .... Cumartesi 12
Kodu 1
D410 45 S×n×f True True ... True True ... True
D510 40 S×n×f False False ... False False ... False

Tablo 6 - Dershane verileri yap×s×

Ġkinci veritaban× ile de tžm dershanelerin ayr× ayr× haftal×k programlar× tutulur. Diğer iki k×s×mda olduğu gibi
yine ilk tabloya girilen yeni kay×t iŒin ikincide otomatik olarak alt× gžn iŒin ayr× kay×tlar aŒ×l×r. Yine ilk tablodaki
değiĢiklikler ikinciye otomatik yans×r.

Ders Ders Ders Ders Ders Ders Ders Ders Ders Ders Ders Ders
Dershane Gün 1 2 3 4 5 6 7 8 9 10 11 12
D410 Pazartesi
D410 Sal×
D410 arĢamba
D410 PerĢembe
D410 Cuma
D410 Cumartesi
D510 Pazartesi
D510 Sal×
Tablo 7 - Dershaneler iŒin ders program× tablosu

Ders Verileri

Ders verilerinin algoritmas× diğerlerinden daha basittir. Tek bir veritaban× tablosu ile ders ad×, ders kodu, teori
ve laboratuar saatleri say×s×, dersin hangi b™lžmžn dersi olduğu bilgileri saklan×r. Ek olarak kayd× yap×lan dersin
Bitirme Projesi veya „ğretmenlik Uygulamas× gibi ™zel yap×da bir ders olup olmad×ğ×n× belirtmek iŒin bir alan
tan×mlanmal×d×r. Bu yap× aĢağ×daki Ģekilde oluĢturulur.

Ders Kodu Ders Adı Teori Laboratuar Bölüm Özel Ders


EDC482 „ğretmenlik Uyg. 0 8 Bilgisayar True
ELC114 Comp. Prog.1 3 2 Bilgisayar False

Tablo 8 - Ders verileri yap×s×

Ders kodu alan×nda derse verilen kod isim belirtilir. Ders ad× ile dersin uzun ad× verilir. Teori ve laboratuar
alanlar× dersin teori ve laboratuar saat say×lar×n× belirtir. B™lžm dersin hangi b™lžmžn dersi olduğunu belirler. „zel
ders alan× ise mant×ksal bir aland×r. Varsay×lan değeri False‟dur. Eğer bu alana True değeri verilirse o ders „ğretmenlik
Uygulamas× gibi sadece Ģubelerin program×na yerleĢecek bir ders olarak tan×mlan×r ve ders program× oluĢturulurken
buna g™re iĢleme konulur.

Öğretim Elemanları Ders Verileri Girişi

„ğretim elemanlar× ders verileri k×sm×nda ise ilk b™lžmde girilen bilgiler kullan×larak ™ğretim elemanlar×n×n
okutacaklar× dersler, bu dersleri alacak Ģubeler ve dersin programa yerleĢmesinde istenecek baz× ™zel koĢullar
belirlenir. Ders program× oluĢturulurken kullan×lacak as×l bilgiler bu k×s×mda girilir. Bir ™nceki b™lžmde girilen bilgiler
tamamen bu k×sm×n oluĢturulmas×na yard×mc× verilerdir. „ğretim elemanlar× ders verileri oluĢturulan bir veritaban×
tablosunda kay×tlar halinde tutulur.

Öğretim Ders Ders Teori Lab Şube Şube Şube Şube Ders-Lab. Teori Lab. Lab Lab
Elemanı Kodu Adı 1 2 3 4 Birleştir Böl Böl 1 2
Ahmet SCI102 Matematik 6 0 2B1 False True False
Ok
Ahmet SCI102 Matematik 6 0 2B2 False True False
Ok
Ali Aksoy ELC114 Comp. 3 2 2B1 2B2 True False True D408 D409
Prog.1
Ali Aksoy ELC332 Comp. Prog. 3 2 3BB 3BK 3BT 3BE True False False D408 D409
3
Tablo 9 - „ğretim elemanlar× ders verileri yap×s×

Tablo 9‟da g™ržlen yap×ya her ™ğretim eleman×n×n okutacağ× dersler ayr× kay×tlar olarak girilir. Bu kay×tlara
bağl× olarak ders program×n×n nas×l haz×rlanacağ× Otomatik Ders Program× Algoritmas× k×sm×nda aŒ×klanacakt×r. „ğretim
eleman× alan×nda ™ğretim g™revlisinin ad ve soyad× tutulur. „ğretim g™revlisi daha ™nce anlat×lan „ğretim Elemanlar×
Verileri tablosundaki kay×tlar aras×ndan seŒilir. Ders kodu ™ğretim eleman×n×n okutacağ× derse verilen kod bilgisini
187

kapsar. Bu kod bilgisi de ™nceden kay×tlar× girilen Ders Verileri veritaban×‟inden seŒilir. Ders kodu seŒildiğinde ders ad×,
teori ve laboratuar bilgileri otomatik olarak Ders Verileri tablosundan okunarak Tablo 9‟daki ilgili alanlara yaz×l×r. Bir
dersin teori k×sm× ayn× saatte ve dershanede, ayn× ™ğretim eleman× taraf×ndan d™rt Ģubeye birden verilebileceğinden
ġube1, ġube2, ġube3 ve ġube4 adl× d™rt alan bulunur. „ğretim g™revlisinden dersi ayn× saatte ortak alan Ģubeler s×ra
ile bu alanlara yerleĢtirilir. Eğer ayn× dersi alan Ģubeler, bu dersi farkl× saatlerde g™recekler ise her Ģube iŒin ayr× kay×t
girilmelidir. „rneğin yukar×daki tabloda g™ržldžğž gibi Ahmet Ok isimli ™ğretim g™revlisi SCI102 kodu Matematik
dersini 2B1 ve 2B2 Ģubelerine ayr× zamanlarda g™stereceğinden her bir Ģube iŒin ayn× ™ğretim eleman× ad×na iki ayr×
kay×t aŒ×lm×Ģt×r. Ayn× Ģekilde Ali Aksoy isimli ™ğretim g™revlisi ELC114 kodlu Programlama dersinin 3 saat olan teori
b™lžmžnž 2B1 ve 2B2 Ģubelerine ayn× saatte ve ayn× derslikte beraber g™stereceğinden bu iki Ģube iŒin sadece bir
kay×t aŒ×lm×Ģt×r. Ancak bu iĢlem sadece teori saatleri iŒin geŒerlidir. Ders program× haz×rlan×rken laboratuar saatleri her
Ģube iŒin, teoriler ortak olsa bile, ayr× ayr× yerleĢtirilir.

Sonra gelen Ders-Lab BirleĢtir, Teori B™l, Laboratuar B™l alanlar× mant×ksal alanlard×r ve True/False değerleri
al×rlar. Bu alanlar×n varsay×lan değerleri False‟dur. Ders-Lab BirleĢtir alan×na True değeri verilmesi dersin teori
saatlerinin de laboratuar saatleri gibi laboratuarda iĢleneceğini belirtir. Yine tablodaki ™rnekte Ali Aksoy‟un
Programlama 1 ve Programlama 3 dersleri iŒin Ders-Lab BirleĢtir alan×na True değeri verilerek ders program×
haz×rlan×rken teori saatlerinin de laboratuara yerleĢtirilmesi sağlan×r. Teori B™l alan×na True atanmas× ile ise dersin
teori saatlerinin ikiye b™lžnerek ayr× gžnlere yerleĢtirilmesi sağlan×r. „rnekte Ahmet Ok adl× ™ğretim g™revlisinin
Matematik dersi kay×tlar×nda Teori B™l alan×na True atanarak dersin 6 saat olan teori k×sm×n×n žŒer saat halinde ayr×
gžnlere yerleĢtirilmesi sağlanabilir. Son olarak Lab B™lme alan×n× True yaparak dersin laboratuar saatlerini A ve B
grubu olarak iki gruba ay×rmak mžmkžndžr. Tablo 9‟da bunu Ali Aksoy‟un Programlama 1 dersi kayd×nda
g™rebilirsiniz.

Son iki alan olan Lab1 ve Lab2 alanlar×na ise dersin varsa laboratuar k×sm×n×n g™sterileceği laboratuarlar×n
kodu girilerek laboratuar saatlerinin bu dersliklere yerleĢtirilmesi sağlan×r. Baz× dersler iŒin birden fazla laboratuar
mevcut ise bu alanlara iki ayr× laboratuar girilebilir. Program haz×rlan×rken dersin laboratuar k×sm× ™nce Lab1
alan×ndaki dersliğe yerleĢtirilmeye Œal×Ģ×l×r. Eğer buras× uygun değil ise laboratuar saatleri Lab2 alan×nda belirtilen
dershaneye yerleĢtirilir.

Otomatik Ders Programı Algoritması

Otomatik ders program× ile temel veriler (dersler, Ģubeler, dershaneler, ™ğretim elemanlar× veri tabanlar×) ve
™ğretim elemanlar× iŒin girilen ders verileri kullan×larak otomatik ders haz×rlan×r. Otomatik Program baĢlay×nca s×ra
ile Ģunlar olur. „nce derslerin yerleĢtirildiği veritabanlar×n×n boĢalt×l×p boĢalt×lmayacağ× sorulur. Bu iĢlem ile daha
™nce haz×rlanm×Ģ bir ders program× var ise silinmesi sağlan×r. „zel dersler (™ğretmenlik uygulanmas×, bitirme
projesi...) gibi dersler ay×klan×p bir diziye atan×r. „zel dersler Ģ™yle yerleĢtirilir; kaŒ Ģube iŒin bu ders belirtilmiĢ ise
her Ģubeye farkl× gžnlere ders atan×r. Yani ™ğretmenlik uygulamas× 4BB iŒin pazartesi, 4BE iŒin sal× gžnž olmas×
sağlan×r. Ġlk kay×t okunup ™ğretim eleman× baĢharfleri, ders kodu, Ģubeler ve diğer bilgiler ara değerlere atan×r.

Eğer ™ğretim eleman×n×n ders kayd×nda hatalar var ise ekrana hata mesaj× gelir. Bu hatalar bilinmeyen Ģube
girmek, bilinmeyen derslik kodu girmek, laboratuar× olan dersin laboratuar kodunun verilmemesi, ders kodunun
olmamas× gibi hatalard×r.

Eğer ders ™zel bir ders değil ise derslik bulma, teori b™lme ve uygun saat arama iĢlemleri yap×l×r. „zel ders
ise derslik ve ™ğretim elemanlar× g™zard× edildiği iŒin daha basit bir saat kontrolž yap×l×r.

Teorik b™lžnecek ise d™ngž iŒinde teorik dersin yar×s× bir gžne, diğer yar×s× ayr× bir gžne konulur. Eğer bu
dersin laboratuar say×s× s×f×r ise yani uygulamas× olmayan bir ders ise, veri giriĢ k×sm×nda laboratuar1 ve laboratuar2
olarak girilen kodlar bu dersin teorisinin iĢleneceği derslik olarak yerleĢtirilir. Eğer hiŒ uygulamas× olmayan derse
laboratuar da belirtilmemiĢ ise bu derse derslik aran×r. Eğer uygun yer bulunamaz ise ekrana hata mesaj× eklenir.
Eğer dersin uygulamas× var ise, ders ve laboratuar×n ayn× derslikte olacağ× iĢaretli mi kontrol edilir. ĠĢaretli değil ise
ders iŒin derslik aran×r. Bu ders iŒin belirtilmiĢ her Ģube iŒin ayr× ayr× laboratuarlar yerleĢtirilir, fakat hepsi ayn×
derslikte ayn× saatte teorik derslerini iĢlerler. Ayr×ca laboratuar b™lme (A ve B grubu gibi) kutusu iĢaretlenmiĢ ise her
Ģubenin ayr× ayr× laboratuar gruplar× farkl× saatlerde olmak žzere uygulamalar×n× yaparlar. Bilgisayar eğitimi dersi
3BB ve 3BK Ģubelerine verilecek ve bu ders iŒin laboratuar b™lme var ise 3BB‟nin uygulamas× ikiye, 3BK‟n×n
uygulamas× farkl× saatlerde yine uygulamas× ikiye ayr×l×r. Fakat her iki Ģube de ayn× derslikte teorilerini iĢlerler.

Uygun saat arama ve derslik bulma kullan×lan iki ana prosedžrdžr. Her Œağr×ld×klar×nda haftan×n ilk gžnž ilk
saatinden itibaren iĢlemler ilerler. „rgžn eğitimde, dersler yerleĢtirilirken uygulamalar iŒin s×n×r 12 saat iken, teorik
iŒin bu 8 saattir. Yani 8. saatten sonra sadece labaratuar konulur. Ġkinci ™ğretim iŒin her iki s×n×r 8‟dir. Buradaki
amaŒ gžndžz ™ğrencilerin son saatlerde derslikleri kullanmay×p ikinci ™ğretim derslik imkan×n× rahatlatmakt×r.
188

„ğretim eleman×na girilen dersler yerleĢtirilirken ™ğretim eleman×n žnvan×na g™re s×ralan×r. B™lžm ayr×m×
yapmaks×z×n dersleri yerleĢtirir. Yani bilgisayar b™lžmž ile elektrik b™lžmžnžn dersleri ayn× anda yerleĢtirilir. Bunun
anlam× b™lžm ayr×m×n×n sadece ders kodu ve Ģube iŒin geŒerli olduğudur. B™ylece farkl× b™lžm ™ğrencileri ayn×
binada ayn× derslikleri paylaĢ×rlar. Asla derslikleri, ™ğretim elemanlar× ve Ģubeleri Œak×Ģmaz.

Veri giriĢinde ayr×ca belli saatlerin iĢaretlenip bu saatlere ders konulmamas× istenebildiği iŒin o saatlere ders
yerleĢtirilmez. „rneğin D410 dershanesi pazartesi gžnžnžn tžmž iĢaretlenmiĢ ise bu saatlerde ders burada
iĢlenmez. Bu sayede derslik baĢka amaŒlar iŒin kullan×labilir. Bu ™ğretim elemanlar× ve Ģubeler iŒin de geŒerlidir.
Ġstenen Ģubeye istenen saatlerde, istenen ™ğretim eleman×na istenen saatlere ders konulmaz.

„ğretim eleman×, ilk Ģube, ikinci Ģube, žŒžncž Ģube, d™rdžncž Ģube, ilk derslik ve ikinci derslik ayn× gžn ve
saatte kilitli değilse ve dolu değil ise yerleĢme iĢlemi yap×l×r. Birisinde bile uygun olmayan durum olduğu anda gžn ve
saat değerleri değiĢtirilmeye devam edilir. Gžn ve saat bittiği halde hala ders yerleĢmemiĢ ise, ana prosedžr olan
baĢlang×ca d™nžlžp, ekrana hata tipi ve aŒ×klamas× eklenir.

BoĢ dershane ararken kullan×lan mevcut Ģu Ģart kullan×larak denetlenir; eğer Ģubelerin toplam mevcutlar×
dershanenin kapasitesinin 30 eksiğinden bžyžk veya eĢit, dershanenin kapasitesinin 20 fazlas×ndan kžŒžk veya eĢit
ise bu derslik uygun demektir. B™ylece ™rneğin 24 mevcutlu 4BB‟nin dersi, 200 kiĢi kapasiteli D102 dersliğine
konulmaz.

El ile Ders Programı Hazırlama Algoritması

Bu b™lžmde de Veri GiriĢi b™lžmžnde girilen bilgiler kullan×l×r. El ile Ders Program× Haz×rlama b™lžmžnžn
algoritmas× dershanelerin haftal×k ders programlar×na dayan×r. Yani ekrana seŒilen bir dershanenin haftal×k ders
program× Œizelgesi gelir. Her gžn iŒin on iki ders saati vard×r ve her ders saatinin yan×nda d™rt Ģube iŒin ayr×lm×Ģ
alanlar vard×r. Bunun nedeni daha ™nce belirtildiği gibi d™rt ayr× Ģubenin ayn× dersi ayn× anda alabilme olas×l×ğ×d×r.
Dershaneler iŒin haftal×k program cizelgesi Tablo 10‟da ki Ģekildedir.

D410 PAZARTESİ SALI ...


Ders Kodu Şube1 Şube2 Şube3 Şube4 Ders Kodu Şube1 Şube2 Şube3 Şube4 ...
Ders 1 SCI102 2B1 ...
Ders 2 SCI102 2B1 ELC332 3BB 3BK 3BT 3BE ...
Ders 3 SCI102 2B1 ELC332 3BB 3BK 3BT 3BE ...
Ders 4 SCI102 2B1 ELC332 3BB 3BK 3BT 3BE ...
Ders 5 SCI102 2B1 ...
Ders 6 SCI102 2B1 ...
Ders 7 ...
Ders 8 ...
Ders 9 ...
Ders 10 ...
Ders 11 ...
Ders 12 ...
Tablo 10 - Dershane program Œizelgesi

Tablo 10‟daki Œizelgede sadece Pazartesi ve Sal× gžnleri g™ržlmektedir. Ancak doğal olarak Œizelge tžm ders
gžnlerini kapsar. Yukar×da ™rnek olarak bu iki gžn kullan×lm×Ģt×r.

izelgede Ders Kodu alanlar×ndan birisine bir dersin kodu girildiğinde o dersi alan Ģubelerin bir listesi ile
karĢ×laĢ×l×r. Bu listeyi oluĢturmak iŒin Veri GiriĢi b™lžmžnde girilen „ğretim Elemanlar× Ders Verileri kay×tlar× kullan×l×r.
Girilen ders kodu ile kay×tlardaki ders kodlar× karĢ×laĢt×r×larak uygun Ģubeler dersi ortak alma durumlar× da g™z ™nžne
al×narak listelenirler. B™ylece ġube alanlar×n× doldurma iĢlemi bu listeden seŒilerek yap×labilir. Bu Ģekilde el ile girilen
bilgiler ders programlar×na kaydedilir.

Veri GiriĢi k×sm×nda aŒ×kland×ğ× gibi her yeni ™ğretim eleman× kayd× iŒin ™ğretim g™revlilerinin haftal×k ders
program×n× tutacak olan veritaban× tablosunda alt× kay×t otomatik olarak aŒ×l×r (Tablo 2‟deki yap×). Yine hat×rlanacağ×
gibi her bir kay×t bir ders gžnž iŒindir. Ayn× iĢlem Ģubeler ve dershaneler iŒin de geŒerlidir. ĠĢte dershanelerin ders
program× Œizelgesine el ile girilen bilgiler s™zž edilen veri tabanlar×nda aŒ×lan bu kay×tlarda ilgili ders saatleri alanlar×na
yerleĢtirilir. Bu kay×t iĢlemi Tablo 10‟da ki SCI102 kodlu ders iŒin aĢağ×da aŒ×klanm×Ģt×r.

Tablo 10‟da D410 dershanesine Pazartesi gžnž ilk alt× saat iŒin SCI102 kodlu Matematik dersi yerleĢtirilmiĢtir.
Bu dersi 2B1 Ģubesi tek olarak alacakt×r. Bu bilgiler veri tabanlar×na kaydedilirken ™ncelikle dershanelerin haftal×k ders
program×n× tutan veritaban×‟de D410 dershanesinin Pazartesi gžnž iŒin aŒ×lan kayd× bulunur. Kay×ttaki Ders1, Ders2,
Ders3, Ders4, Ders5 ve Ders6 adl× alanlara bak×l×r. Eğer bu alanlardan bir yada fazlas× baĢka bir ders kodu ile dolu ise,
yani Œak×Ģma var ise kay×t yap×lmaz ve uyar× mesaj× verilir. Ard×ndan Ģubelerin ders program×n× tutan veritaban×
189

tablosunda 2B1 Ģubesinin Pazartesi gžnž iŒin aŒ×lm×Ģ kay×t bulunur ve Ders1‟den Ders6‟ya olan alanlar iŒin Œak×Ģma
olup olmad×ğ× kontrol edilir ( Eğer birden fazla Ģube dersi ortak olarak al×rsa her bir Ģubenin ilgili kay×tlar× s×ra ile
kontrol edilir ). Son olarak ™ğretim elemanlar× ders verilerini tutan veritaban×‟den SCI201 kodlu Matematik dersini 2B1
Ģubesine g™stermekle g™revli ™ğretim eleman×n×n ad× ve baĢ harfleri ™ğrenilir. „rnekte g™revlinin ad×n×n Ahmet Ok ve
baĢ harflerinin AO olduğu varsay×lm×Ģt×r. Ayn× Ģekilde ™ğretim g™revlilerinin ders program×n× tutan veritaban×
tablosunda ilgili kiĢinin Pazartesi gžnž iŒin aŒ×lm×Ģ kayd× bulunur. Ders1‟den Ders6‟ya olan alanlar kontrol edilir. Tžm
bu kontrollerin sonucunda eğer herhangi bir Œak×Ģma yoksa dersin kodu olan SCI102 bu žŒ veritaban× tablosunda ilgili
kay×tlar×n Ders1‟den Ders6‟ya kadar olan alanlar×na kaydedilir. Eğer Œak×Ģmalar bulunur ise bunlar×n bir listesi
kullan×c×ya bildirilir ve kay×t yap×lmaz. Daha sonra ders program× aŒ×k olarak g™ržlmek istendiğinde bilgiler bu žŒ
dosyadan okunarak birleĢtirilir. Dersin veri tabanlar×na kaydedilmiĢ hali aĢağ×daki Ģekildedir.

Ders Ders Ders Ders Ders Ders Ders Ders Ders Ders Ders Ders
Dershane Gün 1 2 3 4 5 6 7 8 9 10 11 12
D410 Pazartesi SCI102 SCI102 SCI102 SCI102 SCI102 SCI102

D410 Sal×

D410 Cumartesi
a- Dershane tablosuna kay×t

Ders Ders Ders Ders Ders Ders Ders Ders Ders Ders Ders Ders
Şube Gün 1 2 3 4 5 6 7 8 9 10 11 12
2B1 Pazartesi SCI102 SCI102 SCI102 SCI102 SCI102 SCI102

2B1 Sal×

2B1 Cumartesi
b- ġube tablosuna kay×t

Ders Ders Ders Ders Ders Ders Ders Ders Ders Ders Ders Ders
Öğretim Gün 1 2 3 4 5 6 7 8 9 10 11 12
Elemanı
AO Pazartesi SCI102 SCI102 SCI102 SCI102 SCI102 SCI102

AO Sal×

AO Cumartesi
c- „ğretim eleman× tablosuna kay×t
Tablo 11 - Dersin veri tabanlar×na kayd×

Tablolarda da g™ržldžğž gibi SCI201 dersi ™ğretim eleman×n×n, Dershanenin ve Ģubenin Pazartesi gžnž ilk alt×
saatine kaydedilmiĢtir. Bu žŒ tablodan veriler okunup karĢ×laĢt×r×larak birleĢtirilerek ™ğretim eleman×, Ģube ve
dershane verilerinin tamam×n×n olduğu tam bir ders program× haz×rlanabilir.

Raporlama Bölümü Algoritması

Raporlama b™lžmžnde otomatik veya el ile haz×rlanan ders programlar×n×n d™kžmleri al×n×r. Raporlama d™rt
tipte olabilir. ġube ders program×, ™ğretim eleman× ders program×, dershane ders program× ve genel ders program×. Bu
d™kžmleri oluĢturmak iŒin ™ğretim elemanlar×n×n ders programlar×n× tutan veritaban×ndaki bilgiler, Ģubelerin ders
programlar×n× tutan veritaban×ndaki bilgiler ve dersliklerin haftal×k programlar×n× tutan veritaban×ndaki bilgiler
karĢ×laĢt×r×l×r ve birbirlerini tutanlar birleĢtirilir.

ġube iŒin ders program× raporunda ders, ™ğretim eleman× ve derslik bilgileri vard×r. Bu d™kžm oluĢturulurken
Ģubelerin ders programlar×n× tutan veritaban×ndan istenilen Ģubenin Pazartesi, Sal×, arĢamba, PerĢembe, Cuma ve
Cumartesi gžnleri iŒin aŒ×lm×Ģ kay×tlar× esas al×n×r. „ncelikle Ģubenin Pazartesi gžnžne ait kayd×n Ders1 alan×ndaki ders
kodu ele al×n×r. Bu ders kodu ™ğretim elemanlar×n×n programlar×n× tutan veritaban× dosyas×ndaki Pazartesi gžnžne ait
tžm kay×tlar ile karĢ×laĢt×r×l×r. Pazartesi gžnžne ait kayd×n×n Ders1 alan×ndaki ders kodu bilgisi Ģubeninki ile ayn× olan
™ğretim g™revlisi Ģubenin raporuna yaz×l×r. Ayn× iĢlem derslik iŒin de tekrar edilir. Pazartesi gžnž kayd×n×n Ders1
alan×ndaki bilgi aran×lan ders kodu ile birbirini tutan dershane dersin iĢleneceği dershane demektir. Pazartesi
gžnžndeki tžm ders saatlerinin ders kodlar×, ™ğretim g™revlileri ve dershaneleri bulununca diğer gžnlere geŒilir.
Dershane raporunun mant×ğ× da ayn× Ģekildedir. Dershane program× d™kžmžnde ders kodu, dersi alan Ģubeler
ve ™ğretim g™revlisi bilgileri bulunur. Bu raporda istenilen dershanenin program× esas al×n×r ve yukar×da aŒ×klanan
y™ntem ile her ders saati iŒin Ģubeler ve ™ğretim eleman× bilgileri bulunarak raporda yazd×r×l×r. Tek fark dersler d™rt
Ģubeye kadar ortak g™ržlebildiğinden Ģubelerin veritaban× dosyas× d™rt kere taran×r ve aranan ders koduna uygun tžm
Ģubeler bulunur.
190

„ğretim eleman× raporu da ders, Ģubeler ve derslik bilgilerinden oluĢtuğundan tamamen dershane raporu gibi
oluĢturulur.

En son rapor olan Genel Ders Program× raporu ise okuldaki b™lžmler g™z al×narak haz×rlan×r. Yani bir b™lžme
mensup olan tžm Ģubelerin ders, ™ğretim eleman× ve dershane verilerini iŒeren raporlar× ayr× ayr× haz×rlan×larak
birleĢtirilir ve b™lžmžn genel ders program× haline getirilir.
191

24. Dolphin (müzik yapma programı)


(Ornekler\Delphi\Dolphin.zip)

May×s 2001 tarihli 2 hafta sžreli bu proje asl×nda DanceEJay‟den geliyor. WavMix nesnesini kullanarak 8 kanal
mžzik Œal×yoruz. Basit olarak AŒ Kaydet diyaloglar×, durum Œubuğu kullan×m×, thread kullan×m× ve Ģekilli form ve form
sžržklenmesi yap×yoruz. Yard×m dosyas×n× OasisSE ile yapt×m. TListBox'dan TStringGrid nesnesine eleman
sžržkleyebiliyoruz. Mžzik parŒalar×n× Kopyala, Kes ve Yap×Ģt×r gibi iĢlemler varolmas×na rağmen Geri Al k×sm× yok. Ini
dosyalama ile de *.dmf (Dolphin Music File) olarak kay×t edebiliyoruz.

Resim 33a – Ana pencere


Thread (kanal) program×n×n kodlar×:

unit sesthread;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, WaveMix, Grids, ComCtrls, Buttons, ExtCtrls,
StdCtrls;

type
sescal = class(TThread)
private
{ Private declarations }
filenm:string;
chan:integer;
w: array [0..10] of PMixWave;
protected
procedure Execute; override;
192

public
constructor Create(dosya:string;kanal:integer);
end;

{ sescal }

implementation
uses kod;

constructor sescal.Create(dosya:string;kanal:integer);
begin
filenm:=dosya;
chan:=kanal;
inherited Create(false);
end;

procedure sescal.Execute;
begin
// repeat
w[chan-1] := form1.WaveMix1.OpenFromFile(filenm);
form1.WaveMix1.Play( chan-1, w[chan-1], nil, WMIX_QUEUEWAVE, 0 );
// until Terminated;
end;
end.

Ana Program×:

unit kod; PopupMenu2: TPopupMenu;


Play1: TMenuItem;
interface StatusBar1: TStatusBar;
BitBtn2: TBitBtn;
uses MainMenu1: TMainMenu;
Windows, Messages, SysUtils, Classes, Graphics, File1: TMenuItem;
Controls, Forms, Dialogs, Open1: TMenuItem;
WaveMix, Grids, ComCtrls, Buttons, ExtCtrls, Save1: TMenuItem;
StdCtrls,sesthread, Menus, Clear1: TMenuItem;
OleCtrls,IniFiles, ImgList; N1: TMenuItem;
Close1: TMenuItem;
type Edit1: TMenuItem;
TForm1 = class(TForm) Play2: TMenuItem;
StringGrid1: TStringGrid; Help1: TMenuItem;
ImageList1: TImageList; About1: TMenuItem;
Panel1: TPanel; Contents1: TMenuItem;
SpeedButton1: TSpeedButton; Pause1: TMenuItem;
SpeedButton2: TSpeedButton; Stop1: TMenuItem;
SpeedButton3: TSpeedButton; N2: TMenuItem;
OpenDialog1: TOpenDialog; Cleartheselectedarea2: TMenuItem;
SaveDialog1: TSaveDialog; Fillthesoundthisarea2: TMenuItem;
Timer1: TTimer; SpeedButton4: TSpeedButton;
SpeedButton5: TSpeedButton; SpeedButton6: TSpeedButton;
PopupMenu1: TPopupMenu; BitBtn1: TBitBtn;
Fillthesoundthisarea1: TMenuItem; Insertxtimesto1: TMenuItem;
Cleartheselectedarea1: TMenuItem; Copy1: TMenuItem;
PageControl1: TPageControl; Cut1: TMenuItem;
TabSheet1: TTabSheet; Paste1: TMenuItem;
ListView1: TListView; N3: TMenuItem;
TabSheet2: TTabSheet; N4: TMenuItem;
TabSheet3: TTabSheet; Copy2: TMenuItem;
TabSheet4: TTabSheet; Cut2: TMenuItem;
TabSheet5: TTabSheet; Paste2: TMenuItem;
TabSheet6: TTabSheet; WaveMix1: TWaveMix;
ListView2: TListView; procedure FormCreate(Sender: TObject);
ListView3: TListView; procedure ListView1MouseDown(Sender: TObject; Button:
ListView4: TListView; TMouseButton;
ListView5: TListView; Shift: TShiftState; X, Y: Integer);
ListView6: TListView;
193

procedure StringGrid1DragDrop(Sender, Source: Form1: TForm1;


TObject; X, Y: Integer); w: array [0..10] of PMixWave;
procedure StringGrid1DragOver(Sender, Source: bellek: array [0..100, 0..8] of string;
TObject; X, Y: Integer; var X,Y:Integer;
State: TDragState; var Accept: Boolean); FShow :Boolean; // Mesaj için degişken
procedure Button1Click(Sender: TObject); F :TForm; // Aktif Olan Formu kullanmak için
procedure SpeedButton3Click(Sender: TObject); R :HRgn; // Formun Seklini belirtmek için
procedure SpeedButton4Click(Sender: TObject); implementation
procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButton5Click(Sender: TObject); uses About;
procedure StringGrid1KeyDown(Sender: TObject; var
Key: Word; {$R *.DFM}
Shift: TShiftState); procedure Tform1.Hinting(Sender: TObject); //ipuclari olayi
procedure Fillthesoundthisarea1Click(Sender: TObject); begin
procedure Cleartheselectedarea1Click(Sender: statusbar1.Panels[0].Text:=application.Hint;
TObject); end;
procedure ListView2MouseDown(Sender: TObject;
Button: TMouseButton; Procedure TForm1.SetForm;
Shift: TShiftState; X, Y: Integer); var
procedure ListView3MouseDown(Sender: TObject; Dizi:Array[0..50] of TPoint;
Button: TMouseButton; I :Integer;
Shift: TShiftState; X, Y: Integer); I_ :LongInt;
procedure ListView4MouseDown(Sender: TObject; begin
Button: TMouseButton; with form1 do begin
Shift: TShiftState; X, Y: Integer); X:=Width;
procedure ListView5MouseDown(Sender: TObject; Y:=Height;
Button: TMouseButton; Dizi[0].X:=100; Dizi[0].Y:=0;
Shift: TShiftState; X, Y: Integer); Dizi[1].X:=100; Dizi[1].Y:=20;
procedure ListView6MouseDown(Sender: TObject; Dizi[2].X:=x-60; Dizi[2].Y:=20;
Button: TMouseButton; Dizi[3].X:=X-60; Dizi[3].Y:=0;
Shift: TShiftState; X, Y: Integer); Dizi[4].X:=x; Dizi[4].Y:=0;
procedure Cal(Sender: TObject); Dizi[5].X:=x; Dizi[5].Y:=y;
procedure SpeedButton1Click(Sender: TObject); Dizi[6].X:=0; Dizi[6].Y:=y;
procedure Play1Click(Sender: TObject); Dizi[7].X:=0; Dizi[7].Y:=0;
procedure FormMouseDown(Sender: TObject; Button: R:=CreatePolygonRgn(Dizi,8,Winding);
TMouseButton; SetWindowRgn( Handle,R,True);
Shift: TShiftState; X, Y: Integer); end;
procedure Timer1Timer(Sender: TObject); bitbtn2.Left:=x-96;
procedure BitBtn2Click(Sender: TObject); Update;
procedure FormKeyDown(Sender: TObject; var Key:
Word; end;
Shift: TShiftState);
procedure Close1Click(Sender: TObject);
procedure Contents1Click(Sender: TObject); function GetFileSize(const FileName: string): LongInt;
procedure Hinting(Sender: TObject); //ipuclari olayi var
Procedure SetForm; SearchRec: TSearchRec;
procedure FormResize(Sender: TObject); begin
procedure BitBtn1MouseDown(Sender: TObject; Button: try
TMouseButton; if FindFirst(ExpandFileName(FileName), faAnyFile,
Shift: TShiftState; X, Y: Integer); SearchRec) = 0 then
procedure FormDragOver(Sender, Source: TObject; X, Result := SearchRec.Size
Y: Integer; else Result := -1;
State: TDragState; var Accept: Boolean); finally
procedure About1Click(Sender: TObject); SysUtils.FindClose(SearchRec);
procedure SpeedButton6Click(Sender: TObject); end;
procedure Copy1Click(Sender: TObject); end;
procedure Cut1Click(Sender: TObject);
procedure Paste1Click(Sender: TObject); procedure TForm1.FormCreate(Sender: TObject);
private var
{ Private declarations } i : byte;
public begin
{ Public declarations } Application.OnHint:=Hinting;
SesCalThread:array [1..8] of Sescal ; Application.HintColor:=claqua;
end; form1.SetForm;
for i:=1 to 8 do stringgrid1.cells[0,i]:=inttostr(i);
var for i:=1 to 100 do begin
194

stringgrid1.cells[i,0]:=inttostr(i); end; //for


end; end;
end; end;
end;
procedure TForm1.ListView1MouseDown(Sender:
TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); procedure TForm1.StringGrid1DragOver(Sender, Source:
var a:tlistitem; TObject; X,
begin Y: Integer; State: TDragState; var Accept: Boolean);
if Button = mbLeft then begin
begin if sender is tlistitem then accept:=true;
a:=tlistitem.Create(listview1.Items); end;
a:=listview1.GetItemAt(x,y);
if a<>nil then listview1.BeginDrag(false); procedure TForm1.Button1Click(Sender: TObject);
end; begin
end; close;
end;
procedure TForm1.StringGrid1DragDrop(Sender, Source:
TObject; X, procedure TForm1.SpeedButton3Click(Sender: TObject);
Y: Integer); var dizin:string;
var code,deger,cln,stn:integer;g:string; i,j:integer;
dongu : byte; ayarini:TIniFile;
clickedok:boolean; begin
begin SaveDialog1.Execute;
if Source is Tbitbtn then if Savedialog1.FileName<>'' then begin
begin
bitbtn1.left:=x; ayarini:=TIniFile.Create(Savedialog1.FileName);
end;
stringgrid1.MouseToCell(x,y,cln,stn); for i:=1 to 100 do
if (stn<>0) and (cln<>0) then begin for j:=1 to 8 do
if Source is TListView then
begin ayarini.WriteString(inttostr(i),inttostr(j),StringGrid1.cells[i,j]);
initialize(deger);
g:='1'; ayarini.Free;
clickedok:=InputQuery('Count', 'How many will you use end;
this sound?', g); end;
if clickedok then else exit;
Val(g, deger, Code); procedure TForm1.SpeedButton4Click(Sender: TObject);
stringgrid1.MouseToCell(x,y,cln,stn); var i,j:integer;
stringgrid1.row:=stn; ayarini:TIniFile;
stringgrid1.col:=cln; begin
for dongu:=1 to deger do begin OpenDialog1.Execute;
if PageControl1.ActivePage.Caption='Hihat' then if opendialog1.FileName<>'' then begin
if listview1.SelCount<>0 then ayarini:=tinifile.create(opendialog1.FileName);
stringgrid1.cells[stringgrid1.col+(dongu- for i:=1 to 100 do
1),stringgrid1.row] :=listview1.Selected.Caption; for j:=1 to 8 do
if PageControl1.ActivePage.Caption='Kickbass' then
if listview2.SelCount<>0 then StringGrid1.cells[i,j]:=ayarini.readstring(inttostr(i),inttostr(j),'');
stringgrid1.cells[stringgrid1.col+(dongu-
1),stringgrid1.row] :=listview2.Selected.Caption; ayarini.Free;
if PageControl1.ActivePage.Caption='Latin' then end;
if listview3.SelCount<>0 then end;
stringgrid1.cells[stringgrid1.col+(dongu-
1),stringgrid1.row] :=listview3.Selected.Caption; procedure TForm1.SpeedButton2Click(Sender: TObject);
if PageControl1.ActivePage.Caption='Snare' then begin
if listview4.SelCount<>0 then WaveMix1.Activated:=false;
stringgrid1.cells[stringgrid1.col+(dongu- end;
1),stringgrid1.row] :=listview4.Selected.Caption;
if PageControl1.ActivePage.Caption='Tomtom' then procedure TForm1.SpeedButton5Click(Sender: TObject);
if listview5.SelCount<>0 then var i,j:integer;
stringgrid1.cells[stringgrid1.col+(dongu- begin
1),stringgrid1.row] :=listview5.Selected.Caption; if Application.MessageBox('Confirm to clear','Question',1)
if PageControl1.ActivePage.Caption='Triangle' then =IDOK then
if listview6.SelCount<>0 then begin
stringgrid1.cells[stringgrid1.col+(dongu- cursor:=crHourGlass;
1),stringgrid1.row] :=listview6.Selected.Caption; for i:=1 to 100 do
195

for j:=1 to 8 do procedure TForm1.Cleartheselectedarea1Click(Sender:


StringGrid1.Cells[i,j]:=''; TObject);
cursor:=crDefault; var i,j ,fark:integer;
end; begin
end; for j:=1 to StringGrid1.Selection.bottom-
StringGrid1.Selection.top+1 do
procedure TForm1.StringGrid1KeyDown(Sender: TObject; for i:=1 to StringGrid1.Selection.Right-
var Key: Word; StringGrid1.Selection.Left+1 do
Shift: TShiftState); begin
var i,j :integer; stringgrid1.cells[StringGrid1.Selection.Left+i-
begin 1,StringGrid1.Selection.Top+j-1]:='';
if key = VK_DELETE then end;
for j:=1 to StringGrid1.Selection.bottom- end;
StringGrid1.Selection.top+1 do
for i:=1 to StringGrid1.Selection.Right- procedure TForm1.ListView2MouseDown(Sender: TObject;
StringGrid1.Selection.Left+1 do Button: TMouseButton;
begin Shift: TShiftState; X, Y: Integer);
stringgrid1.cells[StringGrid1.Selection.Left+i- var a:tlistitem;
1,StringGrid1.Selection.Top+j-1]:=''; begin
end; if Button = mbLeft then
end; begin
a:=tlistitem.Create(listview2.Items);
procedure TForm1.Fillthesoundthisarea1Click(Sender: a:=listview2.GetItemAt(x,y);
TObject); if a<>nil then listview2.BeginDrag(false);
var i,j :integer; end;
begin
for j:=1 to StringGrid1.Selection.bottom- end;
StringGrid1.Selection.top+1 do
for i:=1 to StringGrid1.Selection.Right- procedure TForm1.ListView3MouseDown(Sender: TObject;
StringGrid1.Selection.Left+1 do Button: TMouseButton;
begin Shift: TShiftState; X, Y: Integer);
if PageControl1.ActivePage.Caption='Hihat' then var a:tlistitem;
if listview1.SelCount<>0 then begin
stringgrid1.cells[StringGrid1.Selection.Left+i- if Button = mbLeft then
1,StringGrid1.Selection.Top+j-1] begin
:=listview1.Selected.Caption; a:=tlistitem.Create(listview3.Items);
if PageControl1.ActivePage.Caption='Kickbass' then a:=listview3.GetItemAt(x,y);
if listview2.SelCount<>0 then if a<>nil then listview3.BeginDrag(false);
stringgrid1.cells[StringGrid1.Selection.Left+i- end;
1,StringGrid1.Selection.Top+j-1] end;
:=listview2.Selected.Caption;
if PageControl1.ActivePage.Caption='Latin' then procedure TForm1.ListView4MouseDown(Sender: TObject;
if listview3.SelCount<>0 then Button: TMouseButton;
stringgrid1.cells[StringGrid1.Selection.Left+i- Shift: TShiftState; X, Y: Integer);
1,StringGrid1.Selection.Top+j-1] var a:tlistitem;
:=listview3.Selected.Caption; begin
if PageControl1.ActivePage.Caption='Snare' then if Button = mbLeft then
if listview4.SelCount<>0 then begin
stringgrid1.cells[StringGrid1.Selection.Left+i- a:=tlistitem.Create(listview4.Items);
1,StringGrid1.Selection.Top+j-1] a:=listview4.GetItemAt(x,y);
:=listview4.Selected.Caption; if a<>nil then listview4.BeginDrag(false);
if PageControl1.ActivePage.Caption='Tomtom' then end;
if listview5.SelCount<>0 then
stringgrid1.cells[StringGrid1.Selection.Left+i- end;
1,StringGrid1.Selection.Top+j-1]
:=listview5.Selected.Caption; procedure TForm1.ListView5MouseDown(Sender: TObject;
if PageControl1.ActivePage.Caption='Triangle' then Button: TMouseButton;
if listview6.SelCount<>0 then Shift: TShiftState; X, Y: Integer);
stringgrid1.cells[StringGrid1.Selection.Left+i- var a:tlistitem;
1,StringGrid1.Selection.Top+j-1] begin
:=listview6.Selected.Caption; if Button = mbLeft then
begin
end; a:=tlistitem.Create(listview5.Items);
end; a:=listview5.GetItemAt(x,y);
if a<>nil then listview5.BeginDrag(false);
end;
196

SesCalThread[1]:=sescal.Create(dosya,j);
end; end;
if stringgrid1.cells[i,j]='Technokick1' then begin
procedure TForm1.ListView6MouseDown(Sender: dosya:='Kickbass\technokick1.wav';
TObject; Button: TMouseButton; SesCalThread[1]:=sescal.Create(dosya,j);
Shift: TShiftState; X, Y: Integer); end;
var a:tlistitem;
begin if stringgrid1.cells[i,j]='Woodblock1' then begin
if Button = mbLeft then dosya:='Latin\woodblock1.wav';
begin SesCalThread[1]:=sescal.Create(dosya,j);
a:=tlistitem.Create(listview6.Items); end;
a:=listview6.GetItemAt(x,y);
if a<>nil then listview6.BeginDrag(false); if stringgrid1.cells[i,j]='Snare1' then begin
end; dosya:='Snare\snare1.wav';
end; SesCalThread[1]:=sescal.Create(dosya,j);
end;
if stringgrid1.cells[i,j]='Synthsnare2' then begin
procedure TForm1.Cal(Sender: TObject); dosya:='Snare\synthsnare2.wav';
var i,j:integer;dosya:string; SesCalThread[1]:=sescal.Create(dosya,j);
devam:boolean;sayac:integer; end;
begin if stringgrid1.cells[i,j]='Rocksnare1' then begin
try dosya:='Snare\rocksnare1.wav';
WaveMix1.Activated:=true; SesCalThread[1]:=sescal.Create(dosya,j);
for i:=1 to 100 do begin end;
sayac:=0;
for j:=1 to 8 do begin if stringgrid1.cells[i,j]='Tom1' then begin
if stringgrid1.cells[i,j]='' then inc(sayac); dosya:='Tomtom\tom1.wav';
if stringgrid1.cells[i,j]='Hithat10' then begin SesCalThread[1]:=sescal.Create(dosya,j);
dosya:='Hihat\hihat10.wav'; end;
SesCalThread[1]:=sescal.Create(dosya,j); if stringgrid1.cells[i,j]='Tom2' then begin
end; dosya:='Tomtom\tom2.wav';
if stringgrid1.cells[i,j]='Hithat8' then begin SesCalThread[1]:=sescal.Create(dosya,j);
dosya:='Hihat\hihat8.wav'; end;
SesCalThread[1]:=sescal.Create(dosya,j); if stringgrid1.cells[i,j]='Tom3' then begin
end; dosya:='Tomtom\tom3.wav';
if stringgrid1.cells[i,j]='OpHithat1' then begin SesCalThread[1]:=sescal.Create(dosya,j);
dosya:='Hihat\ophihat1.wav'; end;
SesCalThread[1]:=sescal.Create(dosya,j);
end; if stringgrid1.cells[i,j]='Triangle1' then begin
if stringgrid1.cells[i,j]='OpHithat10' then begin dosya:='Triangle\triangle1.wav';
dosya:='Hihat\ophihat10.wav'; SesCalThread[1]:=sescal.Create(dosya,j);
SesCalThread[1]:=sescal.Create(dosya,j); end;
end; if stringgrid1.cells[i,j]='Triangle2' then begin
if stringgrid1.cells[i,j]='OpHithat11' then begin dosya:='Triangle\triangle3.wav';
dosya:='Hihat\ophihat11.wav'; SesCalThread[1]:=sescal.Create(dosya,j);
SesCalThread[1]:=sescal.Create(dosya,j); end;
end; if stringgrid1.cells[i,j]='Triangle3' then begin
if stringgrid1.cells[i,j]='Hithat10' then begin dosya:='Triangle\triangle3.wav';
dosya:='Hihat\hihat10.wav'; SesCalThread[1]:=sescal.Create(dosya,j);
SesCalThread[1]:=sescal.Create(dosya,j); end;
end; end;
if sayac=8 then exit
if stringgrid1.cells[i,j]='Technokick3' then begin else bitbtn1.left:=bitbtn1.left+20;
dosya:='Kickbass\technokick3.wav';
SesCalThread[1]:=sescal.Create(dosya,j); end;
end; except
if stringgrid1.cells[i,j]='Technokick2' then begin Application.MessageBox('Your sound card is
dosya:='Kickbass\technokick2.wav'; busy!','Error',0);
SesCalThread[1]:=sescal.Create(dosya,j); end;
end; end;
if stringgrid1.cells[i,j]='Kickbass2' then begin
dosya:='Kickbass\kickbass2.wav'; procedure TForm1.SpeedButton1Click(Sender: TObject);
SesCalThread[1]:=sescal.Create(dosya,j); begin
end; bitbtn1.left:=36;
if stringgrid1.cells[i,j]='Kickbass1' then begin // WaveMix1.FlushAllChannels(True);
dosya:='Kickbass\kickbass1.wav'; form1.Cal(sender);
197

end; SesCalThread[2]:=sescal.Create(dosya,j);
end;
procedure TForm1.Play1Click(Sender: TObject); if listview4.Selected.Caption='Synthsnare2' then begin
var dosya : string;j:integer; dosya:='Snare\synthsnare2.wav';
begin SesCalThread[2]:=sescal.Create(dosya,j);
j:=1; end;
WaveMix1.Activated:=true; if listview4.Selected.Caption='Rocksnare1' then begin
if PageControl1.ActivePage.Caption='Hihat' then begin dosya:='Snare\rocksnare1.wav';
if ListView1.SelCount<>0 then begin SesCalThread[2]:=sescal.Create(dosya,j);
if listview1.Selected.Caption='Hithat10' then begin end;
dosya:='Hihat\hihat10.wav'; end;
SesCalThread[2]:=sescal.Create(dosya,j); end;
end; if PageControl1.ActivePage.Caption='Tomtom' then begin
if listview1.Selected.Caption='Hithat8' then begin if ListView5.SelCount<>0 then begin
dosya:='Hihat\hihat8.wav'; if listview5.Selected.Caption='Tom1' then begin
SesCalThread[2]:=sescal.Create(dosya,j); dosya:='Tomtom\tom1.wav';
end; SesCalThread[2]:=sescal.Create(dosya,j);
if listview1.Selected.Caption='OpHithat1' then begin end;
dosya:='Hihat\ophihat1.wav'; if listview5.Selected.Caption='Tom2' then begin
SesCalThread[2]:=sescal.Create(dosya,j); dosya:='Tomtom\tom2.wav';
end; SesCalThread[2]:=sescal.Create(dosya,j);
if listview1.Selected.Caption='OpHithat10' then begin end;
dosya:='Hihat\ophihat10.wav'; if listview5.Selected.Caption='Tom3' then begin
SesCalThread[2]:=sescal.Create(dosya,j); dosya:='Tomtom\tom3.wav';
end; SesCalThread[2]:=sescal.Create(dosya,j);
if listview1.Selected.Caption='OpHithat11' then begin end;
dosya:='Hihat\ophihat11.wav'; end;
SesCalThread[2]:=sescal.Create(dosya,j); end;
end; if PageControl1.ActivePage.Caption='Triangle' then begin
end; if ListView6.SelCount<>0 then begin
end; if listview6.Selected.Caption='Triangle1' then begin
if PageControl1.ActivePage.Caption='Kickbass' then begin dosya:='Triangle\triangle1.wav';
if ListView2.SelCount<>0 then begin SesCalThread[2]:=sescal.Create(dosya,j);
if listview2.Selected.Caption='Technokick3' then begin end;
dosya:='Kickbass\technokick3.wav'; if listview6.Selected.Caption='Triangle2' then begin
SesCalThread[2]:=sescal.Create(dosya,j); dosya:='Triangle\triangle3.wav';
end; SesCalThread[2]:=sescal.Create(dosya,j);
if listview2.Selected.Caption='Technokick2' then begin end;
dosya:='Kickbass\technokick2.wav'; if listview6.Selected.Caption='Triangle3' then begin
SesCalThread[2]:=sescal.Create(dosya,j); dosya:='Triangle\triangle3.wav';
end; SesCalThread[2]:=sescal.Create(dosya,j);
if listview2.Selected.Caption='Kickbass2' then begin end;
dosya:='Kickbass\kickbass2.wav'; end;
SesCalThread[2]:=sescal.Create(dosya,j); end;
end; end;
if listview2.Selected.Caption='Kickbass1' then begin
dosya:='Kickbass\kickbass1.wav'; procedure TForm1.FormMouseDown(Sender: TObject; Button:
SesCalThread[2]:=sescal.Create(dosya,j); TMouseButton;
end; Shift: TShiftState; X, Y: Integer);
if listview2.Selected.Caption='Technokick1' then begin const
dosya:='Kickbass\technokick1.wav'; SC_DragMove = $F012;
SesCalThread[2]:=sescal.Create(dosya,j); begin
end; Begin
end; ReleaseCapture;
end; FORM1.perform(WM_SysCommand, SC_DragMove, 0);
if PageControl1.ActivePage.Caption='Latin' then End;
if ListView3.SelCount<>0 then end;
if listview3.Selected.Caption='Woodblock1' then begin
dosya:='Latin\woodblock1.wav';
SesCalThread[2]:=sescal.Create(dosya,j); procedure TForm1.Timer1Timer(Sender: TObject);
end; const
CapPanel = 1;
if PageControl1.ActivePage.Caption='Snare' then begin NumPanel = 2;
if ListView4.SelCount<>0 then begin ScrlPanel = 3;
if listview4.Selected.Caption='Snare1' then begin DatePanel = 4;
dosya:='Snare\snare1.wav'; begin
198

with StatusBar1 do accept:=true;


begin end;
if GetKeyState(VK_CAPITAL) <> 0 then
StatusBar1.Panels[CapPanel].Text := 'CAP' procedure TForm1.About1Click(Sender: TObject);
else begin
StatusBar1.Panels[CapPanel].Text := ''; aboutbox.show;
if GetKeyState(VK_NUMLOCK) <> 0 then end;
StatusBar1.Panels[NumPanel].Text := 'NUM'
else procedure TForm1.SpeedButton6Click(Sender: TObject);
StatusBar1.Panels[NumPanel].Text := ''; begin
if GetKeyState(VK_SCROLL) <> 0 then WaveMix1.FlushAllChannels(True);
StatusBar1.Panels[ScrlPanel].Text := 'SCRL' end;
else
StatusBar1.Panels[ScrlPanel].Text := ''; procedure TForm1.Copy1Click(Sender: TObject);
StatusBar1.Panels[DatePanel].Text := var i,j:integer;
FormatDateTime('D mmmm YYYYY', now); begin
end; for i:=0 to 99 do for j:=0 to 8 do bellek [i,j]:='';
end;
for j:=1 to StringGrid1.Selection.bottom-
procedure TForm1.BitBtn2Click(Sender: TObject); StringGrid1.Selection.top+1 do
begin for i:=1 to StringGrid1.Selection.Right-
close; StringGrid1.Selection.Left+1 do
end; begin
bellek [i-1,j-
procedure TForm1.FormKeyDown(Sender: TObject; var 1]:=stringgrid1.cells[StringGrid1.Selection.Left+i-
Key: Word; 1,StringGrid1.Selection.Top+j-1];
Shift: TShiftState); end;
begin bellek [i-1,0]:='/'; //end
if key=VK_F1 then end;
Application.HelpCommand(HELP_CONTENTS, 0);
end; procedure TForm1.Cut1Click(Sender: TObject);
var i,j:integer;
procedure TForm1.Close1Click(Sender: TObject); begin
begin for i:=0 to 99 do for j:=0 to 8 do bellek [i,j]:='';
close;
end; for j:=1 to StringGrid1.Selection.bottom-
StringGrid1.Selection.top+1 do
procedure TForm1.Contents1Click(Sender: TObject); for i:=1 to StringGrid1.Selection.Right-
begin StringGrid1.Selection.Left+1 do
Application.HelpCommand(HELP_CONTENTS, 0); begin
end; bellek [i-1,j-
1]:=stringgrid1.cells[StringGrid1.Selection.Left+i-
procedure TForm1.FormResize(Sender: TObject); 1,StringGrid1.Selection.Top+j-1];
begin end;
Form1.setform; bellek [i-1,0]:='/'; //end
end;
for j:=1 to StringGrid1.Selection.bottom-
procedure TForm1.BitBtn1MouseDown(Sender: TObject; StringGrid1.Selection.top+1 do
Button: TMouseButton; for i:=1 to StringGrid1.Selection.Right-
Shift: TShiftState; X, Y: Integer); StringGrid1.Selection.Left+1 do
var a:TBitBtn; begin
begin stringgrid1.cells[StringGrid1.Selection.Left+i-
if Button = mbLeft then 1,StringGrid1.Selection.Top+j-1]:='';
begin end;
a:=TBitBtn.Create(BitBtn1); end;
// a:=bitbtn1.GetItemAt(x,y);
if a<>nil then bitbtn1.BeginDrag(false); procedure TForm1.Paste1Click(Sender: TObject);
end; var i,j:integer;sayacx,sayacy,son:integer;
begin
end;
for i:=0 to 99 do begin
procedure TForm1.FormDragOver(Sender, Source: if bellek [i,0]='/' then son:=i;
TObject; X, Y: Integer; end;
State: TDragState; var Accept: Boolean); sayacx:=0;
begin for i:=StringGrid1.Selection.left to
if sender is tbitbtn then StringGrid1.Selection.left+son-1 do begin
199

sayacy:=0; inc(sayacx);
for j:=StringGrid1.Selection.Top to 8 do begin end;
if bellek [sayacx,sayacy]<>'' then end;
stringgrid1.Cells[i,j]:=bellek [sayacx,sayacy] ;
inc(sayacy); end.
end;

Resim 33b – Dolphin2 ekran× ve DSMIX

Daha geliĢtirdiğim Dophin2 de ise, DSMixer v1.51 yani DirectX‟in DirectSound komutlar× ile kaliteli mžzik
Œalabiliyoruz. Maalesef DSMIX klas™ržndeki ™rneği Dolphin‟e tam uyarlayamad×m. Eh, yine size iĢ Œ×kt×!
200

25. Ofis (basit bir veritabanı uygulaması)


(Ornekler\Delphi\Ofis.zip)

Mart 2001 tarihli 1500 sat×rdan oluĢan bir iĢyeri iŒin askerde yapt×ğ×m program. Sade bir Ģekilde faturalama,
veri giriĢi ve listeleme y™ntemlerimiz var. Bu program ile ilk kez yapt×ğ×m programc×l×ktan para kazanacağ×m×
ummuĢtum, fakat olmad×. Neyse, ™nemli değil...

Resim 34a – GiriĢ ve hakk×nda pencereleri

ok az programlama yaparak kžŒžk bir iĢyerinin ihtiyac× olan benzin sat×Ģ× ve eski depo kay×tlar×na ulaĢmay×
sağl×yoruz. Delphi‟nin temel veritaban× yetenekleri sayesinde neredeyse hiŒ program yazmad×k. „rneğin bol bol
hesaplanan alanlar kulland×k.

Her gece ve her gžndžz zamanlar×nda, gžvenilir bir eleman stoktan ne kadar žržn sat×ld×ğ×n× pompalardan
bakarak iĢaretler, bu s×f×rlamay× kağ×da da d™kebilir, tabi bu arada mžĢterilerin ald×ğ× malzemeler de fatura edilerek
d™kžmž al×n×r. As×l istenen ilk iĢar ile son iĢar aras×ndaki fark× bulup s×f×rlama iĢleminin yap×lmas×. Eğer aktarma yani
s×f×rlama s×ras×nda kar elde edilmiĢse Œal×Ģanlara da istenen miktarda para eĢit olarak b™lžnebiliyor. K™tž bir fikir
olarak da, aŒ×k var olduğu džĢžnžlmžĢ ise personelden para da kesilebilir. Yani aŒ×k ve avans miktar× da personel
veritaban×nda saklan×yor.

Bence bu program×n altyap×s× kullan×larak istenen tžrde kžŒžk ve orta boy yerel veritaban× uygulamalar×
yap×labilir. Tek eksiği kullan×c× yetkilendirmesi yani kullan×c× giriĢi olmamas×ndan dolay×, bilgisayar× aŒ×k bulan bir
Œal×Ģan istediği bilgiyi değiĢtirebilmesi.
201

Resim 34b – Sat×Ģ ve personel kay×t formu

Resim 34c – Faturalama pencereleri


202

26. Tercuman (İngilizce’den Türkçe’ye çeviri ve okuma programı)


(Ornekler\Delphi\Tercuman.zip)

Ekim 2001 tarihli, yaklaĢ×k 1000 sat×rdan oluĢan bu programda basit bir s™zlžk, ona bağl× olarak aynen
(gramer olarak değil yani) Ġngilizce‟den TžrkŒe‟ye h×zl× bir Ģekilde Œeviriyor ve okumaya da Œal×Ģ×yoruz. DXWaveList ve
DXSound nesneleri ile temiz ses Œal×Ģ× elde etmeye Œal×Ģ×yoruz. eviri ve okuma k×s×mlar× thread ile yap×ld×ğ× iŒin
istediğimiz zaman ara verip, sonra devam edebiliyoruz veya tamamen iĢlemi bitirebiliyoruz. S™zlžğž baĢka bir
programdan alm×Ģt×m, bu s™zlžk žzerinde džzeltme ve silme gibi iĢlemler rahatl×kla yap×labilir.

Ġlk versiyonda gramer iŒin Œok uğraĢ×rken, daha sonra seslendirmeyi eklemek isteyince buna pek zaman
ay×ramad×m. Yani cžmleyi Œevirmeye değil, Ģimdilik kelime kelime karĢ×l×k yazarak idare ediyoruz. Ama Ġngilizce Œeviri,
TžrkŒe‟yi baĢka bir dile Œevirmekten kolay. žnkž TžrkŒe‟de fiiller ve cžmledeki kelimelerin yerine g™re anlam
değiĢmesi Œok fazla. SonuŒ olarak Œevrilen k×sm× farkl× kaydedebilir, yaz×c×dan da Œ×karabiliriz. Sonraki sžržmlerde site
, eposta Œeviri ve okumas× eklenebilir. Cžmleleri “.” iĢareti ile bitirmek gerekli.

Dolphin mžzik program× gibi DXSound nesnesini kullan×yoruz. Wavmix‟de iĢe yarayabilir, fakat daha ™nce de
dediğim gibi DirectSound daha kaliteli. Kendi sesimi a, b, c Ģeklinde Œal×yoruz. Baz× harfleri tek baĢlar×na s™ylemeye
Œal×Ģmak yanl×Ģ. Mesela k harfi, ke, kž, k™, ko, ki, k× gibi birŒok Ģekilde okunabiliyor. Ses birleĢtirmeyi, sentezlemeyi
baĢaramad×m. ok uzun metinlerde hata veriyor ve program kilitleniyor. Bunun sebebi hatal× thread programlama da
olabilir. K×sa kelimeler ile okuma k×sm×n× deneyebilirsiniz.

Resim 35 – Tercžman Program×

Ana kod:

unit Unit1; SpeedButton7: TSpeedButton;


OpenDialog1: TOpenDialog;
interface SaveDialog1: TSaveDialog;
Bevel2: TBevel;
uses Label1: TLabel;
Windows, Messages, SysUtils, Classes, Graphics, Label2: TLabel;
Controls, Forms, Dialogs, ExtCtrls, DBCtrls, Grids, Label3: TLabel;
DBGrids, Db, DBTables, StdCtrls, Buttons, Unit2, unit3, Label5: TLabel;
ComCtrls, WaveMix, Menus, DXSounds, Wave; SpeedButton8: TSpeedButton;
SpeedButton9: TSpeedButton;
type SpeedButton10: TSpeedButton;
TForm1 = class(TForm) Label4: TLabel;
SpeedButton1: TSpeedButton; Label6: TLabel;
BitBtn1: TBitBtn; Bevel3: TBevel;
StaticText1: TStaticText; Bevel4: TBevel;
StaticText2: TStaticText; BitBtn2: TBitBtn;
SpeedButton2: TSpeedButton; SpeedButton11: TSpeedButton;
SpeedButton3: TSpeedButton; SpeedButton12: TSpeedButton;
SpeedButton4: TSpeedButton; Bevel5: TBevel;
SpeedButton5: TSpeedButton; SpeedButton13: TSpeedButton;
SpeedButton6: TSpeedButton; Query1: TQuery;
203

Query1KELIME: TStringField; kelime_Sayisi,cumle_sayisi,ceviri_suresi:integer;


Query1TUR: TStringField; devam:boolean;
Query1ANLAM: TStringField; ilkzaman:TDateTime;
Panel1: TPanel; klasor:string;
RichEdit1: TRichEdit;
RichEdit2: TRichEdit; const
Splitter1: TSplitter; harfler: array [1..28] of string = ('a','b','c','ç','d','e','f','g','h','ı',
SpeedButton14: TSpeedButton; 'i','j','k','l','m','n','o','ö','p','r','s','Ģ','t','u','ü','v','y','z');
PopupMenu1: TPopupMenu;
GeriAL1: TMenuItem; implementation
Kopyala1: TMenuItem;
Kes1: TMenuItem; uses unit4, sozluk;
Yaptr1: TMenuItem;
N1: TMenuItem; {$R *.DFM}
PopupMenu2: TPopupMenu;
MenuItem1: TMenuItem;
MenuItem2: TMenuItem; procedure TForm1.BitBtn1Click(Sender: TObject);
MenuItem3: TMenuItem; begin
MenuItem4: TMenuItem; close;
MenuItem5: TMenuItem; end;
Bevel1: TBevel;
DXWaveList1: TDXWaveList; procedure TForm1.SpeedButton2Click(Sender: TObject);
DXSound1: TDXSound; begin
Bevel6: TBevel; richedit1.Lines.Clear;
SpeedButton15: TSpeedButton; label4.caption:='BoĢ belge';
SpeedButton16: TSpeedButton; end;
SpeedButton17: TSpeedButton;
procedure BitBtn1Click(Sender: TObject); procedure TForm1.SpeedButton5Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject); begin
procedure SpeedButton5Click(Sender: TObject); richedit2.Lines.Clear;
procedure SpeedButton3Click(Sender: TObject); label6.caption:='BoĢ belge';
procedure SpeedButton6Click(Sender: TObject); end;
procedure SpeedButton4Click(Sender: TObject);
procedure SpeedButtonClick(Sender: TObject); procedure TForm1.SpeedButton3Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject); begin
procedure SpeedButton8Click(Sender: TObject); OpenDialog1.Execute;
procedure SpeedButton9Click(Sender: TObject); if OpenDialog1.FileName<>'' then begin
procedure SpeedButton10Click(Sender: TObject); richedit1.Lines.LoadFromFile(OpenDialog1.FileName);
procedure BitBtn2Click(Sender: TObject);
procedure SpeedButton11Click(Sender: TObject); label4.Caption:=OpenDialog1.FileName;
procedure SpeedButton12Click(Sender: TObject); end;
procedure SpeedButton13Click(Sender: TObject); end;
procedure FormCreate(Sender: TObject);
procedure SpeedButton14Click(Sender: TObject); procedure TForm1.SpeedButton6Click(Sender: TObject);
procedure Yaptr1Click(Sender: TObject); begin
procedure Kes1Click(Sender: TObject); OpenDialog1.Execute;
procedure Kopyala1Click(Sender: TObject); if OpenDialog1.FileName<>'' then begin
procedure GeriAL1Click(Sender: TObject); richedit2.Lines.LoadFromFile(OpenDialog1.FileName);
procedure MenuItem1Click(Sender: TObject); label6.Caption:=OpenDialog1.FileName;
procedure MenuItem3Click(Sender: TObject); end;
procedure MenuItem4Click(Sender: TObject); end;
procedure MenuItem5Click(Sender: TObject);
procedure SpeedButton17Click(Sender: TObject); procedure TForm1.SpeedButton4Click(Sender: TObject);
procedure SpeedButton16Click(Sender: TObject); begin
procedure SpeedButton15Click(Sender: TObject); SaveDialog1.Execute;
private if SaveDialog1.FileName<>'' then
{ Private declarations } richedit1.Lines.SaveToFile(SaveDialog1.FileName);
public end;
{ Public declarations }
cvr:cevir; procedure TForm1.SpeedButtonClick(Sender: TObject);
sees:ses; begin
w: array [0..30] of PMixWave; SaveDialog1.Execute;
end; if SaveDialog1.FileName<>'' then
richedit2.Lines.SaveToFile(SaveDialog1.FileName);
var end;
Form1: TForm1;
204

procedure TForm1.SpeedButton1Click(Sender: TObject); begin


begin sees:=ses.Create(False);
query1.Active:=true; sees.Priority:=tpHigher;
label2.Caption:='Kelime Sayısı= 0 '; form1.SpeedButton13.Enabled:=false;
label3.Caption:='Cümle Sayısı= 0 '; SpeedButton13.Enabled:=false;
label5.Caption:='Çeviri Süresi= 00:00:00'; SpeedButton17.Enabled:=true;
kelime_Sayisi:=0;cumle_sayisi:=0;ceviri_suresi:=0; SpeedButton16.Enabled:=true;
ilkzaman:=now(); SpeedButton15.Enabled:=true;
end;
cvr:=cevir.Create(False);
cvr.Priority:=tpNormal; procedure TForm1.FormCreate(Sender: TObject);
begin
SpeedButton1.Enabled:=false; klasor:='takoz\';
SpeedButton8.Enabled:=true; end;
SpeedButton9.Enabled:=true;
SpeedButton10.Enabled:=true; procedure TForm1.SpeedButton14Click(Sender: TObject);
end; begin
form5.show;
procedure TForm1.SpeedButton10Click(Sender: TObject); end;
begin
cvr.Suspend; procedure TForm1.Yaptr1Click(Sender: TObject);
cvr.free; begin
richedit1.PasteFromClipboard;
form1.SpeedButton1.Enabled:=true; end;
form1.SpeedButton8.Enabled:=false;
form1.SpeedButton9.Enabled:=false; procedure TForm1.Kes1Click(Sender: TObject);
form1.SpeedButton10.Enabled:=false; begin
form1.SpeedButton9.Down:=true; richedit1.CutToClipboard;
end; end;

procedure TForm1.SpeedButton8Click(Sender: TObject); procedure TForm1.Kopyala1Click(Sender: TObject);


begin begin
cvr.Suspend; richedit1.CopyToClipboard;
end; end;

procedure TForm1.GeriAL1Click(Sender: TObject);


procedure TForm1.SpeedButton9Click(Sender: TObject); begin
begin richedit1.Undo;
cvr.Resume; end;
end;
procedure TForm1.MenuItem1Click(Sender: TObject);
procedure TForm1.BitBtn2Click(Sender: TObject); begin
begin richedit2.Undo;
aboutbox.show; end;
end;
procedure TForm1.MenuItem3Click(Sender: TObject);
begin
procedure TForm1.SpeedButton11Click(Sender: TObject); richedit2.CopyToClipboard;
begin end;
if Application.MessageBox('Yazdırma
Onayı','Yazdır',1)=idOK then procedure TForm1.MenuItem4Click(Sender: TObject);
RichEdit1.print('Tercüman Döküm'); begin
end; richedit2.CutToClipboard;
end;

procedure TForm1.SpeedButton12Click(Sender: TObject); procedure TForm1.MenuItem5Click(Sender: TObject);


begin begin
if Application.MessageBox('Yazdırma richedit2.PasteFromClipboard;
Onayı','Yazdır',1)=idOK then end;
RichEdit2.print('Tercüman Döküm');
end; procedure TForm1.SpeedButton17Click(Sender: TObject);
begin
sees.Resume;
procedure TForm1.SpeedButton13Click(Sender: TObject); end;
//seslendirme
var i,j,k,l:integer;a:string; procedure TForm1.SpeedButton16Click(Sender: TObject);
205

begin SpeedButton13.Enabled:=true;
sees.suspend; SpeedButton15.Enabled:=false;
end; SpeedButton16.Enabled:=false;
SpeedButton17.Enabled:=false;
procedure TForm1.SpeedButton15Click(Sender: TObject); SpeedButton17.Down:=true;
begin end;
sees.Suspend;
sees.free; end.

eviri thread - kanal kodu:

unit Unit2; if (a[k]='.')and(a[k-1]<>'.') then begin //yeni cumleye gec...

interface kelimeler:=' ';


for l:= noktadan_onceki_k to k-1 do kelimeler[l]:=a[l];
uses ///////////////////
Windows, Messages, SysUtils, Classes, Graphics, with form1.query1 do
Controls, Forms, Dialogs, begin
ExtCtrls, DBCtrls, Grids, DBGrids, Db, DBTables, ara:=trim(kelimeler);
StdCtrls, Buttons;
DisableControls;close;params[0].AsString:=strlower(pchar(ara)
type );
cevir = class(TThread) open;enablecontrols;
private end;
{ Private declarations }
protected b:=form1.query1Anlam.value;
procedure Execute; override; bulunanin_tipi:=form1.query1Tur.value;
procedure translate;
if b='' then b:=kelimeler; //bulamazsa aynen yazar
end;
if bulunanin_tipi='i' then
var cumle:array[1..50]of string; begin
isimler:array[1..50]of string; inc(isim_sayisi);
fiil:array[1..50]of string; isimler[isim_sayisi]:=b;
diger:array[1..50]of string; end
else
implementation if bulunanin_tipi='y' then
begin
{ cevir } inc(fiil_sayisi);
fiil[fiil_sayisi]:=b;
uses unit1; end
else
begin
procedure cevir.translate; inc(diger_sayisi);
diger[diger_sayisi]:=b;
var i,j,k,l,harf:integer;a,b:string;boyut_a:integer; end;
kelimeler,ara,turkcesatir:string;ilk_kelime:boolean;
isim_sayisi,fiil_sayisi,diger_sayisi:integer; ///////////////////
bulunanin_tipi:string;noktadan_onceki_k:integer; for l:=1 to diger_sayisi do
label sart2; begin
begin turkcesatir:=trim(turkcesatir+' '+diger[l]);
form1.richedit2.Clear; end;
j:=form1.richedit1.Lines.Capacity; for l:=1 to isim_sayisi do
isim_sayisi:=0; //cumledeki isim kac tane begin
fiil_sayisi:=0; turkcesatir:=trim(turkcesatir+' '+isimler[l]);
diger_sayisi:=0; end;
for l:=1 to fiil_sayisi do
for i:=0 to j do begin //satir sayisi begin
a:=trimright((pchar(form1.RichEdit1.Lines.Strings[i]))); turkcesatir:=trim(turkcesatir+' '+fiil[l]);
//satir stringi end;
harf:=1;kelimeler:=' ';b:='';
turkcesatir:='';ilk_kelime:=true; form1.RichEdit2.lines.Append(turkcesatir+'.');
boyut_a:=length(a); turkcesatir:='';
noktadan_onceki_k:=0;
for k:=1 to boyut_a do begin //harfler inc(cumle_sayisi);
206

isim_sayisi:=0; //cumledeki isim kac tane end;


fiil_sayisi:=0;
diger_sayisi:=0; inc(kelime_sayisi);
noktadan_onceki_k:=k;
end //if b<>'' then kelimeler:=b;
else //nokta degil ise cumle devam ediyor //if ilk_kelime then turkcesatir:=trim(kelimeler)
if (a[k]<>' ')then // else turkcesatir:=turkcesatir+' '+trim(kelimeler); //ing aynen
begin kalir}
kelimeler[harf]:=a[k]; ilk_kelime:=false;
inc(harf);
if (k=boyut_a) then goto sart2; end;
end harf:=1;
else //bosluk ile karsişlasinca... kelimeler:=' ';
sart2: end;
begin end; //with k:=1
noktadan_onceki_k:=k; end; //for i:=0
if kelimeler<>' ' then
begin end;
with form1.query1 do
begin procedure cevir.Execute;
ara:=trim(kelimeler); var bitti:boolean;
begin
DisableControls;close;params[0].AsString:=strlower(pcha
r(ara)); bitti:=false;
open;enablecontrols;
end; repeat

b:=form1.query1Anlam.value; translate;
bulunanin_tipi:=form1.query1Tur.value;
bitti:=true;
if b='' then b:=kelimeler; //bulamazsa aynen kaldi... form1.query1.Active:=false;
form1.SpeedButton1.Enabled:=true;
if bulunanin_tipi='i' then form1.SpeedButton8.Enabled:=false;
begin form1.SpeedButton9.Enabled:=false;
inc(isim_sayisi); form1.SpeedButton10.Enabled:=false;
isimler[isim_sayisi]:=b; form1.Label2.Caption:='Kelime Sayısı=
end '+IntToStr(kelime_Sayisi);
else form1.Label3.Caption:='Cümle Sayısı=
if bulunanin_tipi='y' then '+IntToStr(cumle_Sayisi);
begin form1.label5.Caption:='Çeviri Süresi= '+TimeToStr(now()-
inc(fiil_sayisi); ilkzaman);
fiil[fiil_sayisi]:=b;
end until Terminated or bitti;
else end;
begin
inc(diger_sayisi); end.
diger[diger_sayisi]:=b;

Sesli okuma k×sm×:

unit Unit3; procedure sesver;


end;
interface
implementation
uses
Windows, Messages, SysUtils, Classes, Graphics, { ses }
Controls, Forms, Dialogs,
ExtCtrls, DBCtrls, Grids, DBGrids, Db, DBTables, uses unit1;
StdCtrls, Buttons, WaveMix;
procedure ses.sesver;
type var i,j,k,l:integer;a:string;
ses = class(TThread) begin
private j:=form1.richedit2.Lines.Capacity;
{ Private declarations } for i:=0 to j do begin
protected a:=lowercase(form1.RichEdit2.Lines.Strings[i]);
procedure Execute; override; if length(a)<>0 then begin
207

for k:=0 to length(a) do begin


if a[k]=' ' then bitti:=false;
begin
form1.DXWaveList1.Items[0].Play(true); repeat
end else
for l:=1 to 28 do begin //28 harfimiz var sesver;
if a[k]=harfler[l] then
begin bitti:=true;
form1.DXWaveList1.Items[l].Play(true); break;
end; form1.SpeedButton13.Enabled:=true;
end; form1.SpeedButton15.Enabled:=false;
end; // k: form1.SpeedButton16.Enabled:=false;
end; form1.SpeedButton17.Enabled:=false;
end; // i:
end; until Terminated or bitti;
end;
procedure ses.Execute;
var bitti:boolean; end.
begin
208

27. CGI kullanımı(Common Gateway Interface)


(Ornekler\Delphi\delphiCGI.zip)

Byte Aral×k 2004 say×s×ndaki bir ™rnek ile Delphi 7‟nin ‟Demos\Internet\CGIs‟ ™rneği birleĢtirerek gžzel bir
Œal×Ģma yap×yoruz. Sadece Perl veya C ile değil Pascal, VB ve Delphi ile de CGI uygulamalar× rahatl×kla yap×labilir.
„rneklerimizi IIS (Internet Information Service) program×n×n k™k dizini olan wwwroot iŒine aŒabilirsiniz. AĢağ×daki
resimdeki gibi web sitesinde CGI Œal×Ģs×n diye bir ayar da yapmam×z(al×Ģt×rma izinleri) gerekli:

Resim 36a – “Varsay×lan Web Sitesi“ne sağ t×klay×n ve „zellikler deyin.

CGI uzant×l× dosyalar× yžržtžlebilen yani Œal×Ģt×r×labilen dosya olarak g™ržlmesi iŒin bu ayar× yap×yoruz. Bu ayar
d×Ģ×na eğer CGI program×m×z dosya oluĢturma ve değiĢtirme gibi iĢlemleri de yap×yor ise o klas™rlere „Yazma“ hakk×
da vermek gereklidir.

Kylix yani Delphi‟nin Linux versiyonunda da ayn× uygulama yap×labilir. Linux‟da genellikle Apache sunucusu
Œal×Ģt×ğ× iŒin, httpd.conf‟da baz× ayarlar yaparak, program×n×z× aktifleĢtirebilirsiniz. Bu dosyadaki aŒ×klamalar× okuman×z×
tavsiye ederim.

CGI konsol uygulamalar×n×z× “Ornekler\Delphi\intrabob.zip“ iŒindeki IntraBob.exe ile de test edebilirsiniz.


Delphi‟nin “Run*Parameters“ ile Host Application belirtilir.

3 ŒeĢit internet dosya tipi vard×r: FTP (file transfer protocol) , HTML (Hyper Text Markup Language) ve CGI.
CGI da standart konsol CGI ve Windows CGI olarak ikiye ayr×l×r. CGI ile sunucu žzerinde Œal×Ģan bir uygulamaya web
taray×c×s× žzerinden veri iletiĢimi kurulur. Uygulamaya genellikle CGI script ad× da verilir.

CGI uygulamalardaki sihirli kelime 'content-type: text/html‟ k×sm×d×r. Hemen ard×ndan da boĢ bir sat×r eklenir.
B™ylece dosyam×z×n normal bir dosya değil, uygulama olduğunu sunucuya belirtiriz. Kod edit™rde yaz×ld×ktan sonra,
derlenerek sunucunun dizinine at×l×r. Dosya uzant×s× ille de *.cgi olmas×na gerek yok. *.exe olarak kalsa da Œal×Ģ×yor.
209

CGI dosyam×z× bir link(a href) ile, bir resim(img src) ile, bir form(action) ile veya doğrudan adresi(www) girerek
Œağ×rabiliriz.

En basit Delphi console CGI program×:

{$apptype console}

begin
WriteLn('content-type: text/html');
Writeln;
WriteLn('Hello world!');
end.

Bir batch – y×ğ×n dosyas× ile de CGI yap×labilir:

@ECHO OFF
ECHO content-type: text/html
ECHO.
ECHO ^<HTML^>^<HEAD^>^<TITLE^>^</TITLE^>^</HEAD^>^<BODY^>ECHO Hello world !
ECHO ^</BODY^>^</HTML^>

Delphi‟de yeni bir „Console Application“ aŒ×p Ģu kodlar× yazal×m; Pascal žŒgeninin kodlar×:

program byteCgi; for satir:= 2 to 17 do


begin
{$APPTYPE CONSOLE} pascal[satir,1] := 1;
for sutun := 2 to satir do
uses pascal[satir,sutun] := pascal[satir-1,sutun] +
SysUtils; pascal[satir-1,sutun-1];
end;
{$E cgi} for i:= 1 to 17 do
begin
var for j:=1 to i do
pascal: array [1..17,1..17] of integer; begin
satir,sutun,i,j: byte; write(pascal[i,j]:7);
karakter: integer; end;
writeln('<br>');
begin end;
writeln('content-type: text/html'); writeln('</p>');
writeln;
writeln('<html>'); writeln('<H1><font color="#FFFFFF">ASCII
writeln('<head>'); Tablosu</font></H1>');
writeln('<title>BYTE CGI</title>'); for karakter := 65 to 122 do
writeln('</head>'); write(chr(karakter)+' ');
writeln('<body bgcolor="#C0C0C0">'); writeln;
writeln('<p align="right">'+DateToStr(Now)+'</font></p>'); for i := 1 to ParamCount do
writeln('<center>'); writeln('<h1>' + ParamStr(i) + '</h1>');
writeln('<H1><font color="#FFFFFF">Pascal writeln('</center>');
Üçgeni</font></H1>'); writeln('</body>');
writeln('<p>'); writeln('</html>');
pascal[1,1]:=1; end.
210

Resim 36b – Basit ™rnek(Pascal …Œgeni) ve biraz daha ileri(AŒ×k Port Tarama) bir uygulamam×z...

Delphi 6 ve žstž sžržmlerde Web Server Application olarak, haz×r CGI uygulamas× yap×labilir. WebModule iŒine
Action‟lar ekleyerek sayfaya parametreler yollanabilir. WebRequestCGI ™rneğinde Œerez oluĢturma ve okuma var.
Daha geliĢmiĢ uygulamalar× File*New*Other...*IntraWeb*Standalone Application ile rahatl×kla yap×labiliriz. F9 ile
sunucu program× Œal×Ģt×r×l×r ve aŒ×lan pencereden de yine F9 ile sayfam×z× Œal×Ģt×rabiliriz. BoĢ form žzerinde Component
Palette‟den IW Standart, IW Data sayfalar×ndan uygun nesneleri kullanabiliriz. Delphi 7‟nin demolar×n× inceleyiniz.
211

28. Öğrenci Bilgi İşleri (paradox veritabanı örnekleri)


(Ornekler\Delphi\obi1.zip ve obi2.zip)

Okulda 2005 y×l×nda bir d™neme (3 ay) yayarak bu projeyi Delphi 6 ile geliĢtirdik. Not giriĢi ve devams×zl×k
giriĢi tam bitmedi. Alias yapmad×ğ×m×zdan BDE kurulu bir bilgisayarda istediğiniz klas™re bu zip dosyay× aŒ×p,
Œal×Ģt×rabilirsiniz. K×saca Ģunlar× g™receksiniz: yaz×c× kullan×m×, sorgulama (SQL), form renkleri ve metin kutular×n×n
renk etkileĢimi, aŒ×l×Ģ ekran× (splash form), ilk aŒ×l×Ģta Ģifre sorarak giriĢ, kay×tlara resim ekleme… Ġkinci sžržm ise
seminer Œal×Ģmas× olarak yapt×k. OBI1‟i s×f×rdan tekrar baĢka y™ntemler kullanarak oluĢturduk. Her iki ™rnekte
bitmeyen k×s×mlar var ise de, bana g™re en bžyžk eksik, d™kžm k×sm×nda 1. ve 2. d™nem ortalamas×n×n al×nmam×Ģ
olmas×. Karne d™kžmž en son iĢ olmas× gerekir. O da yok Ģimdilik. Mezunlar da bir tarafa tabi.

OBI1 daha Œok g™ržntž ™zellikleri ile ™ne Œ×k×yor. Renkleri ve baz× ayarlar× akl×nda tutuyor. Yard×m ve setup da
olsayd× tam olacakt×. OBI2 ise k×sa zamanda (6 gžn – 18 saat) pratik ve minimalist yani az form ve az nesne ile
Œal×Ģman×n žržnž.

Not hesab×n× bazen bildiğimiz FOR d™ngžsž ile, bazen tablolara calculated field – hesaplanan alan ekleyerek,
bazen de SQL sorular× ile ve son olarak da QReport iŒinde QRExpression nesneleri ile yapt×k. Not Œok ™nemli olduğu
iŒin, virgžl sonras× yuvarlamada Œok dikkatli olmam×z gerekiyor. 44.499 ile ™ğrencinin kalmamas× gerekir değil mi?
Ama bizde kal×yor. Hesaplama s×ras×nda binde 5 gibi bir fazla say× ile bu tžr durumlar× engelleme de pek iĢe yaramaz.
Gžzel bir algoritma ile bu iĢ bitirilebilir.

Ama her zaman dediğim gibi gžvenlik (Ģifreli giriĢ ve veritabanlar×n× koruma) ve Œok kullan×c× Œal×Ģma
eksiklerimiz var.
212

Resim 37 – OBI1 ve OBI2 program g™ržntžleri


213

29. Bit Filtrele (8 bit bilgiden seçim yapma)


(Ornekler\Delphi\bitislemleri.zip)

Okulda ™ğrencilere yapt×ğ×m basit bir ™rnek.

Resim 38 – Bit Filtrele

Onluk say× sisteminde girilen, en fazla 255 değeri alabilen bir say×daki, belli bitleri ay×klay×p, sonuŒ k×sm×na
yine onluk ve onalt×l×k olarak say× yazan program. 8‟e kadar istenen bitleri onay kutular× ile seŒip , değerlerini
sağa doğru kayd×rarak tek say× haline getiriyoruz. Mesela (195)10 yani (C3)16 say×s×n×n ilk ve son bitini seŒersek, sonuŒ
3 olur. Temel iĢlem komutlar× AND (ve ile maskeleme), SHR (sağa kayd×rma), OR (sonuŒ değerlerini biraraya
getirme).

™p bilgilerin at×l×p, gerekli bilgilerin sadece kullan×lmas× program× da diyebiliriz.

function hex(d:integer):string; //a'nın 1. bitini alıyoruz


//DelphiTurkKodBankasından… label5.Caption:=(inttostr(bitler[1]));
var kalan, sayi: integer; //1. bit ekrana yazıyoruz
strKalan,sonuc:String; bitler[2]:=a and 2;
begin label6.Caption:=(inttostr(bitler[2]));
sayi:=d; if label6.Caption='2' then label6.Caption:='1';
repeat //2. biti 1-0 şeklinde göster
kalan:= sayi mod 16; bitler[3]:=a and 4;
str(kalan,strKalan); label7.Caption:=(inttostr(bitler[3]));
case kalan of if label7.Caption='4' then label7.Caption:='1';
10: strKalan:='A'; bitler[4]:=a and 8;
11: strKalan:='B'; label8.Caption:=(inttostr(bitler[4]));
12: strKalan:='C'; if label8.Caption='8' then label8.Caption:='1';
13: strKalan:='D'; bitler[5]:=a and 16;
14: strKalan:='E'; label9.Caption:=(inttostr(bitler[5]));
15: strKalan:='F'; if label9.Caption='16' then label9.Caption:='1';
end; //case bitler[6]:=a and 32;
sonuc:= strKalan + sonuc ; label10.Caption:=(inttostr(bitler[6]));
sayi:=sayi div 16; if label10.Caption='32' then label10.Caption:='1';
until sayi < 1; bitler[7]:=a and 64;
hex:=sonuc; label11.Caption:=(inttostr(bitler[7]));
end; if label11.Caption='64' then label11.Caption:='1';
bitler[8]:=a and 128;
procedure TSDIAppForm.Button1Click(Sender: TObject); //a'nın 8. bitini alıyoruz
var label12.Caption:=(inttostr(bitler[8]));
a,b,toplam:integer; //ekrana 8. bit yazılır
bitler: array [1..8] of integer; if label12.Caption='128' then label12.Caption:='1';
secili:integer; //8. biti 1-0 şeklinde göster
begin
//Bütün programı buraya yazdık secili:=0;
Button2Click(self); //kaç tane seçili onay kutusu var?
a:=strtoint(edit2.text); if CheckBox1.Checked then inc(secili);
//10 luk sayı sisteminde giriş if CheckBox2.Checked then inc(secili);
label4.Caption:= hex (a) ; if CheckBox3.Checked then inc(secili);
//girişi hex yapıyoruz if CheckBox4.Checked then inc(secili);
bitler[1]:=a and 1; if CheckBox5.Checked then inc(secili);
214

if CheckBox6.Checked then inc(secili); toplam:=toplam+bitler[4];


if CheckBox7.Checked then inc(secili); CheckBox4.Enabled:=false;
if CheckBox8.Checked then inc(secili); end else
if(CheckBox3.Checked)and(CheckBox3.Enabled)then
toplam:=0; begin
//sonucu önce 0'lıyalım bitler[3]:=bitler[3] shr (3-b);
for b:=secili downto 1 do begin toplam:=toplam+bitler[3];
//yönü önemli değil aslında, kaç tane onay kutusu varsa... CheckBox3.Enabled:=false;
if (CheckBox8.Checked)and(CheckBox8.Enabled) then end else
begin if (CheckBox2.Checked)and(CheckBox2.Enabled)then
bitler[8]:=bitler[8] shr (8-b); begin
//eğer 8. seçili ise sağa doğru kaydır bitler[2]:=bitler[2] shr (2-b);
toplam:=toplam+bitler[2];
toplam:=toplam+bitler[8]; CheckBox2.Enabled:=false;
//sonucumuza bu yeni değerini ekle end else
CheckBox8.Enabled:=false; if (CheckBox1.Checked)and(CheckBox1.Enabled)then
//bu onay kutusunun işi bitti begin
bitler[1]:=bitler[1] shr (1-b);
end else toplam:=toplam+bitler[1];
if(CheckBox7.Checked)and(CheckBox7.Enabled)then CheckBox1.Enabled:=false;
begin end;
bitler[7]:=bitler[7] shr (7-b); end;
toplam:=toplam+bitler[7]; //ekrana sonucu yazdık
CheckBox7.Enabled:=false; label2.Caption:=inttostr(toplam)+' ,hex:'+hex(toplam);
end else end;
if(CheckBox6.Checked)and(CheckBox6.Enabled) then
begin procedure TSDIAppForm.Button2Click(Sender: TObject);
bitler[6]:=bitler[6] shr (6-b); //Yeni düğmesi
toplam:=toplam+bitler[6]; begin
CheckBox6.Enabled:=false; //seçili uçları tekrar aktif ettik (reset)
end else CheckBox1.Enabled:=true;
if (CheckBox5.Checked)and(CheckBox5.Enabled) then CheckBox2.Enabled:=true;
begin CheckBox3.Enabled:=true;
bitler[5]:=bitler[5] shr (5-b); CheckBox4.Enabled:=true;
toplam:=toplam+bitler[5]; CheckBox5.Enabled:=true;
CheckBox5.Enabled:=false; CheckBox6.Enabled:=true;
end else CheckBox7.Enabled:=true;
if (CheckBox4.Checked)and(CheckBox4.Enabled) then CheckBox8.Enabled:=true;
begin end;
bitler[4]:=bitler[4] shr (4-b);
215

30. Ekran Çizimi (ekrana çizim yaparak, ders anlatımı)


(Ornekler\Delphi\ekranCiz2.zip)

„ğretmenlere yard×mc× olmak iŒin, ders anlat×rken ekranda fare ile iĢaret etme yerine veya kalk×p lazer
iĢaretleyicisi ile g™stermek yerine, bu program× haz×rlad×m. 500 sat×r gibi, fakat DelphiTurk KodBankas×‟ndan birŒok
haz×r kod ald×m ve geliĢtirdim.

Resim 39 – Ekran Œiz

Ekran žzerine istenen renkte, istenen kal×nl×kta kalem ile Œizim yapman×n yan×nda, pano kullan×m×, resim
aŒma, kaydetme, boĢ ekran g™sterme, saati g™sterme, arkaplan mžziği, fare oku gizleme gibi gžzel ™zelliklerimiz var.
Program menžsžnde saatin yan×na yerleĢen simge ile de daha az yer kaplayan g™ržnžm sağlan×r. H×zl× geŒiĢler iŒin de
kolay k×sayollar ekledim. „zellikle Powerpoint‟ten ESC, A, B, ve W k×sayollar×n× ™rnek ald×m.

Genel olarak iyi bir fikir, fakat tek k™tž taraf×, XP ile desteklenmeye baĢlayan transparency (saydaml×k -
alphaBlend) ™zelliğinin biraz ekran× karartmas×. Eğer arkada Œal×Ģan program×n Œal×Ģ×r halde g™zžkmesi ™nemli değilse,
™nce C ile ekran× temizleyip, D ile masažstžnžn resmi getirilir. B™ylece sanki tam ekran bir resim Œizme program× gibi
masažstžndeki program×n g™ržntžsž žzerinde oynama yapabiliriz.

Yap×lan hareketlerin geri al×nabilmesi ™zelliği iyi olurdu. Ayr×ca farkl× f×rŒa seŒenekleri de yap×labilir. Dikd™rtgen
ve daire gibi yap×lmas× fare ile zor olan Ģekilleri de kullanabilirdik. BaĢlat Œubuğunu resim Œizmeye dahil etmedik.
„nceden haz×rlanm×Ģ ders resimleri, bir klas™re kopyalan×p, istenirse slayt g™sterisi gibi g™sterilebilirdi. BoĢluk ve
BackSpace tuĢlar× ile dersler aras×nda geŒiĢ yap×labilirdi mesela. TžrkŒe dil desteği de laz×m.

Projeksiyon ile ders anlat×rken, makinenin Freeze (dondur) seŒeneği olmal×. Bu arada siz de ekran×
ayarlars×n×z. Freeze‟den Œ×k×nca ekranda haz×r bir Ģekilde yaz×lar ve resimler Œ×kar.
216

31. Asansör (4 kat binanın asansör simülasyonu)


(Ornekler\Delphi\asansor2.zip)

Okulda ™ğrencilerle yapt×ğ×m asans™r ™rneği. 2 gžnde 5 saat uğraĢ×p, 150 sat×r kod yazd×m. Thread (iĢlemci
kanallar×) ile yap×labilirdi. Ayn× zip dosya iŒinde kanall× ™rnek de var.

Resim 40 – Asans™r
Delphi 6-2005 aras× rahatl×kla Œal×Ģ×r:

unit Unit3; Bevel5: TBevel;


Panel1: TPanel;
Shape1: TShape;
interface SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
uses SpeedButton3: TSpeedButton;
Windows, Messages, SysUtils, Variants, Classes, SpeedButton4: TSpeedButton;
Graphics, Controls, Forms, StaticText1: TStaticText;
Dialogs, ExtCtrls, Buttons, StdCtrls, Spin; StaticText2: TStaticText;
StaticText3: TStaticText;
type StaticText4: TStaticText;
TForm3 = class(TForm) Shape2: TShape;
Timer1: TTimer; SpeedButton5: TSpeedButton;
Bevel1: TBevel; SpeedButton6: TSpeedButton;
Bevel2: TBevel; SpeedButton7: TSpeedButton;
Bevel3: TBevel; SpeedButton8: TSpeedButton;
Bevel4: TBevel; SpeedButton9: TSpeedButton;
217

GroupBox1: TGroupBox; counter:=0;


StaticText7: TStaticText; StaticText6.Caption:='Stopped';
StaticText6: TStaticText; StaticText7.Caption:='Ready';
StaticText8: TStaticText; end;
StaticText9: TStaticText; 2:
StaticText10: TStaticText; begin
Button1: TButton; StaticText6.Caption:='Door Opening';
SpinEdit1: TSpinEdit; StaticText7.Caption:='Not Ready';
Label1: TLabel; counter:= counter + 1 ;
StaticText5: TStaticText; if counter = 12 then state:=3; //finished opening
StaticText11: TStaticText; shape2.Width:=shape2.Width-5;
procedure SpinEdit1Change(Sender: TObject); end;
procedure SpeedButton4Click(Sender: TObject); 3:
procedure SpeedButton3Click(Sender: TObject); begin
procedure SpeedButton2Click(Sender: TObject); StaticText6.Caption:='Door Opened';
procedure SpeedButton1Click(Sender: TObject); StaticText7.Caption:='Not Ready';
procedure Shape2MouseUp(Sender: TObject; Button: counter:= counter + 1 ;
TMouseButton; if counter = 36 then //12*3 more time waiting
Shift: TShiftState; X, Y: Integer); begin
procedure Button1Click(Sender: TObject); state:=4; //close it
procedure SpeedButton9Click(Sender: TObject); counter:=0;
procedure Timer1Timer(Sender: TObject); end;
procedure FormCreate(Sender: TObject); end;
private 4:
{ Private declarations } begin
public StaticText6.Caption:='Door Closing';
{ Public declarations } StaticText7.Caption:='Not Ready';
end; counter:= counter + 1 ;
if counter = 12 then state:=1; //finished closing
var shape2.Width:=shape2.Width+5;
Form3: TForm3; end;
counter : byte = 1; //door counter 5:
requestFloor: byte=0; //where to lift begin
floor : byte = 1; //lifting value counter:=0;
state : byte = 1; //1- stopped, StaticText6.Caption:='Moving';
//2- door open(1 time), StaticText7.Caption:='Not Ready';
//3- door wait(3 times), if (requestFloor=floor)or(measure=0) then
//4- door close(1 time), begin
//5- move state:=2;
floor:=requestFloor; //new floor
implementation exit; //cut the event!
end; //same floor
{$R *.dfm}
if ((requestFloor-floor)>0)and(measure<>0) then
procedure TForm3.FormCreate(Sender: TObject); begin
begin panel1.Top:=panel1.Top-5;
panel1.DoubleBuffered:=True; //smooth graphics measure:=measure-5;
state:=1; //stopped end;
floor:=1; //active floor if ((requestFloor-floor)<0)and(measure<>0) then
measure:=0; begin
end; panel1.Top:=panel1.Top+5;
measure:=measure-5;
procedure TForm3.Timer1Timer(Sender: TObject); end;
begin //Elevator Engine end;
end;
if Form3.panel1.Top=360 then StaticText5.Caption:='1' end;
else
if Form3.panel1.Top=250 then StaticText5.Caption:='2' procedure TForm3.SpeedButton9Click(Sender: TObject);
else begin //Emergency stop...
if Form3.panel1.Top=140 then StaticText5.Caption:='3' timer1.Enabled:=not(timer1.Enabled);
else end;
if Form3.panel1.Top=30 then StaticText5.Caption:='4';
procedure TForm3.Button1Click(Sender: TObject);
case state of begin
1: close; //end...
begin end;
218

procedure TForm3.Shape2MouseUp(Sender: TObject; procedure TForm3.SpeedButton3Click(Sender: TObject);


Button: TMouseButton; begin
Shift: TShiftState; X, Y: Integer); if state = 1 then begin
begin requestFloor:=2; state:=5;
if state = 1 then state:=2; //door open if not moving... measure:=(requestFloor-floor)*(panel1.height+20);
end; if measure<0 then measure:=measure*-1;
SpeedButton7.Down:=true;
procedure TForm3.SpeedButton1Click(Sender: TObject); end;
begin //here we move! end;
if state = 1 then begin
requestFloor:=4; state:=5; procedure TForm3.SpeedButton4Click(Sender: TObject);
measure:=(requestFloor-floor)*(panel1.height+20); begin
if measure<0 then measure:=measure*-1; if state = 1 then begin
SpeedButton5.Down:=true; requestFloor:=1; state:=5;
end; measure:=(requestFloor-floor)*(panel1.height+20);
end; if measure<0 then measure:=measure*-1;
SpeedButton8.Down:=true;
procedure TForm3.SpeedButton2Click(Sender: TObject); end;
begin end;
if state = 1 then begin
requestFloor:=3; state:=5; procedure TForm3.SpinEdit1Change(Sender: TObject);
measure:=(requestFloor-floor)*(panel1.height+20); begin //timer speed
if measure<0 then measure:=measure*-1; timer1.Interval:=SpinEdit1.Value;
SpeedButton6.Down:=true; end;
end;
end; end.
219

Bölüm 6 – Visual Basic


CD‟deki “CD2\Programlama\VB\VB5CCEIN.EXE” yani Visual Basic Control Creation Edition ve Visual Basic 6.0
ile oluĢturduğum ™rnekleri veriyorum. Bu b™lžm iŒin ipuŒlar× ve benzeri bilgi yazamayacağ×m, Delphi k×sm×nda bir kaŒ
ipucu vermiĢtim. VB‟cilere kolay gelsin, F5‟e bas×n gitsin...

1. Sendkeys (diğer uygulamalara tuş basımı yollama)


(Ornekler\VB\sendkeys.zip)

Resim 1 – SendKeys formumuz

Private Sub Command1_Click()

npad = Shell("notepad.exe", vbNormalFocus)


AppActivate npad
SendKeys ("Hesap makinesinde bir hesap yapılıp, ")
SendKeys ("sonuç buraya kopyalanacaktır:" & Chr$(13)), True

clc = Shell("calc.exe", vbNormalFocus)


AppActivate clc
SendKeys Text1 & "-" & Text2 & "=", True „True ile tuş yollama bitene kadar bekleme yapılır
SendKeys "^C", True „^ simgesi CTRL tuşudur
If Check1 Then SendKeys "%{F4}", True „% ile ALT tuşu taklit ediliyor

AppActivate npad
SendKeys ("Sonuç=" & "^v"), True

End Sub

Ne yapt×k b™ylece? Not defteri ve hesap makinesi kendiliğinden aŒ×l×yor ve biz de istediğimiz tuĢ bas×mlar×n× bu
uygulamalara yollay×p, iĢlem yap×yoruz.

^ Control, % Alt, + Shift anlam×na geliyor. {LEFT 42} deyimi 42 kere klavye sol tuĢunun bas×m× demektir.
PRTSC yani Print Screen tuĢ bas×m× programlara uygulanamaz. Diğer klavye tuĢlar×n× VB veya Office VBA yard×m×nda
Sendkeys k×sm×nda, Delphi CD‟sindeki “Info\Extras\Sendkeys\sndkey32.pas” dosyas×nda da geniĢ aŒ×klamalar ayr×ca
bulabilirsiniz. Dynamic Data Exchange (DDE) desteği veren Microsoft Windows programlar× d×Ģ×nda, baz× programlarda
bu y™ntem iĢe yaramayabilir.

Burada akl×ma yeni bir fikir daha geliyor; paralel port, game port veya baĢka bir yoldan alabileceğimiz
sinyalleri belli bir programa ™rneğin, bir oyuna tuĢ bas×m× yollamakta kullanabiliriz. Bir F-16 uŒağ×n×n kokpit yap×s× bir
pano veya tabla žzerine simule – taklit edilerek, klavyenin yetersiz olduğu tuĢlar×n oyuna aktar×lmas× yap×labilir. As×l iĢ
bir Œok say×daki džğmeyi nas×l kodlayacağ×m×z. Yine burada size bir aŒ×k kap× b×rak×yorum.
220

2. Final (hesap makinesi yapımı)


(Ornekler\VB\Final\Project1.vbp)

…niversitedeki finallere haz×rlan×rken yapt×ğ×m×z hesap makinesi Œal×Ģmam×z.

Label9

Command2

Command1

Command16

Resim 2 – Hesap Makinesi ™rneği

Hem fare ile hem de klavyeden tuĢ bas×m×n× kontrol ediyor. Bs Backspace tuĢu, M haf×za - memory iĢlemleri,
+/- ve “.” kontrolž var. Form žzerindekiler sadece CommandButton ve Label.

Option Explicit
Dim a, b As Double
Dim sonuc As Single
Dim hangi_sayi, noktali_a, noktali_b, arti_eksi_a, arti_eksi_b As Boolean
Dim islem As String * 1

Private Sub Command1_Click(Index As Integer) 'Numara ve nokta


If Label9.Caption = "0" Then Label9.Caption = ""
If hangi_sayi = False Then
Label9.Caption = (Label9.Caption + Command1(Index).Caption)
Label1.Caption = Label9.Caption
If (Command1(Index).Caption = ".") And (noktali_a = True) Then
Label9.Caption = (Left$(Label9.Caption, Len(Label9.Caption) - 1))
Label1.Caption = Label9.Caption
End If
If (Command1(Index).Caption = ".") And (noktali_a = False) Then noktali_a = True
Else
Label9.Caption = (Label9.Caption + Command1(Index).Caption)
Label2.Caption = Label9.Caption
If (Command1(Index).Caption = ".") And (noktali_b = True) Then
Label9.Caption = (Left$(Label9.Caption, Len(Label9.Caption) - 1))
Label2.Caption = Label9.Caption
End If
If (Command1(Index).Caption = ".") And (noktali_b = False) Then noktali_b = True
End If
If Label9.Caption = "." Then Label9.Caption = "0."
Label3.Caption = Str(sonuc)
Label4.Caption = islem
Command16.SetFocus
End Sub

Private Sub Command1_KeyPress(Index As Integer, KeyAscii As Integer)


Command16.SetFocus
End Sub
221

Private Sub Command16_KeyPress(KeyAscii As Integer) '=


If Label9.Caption = "0" Then Label9.Caption = ""
If (KeyAscii = 42) Or (KeyAscii = 43) Or (KeyAscii = 45) Or (KeyAscii = 47) Then
hangi_sayi = True
islem = Chr$(KeyAscii)
Label9.Caption = ""
Label2.Caption = ""
noktali_b = False
Label3.Caption = "sonuc=" + Str(sonuc)
Label4.Caption = islem
End If

If hangi_sayi = False Then


If (KeyAscii > 47) And (KeyAscii < 58) Or (KeyAscii = 46) Or (KeyAscii = 8) Then
If (Val(Label9.Caption) = 0) And (KeyAscii = 46) Then Label9.Caption = "0"
If KeyAscii <> 8 Then
Label9.Caption = (Label9.Caption + Chr$(KeyAscii))
Label1.Caption = Label9.Caption
If (KeyAscii = 46) And (noktali_a = True) Then
Label9.Caption = (Left$(Label9.Caption, Len(Label9.Caption) - 1))
Label1.Caption = Label9.Caption
End If
If (KeyAscii = 46) And (noktali_a = False) Then noktali_a = True
Else
If Len(Label9.Caption) <> 0 Then
If Mid$(Label1.Caption, Len(Label1.Caption), 1) = "." Then noktali_a = False
Label9.Caption = (Left$(Label9.Caption, Len(Label9.Caption) - 1))
Label1.Caption = Label9.Caption
End If
End If
End If
Else
If (KeyAscii > 47) And (KeyAscii < 58) Or (KeyAscii = 46) Or (KeyAscii = 8) Then
If (Val(Label9.Caption) = 0) And (KeyAscii = 46) Then Label9.Caption = "0"
If KeyAscii <> 8 Then
Label9.Caption = (Label9.Caption + Chr$(KeyAscii))
Label2.Caption = Label9.Caption
If (KeyAscii = 46) And (noktali_b = True) Then
Label9.Caption = (Left$(Label9.Caption, Len(Label9.Caption) - 1))
Label2.Caption = Label9.Caption
End If
If (KeyAscii = 46) And (noktali_b = False) Then noktali_b = True
Else
If Len(Label9.Caption) <> 0 Then
If Mid$(Label2.Caption, Len(Label2.Caption), 1) = "." Then noktali_b = False
Label9.Caption = (Left$(Label9.Caption, Len(Label9.Caption) - 1))
Label2.Caption = Label9.Caption
End If
End If
End If
End If
If Label9.Caption = "." Then Label9.Caption = "0."
End Sub

Private Sub Command19_Click() '+/-


If hangi_sayi = False Then
If arti_eksi_a = True Then arti_eksi_a = False Else arti_eksi_a = True
If (Val(Label9.Caption) <> 0) And ((Left$(Label9.Caption, 1) <> "-") Or (Left$(Label9.Caption, 1) <> "")) Then
If arti_eksi_a = True Then
Label9.Caption = ("-" + Label9.Caption)
Label1.Caption = Label9.Caption
Else
If Left$(Label1.Caption, 1) = "-" Then
Label9.Caption = (Right$(Label9.Caption, Len(Label9.Caption) - 1))
Label1.Caption = Label9.Caption
End If
222

End If
End If
Else
If arti_eksi_b = True Then arti_eksi_b = False Else arti_eksi_b = True
If (Val(Label9.Caption) <> 0) And ((Left$(Label9.Caption, 1) <> "-") Or (Left$(Label9.Caption, 1) <> "")) Then
If arti_eksi_b = True Then
Label9.Caption = ("-" + Label9.Caption)
Label2.Caption = Label9.Caption
Else
If Left$(Label2.Caption, 1) = "-" Then
Label9.Caption = (Right$(Label9.Caption, Len(Label9.Caption) - 1))
Label2.Caption = Label9.Caption
End If
End If
End If
End If
Command16.SetFocus
End Sub

Private Sub Command2_Click(Index As Integer) '+-*/


hangi_sayi = True
islem = Command2(Index).Caption
Label9.Caption = ""
Label2.Caption = ""
noktali_b = False
Label4.Caption = islem
Command16.SetFocus
End Sub

Private Sub Command16_Click() '=


a = Val(Label1.Caption)
b = Val(Label2.Caption)
If islem = "+" Then sonuc = a + b
If islem = "-" Then sonuc = a - b
If islem = "*" Then sonuc = a * b
If (islem = "/") And (b <> 0) Then sonuc = a / b
Label9.Caption = Str$(CSng(sonuc))
Label1.Caption = (sonuc)
Label2.Caption = (b)
Label3.Caption = Str(sonuc)
Label4.Caption = islem
If hangi_sayi = True Then hangi_sayi = False
a = sonuc
If a < 0 Then arti_eksi_a = True
If InStr(Label9.Caption, ".") > 0 Then noktali_a = True
Command16.SetFocus
End Sub

Private Sub Command2_KeyPress(Index As Integer, KeyAscii As Integer) '+-*/


Command16.SetFocus
End Sub

Private Sub Command21_Click() 'CE


a=0
b=0
sonuc = 0
Label9.Caption = "0"
islem = "+"
Label4.Caption = islem
hangi_sayi = False
Label1.Caption = "0"
Label2.Caption = "0"
Label3.Caption = "0"
Label4.Caption = islem
noktali_a = False
223

noktali_b = False
arti_eksi_a = False
arti_eksi_b = False
Command16.SetFocus
End Sub

Private Sub Command21_KeyPress(KeyAscii As Integer) 'CE


Command16.SetFocus
End Sub

Private Sub Command23_Click() 'x


End
End Sub

Private Sub Command3_Click() 'BS


If hangi_sayi = False Then
If Len(Label9.Caption) <> 0 Then
If Mid$(Label1.Caption, Len(Label1.Caption), 1) = "." Then noktali_a = False
Label9.Caption = (Left$(Label9.Caption, Len(Label9.Caption) - 1))
Label1.Caption = Label9.Caption
End If
Else
If Len(Label9.Caption) <> 0 Then
If Mid$(Label2.Caption, Len(Label2.Caption), 1) = "." Then noktali_b = False
Label9.Caption = (Left$(Label9.Caption, Len(Label9.Caption) - 1))
Label2.Caption = Label9.Caption
End If
End If
Command16.SetFocus
End Sub

Private Sub Command4_Click() 'MR


If hangi_sayi = False Then
Label1.Caption = Label8.Caption
Label9.Caption = Label8.Caption
Else
Label2.Caption = Label8.Caption
Label9.Caption = Label8.Caption
End If
Command16.SetFocus
End Sub

Private Sub Command17_Click() 'M


Label8.Caption = Label9.Caption
Command16.SetFocus
End Sub

Private Sub Command18_Click() 'MC


Label8.Caption = "0"
Command16.SetFocus
End Sub

Private Sub Form_KeyPress(KeyAscii As Integer)


Command16.SetFocus
End Sub

Private Sub Form_Load()


a=0
b=0
islem = "+"
sonuc = 0
Label9.Caption = "0"
Label1.Caption = "0"
Label2.Caption = "0"
Label8.Caption = "0"
Label3.Caption = "0"
224

Label4.Caption = islem
hangi_sayi = False
noktali_a = False
noktali_b = False
arti_eksi_a = False
arti_eksi_b = False
End Sub

Basit bir hesap makinesi iŒin ne Œok kod var değil mi? Sadece fare ile džğmelerin t×klanmas× ile yapsak daha
basit ve k×sa olurdu. Fakat fare ile yap×lan×n klavye ile de yap×lmas× demek iĢimizi ağ×rlaĢt×r×yor. Biraz denerseniz hala
hatalar bulabilirsiniz. Formun sağ×ndaki etiket – label‟larla da birinci ve ikinci girilen rakam ve haf×zaya al×nan rakam
g™steriliyor.

VB‟de bir nesneyi kopyalad×ğ×n×z zaman size “Zaten bu isme sahip nesne var. Dizi oluĢturmak ister misiniz?”
diye sorar. Biz de 0 ile 9 aras×ndaki ve “.” džğmelerini seri oluĢturduk (Command1). +, -, * ve / džğmeleri de seri
olacak (Command2). Bu sayede her džğmeye kod yazmak yerine tek kod ile yžkžmžzž hafiflettik. Hangi džğmeye
t×kland×ğ×n× Command1(Index).Caption gibi bir ifade ile anl×yoruz.

Command16.SetFocus ile de tžm hesaplamalar× “=” tuĢuna y™nlendiriyoruz. Genel anlamda ™rneğin,
Command21_KeyPress(KeyAscii As Integer)– tuĢ bas×m×, Command18_Click()– fare t×klamas× olaylar× anlam×na geliyor.

Asl×nda daha džzgžn olmas× iŒin form žzerine b×rakt×ğ×n×z nesnelere sayilar_Command, islem_Command,
gosterge_Label gibi anlaml× isimler verebilirsiniz.
225

3. Listbox (Print ve Input komutları ile dosyalama)


(Ornekler\VB\Listbox\Project1.vbp)

Resim 3 – Listbox ™rneği

Dosyalama iĢlemlerine bir ™rnek. *.txt veritaban× oluĢturmak, kay×t silmek, kay×t say×s×, kay×t gžncelleme gibi
iĢlemler yap×labiliyor. ok ayr×nt×l× değil, zaten amaŒ basit dosyalama ve liste kutular×n×n ™zelliklerini keĢfetmek. Kay×t
silme var ama siz de dosya silme eklemek istersiniz herhalde. Eğer List1 nesnesinin MultiSelect – Œoklu seŒimini,
extended – geliĢmiĢ yaparsan×z kullan×c× birden fazla değeri Ctrl+fare sol t×klamas× ile seŒerek Kay×t Sil ile bunlar×
silebilir. Kod olarak son seŒilenden yukar× doğru silerseniz seŒililerin indeks yani s×ralar× değiĢmemiĢ olur. Yani
yukar×dan aĢağ×ya silmeye Œal×Ģ×rsak sat×r numaralar× devaml× değiĢtiği iŒin istenen değerler silinemez.

VERSION 5.00 Top = 3240


Begin VB.Form Form1 Width = 1575
Appearance = 0 'Flat End
BackColor = &H80000005& Begin VB.CommandButton Command5
Caption = "Form1" Caption = "&Kapat"
ClientHeight = 3900 Height = 255
ClientLeft = 1395 Left = 4440
ClientTop = 1380 TabIndex = 8
ClientWidth = 5775 Top = 120
BeginProperty Font Width = 1095
Name = "MS Sans Serif" End
Size = 8.25 Begin VB.TextBox Text2
Charset = 162 Height = 285
Weight = 700 Left = 3360
Underline = 0 'False TabIndex = 6
Italic = 0 'False Text = "DosyaAdi"
Strikethrough = 0 'False Top = 2760
EndProperty Width = 1575
ForeColor = &H80000008& End
LinkTopic = "Form1" Begin VB.CommandButton Command4
PaletteMode = 1 'UseZOrder Appearance = 0 'Flat
ScaleHeight = 3900 Caption = "&Farklı Kaydet"
ScaleWidth = 5775 Height = 375
StartUpPosition = 2 'CenterScreen Left = 4200
Begin VB.CommandButton Command6 TabIndex = 5
Caption = "&Dosya Kapat" ToolTipText = "Yeni isimle kayıt"
Height = 375 Top = 3240
Left = 600 Width = 1365
TabIndex = 9 End
226

Begin VB.CommandButton Command3 ToolTipText = "Dosya içeriği"


Caption = "&Kaydet" Top = 480
Height = 375 Width = 2175
Left = 3120 End
TabIndex = 4 Begin VB.Label Label3
ToolTipText = "Sadece kayıt" BackStyle = 0 'Transparent
Top = 3240 Caption = "Kayıt Sayısı:"
Width = 1000 Height = 255
End Left = 240
Begin VB.ListBox List2 TabIndex = 11
Height = 1815 Top = 2400
Left = 3360 Width = 1095
Sorted = -1 'True End
TabIndex = 3 Begin VB.Label Label2
ToolTipText = "Dosya listesi (Çift Tıklayın)" Alignment = 2 'Center
Top = 480 Caption = "Label2"
Width = 2055 Height = 255
End Left = 1440
Begin VB.CommandButton Command1 TabIndex = 10
Caption = "Kayıt &Sil" Top = 2400
Height = 375 Width = 975
Left = 600 End
TabIndex = 2 Begin VB.Label Label1
Top = 2760 BackStyle = 0 'Transparent
Width = 1575 Caption = "Saklanacak Dosya Adı="
End Height = 255
Begin VB.TextBox Text1 Left = 3360
Height = 285 TabIndex = 7
Left = 360 Top = 2400
TabIndex = 1 Width = 2175
Top = 120 WordWrap = -1 'True
Width = 2175 End
End End
Begin VB.ListBox List1 Attribute VB_Name = "Form1"
Height = 1815 Attribute VB_GlobalNameSpace = False
Left = 360 Attribute VB_Creatable = False
MultiSelect = 2 'Extended Attribute VB_PredeclaredId = True
Sorted = -1 'True Attribute VB_Exposed = False
TabIndex = 0

Kod k×sm×:

Dim ac As String List1.Selected(i) = False


Private Sub Command1_Click() „---program buradan başlıyor Next i
If List1.SelCount <> 0 Then Close #1
If List1.SelCount = 1 Then Label2.Caption = List1.ListCount
List1.RemoveItem List1.ListIndex End Sub
Text1.Text = ""
Else „ işte geri geri silme kısmı Private Sub Command4_Click() 'Farklı kaydet
For i = List1.ListCount - 1 To 0 Step -1 Dim bulundu As Boolean
If List1.Selected(i) = True Then bulundu = False
List1.RemoveItem i dosyaadi = Text2.Text
End If
Next i For i = 0 To List2.ListCount - 1
Text1.Text = "" List2.ListIndex = i
End If If List2.Text = dosyaadi Then
End If MsgBox ("Dosya zaten var...")
Label2.Caption = List1.ListCount bulundu = True
End Sub Exit For
End If
Private Sub Command3_Click() 'SAKLA Next i
dsy = ac & "\" & List2 & ".txt"
Open dsy For Output As #1 If bulundu = False Then
For i = 0 To List1.ListCount - 1
List1.Selected(i) = True List2.AddItem dosyaadi
Print #1, List1.Text
227

dsy = ac & "\dosyalar.txt" Open dsy For Input As #1


Open dsy For Output As #1 Do While EOF(1) = 0
For i = 0 To List2.ListCount - 1 Input #1, satir
List2.ListIndex = i List2.AddItem satir
Print #1, List2.Text Loop
Next i Close #1
Close #1 Label2.Caption = List1.ListCount
End Sub
dsy = ac & "\" & dosyaadi & ".txt"
Open dsy For Output As #1 Private Sub List1_Click()
For i = 0 To List1.ListCount - 1 Text1.Text = List1.Text
List1.ListIndex = i End Sub
Print #1, List1.Text
Next i Private Sub List2_DblClick()
Close #1 List1.Clear
Label2.Caption = List1.ListCount
End If dsy = ac & "\" & List2 & ".txt"
Label2.Caption = List1.ListCount Open dsy For Input As #1
End Sub Do While EOF(1) = 0
Input #1, satir
Private Sub Command5_Click() List1.AddItem satir
End Loop
End Sub Close #1
Text2.Text = List2
Private Sub Command6_Click() Label2.Caption = List1.ListCount
Text1.Text = "" If List1.ListCount <> 0 Then List1.Selected(0) = True
List1.Clear Text1.Text = List1
Label2.Caption = List1.ListCount End Sub
End Sub
Private Sub Text1_KeyPress(keyascii As Integer)
Private Sub Form_Load() If keyascii = 13 Then List1.AddItem Text1.Text
ac = App.Path Label2.Caption = List1.ListCount
dsy = ac + "\dosyalar.txt" End Sub
228

4. Fractal (pset grafik komutu)


(Ornekler\VB\Fraktal\Project1.vbp)

Resim 4 – KarmaĢ×k say×lar×n grafiği

VB dilinde de Pset (x, y) komutu ile form žzerine nokta basabiliriz. Bu ™rnekte kullan×lan formžl, karmaĢ×k
say×lar olarak bildiğimiz matematik konusuna dayan×yor. i ve j değerlerini kullanarak değiĢik fraktal g™ržntžler elde
edebilirsiniz. Formun DrawMode ™zelliği kullan×larak noktalar×n stili belirlenebiliyor. B™lgesel Ayarlarda ondal×k simgesi
“.” ise metin kutular×n× noktal× olarak değiĢtirmeniz gerekebilir. ġu anda “,” virgžl Ģeklinde. al×Ģm×yor diye k×zmay×n!

VERSION 5.00 Top = 840


Begin VB.Form Form1 Width = 852
BackColor = &H00800000& End
Caption = "So Fracting!" Begin VB.VScrollBar VScroll3
ClientHeight = 5670 Height = 375
ClientLeft = 60 Left = 7320
ClientTop = 285 Max = 15
ClientWidth = 8355 Min = 1
DrawMode = 8 'Xor Pen TabIndex = 17
DrawStyle = 1 'Dash TabStop = 0 'False
FillColor = &H00FFFF00& Top = 840
FillStyle = 0 'Solid Value = 2
BeginProperty Font Width = 255
Name = "Tahoma" End
Size = 9 Begin VB.VScrollBar VScroll2
Charset = 162 Height = 375
Weight = 400 Left = 4800
Underline = 0 'False Max = 500
Italic = 0 'False Min = 1
Strikethrough = 0 'False SmallChange = 8
EndProperty TabIndex = 12
ForeColor = &H00FFFF00& TabStop = 0 'False
LinkTopic = "Form1" Top = 840
ScaleHeight = 5670 Value = 10
ScaleWidth = 8355 Width = 255
StartUpPosition = 1 'CenterOwner End
Height = 288 Begin VB.VScrollBar VScroll1
Left = 6480 Height = 375
TabIndex = 18 LargeChange = 10
Text = "2" Left = 2280
229

Max = 500 Height = 372


Min = 1 Left = 1440
SmallChange = 8 TabIndex = 2
TabIndex = 11 Top = 240
TabStop = 0 'False Width = 852
Top = 840 End
Value = 20 Begin VB.TextBox Text2
Width = 255 ForeColor = &H00000000&
End Height = 288
Begin VB.TextBox Text6 Left = 360
BackColor = &H80000009& TabIndex = 1
Height = 288 Text = "0,11301"
Left = 3960 Top = 480
TabIndex = 8 Width = 855
Text = "10" End
Top = 840 Begin VB.TextBox Text1
Width = 852 ForeColor = &H00000000&
End Height = 288
Begin VB.TextBox Text5 Left = 360
BackColor = &H80000009& TabIndex = 0
Height = 288 Text = "-0,74543"
Left = 1440 Top = 120
TabIndex = 7 Width = 855
Text = "20" End
Top = 840 Begin VB.Label Label7
Width = 852 BackStyle = 0 'Transparent
End Caption = "Nokta Boyu"
Begin VB.TextBox Text4 ForeColor = &H0000FFFF&
BackColor = &H80000009& Height = 375
Height = 288 Left = 5280
Left = 3120 TabIndex = 19
TabIndex = 6 Top = 840
Text = "-0,11" Width = 1335
Top = 120 End
Width = 855 Begin VB.Label Label6
End BackStyle = 0 'Transparent
Begin VB.TextBox Text3 Caption = "j"
BackColor = &H80000009& ForeColor = &H0000FFFF&
Height = 288 Height = 255
Left = 3120 Left = 2760
TabIndex = 5 TabIndex = 16
Text = "0,6557" Top = 480
Top = 480 Width = 135
Width = 855 End
End Begin VB.Label Label5
Begin VB.CommandButton Command3 BackStyle = 0 'Transparent
BackColor = &H80000009& Caption = "j"
Caption = "&2" ForeColor = &H0000FFFF&
Height = 372 Height = 255
Left = 4320 Left = 120
TabIndex = 4 TabIndex = 15
Top = 240 Top = 480
Width = 852 Width = 135
End End
Begin VB.CommandButton Command2 Begin VB.Label Label4
BackColor = &H80000009& BackStyle = 0 'Transparent
Caption = "Kapa&t" Caption = "i"
Height = 375 ForeColor = &H0000FFFF&
Left = 5640 Height = 255
TabIndex = 3 Left = 2760
Top = 240 TabIndex = 14
Width = 1335 Top = 120
End Width = 135
Begin VB.CommandButton Command1 End
BackColor = &H80000009& Begin VB.Label Label3
Caption = "&1" BackStyle = 0 'Transparent
230

Caption = "i" End


ForeColor = &H0000FFFF& Begin VB.Label Label1
Height = 255 BackStyle = 0 'Transparent
Left = 120 Caption = "Çözünürlük"
TabIndex = 13 ForeColor = &H0000FFFF&
Top = 120 Height = 255
Width = 135 Left = 240
End TabIndex = 9
Begin VB.Label Label2 Top = 840
BackStyle = 0 'Transparent Width = 1095
Caption = "Hesap Hizi" End
ForeColor = &H0000FFFF& End
Height = 375 Attribute VB_Name = "Form1"
Left = 2760 Attribute VB_GlobalNameSpace = False
TabIndex = 10 Attribute VB_Creatable = False
Top = 840 Attribute VB_PredeclaredId = True
Width = 1095 Attribute VB_Exposed = False

Kod k×sm×:

Option Explicit x0 = -2 + m / 25
Dim m, n As Integer For n = 0 To 100
Dim i, x0, y0, x, y, z, x1, y1 As Double y0 = 2 - n / 25
x = x0
Private Sub Command1_Click() y = y0
c1 = Text1 For i = 1 To dig
c2 = Text2 x1 = x * x - y * y + c1
car = Text5 y1 = 0.5 * x * y + c2
dig = Text6 x = x1
Form1.DrawWidth = Text7 y = y1
Form1.Refresh z=x*x+y*y
For m = 0 To 200 If z > 2 Then GoTo 10
x0 = -2 + m / 25 Next i
For n = 0 To 100 PSet (Width / 2 + 700 - m * car, Height / 2 + 1400 - n * car)
y0 = 2 - n / 25 10: Next n
x = x0 Next m
y = y0 Beep
For i = 1 To dig End Sub
x1 = x * x - y * y + c1
y1 = 0.5 * x * y + c2 Private Sub Text5_Change()
x = x1 VScroll1.Value = Text5
y = y1 End Sub
z=x*x+y*y
If z > 2 Then GoTo 10 Private Sub Text6_Change()
Next i VScroll2.Value = Text6
PSet (Width / 2 + 700 - m * car, Height / 2 + 1400 - n * car) End Sub
10: Next n
Next m Private Sub Text7_Change()
Beep VScroll3.Value = Text7
End Sub End Sub

Private Sub Command2_Click() Private Sub VScroll1_Change()


End Text5.Text = VScroll1.Value
End Sub End Sub

Private Sub Command3_Click() Private Sub VScroll2_Change()


Form1.Refresh Text6.Text = VScroll2.Value
Form1.DrawWidth = Text7 End Sub
c1 = Text4
c2 = Text3 Private Sub VScroll3_Change()
car = Text5 Text7.Text = VScroll3.Value
dig = Text6 End Sub
For m = 0 To 200
231

Bölüm 7 – Diğer Diller ve çalışmalarım


Delphi dili kullanarak yapt×ğ×m ActiveX ™rneği, Excel makrolar×, Windows Script Host, Okul Ders Program×,
Yunus, KžPro, MyBoard ve JavaScript ™rnekleri oluĢturacağ×z. Elinizdeki basit imkanlar ile (not defteri ve Internet
Explorer gibi) bile programlama yapabileceğinizi g™receksiniz.

1. Delphi ActiveX (web sayfasında ActiveX)


(Ornekler\Diger\ActiveX\websProj1.dpr)

ActiveX‟i neden Delphi b™lžmžne koymad×n derseniz; bu dosyan×n “websProj1.htm“ dosyas×n× Œal×Ģt×rd×ğ×n×zda,
“Windows\Downloaded Program Files” klas™ržnde “webs Control” ad×nda bir dosya oluĢturmas×. Bu oluĢan
“websproj1.ocx” art×k hemen hemen tžm dillere g™mžlebilir hale geliyor. Asymetrics ToolBook Instructor adl× pek
kullanmay× bilmediğim programlama diline, Visual Basic‟e ve benzeri g™rsel dillere rahatl×kla “ActiveX Control” olarak
dahil edilebiliyor. Yani sadece web sitesi iŒinde Œal×Ģm×yor, genel bir program haline geliyor. Netscape‟de ActiveX‟in
Œal×Ģmad×ğ×n× da unutmamak gerekir.

ActiveX denetimleri VB, Delphi ve VC denetimlerinden farkl× değildir. Bir ActiveX denetimini onu kullanan
uygulaman×n iŒinde g™rebilir, onunla kapsay×c× uygulama penceresinde doğrudan iletiĢim kurabilirsiniz. Tipik Windows
denetimleri mesaj tabanl× bir arabirim kullan×r, VBX denetimleri ™zellik ve olaylar× kullan×r, OLE Automation nesneleri
™zellik ve y™ntemleri kullan×r, ActiveX denetimleri de ™zellik, y™ntem ve olaylar× kullan×r. Bu žŒ eleman ayn× zamanda
Delphi bileĢenlerinde de bulunur. ActiveX denetimleri ile doğrudan etkileĢim kurulabilirken, OLE denetimlere Œift
t×klanarak (inside – out activation – iŒten d×Ģa etkinleĢtirme) aktif edilerek kullan×l×r.

Delphi‟de “View*Type Library” komutu ile oluĢturduğumuz ActiveX denetiminin ™zellikleri g™rebiliriz. Asl×nda
aŒ×lan bu pencerede websProj1.tlb dosyas×n× g™ržyoruz. *.tlb Type Library – tip kžtžphanesi anlam×na gelir.

Bizim yapt×ğ×m×z Delphi‟deki projede Ģunlar var:

Resim 1 – websProj formu

procedure Twebs.Button1Click(Sender: TObject); // Run düğmesi


begin
label1.Caption:=edit1.text;
end;

procedure Twebs.Timer1Timer(Sender: TObject); // Timer1‟in işlevi


begin
StaticText1.Caption:=timetostr(time)+' '+DateToStr(date);
end;
232

procedure Twebs.Button2Click(Sender: TObject); // About düğmesi


begin About1.ShowwebsAbout; end;
procedure Twebs.Button3Click(Sender: TObject); // Close düğmesi
begin close; end;

Delphi5‟in Enterprise sžržmžnde (baĢka bir sžržmde bu ad×mlar× farkl× y™ntemlerle yapabilirsiniz) ActiveX
ad×m ad×m Ģ™yle oluĢturuluyor:

1. “File*New...” den ActiveX sekmesinden “ActiveForm” denilir.


2. ×kan pencere Ģ™yle doldurulur: (“Include About Box” ile hakk×nda kutusunu ekleyebilirsiniz)

Resim 2 – ActiveForm Sihirbaz×

3. “Project*Web Deployment Options” doldurulur: (“Use CAB file compression” ile s×k×Ģt×rmay×
deneyebilirsiniz)

Resim 3 – Web yay×mlama sihirbaz×

4. Formun žzerine birkaŒ metin kutusu ve džğme atabilirsiniz.


5. “Run*Register ActiveX Server” komutu ile ActiveXDenemeProj1.ocx dosyam×z kay×tl× hale gelir.
6. “Project*Web Deploy” komutu ile “c:\Belgelerim\Active„rnek” klas™ržne iki dosya oluĢturulur.
ActiveXDenemeProj1.htm ve ActiveXDenemeProj1.ocx.
233

7. ActiveXDenemeProj1.htm‟ye kžŒžk bir mždahale etmemiz gerek. Dosyam×z× Internet Explorer‟da aŒ×n, boĢ
bir yere sağ t×klay×p “Kaynağ× G™ržntžle” yap×n. AĢağ×daki k×s×mdaki dizin ismini silerek klas™r değiĢse bile
ActiveXDenemeProj1.htm‟sinin Œal×Ģmas×n× sağlayabilirsiniz. Eğer internette kullanmak isterseniz yani.
codebase="ActiveXDenemeProj1.ocx#version=1,0,0,0"

Visual Basic‟i aŒ×p Ģunu deneyelim:

Resim 4 – Visual Basic‟de nesne ekleme

ToolBox‟a sağ t×klay×p “Components...” komutunu verince listede websProj1 Library‟sinin veya sizin deneme
iŒin yapt×ğ×n×z ActiveXDenemeProj1 Library‟sinin de bulunduğunu g™ržrsžnžz. Nesneleri ekleyin ve formun žzerine
birini atal×m. SonuŒ:

Resim 5 – Sžrpriz, Delphi VB iŒinde, ToolBox‟taki nesnemize dikkat...

Tabii ki tam tersini de yapabilirsiniz. VB‟de haz×rlanm×Ģ bir *.ocx Delphi iŒine g™mžlebilir. Ġsterseniz Word veya
Excel‟de de VBA (Visual Basic for Applications)‟i aŒarak makronuza bu denetimi yani nesneyi ekleyebilirsiniz.
234

2. Excel yaziyla.xls (rakamı yazıya çevirme)


(Ornekler\Diger\Excel\yaziyla.xls)

Resim 6 – Yaz×yla makromuz

Bu Excel makrosu ile bir hžcre iŒinde “=yaziyla(12345)” gibi komut vererek, “onikibinžŒyžzk×rkbeĢ” gibi yaz×
halini elde edebiliriz. Ayn× mant×kla roma rakamlar×, Ġngilizce say×lar× yazma yap×labilir. Makrolu bu dosyalar× aŒarken
Œ×kan uyar×ya “Enable Macros” diyerek geŒin.

“Tools*Macro*Visual Basic Editor” ile VBA (Visual Basic for Applications) aŒ×l×r. Buradaki modžl iŒindeki
kodumuz:

'
' Yaziyla Macro
' Macro recorded 24.10.1997 by Tarık
'
'
Dim b$(9)
Dim y$(9)
Dim m$(4)
Dim v(15)
Dim c(3)

Function yaziyla$(sayi)
b$(0) = ""
b$(1) = "bir"
b$(2) = "iki"
b$(3) = "üç"
b$(4) = "dört"
b$(5) = "beĢ"
b$(6) = "altı"
b$(7) = "yedi"
b$(8) = "sekiz"
b$(9) = "dokuz"
y$(0) = ""
y$(1) = "on"
y$(2) = "yirmi"
y$(3) = "otuz"
y$(4) = "kırk"
y$(5) = "elli"
y$(6) = "atmıĢ"
y$(7) = "yetmiĢ"
y$(8) = "seksen"
y$(9) = "doksan"
m$(0) = "trilyon"
m$(1) = "milyar"
m$(2) = "milyon"
m$(3) = "bin"
m$(4) = ""

a$ = Str(sayi)
If Left$(a$, 1) = " " Then poz = 1 Else poz = 0
a$ = Right$(a$, Len(a$) - 1)

For x = 1 To Len(a$)
235

If (Asc(Mid$(a$, x, 1)) > Asc("9")) Or (Asc(Mid$(a$, x, 1)) < Asc("0")) Then GoTo hata
Next x

If Len(a$) > 15 Then GoTo hata

a$ = String(15 - Len(a$), "0") + a$

For x = 1 To 15
v(x) = Val(Mid$(a$, x, 1))
Next x

s$ = ""

For x = 0 To 4
c(1) = v((x * 3) + 1)
c(2) = v((x * 3) + 2)
c(3) = v((x * 3) + 3)
If c(1) = 0 Then e$ = ""

If c(1) = 1 Then e$ = "yüz"


If c(1) > 1 Then e$ = b$(c(1)) + "yüz"

e$ = e$ + y$(c(2)) + b$(c(3))

If e$ <> "" Then e$ = e$ + m$(x)


If (x = 3) And (e$ = "birbin") Then e$ = "bin"

s$ = s$ + e$
Next x

If s$ = "" Then s$ = "sıfır"


If poz = 0 Then s$ = "eksi" + s$

yaziyla$ = s$

GoTo tamam

hata:
yaziyla$ = "### hata"
tamam:
End Function

Kendi makronuzu yazmak isterseniz, boĢ bir Excel kitab×nda “Tools*Macro*Visual Basic Editor” ile VBA‟y× aŒa-
rak, ™nce “Insert*Module” komutu verin. …stteki kodlar× buraya yazabilirsiniz. Sonra Excel‟e geri d™nerek yani VB‟yi
kapatarak, bir hžcrede deneme yapabilirsiniz. Dikkat ederseniz Function yaziyla$(sayi) Ģeklinde olan makromuz metin
bir değer d™ndžržyor. “=yaziyla(2001)” yada bilgisayar×n kafas×n× kar×Ģt×rabilecek bžyžk rakamlar girin. Hatalar× g™r-
meye Œal×Ģ×n. Virgžllž rakam yasak, negatif say× da deneyebilirsiniz.
236

3. Excel dosyalistesi.xls (dosya arama)


(Ornekler\Diger\Excel\ dosyalistesi.xls)

Resim 7 – Dosya listesini veren makromuz

AĢağ×daki ™rnekte de bir prosedžr olarak belli bir klas™r ve iŒindeki alt klas™rlerindeki belli dosyalar× (yani
recursive – kendini Œağ×ran, rikörsiv diye okunur) listeliyor:

Dim ilkhucre, sonhucre, dosyasayisi As Integer

Sub listele()
Dim dtipi$, klasor$
klasor = InputBox("Klasör Adı", "Neresi?", "c:\")
If klasor = "" Then End
dtipi = InputBox("Listelenecek dosya türü", "Tür?", "*.doc")
ActiveCell.Offset(0, 0) = klasor & " içindeki tüm " & dtipi & " listeleniyor..."
ActiveCell.Offset(1, 0) = "Klasor Adı"
ActiveCell.Offset(1, 1) = "Dosya Adı"
Call listeal(klasor, dtipi, True)
ActiveCell.Offset(dosyasayisi + 2, 0) = "Liste sonu ... " & dosyasayisi & " adet dosya var."
End
End Sub

Sub listeal(klasor$, dtipi$, alt%)


Dim klasorler(), i, dosya$, yol, attr%, ks%
Static r
On Error Resume Next
If Right$(klasor, 1) <> "\" Then klasor = klasor & "\"
If dtipi = "" Then End

dosya = Dir(klasor & dtipi, vbNormal)

Do While dosya <> ""


yol = klasor & dosya
ActiveCell.Offset(r + 2, 0) = klasor
ActiveCell.Offset(r + 2, 1) = dosya
dosyasayisi = dosyasayisi + 1
r=r+1
dosya = Dir()
Loop
237

If alt = False Then Exit Sub


dosya = Dir(klasor & "*.*", vbDirectory)
Do While dosya <> ""
attr = 0
attr = GetAttr(klasor & dosya)

If dosya <> "." And dosya <> ".." And (attr And vbDirectory) <> 0 Then
ks = ks + 1
ReDim Preserve klasorler(1 To ks)
klasorler(ks) = dosya
End If

dosya = Dir()
Loop

For i = 1 To ks
Call listeal(klasor & klasorler(i) & "\", dtipi, alt)
Next i
End Sub

Farenin bulunduğu hžcreden itibaren, bir klas™rdeki belli uzant×daki dosya adlar×n× listeleyip, liste sonuna kaŒ
dosya olduğunu yazan bir makro yapt×k. Bu makro kodlar×n× al×p Delphi ™rneklerindeki Meraba1.0 ekran koruyucu-
muzda ve Gezgen ™rneklerinde kullanabiliriz. Delphi‟deki Dosyalistesi ™rneğini de bu makroya bakarak haz×rlad×m. Bir-
kaŒ konu ilerde de, biraz abartt×k ama, WSH ile listele.vbs ad×nda bir ™rneğimiz daha var.
238

4. Excel userform.xls (kullanıcı tanımlı formlar)


(Ornekler\Diger\Excel\userform.xls)

Kendi formunuzu yapmak isterseniz Excel buna da izin veriyor. Yeni bir Excel kitab×nda “Tools*Macro*Visual
Basic Editor” ile VBA‟y× aŒarak, ™nce “Insert*UserForm” komutu verin. Aynen Visual Basic‟deki gibi bir form olduğunu
g™receksiniz. Office97‟de VB 5.0, Office 2000‟de VB 6.0, OfficeXP‟de VB 6.3 kullan×larak makro yap×labiliyor.

Userform ™rneğimiz Œok basit. AmaŒ forma hžcre değerleri almak, formdan sayfam×za değer yollamak.

RefEdit1
CommandButton1

TextBox1 ComboBox1

ListBox1

Resim 8 – Kullan×c× tan×ml× form

ToolBox‟a sağ t×klay×p “Additional Controls” diyerek “RefEdit.Ctrl” nesnesini ekleyin. Bununla hžcre aral×ğ×
seŒme nesnesini formumuza ekleyebileceğiz.

Private Sub ComboBox1_Click()


Sayfa1.Cells(2, 4) = ComboBox1.Text
End Sub

Private Sub CommandButton1_Click()


TextBox1.Text = Sayfa1.Cells(2, 1)
TextBox2.Text = Sayfa1.Cells(2, 2)
ComboBox1.Clear
ComboBox1.AddItem (Sayfa1.Cells(2, 1))
ComboBox1.AddItem (Sayfa1.Cells(2, 2))
ComboBox1.ListIndex = 0
ListBox1.Clear
ListBox1.AddItem (Sayfa1.Cells(2, 1))
ListBox1.AddItem (Sayfa1.Cells(2, 2))
If RefEdit1.Text <> "" Then Worksheets(1).Range(RefEdit1.Text).Value = TextBox3.Text
End Sub

Private Sub CommandButton2_Click()


Unload UserForm1
End Sub

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)


Sayfa1.Cells(2, 3) = ListBox1.Text
End Sub

Bu arada Excel sayfam×z žzerine bir džğme koyup bununla formumuzu aŒ×yoruz. Bunun iŒin Sayfa1, Sayfa2
diye sayfa isimlerinin bulunduğu sekmelere sağ t×klay×p “View Code” diyerek komutlar×m×z× yazabiliriz.

Bundan ™nce sayfa žzerine bir džğme atal×m. AraŒ Œubuklar×na sağ t×klay×p “Forms” ve “Visual Basic” araŒ
Œubuklar×n×n Œ×kmas×n× sağlay×n. “Button” nesnesini at×n, b™ylece CommandButton1‟i oluĢturdunuz.
239

“(Exit) Design
Mode” ile tasar×mda
kalabilir veya
Œ×kabilirsiniz.

Resim 9 – Džğme ekleme

OluĢturduğumuz džğmeye “Design Mode” aktif iken Œift t×klay×p Ģunu yaz×n:

Private Sub CommandButton1_Click()


UserForm1.Show
End Sub

Eğer b™yle makro yapmak zor geliyor ise bir k×sa yol daha var: Excel kendiliğinden zaten makro kaydediyor.
“Tools*Macros*Record New Macro...” ile s×k yapt×ğ×n×z fare ve klavye hareketlerini tek bir komut haline getirip, araŒ
Œubuğuna bunu džğme olarak ekleyebilirsiniz. Tekrar “Tools*Macros*Macros...*Edit” diyerek VB džzenleyicisi ile
mždahalelerde bulanabilirsiniz.

Office žyelerinin hepsi makro tabanl×d×r, menž ve araŒ Œubuğundaki komutlar asl×nda Excel veya Word‟žn
yaz×l×m motoruna makro sinyallerini yollayan arabirimdir. „yleyse VBA asl×nda bir eklenti değil Office paket
program×n×n ayakta durmas×n× sağlayan elemand×r. S×k s×k Excel kullan×yorsan×z kendi hedefinize, zevkinize g™re
makrolar oluĢturup iĢlerinizi h×zland×rabilirsiniz. Tabii Excel, Word, PowerPoint ve Access‟in makro komutlar×
birbirinden farkl×d×r. Yani VBA Office žyeleri iŒin ayr× ayr× davran×r. Word makro kodlar×n× Excel‟de kullanmak genellikle
mžmkžn olmaz. tarih_g™ster.xls ve tarih_formu.xls de bu ™rneğe benzeyen UserForm‟dan Œal×Ģma sayfas×na tarih
değeri aktaran makrodur. “A1” yazan yere “A1:C4”, hatta “A1:C4, F3, G6” gibi koordinatlar belirtebilirsiniz. Calendar
– takvim t×klan×nca belirlenen aral×ktaki hžcrelere tarih aktar×l×yor.

Resim 10 – Kullan×c× tan×ml× form – tarih_goster.xls


240

5. Excel ile tarih dökümü (modül kullanımı)


(Ornekler\Diger\Excel\tarihdokumu.xls)

Resim 11 – Excel‟de tarih denetimi

Okulda ™ğretmenlerin ders saatlerinin tutulduğu Œizelgede, belli bayram gžnleri ve tatil gžnlerini “X” ile
dolduran bir programa ihtiyaŒ duyulmuĢtu. Bu program ayn× zamanda takvim yapmak iŒin de kullan×labilir. Kolay
eriĢim iŒin gunlistele() makrosunu araŒ Œubuğuna da ekleyebiliriz. Alt + F11 k×sayolu ile Visual Basic Editor aŒ×p
aĢağ×daki kodlar× yaz×n×z, daha sonra da araŒ Œubuklar×na sağ t×klay×p Customize... komutu ile Commands
sekmesindeki “Macros*Custom Button” k×sm×ndan sžržkle b×rak ile džğme oluĢturabiliriz. Yeni džğmeye sağ t×klay×p
“Assign Macro...” ile gunlistele() makrosunu atayabiliriz. Ġstediğiniz kadar eleman ve tatil gžnž listelenebilir. KaŒ adet
olacağ× ile ilgili hžcrelere değer verilerek yap×labiliyor. Ay iŒin rakam girmek yerine ComboBox nesnesi de
kullan×labiliyor.
241

Dim tarih As String


Dim tarih1 As String
Dim tarih2 As String
Dim son, i, j, k As Integer
Sub gunlistele()
'resetleme ve hazırlık
For i = 1 To 31
Sheet1.Cells(5, i + 2).Interior.Color = RGB(0, 230, 255) „iç rengi sıfırlanıyor
Next i
For i = 1 To 31
For j = 6 To 11
Sheet1.Cells(j, i + 2) = "" „iki çift tırnak ile silme işlemi, burada belirli bir formül de olabilirdi
Sheet1.Cells(j, i + 2).Interior.Color = RGB(0, 230, 200)
Next j, i
tarih1 = 1 & "/" & Sheet1.Cells(2, 3) & "/" & Sheet1.Cells(3, 3)
tarih2 = 1 & "/" & (Sheet1.Cells(2, 3) + 1) & "/" & Sheet1.Cells(3, 3)
son = DateDiff("d", tarih2, tarih1)
If son < 0 Then son = son * -1
If Sheet1.Cells(2, 3) = 12 Then son = 31
'asıl işlemler buradan başlıyor
For i = 1 To son
tarih = i & "/" & Sheet1.Cells(2, 3) & "/" & Sheet1.Cells(3, 3)
If Weekday(tarih, vbSunday) = 1 Or Weekday(tarih, vbSunday) = 7 Then
Sheet1.Cells(5, i + 2).Interior.Color = RGB(100, 230, 255)
End If
Next i
For i = 1 To son
For j = 6 To 5 + Sheet1.Cells(1, 5) 'eleman sayısınca
tarih = i & "/" & Sheet1.Cells(2, 3) & "/" & Sheet1.Cells(3, 3)
If Weekday(tarih, vbSunday) = 1 Or Weekday(tarih, vbSunday) = 7 Then
Sheet1.Cells(j, i + 2) = "X"
Sheet1.Cells(j, i + 2).Interior.Color = RGB(100, 230, 255)
End If
Next j, i

For k = 4 To 3 + Sheet2.Cells(1, 3) 'bayram sayısınca


For i = 1 To son
For j = 6 To 5 + Sheet1.Cells(1, 5) 'eleman sayısınca
tarih = i & "/" & Sheet1.Cells(2, 3) & "/" & Sheet1.Cells(3, 3)
tarih2 = Sheet2.Cells(k, 2) & "/" & Sheet2.Cells(k, 3) & "/" & Sheet1.Cells(3, 3)
If tarih2 = tarih Then
Sheet1.Cells(j, i + 2) = "X" 'eğer bayram ise de X konulur
Sheet1.Cells(j, i + 2).Interior.Color = RGB(100, 230, 255)
End If
Next j, i, k
End Sub

Private Sub CommandButton1_Click() „Excel kitabı üzerindeki düğmenin kod kısmı


Gunlistele
End Sub

Excel dosyas× žzerine g™rsel programlarda g™rdžğžmžz džğme, Œek kutusu, aŒ×l×r kutu, liste gibi nesneleri
yerleĢtirebilir, onlar× belli hžcrelere bağlayabiliriz. AraŒ Œubuklar×na sağ t×klay×p “Control Toolbox” araŒ Œubuğunu aktif
ettiğinizde bu ve diğer eklenebilen nesnelere ulaĢabilirsiniz. „rneğin džğme att×ğ×n×zda bu nesneye sağ t×klay×p
“Properties” diyerek ™zellikleri değiĢtirilebiliriz.
242

6. WSH ile sayı toplama (*.vbs dosyalar)


(Ornekler\Diger\WSH\toplama.vbs)

Resim 12 – Windows Komut dosyas× ™rneğimiz

Eğer Windows‟unuzda WSH (Windows Scripting Host - Windows Komut Dosyas× Sistemi) kurulu ise soyad×
*.vbs (Visual Basic Script) veya *.js (J-Script) olan dosyalar×n žzerlerine Œift t×klan×p Œal×Ģt×r×labilir. J-Script Netscape
firmas×n×n geliĢtirdiği JavaScript‟in benzeridir ve birbirleri ile uyumludurlar. Win98 iŒin Program Ekle / Kald×r „dan WSH
eklentisini yžkleyebilirsiniz. Fakat WinME kendiliğinden yžklž olarak geliyor. Eğer baĢka bir program ™rneğin
XingMPEG Player *.vbs dosyalar× kendine y™nlendirmiĢ ise o zaman ancak registry yedeğini geri al×p eski WSH bağ×n×
kazanabilirsiniz.

Bu arada script deyince akl×ma Office iŒinde VBA, Corel iŒinde CorelScript, AutoCAD iŒinde AutoLISP ve Studio
Max iŒinde de MaxScript gibi bu uygulamalar×n kendi yard×mc× dilleri olduğu geliyor. Flash iŒinde de Action Script veya
Actions – hareketler adl× C dili benzeri program yazma k×sm× var. Herhangi biri ile uğraĢ×yor iseniz bu dilleri de
™ğrenmeniz yarar×n×za. Kendi komut y×ğ×nlar×n×z× oluĢturup, iĢlevsel Œal×Ģabilirsiniz.

Bu ™rneği not defteri ile yaz×p Œift t×rnak iŒinde “toplama.vbs” olarak kaydedin, sonra dosyan×n žzerine Œift
t×klay×n o kadar.

' Windows Komut Dosyası Sistemi Örnek Komut Dosyası

Mesaj = "A ve B sayısını ister ve toplamını ekrana yazar."


Baslik = "Windows Komut Dosyası Sistemi Örneği"

Call Toplama()

Dim WSHShell
Set WSHShell = WScript.CreateObject("WScript.Shell")

Sub Toplama()

Dim a
Dim b
243

Dim toplam
Dim yap

yap = MsgBox( Mesaj, vbOKCancel + vbInformation, Baslik & " " & date & "/" & time)
If yap = vbCancel Then WScript.Quit

a = inputbox( "A rakamı=" , "Birinci Rakam (Tamsayı giriniz)" )


b = inputbox( "B rakamı=" , "Ġkinci Rakam (Tamsayı giriniz)" )
sonuc = int(a) + int(b)

MsgBox sonuc, vbInformation, Baslik


End Sub

Microsoft‟un as×l amac× bizi DOS iŒinde kulland×ğ×m×z *.bat (batch – y×ğ×n dosyas×) dosyalardan kurtarmak.
Yani metin halindeki bu minicik dosyalar ile programlar aŒabilir, onlara ™zel komutlar yollayarak iĢlerimizi
otomatikleĢtiririz. Tabii ki *.bat dosyadan farkl× olarak Œal×Ģma an×nda size hatal× olan sat×r× rapor eden uyar×lar× da
var. al×Ģt×r×ld×ğ×nda istenirse tžm iĢlemler artalanda yap×labilir.

“Windows\Samples\WSH\chart.vbs” hoĢunuza gidebilir. chart.vbs ™rneği WSH‟nin Office ile olan


entegrasyonuna bir ™rnektir. Bunun iŒin COM - Component Object Model kullan×yor. COM ActiveX kontrolleri ve OLE
iŒin haberleĢme temelini kurar. B™ylece dev bir komut kžmesi sizin emrinize sunulur. Windows veya DOS komutlar×n×
da Œal×Ģt×rabilirsiniz.

...
dim objXL
Set objXL = WScript.CreateObject("Excel.Application")
objXL.visible = true
objXL.Workbooks.Add
objXL.Cells(1,1).Value = 5
objXL.Cells(1,2).Value = 10
objXL.Cells(1,3).Value = "=a1+b1"
objXL.Cells(2,4).Formula = "=Max(a1:c1)"
objXL.Range("A1:C1").Select
objXL.selection.font.bold = true
objXL.Range("D2").Select
objXL.selection.font.italic = true
...
dim objWrd
set objWrd = Wscript.CreateObject (―Word.Application‖)
objWrd.visible = false „ekrana Word gelmeyecek
objWrd.documents.add
objWrd.selection.TypeText (―Naber?‖)
objWrd.ActiveDocument.Saveas (―c:\windows\desktop\sil.doc‖)
objWrd.quit
...
set WshShell = Wscript.CreateObject(―Wscript.Shell‖)
WshShell.Run (―command /c copy a:\*.* c:\temp‖) „gizli dosyalar hariç kopyalayabilir
WshShell.Run (―notepad c:\autoexec.bat‖)
WshShell.Run (―command /c del c:\temp\*.*‖) „merak etmeyin silmeden önce soru sorulacaktır...
...
dim objFile
set objFile = Wscript.CreateObject (―Scripting.FileSystemObject‖)
objFile.CopyFile ―c:\*.*‖,―c:\temp‖,true „gizli dosyalar dahil
...

Bu arada JavaScript iŒin yazd×ğ×m×z “JavaScript ile dosyalama” ™rneğinde aĢağ×daki gibi sat×rlar var. Buradaki
object ve scripting deyimleri žstte kullan×lanlara Œok benziyor.

var fso;
fso = new ActiveXObject("Scripting.FileSystemObject");
244

7. WSH ile dosya listeleme (*.vbs ile Excel otomasyonu)


(Ornekler\Diger\WSH\listele.vbs)

Windows Scripting Host kullanarak Excel iŒine belli uzant×daki dosyalar listelenir. Maalesef *.* veya *.j* gibi
joker karakterleri ile arama yerine žŒ harfli tam uzant× ad× gerekiyor. „rneğin *.doc, *.bmp olabilir. Bu giriĢin son d™rt
karakterine g™re Excel sayfas× iŒine Word d™kžmanlar×n×n karakter say×s× ve boyutu, diğer dosyalar×n da sadece
boyutu listeleniyor. Toplam kaŒ dosya olduğu ve kilobyte cinsinden toplam ekrana gelir. Ġsterseniz yanlar×na
oluĢturulma tarihleri ve dosya nitelikleri gibi ayr×nt×lar× da ekleyebilirsiniz. Listelemeyi ille de Excel‟e yollamak yerine
*.txt dosya haline getirip not defteri program×na g™nderilebilir. Hemen hemen her dilde dosya listelemeyi ™rneklemiĢ
olduk. Windows‟un Bul program× zaten yeterince h×zl× ve ayr×nt×l×. Ama kendi program×n×z iŒinde buna benzer bir
kodlamaya ihtiyaŒ duyabilirsiniz. *.vbs olan bu ™rneğimizi VB dilinde rahatl×kla kullanabilirsiniz.

dim objXL sayisi = sayisi +1


dim objWrd end if
dim objFile next
dim baslangic
dim i for each altdizin in dizin.subfolders
dim karak 'i=i+1
dim toplam s=s & tekrar (altdizin)
dim sayisi next

baslangic = inputbox("Klasör tekrar = s


Adı","Klasör","c:\belgelerim")
uzanti = inputbox("Dosya uzantısı","Uzantı","*.doc") end function
if baslangic<>"" and uzanti<>"" then
on error resume next set objXL = Wscript.CreateObject ("Excel.application")
„bir hata meydana gelirse ekrana mesaj çıkmaz set objWrd = Wscript.CreateObject ("Word.application")
i=2 set objFile = Wscript.CreateObject
function tekrar (ByVal p) ("Scripting.FileSystemObject")
objXL.cells(1,5) = p
dim s objXL.workbooks.add
dim dizin objXL.visible = true
dim altdizin
dim dosya objXL.cells(1,1).value = "Klasör"
set dizin = objFile.GetFolder(p) objXL.cells(1,2).value = "Dosya Adı"
objXL.cells(1,3).value = "Dosya Boyutu (KB)"
for each dosya in dizin.Files objXL.cells(1,4).value = "Karakter Sayısı"
if ucase(right(dosya.name,4))=ucase(right(uzanti,4)) and objXL.range ("a1:e1").select
dosya.name<>"" then objXL.selection.font.size = 16
objXL.cells(i,1) = dizin objXL.selection.font.bold = true
objXL.cells(i,2) = dosya.name
objXL.cells(2,5) = dizin & "\" & dosya.name objWrd.visible = false
if ucase(right(dosya.name,4))=".DOC" then
objWrd.documents.open(dizin & "\" & dosya.name) tekrar (baslangic)
karak = objWrd.Activedocument.characters.count
objWrd.Activedocument.close objXL.cells(1,5).value = "Arama Tamamlandı..."
objXL.cells(i,4) = karak objXL.cells(2,5).value = sayisi & " Adet Dosya " &
objXL.cells(i,3) = dosya.size\1024 toplam & " KB"
„tamsayı sonuc elde etmek için \ kullanılabilir objXL.cells.select
toplam = toplam + dosya.size\1024 objXL.selection.columns.autofit
else objXL.cells(1.1).select
objXL.cells(i,3) = dosya.size\1024
toplam = toplam + dosya.size\1024 objWrd.quit
end if else
msgbox ("GiriĢ boĢ olamaz...")
i=i+1 end if
245

8. kopyala komutu (batch ve Pascal dili kullanarak)


(Ornekler\Diger\kopyala.bat ve Ornekler\Pascal\okul\kopyala.pas)

*.bat dosyalardan biraz bahsedelim. DOS‟da bir komut iĢlerken ™nce yerleĢik – iŒ komut mu (dir, copy, del,
ren gibi; format, sys, xcopy, ver gibi komutlar ise d×Ģ komut olarak adland×r×l×r), sonra bulunulan klas™rdeki *.com,
*.exe veya *.bat dosya m× ve en son da path ile tan×mlanm×Ģ klas™rlerde mi diye aran×r. Windows‟un Œal×Ģt×r×labilir
dosyalar× da *.com, *.exe, *.bat, *.cmd, *.vbs, *.vbe, *.js, *.jse, *.wsh, *.wsf‟dir. Komut istemini aŒarak Ģunlar×
deneyin. ( Enter demektir)

Resim 13 – Kopyala.bat dosyam×z×n kullan×m×

c:\> copy con kopyala.bat 


@echo off
cls
rem Bakalım nasıl olacak?
echo Kopyalar 2001 (c)
if "%1"=="" goto hata
if "%2"=="" goto hata
echo ĠĢlem = %1 dosyası, %2: sürücüsüne kopyalanacaktır...
echo Emin misiniz? (Ctr+C ile çıkıĢ)
pause
if not exist %2:\%1 goto guvenli
echo %2:\%1 dosyası zaten var, üzerine yazılmaması için Ctrl+C yapın!
pause
:guvenli
copy %1 %2:\%1
echo "%1" kopyalandı!
goto son
:hata
echo Kullanım "kopyala <dosyaadı> <sürücüadı>"
:son
Ctrl+Z 
1 file(s) copied
c:\>kopyala deneme.doc d
Kopyalar 2001 (c)
ĠĢlem = deneme.doc dosyası, d: sürücüsüne kopyalanacaktır...
Emin misiniz? (Ctr+C ile çıkıĢ)
Press any key to continue. . . 

d:\deneme.doc dosyası zaten var, üzerine yazılmaması için Ctrl+C yapın!


Press any key to continue. . . 

1 file(s) copied
"deneme.doc" kopyalandı!
c:\>

Eğer bu tip bir *.bat dosyay× kullan×Ģl× bulup, herhangi bir yerde de bu komutu vermek isterseniz
“kopyala.bat” dosyas×n× “Windows\Command” dizinine kopyalay×n! Bunun sebebi sistemde tan×mlanm×Ģ path –
yollardan birinin de “Windows\Command” olmas×. Art×k istediğiniz sžržcž veya dizinde “kopyala *.* a” gibi bir komut
246

verebilirsiniz. Hatta “BaĢlat*al×Ģt×r...*kopyala yedek.* a” gibi de komut verebilirsiniz. Eliniz sžržcž ad×ndan sonra “:”
yazmaya al×Ģm×Ģ ise birkaŒ sat×r× džzelterek bu desteği de verebilirsiniz.

Pascal dilinde de buna benzer bir program yapabiliriz:

program copyfile;
uses crt;
var sourcefile,destfile:file;
recReads: word;
buffer: array [1..1000] of byte; {1000 bytelik blok}
begin
clrscr;
if paramcount <> 2 then
begin
Writeln ('Kopyala 2001 (C)');
Write ('Kullanim : kopyala kaynak_dosyaadi hedef_dosyaadi');
halt;
end;
{$I-}
assign (sourcefile, paramstr(1));
reset (sourcefile,1); {okumak icin ac}
if ioresult <> 0 then
begin
write (paramstr(1), ' bulunamadi...' ); halt;
end;
assign (destfile, paramstr(2));
rewrite (destfile, 1);
writeln ('Her # 1000 Byte anlamindadir...');
blockread (sourcefile, buffer, sizeof(buffer), recReads);
while recReads > 0 do
begin
write ('#');
blockwrite (destfile, buffer, recReads);
blockread (sourcefile, buffer, sizeof(buffer), recReads);
end;
close (sourcefile); close (destfile);
writeln;writeln('Kopyalama tamamlandi.');
end.

Kopyala 2001 (C)


Kullanım : kopyala kaynak_dosyaadi hedef_dosyaadi
C:\> kopyala c:\himem.sys d:\yedek.sys
Her # 1000 Byte anlamindadir...
##################################
Kopyalama tamamlandi.
C:\>

Kaynak ve hedef dosya ad× parametre olarak komut isteminde yaz×l×yor. „rnekteki gibi isim değiĢtirmek iŒin
kullan×lan ren komutuna benzer de kullanabiliriz. “Ornekler\Pascal\Graf\plasma.pas” ™rneğinde de ayn× dosyalama
komutlar×, d×Ģardan resim dosyas× aŒmak amac× ile kullan×lm×Ģ.

Pek MS-DOS‟dan bahsetmek istemezdim ama birkaŒ ipucu verebilirim herhalde:

c:\>dir *. : Sadece klasör adlarını listeler. (uzantısız dosyalar)


c:\>dir /ad : Sadece klasör adlarını listeler.
c:\>dir /a-d : Sadece dosya adlarını listeler.
C:\>subst z: c:\belgelerim: İstediğiniz klasörü sürücü gibi yapabilirsiniz
c:\>copy con prn : Ne yazarsanız printer – yazıcıya çıkarılır.
c:\>doskey dap = dir /on/p : dap isminde makro tanımlıyoruz.
c:\>dap  : Dosya ve dizinler ad sırasında pause – aralık verilerek gösterilir.
doskey listesini görmek için F7 tuşuna basınız. Makrolarınızı görmek için “doskey /macros” deyin.
. <DIR> : İçinde bulunduğunuz dizin. Sadece simgesel gösterim.
.. <DIR> : Bir üst dizin, sadece kök dizinde görüntülenmez.
247

Asl×nda hep yapmak istediğim ama bir tžrlž hala yapamad×ğ×m; birden fazla Windows kurulu olan makinede
aralar×nda geŒiĢ yapabilmek, yani boot menu oluĢturmak. XP boot menžsžnž diske otomatik olarak kurulurken
bulaĢt×r×yor. Eğer Win98 aŒ×l×Ģ disketi oluĢturmuĢsan×z, bu disketteki config.sys‟yi de inceleyebilirsiniz. Hatta bu
diskette RAMDISK oluĢturabilmek iŒin gerekli komutar× da bulabilirsiniz. RAMDISK sayesinde RAM‟inizin bir k×sm×n×
sžržcž olarak atayabilirsiniz. Eğer en az×ndan 512 MB RAM sahibiyseniz, swap dosyan×z× RAM žzerine y™nlendirebilmek
PC‟nizi oldukŒa h×zland×rabilir.

config.sys iŒindekiler:

[MENU]
MENUITEM = Windows, Windows 98
MENUITEM = Windows_Old, Windows 98 Yedek
MENUcolor = 15,0
MENUdefault = Windows, 10

[Windows]
DEVICE=C:\WINDOWS\HIMEM.SYS
DEVICE=C:\WINDOWS\EMM386.EXE
device=C:\WINDOWS\COMMAND\display.sys con=(ega,,1)
Country=090,857,C:\WINDOWS\COMMAND\country.sys

[Windows_old]
DEVICE=C:\yedekWIN\HIMEM.SYS
DEVICE=C:\yedekWIN\EMM386.EXE
device=C:\yedekWIN\COMMAND\display.sys con=(ega,,1)
Country=090,857,C:\yedekwiN\COMMAND\country.sys

autoexec.bat iŒindekiler: (Millenium iŒin ise c:\Windows\Command\cmdinit.bat iŒine yaz×labilir)

@echo off
prompt $p$g
goto %config%
:Windows
SET windir=C:\WINDOWS
SET winbootdir=C:\WINDOWS
SET TEMP=C:\TEMP
goto end
:Windows_old
SET windir=C:\yedekWIN
SET winbootdir=C:\yedeWIN
SET TEMP=C:\TEMP
goto end
:end

msdos.sys iŒindeki bir iki sat×r ile manuel – el ile Ģu sat×rlar× gžncelleyerek yapabiliyorum gibi. Ama aŒ×l×Ģta
menž Œ×kmas× diye bir Ģey yok tabii. DOS‟dan aŒ×l×Ģ yap×p, Windows ad× değiĢtirilerek diğer yedek Windows‟un yeri
belirtilebilir. Uzun ve sak×ncal× bir y™ntem, “Program Files” iŒindeki baz× programlar Œal×Ģmayabilir.

[Paths]
WinDir=C:\Windows „burasına c:\yedekWin diyebilirsiniz...
WinBootDir=C:\Windows „burasına c:\yedekWin diyebilirsiniz...
HostWinBootDrv=C

Eğer s×k kulland×ğ×m×z Control Panel – Denetim Masas× ™ğelerine k×sayol yapmak veya kendi program×m×zdan
onlar× aŒmak istersek Ģu Ģekilde kullanabiliriz:

control appwiz.cpl //program ekle / kaldır çalışır


control appwiz.cpl,, 2 //Windows kur menüsü
control appwiz.cpl,, 3 //başlangıç disketi oluşturma menüsü
control sysdm.cpl //sistem bilgisi
control desk.cpl,,3 //Ekran ayarları açılır
control main.cpl,yazıcılar //Yazıcılar klasörü açılır (yazıcılar yerine printers olabilir)
248

*.cpl dosyalar× “Windows\System” dizininde bulabilirsiniz. …zerlerine sağ t×klay×p “Denetim Masas× ile aŒ” da
diyebilirsiniz veya “BaĢlat*al×Ģt×r...” diyerek žstteki ™rnekleri deneyebilirsiniz.

AĢağ×daki gibi bir deneme.bat dosyas× oluĢturabiliriz. Buradaki /w ile iĢlem bitmeden diğerine geŒilmemesi
sağlan×yor:

start /w defrag /all


start /w scandisk /autofix

MS-DOS „un temel eksikleri Œok kullan×c×l× – multi user ve Œok iĢli – multi tasking olmamas×. Sadece PC –
personal computer mant×ğ× žzerine kurulu olan DOS, buna rağmen džnya žzerinde en Œok kullan×lan iĢletim
sistemlerinden biri olmuĢtur. Ġlk kez 1968‟de žretilen Unix ise bize internet ve h×zl× bir ağ ortam× hediye etmiĢtir.
Zaten Œoğu www (http), ftp (file transfer protocol) ve SMTP (electronic mail) sunucusu Unix‟dir. IBM OS/2 ve NT‟den
pek bahsetmek istemiyorum nedense. Microsoft Windows sayesinde, džĢžnsenize yžzlerce megahertz iĢlemcimiz,
yžzlerce megabyte RAM ve gigabyte‟larca sabit diskimizi yaz× yazmak, oyun oynamak, internete bağlanmak iŒin
kullan×yoruz, hem de bu performans× maksimum kullanamadan. Zaten eminim merakl× kullan×c×lar×n bilgisayar×nda
muhakkak sadece Windows değil, Linux, BeOS gibi ikinci bir iĢletim sistemi de vard×r! Marsa (k™tž anlamda değil)
gitmiĢ gibi hissetmek istiyorsan×z, Microsoft iĢletim sistemleri d×Ģ×ndakileri de muhakkak deneyin.

Unix‟de ise performans džĢmeden bilgisayar×n kaynaklar× birden fazla kullan×c× iŒin paylaĢt×r×labiliyor. Ayn×
bilgisayarda birŒok terminal ekran× (virtual machine – sanal makine) birbirinden bağ×ms×z olarak fonksiyon tuĢlar× ile
aŒ×labilir. Ticari bir amaŒla žretilmeyen, donan×mdan bağ×ms×z bu iĢletim sistemi žzerinde Œal×Ģmak žzere birŒok
program yaz×lm×Ģt×r. Unix Apple, Atari, Amiga gibi 68000 tabanl×, Sun Sparc, Alpha, MIPS, PowerPC ve tabii ki intel
iĢlemcili bilgisayarlara kurulabilir. MS-DOS ise sadece intel (Cyrix ve AMD kžŒžmsenmemeli) žzerine kurulabilir. Ancak
NT ve Windows 2000‟de birden fazla iĢlemci kullan×labiliyorken, Linux iĢletim sisteminin doğal olarak Œoklu iĢlemci
desteği vard×r.

Uzun dosya isimleri de zaten Linux‟da varken, Win95‟den itibaren MS-DOS 8.3 format×n× aĢ×larak kullan×ma
aŒ×lm×Ģt×r. Dosya ve klas™r eriĢim haklar× FAT iŒin imkans×z iken, ancak NT ile NTFS – new technology file system ile
bu imkan elde edilmiĢtir. Linux FAT žzerine de kurulabiliyor, kendi disk sistemi extended filesystem yani reiserfs, ext,
ext2 ve ext3‟džr. MS-DOS uygulamalar× kontrolsžz olarak donan×ma komut yollayabilirken, Linux‟da yaz×l×m ile
donan×m aras×nda kernel interface – Œekirdek arabirimi bulunur. NT‟de kullan×c× modu ve kernel modu ile daha Œok
kararl× sistem elde edilmiĢtir.

Swap yani geŒici bellek alan× iŒin Linux ayr× bir sžržcž oluĢturuyor. Oysa Windows boyu değiĢebilen
win386.swp veya pagefile.sys dosyas×n× kullan×yor. Tabii ille de bu Ģekilde kullanmak zorunda değilsiniz. NT iĢletim
sisteminde birden fazla disk daha performansl× veya kapasiteli kullan×lmas× amac× ile, boĢ alanlar×n birleĢtirilip sžržcž
oluĢturulduğu volume set – hacim kžmesi, her diskten ayn× bžyžklžkte b™lžm al×n×p tek sžržcž oluĢturulduğu stripe
set – Ģerit kžmesi, birbiri ile eĢ sabit disklerin mirror set – ayna kžmesi oluĢturulmas× gibi RAID – Redundant Array of
Independent / Inexpensive Disks (Fazladan bağ×ms×z / ucuz disk dizisi) imkanlar× vard×r.

MOD – Magneto Optik Disk baz× Machintosh sistemleri žzerinde standart olarak gelir. Bu disklere de CD gibi
optik, yani lazer ile veri yazma ve okuma, manyetik bir yžzey žzerinde gerŒekleĢtirilir, fakat CD‟den farkl× olarak
tekrar yaz×labilirler. Yani sabit disk ve compact disk teknolojilerinin birleĢtirilmesi ile oluĢan Œ×kart×labilir bir yedekleme
ortam×d×r. Flash RAM‟ler ise genellikle fotoğraf makineleri gibi portatif aletlerin veri kayd× iŒin kullan×l×r. BirŒok firma
birbiri ile uyumlu olmayan bžyžklžk ve kapasitede bu RAM‟lerden žretilmiĢlerdir. EriĢim sžreleri nanosaniye
seviyesindedir. Unix yeni Œ×kan teknolojilere uyum sağlayabiliyor. SCSI (sıkazi diye okunur), AGP ekran kart× veri yolu,
USB seri port ve UDMA diskler gibi destekleri bulunuyor. Bu arada SCSI ile yaz×c×, disk, taray×c× gibi sekiz donan×m
parŒas× paralel olarak Œal×Ģabilir. Tek disketlik Unix‟lerin yan×nda bir Œok CD ve DVD‟den oluĢan Unix ŒeĢidi vard×r.
Grafik arabirime ilk Macintosh, sonra Windows ve X Window ile de Unix tan×Ģm×Ģt×r. telnet (Telecommunications
Network – Telekomžnikasyon Ağ×) ile baĢka bilgisayara bağlanarak bu bilgisayar× da kendi bilgisayar×n×z gibi
kullanabilirsiniz. ekirdeğinizi derleyerek daha h×zl× Œal×Ģan Unix elde edebilirsiniz. Ġnternet sayesinde Unix donan×m
sžržcžlerinizi bularak onlar× gžncelleyebilirsiniz. Modem, ses kart×, ekran kart×, ağ kart×, yaz×c× gibi donan×mlar×n×za
destek verip vermediğini internetten araĢt×rabilirsiniz. Birden fazla ethernet – ağ kart× da destekliyor. Unix‟de program
nas×l kurulur, uninstall – silinir, defrag (var m× ki?), scandisk nas×l yap×l×r, donan×m ayarlar×, kesmeler, donan×m ekle
nas×l yap×l×r, TžrkŒe karakter problemi nas×l Œ™zžlžr, OpenGL (oupın ci el diye okunur) var m×, program nas×l yaz×l×r, ne
iĢime yarar bu Unix gibi sorular× bana sormay×n. CD‟deki “Diger\Tutorial\Linux-HOWTOs.tar.gz” ile bu gibi sorular×n×za
cevap bulabilirsiniz. Sevdiğim halde ben de pek deneyimli değilim. Kusura bakmay×n! Bu arada WinME gibi DOS komut
isteminde aŒ×lamayan bir iĢletim sisteminiz ve C sžržcžsžnden farkl× bir yerde olan Windows‟unuz varsa kurulumda
zorlanabilirsiniz. Yine de peĢini b×rakmay×n. PiĢman olmazs×n×z! AŒ×l×Ģta “LILO :” diye kalm×Ģsan×z telaĢlanmay×n. AŒ×l×Ģ
disketi ile bir “fdisk /mbr” (mbr – Master Boot Record) yeterli. Fazla ayr×nt×ya girmeyeceğim, bunun yeri bu kitap
değil.
249

9. JavaScript ile dosyalama (rasgele yazı kaydırılması)


(Ornekler\Diger\Java\ana.htm)

Hedefimiz bir *.txt dosyadan web sayfas× iŒinde rasgele kayan yaz×lar oluĢturmak. Ayr×ca bilgisayar×n×zdaki
disk ve dosya bilgileri de al×nabiliyor. Sayfa ilk aŒ×l×rken sorulan ActiveX gžvenlik sorusuna Evet diyerek geŒmemiz
gerekiyor. Disk ile ilgili iki iĢlem yap×ld×ğ× iŒin žst žste iki kere bu soru soruluyor. Biraz can s×k×yor gibi olsa da ™nemli
bir soruĢturmad×r. Ġnternette dolaĢ×rken b™yle bir soruya Evet derseniz diskinize zarar veren komutlara da izin vermiĢ
olursunuz. ActiveX komut ve nesneleri gžvenlik y™nžnden Œok zay×ft×rlar. Ayr×ca Internet Explorer web taray×c×s× iŒin
gžvenlik ayarlar×ndan ActiveX ve JavaScript izinlerini bu ™rnekler iŒin simdilik aŒmak gerekiyor. Deneyim iŒin
yapt×ğ×m×z basit dosyalama iŒin bu y™ntemi tavsiye etmem, onun yerine cookie – Œerez kullan×m× daha rahat ve kolay.

Resim 14 – Ġlk aŒ×l×Ģ sorusu, ana.htm sayfas× ve yan bilgiler

ana.htm iŒinde alt.htm dosya iframe (in line frame) – iŒ ŒerŒeve (Netscape bu komutu desteklemiyor) iŒinde
g™steriliyor. Bu sebeple iki *.htm dosya oluĢturuyoruz. JavaScript C (i++; deyimi gibi), Pascal (var değiĢken
tan×mlama k×sm× gibi) ile Basic (Array deyimi ile dizi tan×mlamak gibi) dillerinin kar×Ģ×m× gibi g™zžkžyor. RahatŒa
değiĢken tan×mlamak, istediğiniz yere kod yazmak, g™rsel diller kadar gžŒlž olan sayfa žzerindeki nesnelere
250

ulaĢabilmek, bilgisayar kaynaklar×n× neredeyse tam kullanabilmek gibi birŒok hoĢ ™zellik vard×r. Eğer bilgisayar×n×zda
Microsoft Visual Studio‟nun bir ™ğesi kurulu ise web sayfas× iŒinde yapt×ğ×n×z hatalar× giderebilir, ad×m ad×m izleyebilir,
komutlar hakk×nda bilgi alabilir, hem tasar×m hem de ™n izleme yapabilirsiniz. Internet Explorer iŒinden
“G™ržnžm*Hata Ay×klay×c×s×*AŒ” komutu ile Microsoft Development Environment 6.0 program×na ulaĢabilirsiniz. Bu
program× Office 2000 CD‟sindeki “Add or Remove Features*Office Tools*HTML Source Editing” ile elde edebilirsiniz.

ana.htm ve alt.htm‟ye ait kodlar:

<html>
<head>
<title>JScript</title>
<meta http-equiv="Content-Type" content="text/html; charset=">
</head>
<body bgcolor="#CCCCFF" OnUnload="kapat()">
<center>
<font face="Arial, Helvetica, sans-serif"><b>Sadece
iç kısım belli saniyede tazelenecektir.<br>
<iframe width="215" height="215" src="alt.htm" ></iframe>
</b> </font>
<form name="form1">
<hr>
<table border="1" align="center" bordercolor="#CCCCFF" bgcolor="#FFFFFF" bordercolorlight="#CCFFFF"
bordercolordark="#CCFFFF">
<tr>
<td>
<div align="center"><font face="Arial, Helvetica, sans-serif">
<input type="text" name="textfield" value="c:" maxlength="15" size="7" >
<a href="#" onMouseOver="bul()" onMouseOut="kapat()">
Disk Bilgisi</a></font></div>
</td>
</tr>
<tr>
<td>
<div align="center"><font face="Arial, Helvetica, sans-serif">
<input type="button" name="Submit2" value="Ayrıntılı Sürücü Bilgileri" onClick="listele()">
</font></div>
</td>
</tr>
<tr>
<td>
<div align="center"><font face="Arial, Helvetica, sans-serif">
<input type="text" name="textfield2" value="c:\" size="15">
<input type="button" name="Submit3" value="Bu Dizindeki Dosya Listesi" onClick="dosyalar()">
</font></div>
</td>
</tr>
</table>
</form>

<font face="Arial, Helvetica, sans-serif">2 GB üstü bilgiler tam gösterilemiyor... Hazır olmayan veya gerçekte var olmayan
sürücü ve dizinlere bir önlem alınmadı.<br>

<script language="JavaScript1.2">
<!--Javascript kodunu eski sürüm browserlardan saklayalim
var fso;
fso = new ActiveXObject("Scripting.FileSystemObject");
Pencere = window.open("", "bilgiler", "top=0 left=0 width=200 height=200")
Pencere.close();
function bul()
{ var d, s;
Pencere = window.open("", "bilgiler", "top=0 left=0 width=200 height=200")
d = fso.GetDrive(fso.GetDriveName(document.form1.elements[0].value));
s = "Sürücü " + document.form1.elements[0].value +"<br>";
s += d.VolumeName + "<br>";
s += "BoĢ Alan: " + d.FreeSpace/1024 + " KB <br>" + "Toplam Alan: " + d.TotalSize/1024 + " KB";
251

Pencere.document.write("<h2>Disk Bilgileri</h2>")
Pencere.document.write("<p>" + s + "</p>")
Pencere.document.close()
}

function dosyalar()
{ var f, fc, s;
f = fso.GetFolder(form1.elements[2].value);
fc = new Enumerator(f.files);
s = "";
for (; !fc.atEnd(); fc.moveNext())
{
s += fc.item();
s += "\n";
}
window.alert (s);
}

function listele()
{
var s, n, e, x, t, d, kapasite , sn;
e = new Enumerator(fso.Drives);
s = "Ad\tTipi\tĠsmi\tSeri NO\t\tBoĢ Alan\n_____________________________________________________\n";
for (; !e.atEnd(); e.moveNext())
{
x = e.item();
switch (x.DriveType)
{
case 0: t = "Bilinmiyor"; break;
case 1: t = "Disket"; break;
case 2: t = "Sabit"; break;
case 3: t = "Ağ"; break;
case 4: t = "CD-ROM"; break;
case 5: t = "RAM Diski"; break;
}
s = s + x.DriveLetter;
s += " ";
if (x.DriveType == 3)
n = x.ShareName;
else if (x.IsReady)
{ n = x.VolumeName;
kapasite=x.FreeSpace/1024;
sn = x.SerialNumber
s += "\t" + t + "\t" + n + "\t" + sn + "\t"+ kapasite + " KB\n\n";
}
else
{
n = "[Hazır Değil]";
kapasite=0;
s += "\t" + t + "\t" + n + "\n\n";
}
}
window.alert(s+"_____________________________________________________")
}

function kapat()
{
Pencere.close();
}
-->
</script>
</font>
</center>
</body>
</html>
252

alt.htm‟nin kodlar×. c:\yazi.txt veri dosyas× yok ise oluĢturuluyor.

<html><head>
<title>Yeni Belge</title>
<!—7 sn‘de bir refresh için olabilirdi ... meta http-equiv="refresh" content="7"-->
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
<meta http-equiv="Content-Language" content="tr">
</head>
<body bgcolor="#CCCCFF">

<SCRIPT LANGUAGE = "JavaScript1.2">


<!--Javascript kodunu eski sürüm browserlardan saklayalim
var arraym = new Array()
var dosya, ac, i, yazi;
var ForReading = 1; ForWriting = 2;

function dosyaAc()
{ dosya = new ActiveXObject("Scripting.FileSystemObject");
if (dosya.FileExists("c:\\yazi.txt"))
{
ac = dosya.OpenTextFile("c:\\yazi.txt", ForReading);
i = 0;
while(!ac.AtEndOfStream)
{ arraym[i] = ac.ReadLine(); i++; }
yaz();
}
else
{
ac = dosya.CreateTextFile("c:\\yazi.txt", ForWriting);
ac.WriteLine ("Bugün hava berbat, fakat tahminlere göre yarın hava güneĢli ve sıcaklık 21 derece civarında seyredecek...");
ac.WriteLine ("Yeni çalıĢmalar için Ahmet aranacak. Eğer yeni üründen de bahsedersen iyi olur. <u>Aramayı unutma!</u>");
ac.WriteLine ("Counter Strike için yapılan Botlar ne sıkıcı. Artık daha akıllı Bot yapmalılar. Devamlı <u>takılıyorlar</u>.");
ac.WriteLine ("cs_dust oynamayalım. Kaç saattir bu haritayı ezberledik. Biraz da cs_estate olabilir.");
ac.WriteLine ("<a href='http://www.tbagriyanik.cjb.net'>Sitemi ziyaret edin.</a> Hem orada tüm çalıĢmalarımı bulabilir ve
haberdar olabilirsiniz");
ac.WriteLine ("Ütüyü <i>fiĢten</i> çektin mi? Yoksa ne olabilir tahmin et!");
ac.WriteLine ("<hr>Bu hafta Yerli Malları Haftası. Kutlamayı unutmayın...<hr>");
ac.WriteLine ("Programcılık en zevkli bilgisayar uğraĢıdır. <font color=green>Meslek</font> olarak da en güzelidir.");
ac.WriteLine ("Ne desem bilmem ki! Kendinize iyi bakın...");
ac.WriteLine ("Hile yapmadan oynanan oyun en zevklisidir...");
ac.WriteLine ("Siz olsanız hangi ülkeye tatile gitmek isterdiniz? Madagaskar mı?... <font color=red>:)</font>");
ac.WriteLine ("<font color=orange>oleee </font>Ne güzel yaa, her yazdığım çıkabiliyor");
ac.WriteLine ("<font color=yellow>Ġstediğin kadar yaz...</font>");
ac.WriteLine ("Artık YETER");
ac.WriteLine ("Bu son satirdir. Üsttekiler ekrana rastgele gelebilir...");
ac.Close();
document.write ("Dosya c:\yazi.txt olarak oluĢturuldu... Birazdan çalıĢmaya baĢlayacak");
window.setTimeout("window.navigate('alt.htm')", 3000); //3 sn sonra kendini çağırır
}
}

function yaz()
{ yazi = Math.round((Math.random()*(i-1)))
document.open()
document.write("<b><MARQUEE BEHAVIOR=SCROLL DIRECTION=up LOOP=-1 SCROLLDELAY=0
SCROLLAMOUNT=2 WIDTH=180 HEIGHT=180>",arraym[yazi],"</MARQUEE></b>")
document.close() //görüldüğü gibi asıl kaydırma komutu MARQUEE‟dir
window.setTimeout("window.navigate('alt.htm')", 7000);
}
dosyaAc(); //ana komut
//-->
</SCRIPT>
</body>
</html>
253

Cookie ise “Windows\Cookies” klas™ržnde saklanan metin tabanl× boyutu kžŒžk, kullan×c×n×n gezdiği sitelerin
geŒici bilgilerinin sakland×ğ× dosyalard×r. Web sitelerini dolaĢ×rken sadece insanlar ana bilgisayarlardan bilgi Œekmezler,
sunucu da istemciden bilgi talep edebilir. Her bağlant×da bu bilgilerin sabit kalabilmesi bu kžŒžk metin dosyalar×
sayesinde olur. Netscape firmas×n×n etkileĢim iŒin Œ×kard×ğ× bu sistem ile sitelerin davran×Ģ× kullan×c×n×n ™zelliklerine
g™re değiĢebiliyor. BaĢka siteler yetkileri olmadan diğer cookie‟leri okuyamazlar. Internet Explorer 6.0 ve žzeri web
taray×c×lar× bir siteye girildiğinde kendiliklerinden cookie kontrolž yapabiliyorlar. Bunu durum Œubuğundan
anlayabilirsiniz. B™ylece zararl× cookie tutulmas× ™nleniyor. Adaware adl× bir programla da reklam kaynakl× bilgi
s×zd×ran dosyalar×n silinmesini sağlayabilirsiniz. Spybot – Search&Destroy program× da TžrkŒe, bedava ve internetten
gžncellenebiliyor.

*.asp dosyalar×m×z iŒinde bu bilgileri yazma ve okuma komutlar×n× kullanabiliriz. “Ornekler\Diger\Java\


cookie.html” ile JavaScript kullanarak cookie, yanda kayan menž, fare takipcisi gibi değiĢik numaralar elde ediyoruz.
JavaScript modžler fakat VBScript kullanan *.asp daha basit. Kopyala yap×Ģt×r ile script k×s×mlar×n× kendi web
sayfalar×n×za ekleyebilirsiniz. “Ornekler\Diger\Java\hesapmakinesi.htm” ile de yine Java‟n×n gžcž belli oluyor.

Bir cookie‟nin en fazla 4 KB olabileceğini džĢžnerek Ģu Ģekilde değerler kaydebilir:

<%
Response.Cookies(―cerezimiz‖)(―a‖)= ―Deneme 1‖
Response.Cookies(―cerezimiz‖)(―b‖)= ―Deneme 2‖
Response.Cookies(―cerezimiz‖)(―c‖)= ―Deneme 3‖
Response.Cookies(―cerezimiz‖).Expires= ―November 30, 2001‖
Response.Cookies(―cerezimiz‖).HasKeys
%>

Ayn× değiĢken adlar×n× kullanarak, tekrar okumak iŒin de Ģ™yle yapabiliriz:

<%
a=Request.Cookies("cerezimiz")("a")
b=Request.Cookies("cerezimiz")("b")
c=Request.Cookies("cerezimiz")("c")
Response.Write a
Response.Write b
Response.Write c
%>

Eğer <%= Request.Cookies("cerezimiz") %> yapsayd×k tžm değiĢkenler ekrana gelirdi:

C=Deneme+3&B=Deneme+2&A=Deneme+1

<%= Request.Cookies("cerezimiz")(―a‖) %> ekrana sadece tek bilgi gelir:

Deneme 1
254

10. JavaScript ve Flash (rasgele yazı kaydırılması)


(Ornekler\Diger\Flash\ana.htm)

…stteki kayan yaz× ™rneğinin Macromedia Flash ile benzerini oluĢturabiliriz. SonuŒta flash.fla, flash.swf,
ana.htm, alt.htm ve yazi2.txt adl× dosyalar elde edeceğiz. alt.htm gibi bir sayfaya as×l kodlar× yaz×yoruz. Fakat
doğrudan olarak ana sayfaya yapmay×Ģ×m×z×n bir nedeni de, her tazelemede sorulan gžvenlik sorgulamas×n×, ilk aŒ×l×Ģta
sorulan tek soruya indirmektir. Bu arada žstteki ™rnekteki yazi.txt iŒindeki art×k kullanamayacağ×m×z HTML kodlar×n×
kald×r×p, yazi2.txt gibi ikinci bir yaz× dosyas× yapmak zorunda kal×yoruz. žnkž Flash metin iŒindeki HTML kodlar×n×
yorumlamay×p aynen yaz×yor. Zaten Flash‟×n efektleri HTML‟den Œok daha yetenekli.

„nce Flash program× ile yukar× doğru kayan bir yaz× haz×rl×yoruz. Bir Text nesnesini sahneye ekliyoruz.
Character – karakter ™zelliklerini Arial Tur, 21 punto, kal×n ve sar× renk yap×p, Text Options k×sm×nda da Dynamic
Text (dinamik yaz×), Multiline (Œok sat×rl×) ve Wordwrap (kelime kayd×r) ™zelliklerini değiĢtiriyoruz. Resimdeki gibi
džzenlemeleri yapabilirsiniz. Variable – değiĢken ad×na tekst demeyi unutmay×n. JavaScript ile bu değiĢkene değer
yollayacağ×z.

Resim 15 – Flash tasar×m an× ve sonuŒ ekran×


255

Yaz× k×sm× haz×rlan×nca ilk frame – ŒerŒeve (zaman Œizgisinde 1 numaral× ŒerŒeve) žzerine sağ t×klay×p “Create
Motion Tween” komutu veriyoruz. Son ŒerŒeve iŒin layer1 žzerinde 30‟ncu kare t×klan×p F6 tuĢu ile keyframe – anahtar
ŒerŒeve ekliyoruz. Yaz×n×n yukar× doğru gitmesi iŒin bu son ŒerŒevede yaz×y× klavyeden Shift tuĢuna (yanlara
kaymamas× iŒin) basarken yukar× taĢ×y×n. Yine 30‟ncu ŒerŒeve sağ t×klan×p Action – hareket kod k×sm×na gotoAndPlay
(1); diyoruz. Asl×nda zaten kendiliğinden otomatik olarak loop – tekrar ayn× hareketleri yap×yor. Bunu yapmasan×z da
tekrar baĢa d™ner demek istiyorum.

Resim 16 – Motion Tween ve Action Script yazmak

Resim 15‟de g™rebileceğiniz 8.0 fps yaz×s×n×n olduğu yere Œift t×klay×p 8 fps – frames per second (saniyedeki
kare say×s×), Width 200 px – pixel, Height 370 px yaparak h×z ve boyut ayarlar×m×z× yapabiliriz. Ayn× menždeki
Background Color ile mavi gibi bir renk seŒebilirsiniz, fakat arka plan rengini alt.htm dosyas×nda değiĢtiriyoruz.
Ctrl+Enter tuĢar× ile hem flash.swf dosyam×z× elde ediyor, hem de ™nizleme yapabiliyoruz. Sadece Enter ile de tasar×m
ve Œal×Ģmay× ayn× anda g™rebiliriz. “File*Publish Settings...” ile *.htm ve *.swf seŒili olursa, “File*Publish Shift+F12”
dediğimizde alt.htm iŒinde kullanacağ×m×z <object> tag – etiket kodlar×n×n haz×r olarak gelmesini sağlayabiliriz.

ana.htm ve alt.htm kodlar× Ģu Ģekilde not defteri ile haz×rlanabilir:

<html> <head>
<title>JavaScript ve Flash</title>
<meta http-equiv="Content-Type" content="text/html; charset="></head>
<body bgcolor="#CCCCFF">
<center>
<font face="Arial, Helvetica, sans-serif"><b>Sadece
iç kısım belli saniyede tazelenecektir.<br>
<iframe width="235" height="405" src="alt.htm" ></iframe>
</b> </font>
256

</center>
</body>
</html>

alt.htm:

<html><head>
<title>JavaScript ve Flash</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
<meta http-equiv="Content-Language" content="tr">
</head>
<body bgcolor="#CCCCFF">
<OBJECT id='flash' classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" WIDTH=200
HEIGHT=370><PARAM NAME=movie VALUE="flash.swf"> <PARAM NAME=quality VALUE=high> <PARAM NAME=bgcolor
VALUE=#CCCCFF> <EMBED name="flash" src="flash.swf" quality=high bgcolor=#CCCCFF WIDTH=200 HEIGHT=370
TYPE="application/x-shockwave-flash"
PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBE
D></OBJECT>
<SCRIPT LANGUAGE = "JavaScript1.2">
<!--Javascript kodunu eski sürüm browserlardan saklayalim
var arraym = new Array()
var dosya, ac, i, yazi;
var ForReading = 1; ForWriting = 2;
function dosyaAc()
{ dosya = new ActiveXObject("Scripting.FileSystemObject");
if (dosya.FileExists("c:\\yazi2.txt"))
{ac = dosya.OpenTextFile("c:\\yazi2.txt", ForReading);
i = 0;
document.open()
while(!ac.AtEndOfStream)
{arraym[i] = ac.ReadLine();
i++;
}
yaz();
}
else
{
ac = dosya.CreateTextFile("c:\\yazi2.txt", ForWriting);
ac.WriteLine ("Bugün hava berbat, fakat tahminlere göre yarın hava güneĢli ve sıcaklık 21 derece civarında seyredecek...");
ac.WriteLine ("Yeni çalıĢmalar için Ahmet aranacak. Eğer yeni üründen de bahsedersen iyi olur. Aramayı unutma!");
ac.WriteLine ("Counter Strike için yapılan Botlar ne sıkıcı. Artık daha akıllı Bot yapmalılar. Devamlı takılıyorlar.");
ac.WriteLine ("cs_dust oynamayalım. Kaç saattir bu haritayı ezberledik. Biraz da cs_estate olabilir.");
ac.WriteLine ("http://www.tbagriyanik.cjb.net sitemi ziyaret edin. Hem orada tüm çalıĢmalarımı bulabilir ve haberdar
olabilirsiniz");
ac.WriteLine ("Ütüyü fiĢten çektin mi? Yoksa ne olabilir tahmin et!");
ac.WriteLine ("Bu hafta Yerli Malları Haftası. Kutlamayı unutmayın...");
ac.WriteLine ("Siz olsanız hangi ülkeye tatile gitmek isterdiniz? Madagaskar mı?... :)");
ac.WriteLine ("olee Ne güzel yaa, her yazdığım çıkabiliyor");
ac.WriteLine ("Ġstediğin kadar yaz...");
ac.WriteLine ("Artık YETER");
ac.WriteLine ("Bu son satirdir. Üsttekiler ekrana rastgele gelebilir...");
ac.Close();
window.setTimeout("window.navigate('alt.htm')", 100);
}
}

function yaz()
{ yazi = Math.round((Math.random()*(i-1)));
window.document.flash.SetVariable("tekst",arraym[yazi]);
window.setTimeout("window.navigate('alt.htm')", 7000);
}
dosyaAc(); //ana komut
//-->
</SCRIPT>
</body> </html>
257

window.document.flash.SetVariable("tekst",arraym[yazi]); komutu sayesinde Flash iŒindeki herhangi bir


nesneye değer atabiliyoruz. flash kelimesi bizim oluĢturduğumuz flash.swf dosyas×n×n ad×d×r ve alt.htm‟nin žst
sat×rlar×ndaki <object> k×sm×ndaki yerde id – identification (kimlik) ve embed k×sm×nda da name – ad ile bunu
belirtmeliyiz.

Flash iŒine komut yollaman×n yan×nda getURL(); ile d×Ģar×ya yani Internet Explorer penceresine de komutlar
yollayabiliriz. Bu web sayfas× iŒindeki bir JavaScript fonksiyonu da olabilir. Nesne veya džğmenin Action komutlar×na
Ģu ™rnekleri yazabilirsiniz:

getURL (―JavaScript:dosyaAc();‖);

Bir džğmenin kod k×sm×na Ģunlar yaz×larak web sayfas× kapat×labilir:

on (release){
getURL(―JavaScript:top.close();‖); //pencere kapatılmadan önce Internet Explorer onay istiyor
}

BaĢka bir džğmenin kod k×sm×na Ģunlar yaz×larak ayr× bir pencere aŒ×labilir:

on (release){
getURL ("sayfa2.html", "blank");
}

Flash iŒindeki baĢka bir nesnenin ™zelliklerine Ģu Ģekilde ulaĢ×labilir:

setProperty (―nesneadi‖, _x, 250); //nesneadi „nin x koordinatı değiştirilir


setProperty ("nesneadi ",_x, getProperty("nesneadi ", _x)-artim);

Verilen hedefte(bir movie clip olabilir) ™rneğin pop menžler gibi kontroller yapmak iŒin:

tellTarget (―hedefadi‖)
{
gotoAndPlay(5); //burada başka işlemler de yapılabilir
};
258

11. JavaScript ile arama (*.html içinde arama)


(Ornekler\Diger\Java\arama.htm)

Sayfa iŒinde belli kelimeyi aramak ve kaŒ adet olduğunu bulmak iŒin bu kodlar× kullanabiliriz. Netscape iŒin
farkl× komut kullan×m× gerekebilir. Netscape‟e ™zel kod ile uğraĢmama nedenim džnyada bžyžk bir Œoğunluğun bu
browser - taray×c×y× kullanmamas×. ġu anda Œoğu kiĢi Internet Explorer 5 ve žzerini doğal olarak kullan×yorlar.
Ġsterseniz program× geliĢtirerek bulunan sat×rlar× baĢka bir sayfada tablo halinde listeleyebilirsiniz.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
<title>Arama</title>
</head>
<body bgcolor="#00ccff">

<font face="Arial">The help is in the "Help" subdirectory, in HTMLHelp


format (check the "download" section if you are using Win95 and need
HTMLHelp support). It is regularly updated, but GLScene is currently growing
faster than the help file.</font>

<form name="form1">
<p align="center"><input name="string"><br>
<input type="button" value="Ara/Sonraki" name="B1" onclick="bul();">
<input type="reset" value="Temizle" name="B2"></p>
<input type="text" name="textfield" value="TB" maxlength="0" size="1">
</form>

<script language="JavaScript1.2">
var n = 0;
function bul()
{
var txt,i,tamam;
str = document.form1.elements[0].value;
if (str!='')
{
txt = document.body.createTextRange();
for (i=0;i<= n &&(tamam=txt.findText(str))!=false;i++)
{
txt.moveStart("character",1);
txt.moveEnd("textedit");
}
if (tamam)
{
txt.moveStart("character",-1);
txt.findText (str);
txt.select();
txt.scrollIntoView();
n++;
}
else
{
if (n>0)
{
alert("Toplam "+n+" adet bulundu"); n=0;
}
else alert (str+" bulunamadı...");
}
}
}
</script>
</body>
</html>
259

12. ASP ile misafir defteri (*.asp ve *.mdb veritabanı)


(Diger\ASP\myasp\myasp1.zip ve myasp2.zip)

Temel olarak *.asp dosyalar olan Active Server Pages – etkin sunucu sayfalar× ile, internet veya intranet
žzerinde veritaban× ve gžvenlik gerektiren sayfalar× oluĢturabilirsiniz. PHP ve Perl – Practical Extraction and Report
Language gibi C diline benzeyen diğer CGI – Common Gateway Interface programlama dilleri ile de daha profesy™nel
sayfalar yapmak mžmkžndžr. Ayr×ca Macromedia Flash gibi animasyonlu web sayfalar× rahatl×kla ASP ile
iliĢkilendirilebilir. Genellikle tžm siteyi *.asp olarak haz×rlamak yerine kullan×c× logon – giriĢi, misafir defteri, forum ve
benzeri anket gibi analiz edilebilen verilerin olduğu internet sayfalar×nda kullanabiliriz. brinkster.com gibi bedava
ASP desteği veren siteler ile de yapt×ğ×n×z sayfalar× deneyebilirsiniz, ya da žcretli olarak edindiğiniz host - sunucu
žzerinde iĢlevleri test edebilirsiniz. Asl×nda Œoğu sunucu NT/2000/2003 ve Unix tabanl×d×r. Bu iĢletim sistemleri doğal
olarak CGI gibi hizmetleri iŒerirler. Brinkster žyeliği sonras×nda db klas™ržne att×ğ×n×z *.mbd iŒin yazma hakk×
olmad×ğ×na dair bir hata mesaj alabilirsiniz. Live Support ile bu isteğinizi belirtirseniz, veritaban×n×za kay×t girme ve
silme gibi iĢlemleri de yapabilirsiniz.

CGI dosyalar× istemci yani kullan×c×lar×n web sayfas×n× sunucudan istemesi ile Œal×Ģmaya baĢlar. Kullan×c×
penceresinde *.htm dosyay× g™rdžğž halde asl×nda bu sayfa sunucu žzerinde Œal×Ģan *.asp dosyas×d×r. Form bilgileri
ve seŒeneklere g™re *.asp dosyan×n son iĢlenmiĢ *.htm hali farkl× olabilir. CGI sayesinde istemci, sunucuya komut
yollar ve onu programlar. Fakat onlarca kiĢi ayn× anda sunucudan hizmet bekleyince sunucu gittikŒe yavaĢlamaya
baĢlayabilir. JavaScript istemci taraf×nda Œal×Ģ×rken, ASP sunucu taraf×nda Œal×Ģ×r. B™ylece web browser – taray×c×
program× ne olursa olsun *.htm kodunu kullan×c× rahatl×kla g™recektir. Bu arada *.asp dosyalardaki kodlar×n asl×nda
VBScript olduğuna da dikkatinizi Œekerim. Bunun anlam× JavaScript ile de *.asp dosya oluĢturulabileceğidir. VBScript
Netscape taray×c×s× taraf×ndan tan×nmad×ğ× halde *.asp kodlar×m×z sunucu taraf×nda Œal×Ģ×p *.htm halini yollayacakt×r.
Kullan×c× sizin *.asp k×sm×ndaki kodlar× asla g™remeyecek ve sadece ™zet bilgi gibi ™nžne gelen *.htm ile yetinecektir.
Orijinal *.asp kodu ™rneğin 3KB iken, sonuŒ *.htm dosyas× 1KB‟dan MB seviyesine kadar bžyžk dosya olabilir. žnkž
sonuŒ en az×ndan basit bir hata mesaj× olabilir veya bžyžk bir veritaban×n×n ekrana tablolanmas× da olabilir.

Kendi bilgisayar×m×zda *.asp sayfalar× oluĢturmam×z iŒin gerekenler sadece not defteri, Microsoft Access ve
Microsoft Personal Web Server (PWS – KiĢisel Web Sunucusu) programlar×d×r. PWS program× Win98 CD‟sinde
“Tools\Add-ons\pws” dizininde bulabilirsiniz. Kurulumdaki root – k™k dizin sorulduğunda “C:\Belgelerim\My Webs” gibi
bir klas™r ad×n× belirledikten sonra, saat simgesinin yan×ndaki basit menžlere sahip olan PWS program×na
ulaĢabilirsiniz. NT ve žzeri iŒin ise Internet Information Services – IIS adl× program× kurman×z gerekli.

Internet Explorer adres Œubuğundan internete bağlanmadan, “http://localhost” denildiğinde, art×k sizin
bilgisayar×n×zdaki default.asp, index.htm gibi sayfalar×m×z× Œal×Ģt×r×p *.asp uzant×l× dosyalar×n canl× hale geldiğini
g™rebilirsiniz. Ġsterseniz “Denetim Masas×*Ağ” k×sm×ndan bilgisayar ad×n× değiĢtirerek “http://server” gibi de
adland×rabilirsiniz. Perl iŒin *.pl uzant×l× dosyalar×n aktif hale gelmesi ActivePerl adl× program sayesinde olur.

MS Access ile “My Webs\db” isimli bir dizin iŒine guestbook.mdb adl× basit bir veritaban× oluĢturacağ×z.
tblContacts adl× bir Table – tablo ekleyerek alan adlar×n× Ģu Ģekilde yap×yoruz:

ContactID AutoNumber
FirstName Text Size 30
LastName Text Size 30
Phone Text Size 100
Email Text Size 50
Comments Note
DateEntered Date/Time Default Value =NOW()
Type Number

Bu projede 3 farkl× alan birbirine benzer Ģekilde birleĢtirilmiĢ. Misafir defteri, program ekleme, site ekleme
modžlleri. Arabirimleri ayn× fakat gruplar×(Type) farkl×d×r. Yani ayn× veritaban×na kaydolurken, kayd×n tžržne g™re filtre
amac× ile numara veriyoruz. Mesela misafir defteri 1, program ekleme 2 ve site ekleme 3.

index.html misafir deferi iŒin, index1.html program ekleme iŒin ve son index2.html de site ekleme iŒin
gereken ana sayfad×r. Tek ana sayfa da yap×labilirdi. Kullan×c×lar žye yap×larak, kendi misafir defteri de yapma imkan×
olabilirdi. B™ylece misafir defteri hizmeti de verebilirdik.
260

Resim – Asp projemizin Œal×Ģ×r haldeki ekran g™ržntžleri

Ana menž yani veri giriĢ ve listeleme iŒin, “My Webs\index.html” iŒine sayfa oluĢturuyoruz:

<html><title>Tarik's Web Site - Guestbook</title>


<body bgcolor="#FFFFFF" text="#336666" link="#009999" alink="#00FFFF" vlink="#66CCCC">
<font face="Verdana, Arial, Helvetica, sans-serif"><h1 align="center">Tarik's Web Site's Guestbook</h1>
<a href="ViewGuestBook.asp"><b><font size="2" face="Arial, Helvetica, sans-serif">Return
to Guestbook</font></b></a><font size="2" face="Arial, Helvetica, sans-serif"><b><br>
<A HREF="http://www.yunus.projesi.com" target="_self">Return
to Homepage </A></b></font> </font>
<form name="form1" method="post" action="GuestBook.asp">
261

<table width="65%" border="0" height="44%" align="center">


<tr>
<td>
<p align="right"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Your
Name :
<input type="text" name="FirstName" maxlength="30">
<br>
Your City :
<input type="text" name="LastName" maxlength="30">
<br>
Web Site(without &quot;http://&quot;)
:
<input type="text" name="Phone" value="none" maxlength="100">
<br>
Email :
<input type="text" name="Email" value="none" maxlength="50">
<br>
<br>
Comment :
<textarea name="Comments" rows="5" cols="70"></textarea>
</font> <b> <font color="#009999">
<br>
</font></b><b><font color="#009999">
<br>
<input type="submit" name="Submit" value="Add">
<input type="reset" name="Submit2" value="Clear">
</font> </b> </p>
</td>
</tr>
</table>
</form>
</html>

Bilgileri index.html‟den al×p kontrol ederek kaydeden dosyam×z ise “GuestBook.asp” ‟dir:

<% @ LANGUAGE="VBSCRIPT" %>


<%
Option Explicit

Dim rst
Dim strFirstName
Dim strLastName
Dim strPhone
Dim strEmail
Dim strComments

dim DatabasePath

Dim ado_OpenKeyset
Dim ado_LockOptimistic
Dim strConnect

function temizle(metin)
metin=replace(metin,chr(10),"") 'satirbasi
metin=replace(metin,chr(34),"") 'tirnak
metin=replace(metin,"'","") 'tirnak
metin=replace(metin,"<","")
metin=replace(metin,">","")
temizle=trim(metin)
end function

'Connection String
DatabasePath = "db/guestbook.mdb"
strConnect= "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ= " & server.mappath(DatabasePath)
ado_OpenKeyset=1
ado_LockOptimistic=3
262

'get user input from the form fields


strFirstName = temizle(Request.Form("FirstName"))
strLastName = temizle(Request.Form("LastName"))
strPhone = temizle(Request.Form("Phone"))
strEmail = temizle(Request.Form("Email"))
strComments = temizle(Request.Form("Comments"))

'set up rst; create the recordset object


Set rst=server.createobject("ADODB.RECORDSET")
%>

<html>

<head>
<title>Tarik's Web Site - Guestbook</title>
<meta name="keywords" content="asp, active server pages, learning, beginners, newbie, asp, java, access 2000 2000 visual
basic vb resources MSAccess 97 microsoft programming web design web ">
</head>
<body bgcolor="#FFFFFF" text="#336666" link="#009999" alink="#00FFFF" vlink="#66CCCC">
<font face="Verdana, Arial, Helvetica, sans-serif" size="2">
<h1 align="center">Tarik's Web Site's
Guestbook</h1>
<p> <a href="index.html"><font face="Arial, Helvetica, sans-serif"><b>Sign
in Guestbook</b></font></a><b><font face="Arial, Helvetica, sans-serif"><br>
<a href="ViewGuestBook.asp">Return
to Guestbook</a><br>
<A HREF="http://www.yunus.projesi.com" target="_self">Return
to Homepage </A> <br>
</font></b> </p>

<%
If strFirstName="" or strLastName ="" or strPhone ="" or strEmail ="" or strComments ="" Then
Response.Write "<font color=red>You did not enter all, please do.</font>"
Else
rst.open "tblContacts", strConnect, ado_OpenKeyset, ado_LockOptimistic

rst.AddNew
rst("FirstName") = strFirstName
rst("LastName") = strLastName
rst("Phone") = strPhone
rst("Email") = strEmail
rst("Comments") = strComments
rst("Type") = 1
rst.Update
Response.Write "<font color=blue>Thank you for your patience... " & strFirstName & " from " & strLastName &
"</font>"
rst.Close
set rst = Nothing
end if

%> </font>
</body>
</html>

Bilgileri ekrana listeleyen sayfa ise “ViewGuestBook.asp”.

<%@ Language=VBScript%>
<%Option Explicit%>

<html>
<head>
<TITLE>Tarik's Web Site - Guestbook</TITLE>
<meta name="keywords" content=" asp, active server pages, learning, beginners, newbie, asp, java, access 2000 2000 visual
basic vb resources MSAccess 97 microsoft programming web design schedules office 2000">
263

</head>

<body bgcolor="#FFFFFF" text="#336666" link="#009999" alink="#00FFFF" vlink="#66CCCC">


<h1 align="center" msnavigation><font face="Verdana, Arial, Helvetica, sans-serif">Tarik's
Web Site's Guestbook</font><font face="Arial, Helvetica, sans-serif" size="2"></font></h1>
<p align="left"> <b> <A href="index.html"><font face="Arial, Helvetica, sans-serif" size="2">Sign
in Guestbook</font></a>
<font face="Arial, Helvetica, sans-serif" size="2"><br>
<a href="http://www.yunus.projesi.com">Return to Homepage</a>
<br></b>
<a href="delete.asp">Delete a record</a> </font></b>
</p>
<tr><td valign="top" width="1%"></td><td valign="top" width="24"></td>
<td valign="top" msnavigation>
<hr noshade>
<font size="2"><%
Dim rst

dim DatabasePath

Dim ado_OpenKeyset
Dim ado_LockOptimistic
Dim strConnect
Dim strSQL
Dim kayitno

'Connection String
DatabasePath = "db/guestbook.mdb"
set strConnect = server.createobject("ADODB.Connection")
strConnect.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ= " & server.mappath(DatabasePath)

'I am using this sql instead of the usual recordset object to sort data in desc order
strSQL = "SELECT * FROM tblContacts " & _
"where type=1"

'Execute the SQL statement'


set rst = strConnect.execute(strSQL) 'this creates our recordset

kayitno = 0
%> </font>
<div align="left">
<table border="0" cellspacing="0" width="100%" bgcolor="#ffffff">
<%
'loop through the table
do while not rst.EOF
kayitno=kayitno+1
%>
<tr>
<td width="75%"><font color="#800000" size="2"><b><%Response.write kayitno & " - " %></b></font>
</td>
</tr>
<tr>
<td width="75%"><font color="#800000"><b><%Response.write rst("Comments")%></b></font>
</td>
</tr>
<tr>
<td width="100%"><%Response.write rst("FirstName") & " " & rst("LastName") %>
</td>
</tr>
<tr>
<td width="100%"> <%
if rst("Phone")<>"none" then
Response.write "Web Site: "
Response.write "<a href='http://"&rst("Phone")&"' target='_blank'>"& rst("Phone")&"</a>, "
end if
if rst("Email")<>"none" then
264

Response.write "Email: "


Response.write "<a href='mailto:"&rst("Email")&"'>"& rst("Email")&"</a>, "
end if
Response.write "Date Entered: "& rst("DateEntered")
%> </td>
</tr>
<tr>
<td width="100%">
<hr noshade>
</td>
</tr>
<%
rst.MoveNext
loop
'clean up
rst.Close
set rst = Nothing
%>
<tr>
<td valign="baseline" colspan="3" width="100%">
<p align="left">&nbsp;</p>
</td>
</tr>
</table>
<font face="Arial, Helvetica, sans-serif" size="2">
<a href="http://www.yunus.projesi.com">Return to Homepage</a>
</div>
<font size="2">&nbsp; </font>
</body msnavigation>
</HTML>

Kay×t silme k×sm× “delete.asp” :

<% Response.Buffer = True


Response.Expires = 0 %>
<html>
<head>
<title>Menu</title>
<style type="text/css">
<!--
body,td,th {
font-family: Arial, Helvetica, sans-serif;
}
.style32 {font-size: small}
.style33 {
font-size: x-small;
font-weight: bold;
}
.style34 {font-size: x-small}
.style35 {font-size: 12px}
-->
</style>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-9"></head>

<body bgcolor="#FFFFFF" text="#FF0000">


<span class="style5"><font size="2">
<%

veritabani = "Driver={Microsoft Access Driver (*.mdb)}; dbq=" & server.mappath("db/guestbook.mdb")


set bag = Server.CreateObject("adodb.connection")
set ks = Server.CreateObject("adodb.recordset")

%>
<%
'######################################################################
265

dogruparola = "12345678" ' Kendiniz yeni bir parola belirleyiniz.CHOOSE PASSWORD


'######################################################################

If request("parola") = dogruparola or session("parola") = dogruparola then


If request("islem") = "Ana" then
Call Ana
session("parola") = dogruparola
Elseif request("islem") = "Yeni_Link" then
Call Yeni_Link
session("parola") = dogruparola
Elseif request("islem") = "Link_Duzenle" then
Call Link_Duzenle
session("parola") = dogruparola
Elseif request("islem") = "Link_Sil" then
Call Link_Sil
session("parola") = dogruparola
Elseif request("islem") = "KayitSil" then
Call KayitSil
session("parola") = dogruparola
Elseif request("islem") = "KayitEkle" then
Call KayitEkle
session("parola") = dogruparola
Elseif request("islem") = "DuzenleKaydet" then
Call DuzenleKaydet
session("parola") = dogruparola
Elseif request("islem") = "cikis" then
session("parola") = ""
response.redirect (Request.ServerVariables("HTTP_REFERER"))
Elseif request("islem") = "Link_DuzenleAna" then
Call Link_DuzenleAna
session("parola") = dogruparola
Else
Call Ana
session("parola") = dogruparola
End If
Else
Call Parola
End If

%>
<%
'=================================================
%>
<% SUB Ana %>
<!-- Ana Menü -->
</font>
</span>
<table border="0" width="141" cellpadding="0" cellspacing="0" align="center">
<tr bgcolor="#DFDFFF">
<th width="141"><div align="center"><span class="style7"> Menu</span></div></th>
</tr>
<tr bgcolor="#FFFFCA">
<td> <div align="left">
<ul>
<li><span class="style9"><font size="2"><a href="?islem=Link_Sil" title="Record
delete">DELETE</a></font></span></li>
</ul>
</div></td>
</tr>
<tr bgcolor="#FFFFCA">
<td> <div align="left">
<ul>
<li><span class="style11"><font size="2"><a href="?islem=Yeni_Link" title="New record">ADD</a></font> </span></li>
</ul>
</div></td>
</tr>
266

<tr bgcolor="#FFFFCA">
<td><div align="left">
<ul>
<li>
<span class="style13"><font size="2"><a href="?islem=Link_Duzenle" title="Update a
record">UPDATE</a></font></span></li>
</ul>
</div></td>
</tr>
<tr bgcolor="#FFFFCA">
<td><div align="center"></div></td>
</tr>
<tr bgcolor="#FFFFCA">
<td><div align="center"><span class="style17"><a href="?islem=cikis" title="Quit">Logout</a></span></div></td>
</tr>
</table>
<span class="style18"><font size="2">
<!-- Ana Menü -->
<% END SUB ' Ana %>
<%
'=================================================
%>
<%
SUB Parola
%>
<!-- Parola -->
</font>
</span>
<p align="center">
<form action="delete.asp" method=post name="yeni"><span class="style20">
<font size="2">
<input type="password" name="parola">
<input type="submit" value="Enter">
</font>
</span></form>
<span class="style21"><font size="2">
<!-- Parola -->
<%
END SUB ' Parola
%>
<%
SUB Link_Sil
%>
<!-- site_name Sil-->
<%
bag.open veritabani
sql = "select * from tblContacts order by DateEntered"
set kayitlar = bag.execute(sql)
%>
</font>
</span>
<form action="delete.asp" method="post" name="silmeFormu" id="silmeFormu">
<span class="style22"><font size="2">
<input type="hidden" name="islem" value="KayitSil">
</font>
</span>
<hr noshade color=black>
<span class="style22"><br>
<span class="style33">Delete Record
</span></span>
<table align="center">
<% do while not kayitlar.eof %>
<tr bgcolor="#FFFFCA">
<td class="style32">
<input name="<%=kayitlar("ContactID")%>" type="checkbox" value="sil">
</td>
267

<td class="style35">
<%=kayitlar("ContactID")%>) <%=Left(kayitlar("FirstName"),250)%>
, <%=Left(kayitlar("LastName"),250)%>
, <%=Left(kayitlar("Phone"),250)%>
, <%=Left(kayitlar("Email"),250)%>
, <%=Left(kayitlar("DateEntered"),250)%>
,
<%if kayitlar("Type")=1 then %>
GB
<% end if
if kayitlar("Type")=2 then %>
ST
<% end if
if kayitlar("Type")=3 then %>
PR
<% end if %>
</td>
</tr>
<%
kayitlar.movenext
loop
%>
<tr>
<td colspan=2 align=center class="style32">

<input name="" type="submit" onClick="alert('Process done');" VALUE="Delete">


</td>
</tr>
</table>
<span class="style32"><br>
<span class="style34">*GB: guestbook entry, ST: site entry, PR: program entry</span></span>
<hr noshade color=black>
</form>
<p align=center><span class="style23"><font size="2"><a href="?islem=Ana">Menu</a> <%
kayitlar.close
set kayitlar = nothing
bag.close
set bag = nothing
%>
<!-- site_name Sil-->
<%
END SUB ' Link_Sil
%>
<%
'=================================================
%>
<%
SUB KayitSil
%>
<!-- Kayyt Sil -->
<%
bag.open veritabani
set ks1 = Server.CreateObject("ADODB.Recordset")
set ks2 = Server.CreateObject("ADODB.Recordset")
sql1 = "Select * from tblContacts"

ks1.open sql1, bag, 0, 1

do while not ks1.eof


sno = ks1("ContactID")
sno = cstr(sno)
if request.form(sno) = "sil" then

sql2 = "delete from tblContacts Where ContactID = " & sno


ks.open sql2, bag, 0, 1
end if
268

ks1.MoveNext
loop

ks1.Close
set ks1 = Nothing
set ks2 = Nothing
bag.close
set bag = Nothing

response.redirect (Request.ServerVariables("HTTP_REFERER"))
%>
<!-- Kayyt Sil -->
<%
END SUB ' KayitSil
%>
<%
'=================================================
%>
<% SUB Yeni_Link %>
</font>
</span><form action="delete.asp" method="post" name="form1yeni">
<table width="100%" border="0" height="44%" align="center">
<tr>
<td>
<p align="left"><span class="style24"><font size="2"> <strong>New Record</strong> <br>
Name <br>
<input type="text" name="FirstName" maxlength="30">
<br>
City<br>
<input type="text" name="LastName" maxlength="30">
<br>
Link(without &quot;http://&quot;)<br>
<input name="Phone" type="text" value="none" size="50" maxlength="100">
<br>
Email<br>
<input type="text" name="Email" value="none" maxlength="50">
<br>
Comment<br>
<textarea name="Comments" rows="5" cols="70"></textarea>
</font> <b><font color="#009999"> <br>
</font></b></span>
<label>
<span class="style35">
<input name="Type" type="radio" value="1" checked>
GuestBook</span></label>
<span class="style35"><br>
<label>
<input type="radio" name="Type" value="2">
Site</label>
<br>
<label>
<input type="radio" name="Type" value="3">
Program</label>
<br>
</span> <span class="style24"><b><font color="#009999">
<input name="Submit" type="submit" onClick="alert('Process started');" value="Add">
</font>|<font color="#009999">
<input type="reset" name="Submit2" value="Reset">
<input type="hidden" name="islem" value="KayitEkle">
</font> </b> </span></p> </td>
</tr>
</table>
</form>
<p align=center><span class="style26"><font size="2"><a href="?islem=Ana">Menu</a> <%
'=================================================
269

%>
<% END SUB ' Yeni_Link %>
<%
'=================================================
%>
<%
SUB KayitEkle
%>
<%
first_name = Request.Form("FirstName")
last_name = Request.Form("LastName")
city_name = Request.Form("Phone")
email_name = Request.Form("Email")
comment_name = Request.Form("Comments")
t_name = Request.Form("Type")
if first_name = "" or last_name = "" or comment_name = "" then
response.write("<p align=center>Empty fields! Press Back button to retry.")
response.end
end if

bag.open veritabani
sql ="Select * from tblContacts"
ks.open sql, bag, 1, 3
ks.AddNew
ks("FirstName") = first_name
ks("LastName") = last_name
ks("Phone") = city_name
ks("Email") = email_name
ks("Comments") = comment_name
ks("Type") = t_name
ks.update
ks.close
set ks = nothing
bag.close
set bag = nothing
response.redirect("?islem=Ana")
%>
<% END SUB ' KayitEkle %>
<%
'=================================================
%>
<% SUB Link_Duzenle %>
<!-- site_name Düzenle -->
</font>
</span><p align="center">
<form action="delete.asp" method="post" name="duzenNo" id="duzenNo"><span class="style28">
<font size="2">
<input type="Hidden" name="islem" value="Link_DuzenleAna">
Record number to edit
<input type="text" name="ContactID" size="4">
<input type="submit" value="Edit">
</font>
</span></form>
<p align=center><span class="style29"><font size="2"><a href="?islem=Ana">Menu</a> <!-- site_name Düzenle -->
<% END SUB ' Link_Duzenle %>
<%
'=================================================
%>
<% SUB link_DuzenleAna %>
<!-- Haber Düzenle Ana -->
<%
sno = Request.Form("ContactID")
%>
<%

bag.open veritabani
270

sql = "Select * from tblContacts Where ContactID= "& sno


set kayitlar = bag.execute (sql)

%>
<% if kayitlar.eof then
response.write("<tr><td>Not found!</td></tr>")
else
%>
</font>
</span><form action="delete.asp" method="post" name="formDuzenle" id="formDuzenle">
<tr>
<td valign="top"><span class="style30"><font size="2"><b> Editing
Record Number</b> <%=kayitlar("ContactID")%><br>
Name<br>
<input type="text" name="FirstName" size="30" value='<%=kayitlar("FirstName") %>'>
<br>
City<br>
<input type="text" name="LastName" size="30" value='<%=kayitlar("LastName") %>'>
<br>
Link(without &quot;http://&quot;)<br>
<input name="Phone" type="text" value='<%=kayitlar("Phone") %>' size="50" maxlength="100">
<br>
Email<br>
<input type="text" name="Email" value='<%=kayitlar("Email") %>' maxlength="50">
<br>
Comment <br>
<textarea name="Comments" rows="5" cols="70"><%=kayitlar("Comments")%></textarea>
<br>
<label><span class="style35">
<input name="Type" type="radio" value="1"
<% if kayitlar("Type")=1 then response.Write("checked") %>
>
GuestBook</span></label>
<span class="style35"><br>
<input type="radio" name="Type" value="2" <% if kayitlar("Type")=2 then response.Write("checked") %>
>
Site <br>
<label>
<input type="radio" name="Type" value="3"
<% if kayitlar("Type")=3 then response.Write("checked") %>
>
Program</label>
<br>
</span> <input type="hidden" name="sno" Value="<%=kayitlar("ContactID")%>">
<input type="hidden" name="islem" value="DuzenleKaydet">
<input type="Submit" Value="Update" onClick="alert('Process done');">
</font>|<font size="2">
<input type="Reset" Value="Reset">
</font></span></td>
</tr>
<span class="style30">
</table>
</span>
</form>
<p align=center><span class="style31"><font size="2"><a href="?islem=Ana">Menu</a>
<%
bag.close
set bag = nothing
%>
<% end if %>
<!-- HaberDüzenleAna -->
<% END SUB ' HaberDuzenleAna
'------------------------------------------------------------------------------------------------
%>

<% SUB DuzenleKaydet %>


271

<!-- DÜzenle Kaydet -->


<%
first_name = Request.Form("FirstName")
last_name = Request.Form("LastName")
city_name = Request.Form("Phone")
email_name = Request.Form("Email")
comment_name = Request.Form("Comments")
t_name = Request.Form("Type")
sno = Request.Form("sno")
%>
<%
bag.open veritabani
sql ="Select * from tblContacts Where ContactID= " & sno
ks.open sql, bag, 1, 3
ks("FirstName") = first_name
ks("LastName") = last_name
ks("Phone") = city_name
ks("Email") = email_name
ks("Comments") = comment_name
ks("Type") = t_name
ks.update
ks.close
set ks = nothing
bag.close
set bag = nothing
response.redirect("delete.asp?islem=Ana")
%>
<!-- DÜzenle Kaydet -->
<% END SUB 'DuzenleKaydet %>
<%
'=================================================
%>
</font>
</span>
</body>
</html>

delete.asp iŒinde silme, gžncelleme, ekleme iĢlemleri var. GuestBook.asp‟de kay×t yap×lmadan ™nce tžm
alanlar×n doldurulup doldurulmad×ğ× kontrol ediliyor ve kullan×c×n×n yorum gibi k×s×mlara HTML kodlar× girilmesi
gžvenlik amac× ile engelleniyor. Ekrana kay×t numaralar× ile birlikte tžm kay×tlar geliyor. Ġsterseniz SQL * komutlar×n×
kullanarak kay×t s×ralama, kay×t silme, say×sal veriler girilip onlar×n ortalamas× veya minimum, maksimum gibi
istatistiklerin tutulmas×n×, ayr×ca kay×tl× kullan×c× oluĢturup onlar×n login veya logon ile sitenize girmeleri gibi hoĢ
™zellikler yapabilirsiniz. E-mail listesi tutma da buna benzer yap×labilir. Daha Œok gžvenlik gerektiren (kredi kartlar×
bilgileri, e-ticaret gibi) alanlarda da SHTML – Secure HTML (Gžvenli Yuva Katman× veya SSL) kodlamas×n× ™ğrenmenizi
tavsiye ederim.

JavaScript ™rneklerimizdeki tžm iĢlemleri *.asp olarak VBScript kodlama ile de yapabiliriz. “Ornekler\Diger
\ASP\extra” dizininde Dr. Hakk× „cal‟×n Œal×Ģmalar×n× g™rebilirsiniz. „rneğin bilgisayar×m×zdaki sžržcž listesini almak
hemen hemen ayn×:

<% Option Explicit %>


<HTML><HEAD><TITLE>ASP Listeleme Örneği</TITLE></HEAD><BODY>
<%Dim DosyaSistemi, Surucu, Suruculer
Set DosyaSistemi = CreateObject("Scripting.FileSystemObject")
Set Suruculer = DosyaSistemi.Drives
For Each Surucu In Suruculer%>
<b>Sürücü:</b> <%=Surucu.DriveLetter%><br>
<% If Surucu.IsReady = True Then%><b>Disk Adı:</b> <%=Surucu.VolumeName%><br>
<b>BoĢ alan:</b> <%=Surucu.FreeSpace%><br><% Else %>
<i>Sürücü hazır değil!</i><br>
<% End If
Next %>
</BODY> </HTML>

*
Ek 2 – SQL k×sm×na bak×n×z.
272

13. Yunus Programlama Dili (Türkçe açık kaynak programlama projesi)


(Ornekler\Diger\Yunus\Yunus.exe)

Nihayet Nisan 2004 tarihinde kendi projemi de kitaba ekliyorum. ġu anki son sžržmž 2.8 olan ve Delphi 6 ile
oluĢturduğum proje asl×nda bu kitab×n bir sonucu da diyebiliriz. Aral×k 2001‟den bu yana, renkli kod desteği veren
MemoX nesnesi d×Ģ×nda kendi emeğimiz ile birĢeyler yapmaya Œal×Ģ×yoruz. Bu bebek ile kan×tlamak istediğim, 1 MB
boyut bile bulmayan kžŒžk bir iĢlevsel programlama dili yap×labileceğidir. Multimedya ve veritaban× gibi gžzel
™zellikleri daha kolay ve kullan×Ģl× bir Ģekilde biraraya getiriyoruz. Fakat eksikleri daha var ve asl×nda bitmiĢ bir sžržm
değil. Balinalar ile yar×Ģabilmesi iŒin sadece benim değil, bir Œok insan×n ilgilenmesine Œabal×yorum. „zellikle birŒok
programlama sitesine žye olarak tan×t×m yap×yorum. Hala tam istediğim gibi bir seviyede destek bulamad×m.

Resim 17a – Yunus 2.8‟in aŒ×l×Ģ g™ržntžsž

Yunus ismi Delphi‟den geliyor. Delphi, dolphin yani yunus‟a benzediğinden bu ad× verdim. Dolphin diye bir
mžzik program×m da var ve benimle ilgisi olmayan delphi-dolphin.com diye bir programlama sitesi de var. „zellikle
delphiturk.com sitesinde yard×m isteğim yan×ts×z kald×.

Programlama kod diline de SoleBee ad×n× verdim. SoleBee‟yi asl×nda modžler yapma džĢžncem var. Yani
istenen program iŒinde program yapabilme eklentisi yeteneği verilebilir.

Yunus‟un daha geliĢtirilmiĢ hali olarak da BlueDream projem de var, fakat birŒok nesnenin biraraya gelmesi ile
yapt×ğ×m iŒin, devam× Œok zor g™zžkžyor. žnkž Mart 2003 tarihinden itibaren baĢlad×ğ×mdan bu yana Shareware
Greatis Form Designer‟×n daha yenisini yapt×lar ve bu sžržmžnž eklemek iŒin uğraĢt×ğ×mda uyumsuzluklarla
karĢ×laĢt×m. Yunus ise tamamen benim yazd×ğ×m kodlarla meydana geldiği iŒin gžncellemem daha kolay olabilir. BD
iŒinde Œok uğraĢt×ğ×m 3 boyut džzenleme penceresi ve nesne ™zellikleri pencereleri art×k Yunus iŒinde de olabilir.
Ayr×ca yazd×rma k×sm× BD‟de Œok daha ileri seviyede.

Microsoft‟un .NET teknolojisi hakk×nda o zamanlar (2001 y×l×) hiŒbir bilgim olmad×ğ× halde benzer bir proje ile
uğraĢm×Ģ×z. Tabii ki onlar×n web entegrasyonu (*.aspx), PC yani kiĢisel bilgisayar d×Ģ×nda baĢka yerlerde de Œal×Ģabilme
(cep telefonu, palmtop – avuŒiŒi bilgisayarlar) ™zelliklerine g×pta etmekten baĢka yapabileceğimiz yok. Delphi.NET
yani Delphi 9 sžržmžnde rahatl×la Yunus 3.1‟i aŒ×p, Œal×Ģt×r×yoruz. Sadece Qreport art×k bulunmad×ğ×ndan sorun Œ×ksa
da SynEdit nesnesi bizi kurtar×yor. Yani hala kodlar× yaz×c× ile Œ×kt× alabiliyoruz.
273

Gelecek sžržmlerde HTML, PHP veya ASP Œ×k×Ģ× ile internet, SQL desteği, OpenGL ile 3 boyutlu tasar×m, daha
geliĢmiĢ veritaban×, daha fazla nesne ve daha fazla nesne ™zelliği de olacak. Yazd×rma, kodlama, kod tamamlama da
yeniden g™zden geŒirilecek.

oğunlukla Visual Basic benzeri kodlama sistemimiz var. Asl×nda hoĢuma giden Pascal ve C++ komutlar× da
ekledim. SonuŒta TžrkŒe veya baĢka bir dilde ™zelleĢtirilebilen basit bir eğitim amaŒl× script dilimiz var.
Examples klas™rž iŒindeki ™rnekleri inceleyerek genel kullan×m hakk×nda bilgi alabilirsiniz.

BirkaΠipucu:
# DeğiĢken tžrleri ve tan×mlanmas× yoktur. Tžm değiĢkenler globaldir. DeğiĢken adlar×nda say× ile baĢlamak ve ™zel
karakter kullanmak, boĢluk b×rakmak sorun Œ×karmasa da tavsiye edilmez. Kullan×c× hatay× bilerek oluĢturduğu kabul
ediliyor.
# Say× (tamsay× ve gerŒek), metin ve mant×ksal (True - Evet, False - Hayir) kendiliğinden d™nžĢtžržlžyor. 1E3 rakam×
1000 anlam×nda kullan×labilir. GerŒek say×larda "," virgžl ile ondal×k basamak ayr×labilir.
# "=" ile atama ve karĢ×laĢt×rma, sat×r sonlar×nda ";" yoktur. Ayn× sat×ra ";" kullanarak daha Œok komut yazmay×
džĢžnžyorum.
# "+", "-", "*", "/", "&" (metin birleĢtirme), "^" (exp - žs alma), “\” (div - tam b™lžm), "%" (mod - kalan), "@"
(mant×ksal ve), "~" (mant×ksal veya) hesaplama bağlac×d×r. ĠŒiŒe hesap ve parantez kullan×labiliyor.
# DeğiĢken ve nesne ™zelliklerinden sonra "++" ve "--" ile art×m eksiltme yap×labilir. a++ gibi, fakat Ģimdilik ++a
yoktur. a++ deyimi a=a+1'den biraz h×zl× iĢler.
# BirleĢtirici hesaplamalar a+=2 (eĢiti a=a+2) gibi tžm iĢlemler (+, -, *, /, ^, %, &, \, @, ~) iŒin kullan×labilir. a+ =1
gibi operat™r ve eĢittir aras×na boĢluk b×rakmay×n×z.
# Hesap y™nž soldan sağad×r. arpma ve b™lme ™nceliği yoktur. Bu gibi durumlarda parantez kullan×labilir.
a=5+6*3-2 ==> a=21 //normalde; * (Œarpma) ™nce yap×l×r, sonra da kalan yap×l×r.
a=5+6*3-2 ==> a=31 //Yunus'da; 5+6, sonra 11*3, sonra 33-2... parantez ile a=5+(6*3)-2 as×l sonuŒ Œ×kt×ğ×
g™ržlebilir.
# sin(gerŒek), cos(gerŒek), random(tamsay×), int(gerŒek), not(mant×ksal), len(metin), lower(metin), upper(metin),
chr(tamsay×), asc(karakter), delete(metin, ilk, miktar), mid(metin, ilk, miktar), pos(metin, karakter), and(tamsay×,
tamsay×), or(tamsay×, tamsay×), xor(tamsay×, tamsay×), shr(tamsay×, miktar), shl(tamsay×, miktar), time() ve date()
fonksiyonlar×n× kod k×sm×nda kullanabilirsiniz. Bu komutlar× ™zelleĢtirme penceresinde bulamazs×n×z.
# Metinleri " iĢareti iŒine almak gerekebilir. Mant×ksal değer olan “Evet” ve “Hayir” Œift t×rnak iŒine al×nmal×d×r.
# Bžyžk kžŒžk harf ayr×m× yoktur. Komutlar, nesne ™zellikleri ve değiĢkenler istenilen bžyžklžkte kar×Ģ×k yaz×labilir.
# Eger komutu tek veya Œok Ģartl× olarak kullan×labilir. ġart k×sm×nda AND iŒin "@" ve OR iŒin de "~" gibi bağlaŒlar×
destekliyor.
# Eger komutunda "=" ">" "<" "<>" "<=" ">=" kullan×labilir. ĠŒiŒe Eger (Degilse) kullan×m× sorun Œ×karmaz.
# eEger Ģart, dogruSatir, yanlisSatir VB dilindeki iif gibidir. ĠŒ k×s×mlarda bloklu komutlar kullan×lamaz.
# Donder degiskenAdi=BaslangicDegeri, BitisDegeri, Artim Ģeklinde iŒiŒe kullanabileceğimiz d™ngž komutumuz var.
# iken ġart Ģeklinde sonuŒ "Yanl×Ģ" olana dek d™nen komut vard×r. ikenBitti ile de bittiği belirtilir.
# Kullan×c× kendi Fonksiyon'unu tan×mlanabiliyor.
# "//" aŒ×klama sat×r× yapar. Sat×r iŒi aŒ×klama sat×r× yap×labiliyor.
# Etiket tan×mlamas× ile istenen sat×ra Git komutu ile dallanabilme imkan× vard×r.
# Deyimler aras×na boĢluk ve TAB yap×labilir. Fakat Git komutunun etiketi ":" ile bitiĢik olmas× gereklidir.
# Yuzey komutu ile form žzerine metin, cizgi, nokta, dikdortgen (kare), daire (elips), poligon yap×labilir. Fakat form
žzerinden bir Ģeyler geŒtiğinde silindiğini g™rebilirsiniz. Tazele komutu ile de formu temizleyebilirsiniz.
# sesCal dosyaadi ile *.wav mžzik dosyalar× Œal×nabilir. *.mp3 Œal×Ģm×yor.
# Tablo nesnesi ile *.xml (Extensible Markup Language) ve *.cds (Client Data Set) dosyalar×na eriĢip basit kay×tlar
oluĢturabilirsiniz. ġimdilik SQL (Structured Query Language) ve tablo tasar×m penceresi (k×sayolu: Ctrl+D) bitmedi.
# ExcelTablosu nesnesi ile Excel dosyalar×na ulaĢabilir, istenen hžcrenin değeri al×nabilir, değiĢtirilebilir, sonrada
kaydedilebilir. Yeni dosya oluĢturma yoktur.
# BenchmarkStart ve BenchmarkEnd kodlar× aras× milisaniye olarak h×z ™lŒžmž verir. SonuŒ Hata Penceresi'ne eklenir.
# komut tekSatirKomut ile Yunus'un tek satirlik kendi komutlar×n× kullanabilirsiniz. Mesela;
komut a=1
# inport(adres) ve outport(adres, byteDeger) donan×m olarak port kullan×m× iŒindir. „rneğin 888 (378 onalt×l×k) adresi
yaz×c×n×n veri portu olarak kullan×l×r. BaĢka portlar bilgisayar× kilitleyebilir.
# AĢağ×daki listede baz× nesnelere atanabilen olay adlar× vard×r. Form ilk aŒ×l×Ģ ayarlar× iŒin “Yuklenince - OnLoad”,
kapanirken de "Kapanirken - OnClose" olaylar× oluĢturulabilir.

Nesne Yunus'daki olaylar Delphi'deki olay eşdeğeri


Yuklenince OnShow
Form
Kapanirken OnClose
274

Etiket Tiklaninca OnClick


YaziKutusu Tiklaninca OnChange
Dugme Tiklaninca OnClick
OnayKutusu Tiklaninca OnClick
AcilirKutu Tiklaninca OnChange
YaziKutusu Tiklaninca OnChange
ListeKutusu Tiklaninca OnClick
Zamanlayici Tiklaninca OnTimer

# Komutlar× değiĢken ad× olarak kullanmamaya dikkat ediniz. Mesela Git, Donder, bitti ™zel kelimelerdir.
# Proje ad× olarak "yeni" kelimesi kullanmay×n×z.

Hedeflenenler:
# Case komutu
# Nesne oluĢturma
# Daha iyi nesne seŒimi ve nesne boyutland×rma
# Nesne ve değiĢken dizileri
# Tam olarak Œal×Ģan birden fazla form kullanma
# Daha geniĢ Yard×m konular×
# EXE ve HTML oluĢtururken tžm nesnelerin komutlar× ile birlikte Œal×Ģabilmeleri

Yunus.exe tek baĢ×na Œal×Ģsa da, ayn× klas™rde midas.dll (XML desteği iŒin), zlportio.sys (Windows NT ve žstž
iŒin port kullan×m×), yunus.chm (Yard×m dosyas×), *.exe oluĢturmas× iŒin gerekli Kalip klas™rž olmal×, ve kod d™kžmž
iŒin bir yaz×c× tan×t×lm×Ģ olmas× daha iyi olur. Kopyalanan nesneler “~kopya.txt” ad×nda kaydediliyor. Bu sayede
bilgisayar× kapatsak da kopya nesneler sakl× kal×yor. Ayarlar Windows kay×t defterinde değil, *.ini dosya yap×s×nda
“varsayilan.ayar” dosyas×nda saklan×yor. *.proje dosya uzant×s× desteği ilk Œal×Ģt×rmada oluĢturulur, istenirse
“Dosya*SeŒenekler…”den silinebilir. Yani sisteme en az yžk ve yer kaplamas× ile Œal×Ģabiliyoruz. Her ne kadar 700KB
olsa da haf×zada 10MB gibi bir alan kapl×yor. BD ise 17MB kapl×yor.

Maalesef menž yabanc× dil desteği iŒin “menu.rc” dosyas× yapm×Ģ×z. Bu yžzden de isteyen kendi žlkesinin dil
Œevrimini yapmak isterse, Delphi‟nin kurulu olmas× ve Yunus‟un tekrar derlenmesi gerekiyor. Tasarim klas™ržnde
derle.bat dosyas×, brcc32.exe kullanarak menž değerleri *.res yani resource – kaynak haline getiriliyor.

ASPack denen baĢka bir shareware program ile de yunus.exe s×k×Ģt×r×l×p žŒte bir kžŒžlmesi sağlan×yor. Bunu
ssadece Borland dosyalar× iŒin kullanabilirsiniz. Visual Basic ile yap×lan exe dosyalar× s×k×Ģt×rm×yor.

YaklaĢ×k 70 adet komutun “Proje*Komutlar” menžsžnden ™zelleĢtirilmesi ise Ġngilizce ve TžrkŒe dilleri iŒin
yapt×ğ×m bir yenilik. Fakat ™zelleĢtirilince eski programlar istenen Ģekilde Œal×Ģmayabilir. Bir Frans×z komutlar× kendi
diline Œevirse bile “varsayilan.ayar” dosyas×n× da diğer insanlara vermesi gerekiyor. Bu sebeple bayağ× bir kargaĢa
Œ×kabilir. Eski ayarlara istediğimiz zaman geŒsek de pek faydas× olmayan ve kodlar×n yavaĢlamas×na sebep olan bir
seŒenek. Hem de kopyalanan ve kesilen nesneler tam olarak sadece dili ayn× olan projeye yap×Ģt×r×labiliyor.

Kod renklendirme ve yaz×tipi ™zelleĢtirebilme de yap×labilir. Her projenin ayar× farkl× olabilir ve “projead×.ayar”
ad× ile saklan×r. Burada da en Œok karĢ×laĢ×lan sorun, yaz×tipinin baĢka bilgisayarda bulunmamas× halinde kodlar×n
okunakl× olmamas× oluyor. Ġlle de projeadi.proje aŒ×lmas×na gerek yok, “Dosya*AŒ”da projeadi.dfm de seŒilse dosya
adlar× ayn× olduğu iŒin proje aŒ×l×r. Birden fazla form kayd×n× daha yapamad×ğ×m iŒin bir sorun yok.

ok karmaĢ×k gibi g™zžktž biliyorum, asl×nda diğer profesy™nel uygulamalara g™re Œok basit say×labilir.
Derleme imkan× da olsayd×, script demekten vazgerdim. Internet Explorer nas×l metin tabanl× *.html dosyalar×
Œal×Ģt×r×yorsa, Yunus da *.proje dosyalar×n× Œal×Ģt×r×yor. *.exe oluĢmad×ğ× iŒin minicik programlar yap×yoruz. Bu tžr
programlama dillerinin bir avantaj× da sadece yorumlama program× gžncellenerek projelerin Œal×Ģmalar× daha
iyileĢtirilebiliyor. Eğer daha h×zl× Œal×Ģan algoritmalar yapabilirsek, uzun sžren (d™ngžler gibi) iĢlemler daha Œabuk
bitirilebilir.

Tek tek menžleri ve komutlar× anlatmak zor, onun yerine ™rneklerden baz×lar×n× anlatal×m. Mesela
YatayAtisProblemi.proje (Ġngilizce menž ve kod) ve hesapmak.proje (TžrkŒe menž ve kod).

Yatay at×Ģ fizik dersinden bildiğimiz bir problemdir. Buradan yola Œ×karak basit bir oyun yapt×k. AŒ× ve h×z
değiĢtirilerek hedef vurulmaya Œal×Ģ×l×yor. x ve y koordinatlar× Ģu formžllerle bulunuyor:

x= Vo*cos(α)*t
275

y= Vo*sin(α)*t – ´*g*t2 g=10 kabul edilirse y=Vo.sin(α)t-5t2 de diyebiliriz.

Resim 17b – Yunus ile yap×lm×Ģ iki ™rnek: YatayAtisProblemi ve hesapmak

Counter-Strike oyunundan ald×ğ×m ses dosyalar×n× belli anlarda Œal×yoruz. Eğer klas™r doğru belirtilmezse
sesler ve kale resmi olmadan yine program Œal×Ģ×yor. Ya da Ģ™yle diyelim, herhangi bir sat×rda bir hata oluĢtuğunda
tžm program×n kapanmas× yerine sadece o sat×r iĢlenmiyor, program Œal×Ģmaya devam ediyor. Hangi sat×rda hata
olduğunu hata penceresinden (F6 k×sayolu ile) bakabilirsiniz. Pek geliĢmiĢ bir hata aŒ×klamas× yok. Hata penceresinde
ayr×ca Benchmark yani h×z test sonuŒlar×da g™ržntžlenebiliyor. Kod bloğunun kaŒ milisaniyede Œal×Ģt×ğ×n× g™rebiliriz.
Ses Œalmayla ilgili s™yleyebileceğim diğer Ģeyler de ayn× anda birden fazla ses Œal×namad×ğ× ve peĢpeĢe ses Œal×nmaya
Œal×Ģ×ld×ğ×nda da ™nceki sesin kapat×ld×ğ×d×r. *.wav d×Ģ×ndaki diğer mžzik ve ses dosyalar× desteklenmiyor.

Bu ™rnekte program durdurulsa da “Persistent Variables – Kal×c× DeğiĢkenler” seŒeneği seŒildiğinden, aŒ× ve h×z
bir sonraki Œal×Ģt×rmada da kal×yor. Eğer program kaydedilirse daha sonraki Yunus Œal×Ģt×r×lmas×nda da ayn× yerden
devam edilebiliyor. DeğiĢkenler penceresinde değiĢkenlere sağ t×klay×p sil, ekle, değiĢtir gibi seŒeneklere ulaĢabiliriz.
Bu pencerede diğer dillerdeki “Watch – G™zetle” imkan× kendiliğinden haz×r olduğu g™ržlebilir. Arkaplanda neler olduğu
daha belirgin. Ayn× isimde değiĢken eklense de ilk bulunan aktif değiĢken olur. ĠŒinde boĢluk ve diğer baz× ™zel
karakterler geŒen değiĢkenler de kabul ediliyor.

Program hatas× veya Yunus‟un kendi hatalar× “Exceptions – Ġstisnalar” penceresinde tutuluyor. Sadece
bilgilendirme amac× ile yap×lm×Ģt×r. BD‟de de bunlar× “error.log” diye bir dosyaya saklamay× tercih ettim. Ama ™lžmcžl
hatalarda (sabit diskin bozulmas× gibi) bu kay×tlar bile tutulamadan ana program kapan×yor.

ift t×rnaklar iŒine yaz×lanlar metin olarak alg×lansa da ilk baĢlarda iŒinde =, +, / gibi iĢleŒler iŒiren kelimelerde
onlar da Œal×Ģt×r×lmaya Œal×Ģ×ld×ğ× iŒin, zorlanm×Ģt×m. message "x=0" komutu maalesef ekrana x=0 mesaj× Œ×karm×yor. =
276

yerine : kullanabilirsiniz. AĢağ×da g™ržldžğž gibi mesela “KaŒan =”&kacan gibi kullan×m art×k sorunsuz. Hatta “”
kullan×lmadan da atama yap×labiliyor. Ama o zaman da iŒinde =, + geŒiyorsa hatal× bir kullan×m olur. “True – Evet” ve
“False – Hayir” Œift t×rnak iŒine al×nmazsa değiĢken zannedilebilir.

Mant×ksal iĢlemler ile bitsel iĢlemlerin and ve or‟lar× birbirine kar×Ģt×r×labiliyor. If ve while komutlar×n×n
karĢlaĢt×rma deyimlerinde @ ve ~ kullan×l×rken, iki tamsay×n×n bitsel olarak ve‟lenmesi and(sayi1,sayi1) ile oluyor.
KarĢ×laĢt×rma gibi iĢlemlerde True ve False yerine 1 ve 0 kullan×l×yor. Nesnelerin ™zelliklerini değiĢtirirken de True ve
False kullan×l×yor. Asl×nda ortak bir arabirim olabilirdi.

Sinžs ve kosinžs al×n×rken radyan değil doğrudan aŒ× değeri kullan×l×yor. BirŒok dilde dereceden radyana
Œevrim yapmak zorunda kal×yorduk.

Yapt×ğ×m×z projeyi Delphi‟nin komut sat×r× yorumlay×c×s× dcc32.exe ile *.exe yapmaya Œal×Ģt×m. “Kalip”
klas™ržndeki dosyalar× temel alarak exe dosya oluĢuyor. Komutlar× tekrar SoleBee‟den Pascal‟a Œevirme bitmese de,
en az×ndan form oluĢuyor. BaĢka bir dile Œevirmek gereksiz gibi de g™ržlebilir. žnkž zaten isteyen istediği program× o
dilde yapabilir. Ayn× Ģekilde HTML Œ×kt×da da komutlar JavaScript veya VBScript‟e d™nžĢtžržlemiyor, ama g™ržnžm,
neredeyse yžzde 95 gibi, as×l tasarlad×ğ×m×za benziyor. Ġlk ad×mlar×m×z umut verici. Bunlara ek olarak da VB, VC ,ASP
ve PHP d™nžĢžmleri de olabilir. D×Ģardan Yunus‟a exe ve html alma daha yok. Etrafta buna benzer bir Ģey hiŒ
g™rmedim zaten. ResHacker gibi programlar formlar× filan okuyabilse de normal dilin kodlar×na eriĢim hiŒbir yerde yok.
Disassembler (makine dilini g™steren) programlar× bu iĢi g™ržyor galiba. Bu iĢlerden ™nce nas×l exe dosya yap×l×yor
bunu keĢfetmek gerekiyor.

Diğer programlama dillerinden farkl× olarak “calistir komut” ile kendi SoleBee kodunu Œal×Ģt×rabiliriz. ok
sat×rdan oluĢan for, if, while, goto Œal×Ģt×r×lamaz. Eğer Yunus ile Yunus‟a benzer bir programlama dili yapabilirsek bu
son sžržm olacakt×r herhalde.

Bir tžrlž yapamad×ğ×m diğer ™zellik de, daha fazla form ekleyebilme. Form oluĢturma kolay olsa da, kod
ekleme bžyžk problem. Kod ve formlar× kaydederken, isimleri ne olacak, her form iŒin ayr× bir Yunus mu Œal×Ģacak,
karara varamad×m. Proje y™neticisi gibi bir ekleme silme penceresi olmal×. Ana form hangisi olacak, ilk aŒ×l×Ģta kimler
g™zžkecek…

Ġlk aŒ×l×Ģ ekran×n× basit tutmaya Œal×Ģt×ğ×m iŒin, tek pencerede ana menž, araŒ Œubuklar×, ™zellikler, olaylar
birleĢtirilmiĢ halde. Ama yeni eklentiler oldukŒa nereye nas×l daha fazla s×k×Ģt×r×r×z, zor olacak gibi. Visual Studio
.NET‟in burada hoĢ bir ™zelliği var; alt pencereler otomatik gizlenebiliyor ve fare žzerlerine gelince ortaya Œ×k×yorlar.
Eğer fazlaca kullan×lan bir pencereniz varsa, Toolbox gibi, baĢl×k Œubuğundaki raptiyeye basarak sabitleyebilirsiniz.
Macromedia FlashMX 2004‟de de katlanan pencereler var fakat DotNET en kullan×Ģl× arabirime sahip. Ġlk kez bu
programlar× kullanan birisi bu kadar Œok pencere aras×nda kafas× kar×Ģabiliyor. Yunus ve BlueDream‟da genellikle
Delphi benzeri bir g™ržnžm var. Yine de bu programlar× taklit amaŒl× olmamaya gayret ettim.

S×k kullan×lan baz× Delphi kodlar×n× da prosedžr haline getirip, Yunus iŒinde komut olarak ekleyebiliriz. „rneğin
internetten yani TCP/IP kullanarak baĢka bilgisayara bilgi yollama komutu ekleyebilirsiniz. netbaglan, netDosyaYolla,
netMesajYolla gibi… Daha uŒuk kaŒ×k fikirler de olabilir. Mesela kablosuz eriĢim ile baĢka bir cihaz (telefon) ile veri
al×ĢveriĢi de olabilir. Yunus bu sebeple Delphi‟nin makro program× da oluyor. KeĢke kžtžphane veya dosya dahil etme
gibi bir imkan×m×z olsayd×. BaĢkalar×n×n yapt×ğ× gžzel kodlar× kendi program×m×za da ekleyebilirdik. Delphi‟deki “Install
ActiveX” seŒeneği gibi, OCX dosyalar× nesne paletimize de eklememiz profesy™nel bir Œal×Ģma olabilirdi.

Yatay at×Ģ program×n×n kodlar×:

Timer2 OnClick //bu proje ile ilk oyunumuzu yapıyoruz... ucu2=Label1.top+Label1.Height


ilkhiz=Edit3.Caption furdu=""
aci=Edit4.Caption
timer2.Value=Edit1.Caption If ucu1>=Button4.Left
i+=0,35 If ucu2>=Button4.top
x=int(ilkhiz*cos(aci)*i) If Label1.left<=sinir1
y=int(ilkhiz*sin(aci)*i-(5*i*i)) If Label1.top<=sinir2
Label1.Left=x i=0
Label1.Top=250-y Label1.Top=250
Label1.left=20
sinir1=Button4.Left+Button4.Width Button4.Value=klasor&"ROOKW.BMP"
sinir2=Button4.top+Button4.Height skor++
sinir3=Memo1.Left+Memo1.Width Label6.Caption="Skor = "&skor
sinir4=Memo1.top+Memo1.Height Button4.Top=random(280)
ucu1=Label1.Left+Label1.Width Button4.left=random(500)
277

Timer2.Active="false" SON_Sesli:
furdu="true" If furdu="True"
goto iptal playsound klasor&"yes.wav"
Endif endif
Endif If furdu="false"
Endif playsound klasor&"no.wav"
Endif endif
SON_Sessiz:
If ucu1>=sinir3 End
i=0
Label1.Top=250 function Sifirla
Label1.left=20 i=0
furdu="false" ilkhiz=Edit3.Caption
kacan++ aci=Edit4.Caption
Label2.Caption="Kaçan = "&kacan Timer2.Active="false"
Timer2.Active="false" Label1.Top=250
goto iptal Label1.left=20
Endif klasor= "C:\Yunus\Examples\Projects\Yatay\"
If ucu2>=sinir4 Button4.Value=klasor&"ROOKB.BMP"
i=0 end
Label1.Top=250
Label1.left=20 Form OnLoad
furdu="false" sifirla
kacan++ skor=0
Label2.Caption="Kaçan = "&kacan kacan = 0
Timer2.Active="false" Label6.Caption="Skor = 0"
goto iptal Label2.Caption="Kaçan = 0"
Endif Button4.Top=267
If label1.top<=Memo1.Top Button4.Left=491
i=0 iIf Check1.Value="True", playsound klasor&"enter.wav", ""
Label1.Top=250 End
Label1.left=20
furdu="false" Button1 OnClick
kacan++ sifirla
Label2.Caption="Kaçan = "&kacan iIf Check1.Value="True", playsound klasor&"shoot.wav", ""
Timer2.Active="false" Timer2.Active="true"
goto iptal End
Endif
If label1.left<=Memo1.left Button3 OnClick
i=0 edit3.Caption += 1
Label1.Top=250 End
Label1.left=20
furdu="false" Button6 OnClick
kacan++ edit3.Caption -= 1
Label2.Caption="Kaçan = "&kacan End
Timer2.Active="false"
goto iptal Button8 OnClick
Endif edit4.Caption += 1
iptal: End
If Check1.Value="True"
goto SON_Sesli Button7 OnClick
else edit4.Caption -= 1
goto SON_Sessiz End
Endif

Hesap Makinesi program×n×n kodlar×:

Form Yuklenince bitti


Etiket1.baslik=0
a=0 Form kapanirken
b=0 form.ust=eski_ust
islem = "a" form.sol=eski_sol
eski_ust=form.ust bitti
eski_sol=Form.sol
form.ust=200 Dugme17 Tiklaninca
form.sol=400 a=0
278

b=0 Dugme9 Tiklaninca


islem="a" eeger Etiket1.baslik=0,Etiket1.baslik="",
Etiket1.baslik="0" Etiket1.baslik&="7"
bitti bitti
Dugme8 Tiklaninca
Dugme18 Tiklaninca eeger Etiket1.baslik=0,Etiket1.baslik="",
Etiket1.baslik *= -1 Etiket1.baslik&="8"
bitti bitti
Dugme19 Tiklaninca Dugme7 Tiklaninca
uzunluk=len(Etiket1.baslik) eeger Etiket1.baslik=0,Etiket1.baslik="",
eEger Etiket1.baslik&="9"
uzunluk<>1,Etiket1.baslik=delete(Etiket1.baslik,uzunluk,1),Et bitti
iket1.baslik=0 Dugme6 Tiklaninca
bitti eeger Etiket1.baslik=0,Etiket1.baslik="",
Dugme20 Tiklaninca Etiket1.baslik&="0"
Etiket1.baslik=0 bitti
bitti
Dugme21 Tiklaninca Dugme5 Tiklaninca
Etiket1.baslik=1/Etiket1.baslik ara=int(Etiket1.baslik)
bitti eEger ara=Etiket1.baslik,Etiket1.baslik&=",", ""
Dugme22 Tiklaninca bitti
Etiket1.baslik=cos(Etiket1.baslik)
bitti Dugme4 Tiklaninca
Dugme23 Tiklaninca a=Etiket1.baslik
Etiket1.baslik=sin(Etiket1.baslik) islem="a"
bitti Etiket1.baslik="0"
bitti
Dugme15 Tiklaninca Dugme3 Tiklaninca
eeger Etiket1.baslik=0,Etiket1.baslik="", a=Etiket1.baslik
Etiket1.baslik&="1" islem="c"
bitti Etiket1.baslik="0"
Dugme14 Tiklaninca bitti
eeger Etiket1.baslik=0,Etiket1.baslik="", Dugme2 Tiklaninca
Etiket1.baslik&="2" a=Etiket1.baslik
bitti islem="m"
Dugme13 Tiklaninca Etiket1.baslik="0"
eeger Etiket1.baslik=0,Etiket1.baslik="", bitti
Etiket1.baslik&="3" Dugme1 Tiklaninca
bitti a=Etiket1.baslik
Dugme12 Tiklaninca islem="b"
eeger Etiket1.baslik=0,Etiket1.baslik="", Etiket1.baslik="0"
Etiket1.baslik&="4" bitti
bitti
Dugme11 Tiklaninca Dugme16 Tiklaninca
eeger Etiket1.baslik=0,Etiket1.baslik="", b=Etiket1.baslik
Etiket1.baslik&="5" eeger islem="a",Etiket1.baslik=a+b, ""
bitti eeger islem="c",Etiket1.baslik=a-b, ""
Dugme10 Tiklaninca eeger islem="m",Etiket1.baslik=a*b, ""
eeger Etiket1.baslik=0,Etiket1.baslik="", eeger islem="b",Etiket1.baslik=a/b, ""
Etiket1.baslik&="6" bitti
bitti

Her iki ™rnek 100 sat×r× (yaklaĢ×k 2000 Byte) aĢan kod ile yap×lm×Ģ. Bu programlar× Delphi ile yapsayd×k, yine
yaklaĢ×k bu kadar veya daha fazla yazarak elde edebilirdik. „nemli olan daha doğrusu as×l hedefimiz, diğer dillere
žstžnlžk sağlama değil, iĢlerimizi basit yollardan halletmeye Œal×Ģmak. Ġlk kez g™rsel programlama yapan biri iŒin
Yunus rahat ve basit bir programlama ortam×.

BlueDream projem ile ilgili birkaŒ resim de Ģunlard×r:


279

BD ile Yunus kadar Œok program yapma imkan× yok. žnkž SoleBee‟yi burada kullanmad×m. DelphiWebScript
II 1.1 nesnesi ile neredeyse Delphi ile ayn× kod ortam× oluĢturdum. Ama form tasar×m× ile kod birlikte Œal×Ģm×yor. Form
tasar×m× da Greatis Form Designer 3.5 nesnesi ile yap×ld×. Kod renklendirilmesi SynEdit1.1 nesnesi iledir. Language
v1.0 nesnesi ile de Ġngilizce ve TžrkŒe dillerine destek sağlad×m. 3 boyut tasar×m softGL‟den ™rnek al×nd×. Yunus da ise
sadece MemoX ile diğer insanlar×n yapt×ğ× bir nesneyi kullan×rken, BD projesinde internetten yapt×ğ×m uzun
araĢt×rmalar sonunda bulduğum nesne ve kodlar× kulland×m. Pencerelerin hemen hemen hepsinde eksikler ve hiŒ
bitmemiĢ k×s×mlar var. Ama žzerinde Œok uğraĢt×ğ×m k×s×mlar× s×ralamak gerekirse; “Nesne „zellikleri”, “3B Džzenleme
Penceresi”, “Yaz×c× „nizleme” diyebilirim. Genel g™ržnžm ve menžlerin tasar×m× da az da olsa zaman×m× ald×.

Bu projenin devam etmeme nedenlerinin baĢ×nda yeni Œ×kan ve gžncellenen nesneleri BD iŒine dahil etmede
Œok zorlanmam ve piyasada “CD2\Programlama\ScriptDiller\delphiscriptfull.exe” gibi Œok daha iyi haz×rlanm×Ģ ve
Œal×Ģan ™rnekler olmas×. Ama ileri bir zamanda yeni kazand×ğ×m deneyimleri Yunus‟a aktararak projeyi devam da
edebilirim.

Yunus ile PHP ve ASP gibi dillerde kullan×lan basit form ™ğeleri gibi Œ×kt× al×nabildiği iŒin, BD‟deki gibi geliĢmiĢ
“Nesne „zellikleri”ne gerek yok da denilebilir. Ya da basit ™zellikler ve geliĢmiĢ ™zellikler diye programc×ya seŒenek
b×rak×labilir. BD‟deki “Nesne „zellikleri”nde ValueListEditor nesnesinin žzerinde Œok uğraĢt×m. Tek tek Œoğu nesnelere
ait alt ™zellikleri bulup, džzenlenmelerine Œal×Ģ×yoruz. Her ne kadar tžm ™zellikler ve olaylar listelense bile form
žzerindeki nesneler ile iletiĢim tam değil. Mesela Form‟un Action ™zelliği aktif değil.
280

Resim 17c – BlueDream projesi

3 boyut yani OpenGL rahatl×kla GeForce ve ATI ekran kartlar×nda Œal×Ģ×yor. Kžre, dikd™rtgen prizma, yay, yaz×,
žŒgen, tžp, simit, disk ve ×Ģ×k gibi temel nesnelerimiz var. Projemin bitimine yak×n Œok doku ekleyebilme ve nesneleri
“Nesne „zellikleri” penceresi ile birleĢtirmeye Œal×Ģ×yordum. Formlar nas×l sonuŒta Œal×Ģt×r×l×yorlarsa, bu penceredekileri
denemek iŒin sahne iŒinde dolaĢma, “al×Ģt×r” k×sm×n× yapmaya Œal×Ģsam da bitmedi.

En son bitirmek istediğim, nesnelere animasyon imkan× ve onlara ait kod yaz×labilme ™zelliği kazand×rmak.
Yani zamanla kendimiz de DarkBasic (DirectX kullan×yor) gibi oyun haz×rlama platformu veya benzeri iĢlemleri
yapabileceğimiz rahat bir ortamda program yapabiliriz. Tek baĢ×ma Œok geliĢmiĢ Ģeyler yapamam. Ne kadar uğraĢsak
da hep ilkel kalacak.

GeliĢtirildiğim k×s×mlar× s™kžp baĢka programlarda kullanmay× maalesef zor buluyorum. Programlama k×sm×nda
modžlerlik kural×na pek uymad×ğ×m×z iŒin. Hayat× zorlaĢt×ran hep kendimiz oluyoruz. Basit ve kolay iĢler yaparak, diğer
programc×lara ™rnek olmak gerekir. Benim ™rnek ald×ğ×m kaynaklarda genellikle aŒ×klamalar ve džzenli programlama
olduğundan az bir uğraĢla kendi program×ma bunlar× ekledim.
281

14. KüPro (Web tabanlı uygulama geliştirme)


(Ornekler\Diger\kutuphane192.zip)

PHP (Personal Homepage) ile yapt×ğ×m bu program ile bir kžtžphane iŒin gerekli kitap kayd×, kitap ™džnŒ
verme alma iĢlemlerinin takibi ve istatistik Œal×Ģmalar× yap×labiliyor. PCNet dergisinden bulduğum birŒok Mac ikonlar×
sžslž pžslž olmas×n× sağlad×. PHP tek baĢ×na bu kadar g™rsellik sağlam×yor. Ayr×ca birŒok JavaScript ve DHTML kodu
da arkaplanda Œal×Ģ×yor. Bunlar iŒin JavaScript Vault (myplace.50g.com) kulland×m. Toplam 5200 sat×r žzeri kodu
yazarken, Notepad yerine de Crimson Editor‟u kodlar× renklendirdiği ve daha pratik olduğu iŒin kulland×m.

Resim 18a – KžPro giriĢ ekran×

ASP ile dinamik sayfa yapmak Œok kolay, ayn× Ģekilde PHP‟de *.mdb dosyalar× ODBC ile veritaban× kullan×larak
iĢlerimizi g™rebiliriz. PHP tek baĢ×na bir anlam ifade etmiyor. Ana makine program× yine bedava olan Apache,
veritaban× olarak da MySQL kullan×l×yor. Genellikle de PHP Linux veya Unix žzerinde Œal×Ģ×yor. Yani bu dil hem aŒ×k
kaynak kodlu hem de bedava bir tasar×m dili. Windows žzerine de bu programlar kurulabiliyor. Fakat Linux kadar
performans al×namayabilir.

Toplu paket ad×nda AbriaMerlin, PHPTriad ve multiservis (TžrkŒe) baĢlang׌ ayarlar×n× bilmeyenler iŒin haz×r
paketlerdir. Toplam 40-50MB aras×nda olan bu programlarda bol miktarda ™rnek ve ™ğretici dokžman var. Az yer
kaplayan birŒok bedava alternatif de var. Mesela Abyss Web Server ve BadBlue gibi. OmniHTTP ile PHP de
kendiliğinden kuruluyor ve kurulumdan k×sa sžre sonra da “http://localhost” da test sayfalar×na bakabiliyorsunuz.
omnicron.ca sitesini ziyaret ediniz.

Eğer hem ASP hem de PHP ayn× anda Œal×Ģs×n diyorsan×z IIS ve PWS iŒin ayarlar internet sayfalar×ndan
™ğrenilebilir. Bu kadar imkan varken ™nemli olan h×z ve az yer kaplama ise en iyisi OmniHTTP diyeceğim. Bu arada
Linux žzerinden de ODBC (iODBC ile) ve ASP Œal×Ģt×r×labiliyor. Ġnternette arama yap×nca birŒok seŒenek karĢ×n×za
geliyor.

Diğer bir problem de Netscape, Mozilla, Opera gibi browser – taray×c×larda iframe ve stiller gibi konular tam
desteklenmiyor. Bu sebeple Unix kullananlar×n ekranlar×nda siteniz berbat g™ržnebilir.
282

Resim 18b – Kitap listesi

Resim 18c – Kitap takibi

Resim 18d – Kitap džzenleme ekran×

Sonraki versiyonlarda daha h×zl× ve veritabanlar× az yer kaplayan MySQL kullanabiliriz. Neyseki Ģimdilik sadece
birkaŒ bin kay×t ile uğraĢ×yoruz. Milyonlarca kay×t olsayd×, MySQL ancak iĢlemleri becerebilirdi.

Windows‟da projenin Œal×Ģmas× iŒin Ģu s×ray× takip ediniz:


1) kutuphane.zip dosyas×n× “apache\htdocs” klas™ržne “kutuphane” isminde klas™r oluĢturarak aŒ×n×z.
283

2) Denetim Masas×ndaki ODBC simgesini kullanarak yeni bir Sistem DSN (Datasource Name – Veri kaynağ×
ad×) ekleyelim. Ġsmine “weri” diyerek “kutuphane\inc\kutuphane.mdb” dosyas×na y™nlendirip kapatal×m.
3) Windows dizinindeki php.ini dosyas×ndaki “register_globals = on” sat×r× olmas×na dikkat edelim.
4) Projeyi “http://localhost/kutuphane” diye aŒt×ğ×m×zda, oturum kay×tlar×n× k™k dizininde saklad×ğ×m×z
iŒin muhtemelen “c:\” de sess_ef2b2b6ded… gibi dosyalar oluĢacak. Daha sonra bunlar× rahatl×kla
silebilirsiniz. Linux‟da ise k™k dizine yazma hakk× verilmez, o sebeple oturumlar “/tmp” gibi yerlere
y™nlendirilmelidir. Her *.php dosya iŒindeki session_save_path("/tmp"); olarak džzenlenebilir.
5) nobetci ismi ve Ģifresi ile giriĢ yap×l×nca kitap al×Ģ veriĢi yap×labilir; admin ise kullan×c× aŒabilir, kitap
ekleyebilir, silebilir, kitap al×Ģ veriĢi yapabilir, ™ğrencileri žye yapabilir; kullan×c×lar ise kitap ekleme, silme
ve kitap al×Ģ veriĢi yapabilir, ™ğrencileri žye yapabilir.
6) “apache\htdocs\kutuphane\inc” klas™ržndeki turkish.php ve english.php dosyalar×nda gerekli
džzenlemeler yap×larak baĢka dillere destek veriliyor. Hem de baĢka b™lžm var ise, mesela matbaa
b™lžmžnžn kžtžphanesinde kullan×lacaksa, turkish.php iŒindeki Bilgisayar geŒen yerleri Matbaa diye
yerdeğiĢtirmek yetiyor.
7) Microsoft Access ile “apache\htdocs\kutuphane\inc” klas™ržndeki kutuphane.mdb džzenlebilir. Yeni
kžtžphane aŒanlar buradan eski kitaplar×, kay×tlar× silebilirler.
8) Bu projede kullan×c× giriĢi iŒin kullan×c×:admin, Ģifre:123 kullanabiliriz, kutuphane.mdb‟nin Ģifresi de
my_library. ġifreleri md5 komutu ile kripto iĢlemine sokabilirdik veya kendi algoritmam×z ile de session –
oturuma kaydedebilirdik.

SQL desteği sayesinde istatistik k×sm×nda gžzel sonuŒlar elde ediyoruz. Mesela;

$sql= "SELECT UyeNo,count(UyeNo) as toplam FROM teslim where Demirbasno='kitapsiz' and UyeNo<>''
group by UyeNo order by count(UyeNo) desc";

En Œok Œal×Ģmaya gelen žyelerin numaralar×n× veriyor. Ġsimlerini de baĢka bir tablodan al×yoruz:

$sql2="select uyeno, adi, soyadi from uyeler where uyeno=$uyeno2 ";

Genellikle en Œok form elemanlar×na ulaĢma, iŒlerini gžncelleme, uyar×lar, metin kutular×, onay kutular×n×n
Œal×Ģmalar× gibi konularda JavaScript‟e mecbur kalmak tuhaf. G™rsel k×s×mlarda PHP‟nin hiŒbir yeteneği yok.
Extensions – geniĢleme eklentilerini de Œal×Ģt×ramad×ğ×m iŒin grafik komutlar× gibi gžzel unsurlardan yoksun kald×m.
Ayr×ca php.ini ve httpd.conf gibi dosyalar×n iŒine girip, ayar yapmak bana zor geliyor. PHPConfig (analogx.com) biraz
yard×mc× olsa da iĢin iŒinden Œ×kamad×m. Unix kullananlar en basit ayar× bile not defteri benzeri programlar ile
yapmaya al×Ģ×kt×rlar, ama Windows kullananlar iŒin anlaĢ×lmas× zor.

if ($baski!="evet") echo "&nbsp;<a href=# onClick=history.go(-1)>Geri</a>‖;

Buradaki gibi HTML, JavaScript ve PHP bir arada kulland×m.

TžrkŒe ve Ġngilizce desteğini d×Ģ dosyalar× “include” ile ederek sağlarken, asl×nda bu program× baĢka amaŒlar
iŒin de kullanma imkan× ortaya Œ×kar×l×yor. Mesela bilgisayar kelimelerini elektronik ile değiĢtirdiğinizde, elektronik
b™lžmžnžn kžtžphanesi de yap×lm×Ģ oluyor. Tabi tablolar× da ona g™re isimlendirilmeli. Ayr×ca Soru Bankas×, Online
Test Program× gibi projelerde de ayn× altyap×y× kullan×yoruz. Program×m×z yerel de Œal×Ģt×r×labilir, intranet, internet
žzerinden de kullan×labilir.
284

15. MyBoard (Flash ile dijital devre tasarımı)


(Ornekler\Diger\mb\mb.zip)

21 Ocak 2004 ile 30 Mart 2004 tarihleri aras×nda Macromedia FlashMXProfessional 2004 ile yapt×ğ×m bu
™rnekte amaŒ basit devreler tasarlay×p onlar× Œal×Ģt×rabilmek. al×Ģt×rma ve kaydetme maalesef bitmedi. Pek bitecek
gibi de g™zžkmžyor. Flash arabirimine bir tžrlž al×Ģamad×m. Minicik pencere ve yaz×lar, bir sžrž k×sayol, k×s×tl× yard×m
dosyalar× ve sonuŒta gittikŒe yavaĢlayan bir *.fla dosya beni b×kt×rd×. Biraz daha kafa yorsayd×m ve sabretseydim,
“al×Ģt×r” da olabilecekti.

Resim 19a – MyBoard 1.6 tasar×m penceresi

K×sayollar×:
BoĢluk = al×Ģt×r / Dur
Ctrl + F = Tam Ekran
Ctrl + W = ×k×Ģ
Shift + sžržkle = Eleman× serbest taĢ×
Oklar = Eleman× 10 pixel taĢ×
Shift + Oklar = Eleman× 1 pixel taĢ×
Delete = SeŒili eleman× siler
Esc = Pencere g™ržnžmž

Bu program× da bedava ve aŒ×k kaynak kodlu proje olarak yapt×m. Menž ve ipuŒlar×nda, Ġngilizce ve TžrkŒe dili
desteği var. english.txt dosyas×n× değiĢtirerek baĢka dilde de destek sağlanabilir. TžrkŒe dosyas×n× not defteri ile
iĢlerken UTF-8 kodlama seŒilerek kaydetmeyi unutmay×n. Yoksa TžrkŒe karakterler Flash‟da okunmuyor.

YerleĢtirilen nesnelerin iğne veya bacak uŒlar× t×klan×nca kablo durumuna geŒilir. Tekrar ayn× uŒ t×klan×nca
vazgeŒilir, ya da baĢka bir nesneye bağlan×r. Kablo durumunda sžržkleme imkan× iptal edilir. K™Ģeli kablo veya
kabloya baĢka bir Ģey bağlama, Œok telli bağlant× yok. ISIS Proteus kullananlar burada hayal k×r×kl×ğ×na uğrayabilir.

Nesnelere sağ t×klan×p, Cut, Copy, Paste ve Delete gibi iĢlemleri yapabiliriz. Bu iĢi “ClipBoard.as” dosyas×
hallediyor. TžrkŒe menž yapamad×m. Paste yani yap×Ģt×rmak iŒin fare ile baĢka bir boĢ alan sağ t×klanan×r ve komut
verilir. Yeni nesnenin ad× biraz tuhaf rakamla bitiyor. Bu isimlendirmede de Œok uğraĢmad×m.

Led eleman×n×n iŒinde direnŒ olduğunu varsay×yoruz. Yani normalde direnŒ ile kullan×lmal×d×r. Led doğrudan
kaynağa bağlan×nca žzerinden fazla ak×m geŒer ve ™mrž k×sal×r. 7 parŒal× Led g™sterge de (Display) 7447 gibi
elemanlarla kullan×l×r. Yine program×m×zda iŒinde varolduğunu džĢžnerek tasar×m yap×yoruz. Zaten bu arada tžm
nesneler de gerŒek boyutlar×nda değiller. Bask× devre haz×rlama program× amac×m×z yoktu. Program×m×za “Devre Test
Program×” da diyebiliriz.

XML dosyalara eriĢim neredeyse Œok basit iken yazma iĢin iŒine girince PHP, JavaScript gibi yard×mc× dillere
ihtiyaŒ duyuluyor. Gžvenlik neden ile olsa gerek. Ama stand-alone dosya yani exe dosya olarak bilgisayar×m×z×n
diskinden kullanacağ×m×z program iŒin baĢka Œ™zžm bulmak gerekli. PHP ile de site haz×rlarken HTML ve JavaScript
olmadan Œoğu Ģeyleri yapam×yoruz.
285

XML_var = new XML ();


XML_var.load ("empty.xml");
XML_var.onLoad = displayXML;
function displayXML () {…}

Bu projede Flash‟× tercih etmemin en bžyžk sebebi, pencereye sağ t×klay×p bžyžt, kžŒžlt komutlar×n×
verebilmemiz. Kalite bozulmadan bu iĢlemler yapabiliriz. Normalde programlama dillerinde grafik olarak scale
(™lŒeklendirme) yapman×n bir sžrž tuhafl×klar× oluyor. Flash iŒindeki tžm Œizilen nesneler(yaz×lar, Œizgiler, daireler,
poligonlar… - bitmap resimler ise net olmayabilir) vekt™rel olarak yap×l×r. Ses ve d×Ģar×dan film alma geliĢmiĢ. Fakat
burada hiŒ kullanmad×m.

En Œok kafam× yoran elektrik ak×m×n×n nas×l kablolar žzerinde akacağ× oldu. Birden fazla Vcc (+5V, 1, yada
art×) ve Gnd (0V, 0, Toprak yada eksi) olunca ne olacak? Eğer aŒ×k uŒ varsay×lan olarak 1 kabul edilirse dijital devre
elemanlar×n×n davran×Ģlar× ona g™re değiĢmeli. Ya k×sadevre durumu nas×l değerlendirilecek? Nesnelere mi davran×Ģ
vermeliydim yoksa bir prosedžr yap×p devaml× tarama m× yapsayd×m karar veremedim. Birbirine değen ve bağl×
elemanlar×n bir listesini “al×Ģt×r” deyince Œ×kar×yoruz. Bu metin dizisi halindeki listeyi iĢlemek zor geliyor.

ActionScript 2.0 ile ilgili de pek iyi an×lar×m olmad×ğ×n× s™yleyebilirim. Ama en sevdiğim Ģey Ctrl+Shift+F
k×sayolu ile “Auto Format” kod yaz×m×n× derleyip toparlamas× oldu. Hem yaz×m hatas× kontrolž yap×yor hem de kod
okunakl×l×ğ×n× art×r×yor. Tabi iŒ iŒe Œok blok varsa daha standart g™ržnžm elde ediyoruz. BiŒimlendirmede baz×
seŒenekler “Auto Format Options…” ile g™ržlebilir. Yine de kod yaz×m×, VB veya Delphi‟nin yan×nda Œok s™nžk ve
yard×mseverlikten uzak. Nereye ne yazd×ğ×m× ilk baĢlarda bir tžrlž anlayamad×m. Movie Explorer(Alt+F3) ve Library
(Ctrl+L) kar×Ģ×k, kafa kar×Ģt×r×c×… macromedia.com‟dan tžm pdf dosyalar× indirsem de bunlar× pek kullanmad×m.
google.com‟dan arama ile bir sžrž pratik bilgiye ulaĢabilirsiniz. Flash‟×n yetenekleri bol olsa da, neredeyse yar×s×n×
kullanmad×m. Kžtžphanesindeki bir sžrž gžzel elemanlar pek iĢimi g™rmedi.

Resim 19b‟deki gibi 17” ekran 1024*768 Œ™zžnžrlžk yetersiz… F4 ile tžm pencereler gizlense de neredeyse hiŒ
bu durumda kalamad×m. Her Ģeye k×sayol tuĢlar× verilmesine rağmen genellikle faremizi t×k×r t×k×r Œal×Ģt×rmak zorunda
kal×yoruz. Flash ile animasyon filmi yapanlar×n iĢi daha zor. Bu projede sadece 2 katman var ve tek frame – ŒerŒeve
ile Œal×Ģ×yoruz. Programlar×n Œoğu MovieClip – film kliplerine yaz×ld×. Belki de projemizi yavaĢlatan Ģey, klip iŒinde
klipler yap×p her birinde de program Œal×Ģmas× olabilir. „zellikle 14 bacakl× entegrelerden bir iki tanesini kullan×nca
neredeyse kilitleniyor.

Nesneleri eğer Transform – d™nžĢtžrme iĢlemine sokmad×ysan×z, ana ŒerŒeve ile ayn× x y birimine sahip
oluyorlar. Fakat yžkseklik ve geniĢlikle oynay×nca nesnenin uzay×, birimi farkl× oluyor. Bir de bunlar×n eĢdeğerini
bulmaya Œal×Ģ×rken iyice iĢin iŒinden Œ×kamad×m. Sonradan nesne oluĢturduğumuzdan istediğimiz yere getirmek, kablo
Œekmeye Œal×Ģmak zor oldu.

anaKatman ismindeki katman×m×zda tan×lad×ğ×m×z değiĢkenler ve fonksiyonlar global oluyorlar.

var ilkNoktaX:Number = 0;
var ilkNoktaY:Number = 0;
var sonNoktaX:Number = 0;
var sonNoktaY:Number = 0;

C dilindeki gibi bžyžk kžŒžk harf duyarl×l×ğ×, değiĢken isimlerinde ve fonksiyon adlar×nda var. Pascal m× desem
Basic mi desem, kar×Ģ×k iĢte… Bir iki ™rnek yapt×ktan sonra eliniz al×Ģ×yor.

Fare ve klavye olaylar×n×n isimlendirilmesi garip, Delphi‟deki onKeydown, onMouseMove daha anlaĢ×l×r:

on (press) { //fare tuş basımı, bu olay yazılan kliplerde fare imleci el olur
}
onClipEvent (keyDown) { //klavye tuşu basımı
}
286

Resim 19b – MyBoard 1.6‟un tasarland×ğ× pencere!?

ResourceHacker gibi programlar ile exe dosyam×z žzerinde değiĢiklikler yapabiliriz. BaĢl×k Œubuğuna program
ad×n× yazabilir, program simgesini değiĢtirebilir, sağ tuĢ menžsžnž ve ana menžyž değiĢtirebiliriz. Biz de buradaki
MyBoard 1.6 baĢl×k değiĢimini ve Play ana menž dal×n× silinmesini rahatl×kla yapt×k. Program×m×z×n son halinde
değiĢiklik gerekli gibi zaten. Hakk×nda deyince Flash Œ×kmas× Œok saŒma.
287

16. SiPro (Web tabanlı sınav programı geliştirme)


(Ornekler\Diger\sinav133c.zip)

Yine PHP (Personal Homepage) ile yapt×ğ×m bu program ile de s×nav otomasyonu yap×yoruz. KžPro kodlar×n×
kullanarak yapt×ğ×m iŒin iki projenin g™ržnžmleri benziyor. YaklaĢ×k 6600 sat×r sžren bu programda MySQL RDBMS
(Remote Database Management System – Uzaktan veritaban× y™netim sistemi) veritaban× kullanmay× tercih ettim.

Resim 20a – phpMyAdmin ekran×

Resim 20b – Crimson metin džzenleyicisi


288

Resim 20c – SiPro aŒ×l×Ģ ekran×

Resim 20d – …ye listesi


289

Resim 20e – …ye listesinde mail komutu ile žyeye elektronik mesaj at×labilir

Resim 20f – Yeni žye ekleme


290

Resim 20g – Hatas×z giriĢ yapm×Ģ×z

Resim 20h – Soru džzenleme


291

Resim 20i – Sorulara resim ekleme

Okuldaki Linux tžrevi Gentoo ile nas×l Œal×Ģabilir y™nžnde tasar×m yapmam gerekli idi. Bu sebeple evimdeki
bilgisayara da benzer olan Mandrake 9.0/Suse 9.1 kurdum. BirkaŒ problem d×Ģ×nda kurulum kolayd×. Problemlerin en
bžyžğž kurulum s×ras×nda b™lžmlendirme yaparken, tžm bilgilerimin silinmesi oldu. Asl×nda dikkatsiz bir Ģekilde
kurulumdaki bir ad×m× geŒince b™yle oldu. Gelecek Linux 2.0 ve Mandrake 9.1 kurulum denemelerim tam istediğim
gibi değildi. „zellikle MySQL kendiliğinden kurulmad×ğ× iŒin rpm dosyas×n× internetten ve kurulum CD‟lerinin iŒinde
aramak zorunda kald×m. Bu arada her Linux sžržmž diğer Linux sžržmlerinin *.rpm paketlerini okumayabiliyor.
MySQL hizmetini Linux‟da konsol ekran×ndan “service –f mysql” komutu ile Œal×Ģt×r×yoruz. BaĢlang׌ta bu hizmetin
Œal×Ģmas×n× ayarlamaya Œal×Ģsam da yapamad×m. SuSe 9.1‟de ise servisler g™rsel bir arabirimden Œal×Ģt×r×l×p
durdurulabiliyorlar.

BirkaŒ gžn uğraĢt×ktan sonra Windows XP ve Mandrake 9.0 kurulu bilgisayar×ma kavuĢtum. Asl×nda ille de
PHP‟nin Œal×Ģmas× iŒin Linux gerekli değil. Ayn× ortam× Windows ile de oluĢturabiliyoruz. Zaten k×sa bir sžre sonra
kullan×m kolayl×klar×ndan dolay× Windows‟a geri d™ndžm. „zellikle Kate metin edit™rž d×Ģ×nda arad×ğ×m yaz× program×n×
bulamad×m. K×sa yollar× hemen hemen Windows‟un not defteri ile ayn× olmas×na rağmen al×Ģamad×m. Mozilla ve
Konqueror taray×c×lar× da maalesef Internet Explorer gibi kullan×Ģl× değil. Ġleride Linux bu aŒ×klar× muhtemelen
kapatacakt×r. ġimdilik yapt×ğ×m değiĢiklileri bazen Linux‟da deniyorum.

Windows‟da projenin Œal×Ģmas× iŒin Ģu s×ray× takip ediniz:


1) PHPTriad/Xampp paketini kurarak Apache ve MySQL‟i Œal×Ģt×r×yoruz.
2) Sinav133c.zip dosyas×n× “apache\htdocs” klas™ržne “sinav” isminde klas™r oluĢturarak aŒ×n×z.
3) MySQL‟de veritaban× džzenlemek iŒin en rahat ortam olan “http://localhost/phpmyadmin” adresini
aŒal×m. phpMyAdmin tablo oluĢturmada ve džzenlemede en basit arabirimi sağl×yor. duyuru isminde yeni
bir veritaban× aŒarak sinav klas™ržndeki “vt.sql” dosyas×n× SQL sekmesinde Œal×Ģt×ral×m. BaĢar× ile
tablolar×n eklenmesi gerekli.
4) Windows dizinindeki php.ini dosyas×ndaki “register_globals = off” sat×r× olmas×na dikkat edelim. Kžtžphane
projesinde ise “on” olmak zorundayd×. SiPro, birŒok y™nden KžPro‟dan daha olgun.
5) Projeyi “http://localhost/sinav” diye aŒt×ğ×m×zda, oturum kay×tlar×n× geŒici bir dizinde dizininde
saklad×ğ×m×z iŒin muhtemelen “c:\tmp” de sess_ef2b2b6ded… gibi dosyalar oluĢacak. Daha sonra bunlar×
rahatl×kla silebilirsiniz. Linux‟da ise k™k dizine yazma hakk× verilmez, o sebeple oturumlar “/tmp” gibi
yerlere y™nlendirilmelidir. Eğer kullan×c× ve žyeler “Gžvenli ×k×Ģ” ile Œ×karlarsa, kendi oturum dosyalar×
zaten siliniyor.
6) admin ile kullan×c× ve žye aŒabilir, soru ekleyebilir, s×nav olabilir; kullan×c× yani ™ğretmenler soru
ekleyebilir, s×nav olabilir; žyeler yani ™ğrenciler s×nav olabilir.
7) turkish.php ve english.php dosyalar×nda gerekli džzenlemeler yap×larak baĢka dillere destek veriliyor.

Kurulumu kendi ayarlar×m×za g™re değiĢtirmemiz gerekli. Bunun iŒin projemizdeki “conf.php” dosyas×na
bakabiliriz. „rneğin MySQL‟deki kullan×c× ad× ve Ģifresini burada server olarak kullanm×Ģ×z. Siz de kendi kullan×c× ad× ve
292

Ģifresini belirlemeniz gerekebilir. Bu ayarlar× phpMyAdmin‟den “mysql” veritaban×ndan “users” tablosunda


bulabilirsiniz.

php.ini‟de de gžvenlik ve performans amac× ile “register_globals = Off” yap×yoruz. Bu sebeple


$HTTP_SESSION_VARS, $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS gibi komutlar kullanarak
değiĢkenleri form veya adresten alabiliyoruz. Bazen ayn× ad× olan hem GET hem de POST edilmiĢ değiĢkenler oluyor.
O zaman da empty() fonksiyonu ile nereden geldiğini belirlemeye Œal×Ģ×yoruz.

Sizin veritaban×n×n ad× da duyuru olmak zorunda değil. Oturumun kaydedileceği klas™rž de belirttikten sonra,
son olarak projemizdeki “sinav/yollanan” isimli klas™re herkes iŒin yazma hakk× verilmesi gerekiyor. Eğer ftp ile ana
bilgisayara dosyalar× at×yor iseniz, giriĢ yapt×ktan sonra bu klas™re sağ t×klay×p, haklar×n× değiĢtirebilirsiniz. Linux‟da da
ayn× Ģekilde haklar× değiĢtirebilirsiniz, veya bir konsol ekran×ndan “chmod” komutu verebilirsiniz.

Bunlar× džzenledikten sonra art×k s×nav projemiz sorunsuz Œal×Ģ×r hale geliyor. „ğrenci žyeler baĢvurduklar×
anda aktif hale geldikleri halde, ™ğretmenlere daha sonra admin eposta atarak aktif olduklar×n× belirtiyor. Her yeni žye
olunduğunda admin‟e eposta yollanmas× admin‟i zor durumda b×rakabilir. Hatta en Œok yap×lan hata da ™ğrencilerin
yanl×Ģl×kla ™ğretmen olarak baĢvurmalar×. ġimdilik ™ğrenci ™ğretmen fark×n× Œ™zmenin bir yolu yok. Yžz yžze,
konuĢarak onay al×nmas× gerekebilir. „ğretmenin tek fark× soru oluĢturma ve değiĢtirme hakk× olmas×. „ğrenciler de
s×nava girerek puanlar×n× art×rmaya Œal×Ģ×yorlar. Bu amaca g™re hareket edersek, ™ğretmenlerin Ģifrelerini ™ğrencilere
belli etmemeleri de iyi olur :)

Eposta adresi gizli olmayan ™ğretmenlere ve ™ğrencilere, adlar× geŒen yerlerde (istatistik, baĢar× listesi, soru
bask× ™nizlemesi), eposta atma penceresi kullanarak eposta yollanabiliyor.

BasitŒe bir ay sžreli ™mrž olan bir Œerez kullanarak, dil, son giriĢ yapan×n ad×, tžrž saklanabiliyor. “Beni
Hat×rla” seŒeneğini iptal etmek iŒin de, seŒimi kald×r×p, giriĢ yapmak yeterlidir.

admin ise soru oluĢturma, kullan×c×(™ğretmen) ve žye(™ğrenci) džzenleme silme yetkisine sahip. „ğretmen ve
admin‟in puanlar× derecelenmede etkili olmasa da, istatistikte girdikleri s×navlar belli olduğu iŒin puanlar×n× g™rebilirler.

Sorular ortak bir havuzda tutulduğu iŒin, ™rneğin Edebiyat ™ğretmeni diğer derslerdeki TžrkŒe yaz×m hatalar×n×
džzeltebilir. B™ylece gittikŒe daha gžzel sorular ortaya Œ×kabilir. Hem de kiĢiye ™zel ders olmuyor. Pascal bilen
bilgisayar ™ğretmenleri benzer sorular× bir yerde toplay×p, ortak s×nav gibi haz×rl×k yapabilirler. „ğrenciler ™ğretmene
g™re değil, konular×na g™re ders Œal×Ģ×rlar.

Veri giriĢi uzun sžržyor, bu sebeple, sorular× bilgisayar baĢ×nda o anda žretmek yerine, ™nceden haz×rlay×p,
girmek daha ŒabuklaĢt×r×yor. Ama Excel‟den Ģu verileri al gibi bir ™zellik olsayd×, iyi olurdu. Benzer Ģekilde sorular×
kaydedip daha sonra Œal×Ģma imkan× “Soru „nizleme” ile yap×lsa da, sorular× gerŒek s×navlarda kullanmak isteyen
™ğretmenler biraz uğraĢmalar× gerekiyor. Yani belli sorular× numaraland×r×p Word‟e aktarsayd×k Œok faydal× olurdu.
Soru ™nizlemesinde sorular× Ctrl+A ve Ctrl+C ile kopyalay×p, Word‟e “„zel Yap×Ģt×r…*BiŒimlendirilmiĢ Metin(RTF)”
olarak yap×Ģt×r denilince biraz da olsa iĢe yarar Ģeyler elde edebiliyoruz. Yap×Ģt×rma iĢleminde HTML biŒimi seŒilirse
resimler de yap×Ģt×r×labiliyor.

Sadece belli bir haftada s×nav sorular×n×n aktif olmas× istenirse, “Dersi Kilitle” ĢeŒeneği kullan×l×yor. B™ylece o
dersin tžm sorular× pasif yap×larak, ™ğrencilerin o s×nava ulaĢmalar× engelleniyor. Ne zaman ne olacağ× ana sayfadan
duyurulabilirdi. ġimdilik bu konu ile ilgili haberleĢme veya ™ğrencilere not b×rakma yok.

„ğrenciler anlamad×klar×, bilemedikleri sorular× Google‟dan arayabilir. ok uzun sorularda pek faydal× olmasa
da ™ğrenci arama metnini azalt×p tekrar yazarak arama yapabilir. Cevaplar× s×nav bitiminde veya soru cevaplan×rken
hiŒbir yerde g™ržlemiyor. Soru d™kžmžne de cevaplar× eklemedim. Bu sayede ™ğrenci araĢt×rma yapmaya da
y™nlendiriliyor. Bilemediği sorular× internetten arayabilir veya ™ğretmenine sorabilir.

Soru ve derslerin zorluk derecesi de zamanla cevapland×kŒa, s×navlar yap×ld×kŒa, değiĢiyor. Genellikle tek
seŒenekli sorular en zorlar×. Bir harf hatas× olursa yanl×Ģ oluyor. Soru haz×rlarken eğer tek seŒenek de kullan×lsa, cevap
k×sm×na bir harf girilmesi gerekir. Eğer ™rneğin B seŒeneği boĢ b×rak×l×p C, D yaz×lsa bile, s×nav s×ras×nda B seŒeneği
g™sterilmeyip, C, D olarak devam ediyor. Yani soru haz×rlan×rken boĢ b×rak×lan seŒeneklerin harfleri džzeltilmiyor. A, C,
D olarak gidiyor.

En iyisi Œoktan seŒmeli sorular. En fazla 5 seŒeneğe kadar seŒenek sunarak soru haz×rlanabilir. Soru metni ve
seŒeneklere resim de eklenebiliyor. Bunun iŒin “sinav/yollanan” klas™rž kullan×l×yor. Ayn× resim baĢka sorularda da
kullan×labilir. Ġstenirse hem yaz× hem de resim birlikte olabilir. Desteklenen dosya tžrleri JP*G ve GIF. 1 MB s×n×r× Œok
fazla olsa bile tahminim kimse 1260*1024 gibi resim yollamaz. Zaten resim ekranda en iyi 300*300 g™ržntžleniyor.
293

Ġleriki aĢamalar olarak, s×navlar×n sžreli olmas×, daha estetik g™ržnžm, isteyenlere kolayl×k derecesine g™re
s×nav seŒeneği sunma gibi Ģeyler yap×labilir. Flash ile de sorulara animasyon desteği verilebilir.

Bu proje ile ilk kez neredeyse tžm platformlarda Œal×Ģabilecek bir program yapmam×z oldu. JavaScript projeleri
de platform‟dan bağ×ms×z olsa da geliĢmiĢ programlar PHP ile kolayca halledilebiliyor. DotNET ile de Microsoft bu
global programc×l×ğ× sağlamaya Œal×Ģ×yor. Ama Ģimdilik PHP bedava olmas×, h×zl× ve kolay ™ğrenilmesi bak×m×ndan en
Œok tutulan×. Hem ASP hem de PHP destekli az da olsa ana bilgisayar(hosting firmas×) bulabilirsiniz. Siz de kendi
bilgisayar×n×z× host – ana bilgisayara d™nžĢtžrebilirsiniz. Normalde port numaran×z 80 olduğu iŒin, ™rneğin; apache iŒin
81, IIS iŒin 80 numaral× portu seŒerek, ayn× anda ASP ve PHP Œal×Ģt×rabilirsiniz. http://localhost ASP iŒin,
http://localhost:81 PHP iŒin olur. Eğer sabit IP‟li bir bağlant×n×z var ise ve her zaman Œal×Ģt×r×labileceğiniz bir
bilgisayar×n×z var ise kendi web server‟×n×z× yapabilirsiniz. Linux + Apache + PHP + MySQL gžŒlž ve bedava bir
konfigžrasyon. Windows + IIS + MSSQL ise biraz pahal× ve gžvenlik aŒ×klar× bol bir sistem. Asl×nda Linux iŒinde
gžvenlik sorunlar×ndan bahsedebiliriz fakat, internetten rahatl×kla kžŒžk gžncellemeler ile bunlar×n žstesinden
gelebilirsiniz.

SonuŒ olarak tek noktadan Œal×Ģarak, tžm džnyada geŒerli olan, ayn× anda Œoklu kullan×c× giriĢi yap×labilen, bir
eğitim ağ× kurulmuĢ oluyor. Makine ve iĢletim sistemine bağ×ml× olmayan, h×zl×, estetik, geniĢletilebilir bir proje.
GeliĢmiĢ bir cep telefonundan bile Œal×Ģabilir, en eski bilgisayarda da Œal×Ģt×ğ×n× g™rmek sžrpriz olmaz.

Apache, PHP ve MySQL žzerinde Œal×Ģan moodle.com (45 MB kurulmuĢ hali) ile atutor.ca (4.5 MB kurulmuĢ
hali) projelerini bedava aŒ×k kaynak kod LMS (Learning Managament System – „ğrenme Y™netim Sistemi)
deneyebilirsiniz. „zellikle moodle Œok geliĢmiĢ. Java alternetifimiz de olat.org projesidir. OLAT kurulumunda kendi
server program× ile geliyor. Yani tam bir paket (50 MB kurulmuĢ hali). ĠŒinde Tomcat5 ve HSQL veritaban× var. Zžrih
…niversitesi‟nde yap×lm×Ģ. Administrator yani y™netici tžm siteye bak×m yapma, žyelikleri kontrol etme gibi iĢleri
varken, ™ğretmenler kurs aŒ×yor, ™ğrenciler de diledikleri kurslara kay×t oluyor. Ġster sohbet, isterse forumlara da
kat×labiliyor. Aralar×nda mesajlaĢma yolu ile de bağ kuruyorlar.

SiPro‟da da (3 MB kurulmuĢ hali) buna benzer iĢlevler varsa da, konu anlat×m× ve g™rsel bžtžnlžk konusunda
Œok eksiklerimiz var. Resim džzenleyici de ekleme isterdim. „ğretmen sorular× eklerken, soru metnine resim yaparak
da daha gžzel anlatabilir. Metin džzenlemede bedava Protopad (http://www.xtort.net/xtort/protopad.php) ve
fckeditor.net yard×mc× olabilirdi. WYSIWYG metin džzenleme kolay ama, resim iĢlemede alternatif bulamad×m.

E-eğitimde iŒerik haz×rlamak iŒin en iyi yol Flash. oğu bilgisayarda Flash Player yžklž veya internetten
kurmas× Œok kolay. Powerpoint ile de ders anlat×m× yap×labilse de yayg×n değil. Uzun belgeler genelde *.pdf olarak site
iŒine ekleniyor. Her ne kadar Java ve JavaScript ile dinamik g™ržntž yapabilsek de Flash kadar etkili değiller.
294
295

Resim 20j – Linux‟dan birkaŒ g™ržntž


296

17. Denklemler (Excel ile denklem çözümü)


(Ornekler\Diger\ExceldeDenklemler.zip)

Byte 1998 Mart say×s×ndan yapt×ğ×m bu ™rnekde, 2 y™ntemle “n. dereceden bir bilinmeyenli denklem”, 2
y™ntemle de “birinci dereceden n bilinmeyenli denklem” Œ™zžlebiliyor. Microsoft Excel‟in bir eklentisi olan “™zžcž
Eklentisi” kurulu olmal×d×r. Ġsterseniz istatistik Œal×Ģmalar× iŒin de “ToolPak ™zžmleyicisini” yžkleyin.

Yard×m dosyas×nda Œ™zžmleme arac× Ģu Ģekilde tan×mlanm×Ģ:


“Microsoft Excel, karmaĢ×k istatistiksel ve mžhendislik Œ™zžmlemeleri geliĢtirdiğinizde ad×mlar× kaydetmek iŒin
kullanabileceğiniz (ToolPak ™zžmleyicisi ad×nda) bir veri Œ™zžmlemesi kžmesi sağlar. Her Œ™zžmlemenin verilerini ve
parametrelerini siz sağlars×n×z; araŒ, uygun istatistiksel veya mžhendislik makro iĢlevlerini kullan×r ve sonra sonuŒlar×
bir Œ×kt× tablosunda g™ržntžler. Baz× araŒlar, Œ×k×Ģ tablolar×na ek olarak, grafikler de oluĢturur.”
Yani Œ™zžmleme Anova, Korelasyon, Kovaryans, Tan×mlay×c× Ġstatistik, …stel Džzeltme, Fourier ™zžmlemesi,
Hareketli ortalama, „rnekleme, Regresyon, t-test, z-test, Histogram gibi araŒlarla da yap×labiliyor. Buradaki “n.
dereceden bir bilinmeyenli denklem” ve “birinci dereceden n bilinmeyenli denklem” iŒin bu araŒlara gerek kalmadan
basitŒe “™zžcž” ile iĢimizi hallediyoruz.
297

Resim 21a – Excel sayfalar×n×n g™ržnžmleri


298

Resim 21b – ™zžcž ayarlar×

SonuŒlar× Yan×t Raporu, Duyarl×l×k Raporu ve S×n×rlamalar Raporu olarak g™rebiliriz. ™zmeden ™nce
SeŒenekler menžsžnden de Yineleme, Tolerans, Yak×nsama ve Duyarl×l×k gibi ayarlar× yapabiliriz. Formžlž girdikten
sonra yeĢil olarak renklendirdiğim hžcrelere rakam girerek sonucu deneme imkan×m×z var. Ama bu denemeleri
neyseki Excel otomatik olarak bitiriyor. Yani sonuŒlar 0 olana kadar belli aral×kta denemeler yap×yor.

Formžllerde g™rdžğžnžz x, y ve z gibi harfleri hžcrelere isim vererek yap×yoruz. Mesela D8 hžcresi x değerine
denk gelecek ise, “Ekle*Ad*Tan×mla…” menžsžnde isim verebiliriz. Bu sayfada istediğiniz yerde formžllerde D8 yerine
x yazabilirsiniz. Ġstediğimiz zaman da formžl Œubuğunun solundaki “Ad Kutusu”na x yazarak o hžcreye gidebiliriz.

™zžcž parametreleri pencerelerinde hžcre isimleri $ simgeleri ile yaz×lmal×d×r. B™ylece referans× sabit olan
hžcre isimleri elde ediyoruz.
299

18. ASP.NET uygulaması (Online Telefon Defteri)


(Ornekler\Diger\wa211.zip)

Microsoft, .NET ile programc×lar iŒin en rahat ortam× sunmaya Œal×Ģ×yor. GerŒekten de art×k k™kten bir değiĢim
gibi g™zžken ama, tžm programc×lara hitap eden bir arabirimi var. Resimde g™ržldžğž gibi Visual Basic‟in IDE‟sine Œok
benziyor. C#, C++, Basic, J# veya Delphi fark etmeden tek bir IDE (Integrated Development Environment – Entegre
GeliĢtirme Ortam×) ile ister Windows, ister Web uygulamas×, isterse de el bilgisayar× (PalmPC) programlar× h×zl× bir
Ģekilde yap×labiliyor. Unix desteği de var. XML ağ×rl×kl× olmas×na rağmen de Access hala en Œok kullan×lan veritaban×.
Daha etkili ve kapasiteli veritaban× uygulamalar× da MSSQL Server ile yap×labilir.

YaklaĢ×k 40 saat (700 sat×r) uğraĢt×ktan sonra Telefon Rehberi program×m×z olgunluğa eriĢti. Altyap× olarak
Windows XP, ASP.NET 2003, Internet Information Services (IIS), MSSQL Server Service Desktop Edition 8.0
kulland×m.

IIS‟yi Windows CD‟si kullanarak Program Ekle Kald×r‟dan eklemeyi unutmay×n. “C:\Inetpub\wwwroot” klas™rž
bizim ana dizinimiz olacak. Visual Basic.NET‟de yeni proje diyerek, “ASP.NET Web Application” seŒince ana dizinin
alt×nda wa2 gibi uygulamam×z oluĢur. Son aĢamada, sitemizi “http://localhost/wa2/index.aspx” diye internet
gezginimizden g™rebiliriz.

ASP.NET kurulduktan sonra otomatik oluĢan ASPNET kullan×c×s×na, yetki vermemiz gereklidir. “BaĢlat*Ayarlar
*Denetim Masas×*Y™netimsel AraŒlar*Bilgisayar Y™netimi*Sistem AraŒlar×*Yerel Kullan×c×lar ve Gruplar*Users” dan
ASPNET seŒilerek …yelik k×sm×na Administrators, VS Developers ve Users ekliyoruz. Asl×nda Administrator hakk×
vermek Œok tehlikelidir, ama Ģimdilik ™ğrenmek iŒin kendi bilgisayar×m×zda bu ayar× yapabiliriz.

index.aspx‟i sağ t×klay×p, “Set As


Start Page” demeyi unutmay×n!

Resim 22a – VB ASP.NET tasar×m penceresi


300

Resim 22b – SQL Server Query Analyzer ile SQL denemelerimiz

Kullan×lacak tablolar× SQL Server‟a “dtname” veritaban× alt×na tablo1 (telefon bilgileri), kullanicis (kullan×c×
bilgileri) oluĢturuyoruz. Tasar×m penceresindeki “Server Explorer” menžsžne sağ t×klay×p “Add Connection…” ile
dtname eklenir.

Kullanicis tablosu yap×s×:


sira char 10
ad char 10
sifre char 10
logsayisi int 4
email char 10

Tablo1 yap×s×:
sira char 10
ad char 10
no char 10
tel char 10
email char 10
not1 float 8
not2 float 8
ort float 8 Formula bilgisi (([not1] + [not2]) / 2)

dtname eklendikten sonra da Server Explorer menžsžndeki dtname‟ye “Tables*New Table” ile tablolar×
ekleyiniz. Asl×nda dtname iŒine otomatik olarak tablolar× oluĢturan SQL komutu da (CREATE TABLE) verebilirdik.
SiPro‟da MySQL iŒin “vt.sql” yapm×Ģt×k hat×rlarsan×z. Tam sžržm MSSQL Server‟da bu imkan vard×r.

index.aspx ve dataform1.aspx olmak žzere iki sayfadan oluĢan sitemiz var. PHP‟deki gibi JavaScript ile uyar×
(alert) ve onay (prompt) k×s×mlar×n× hallediyoruz. Sytles.css iŒinde de tžm sitenin stil ayarlar× var.
301

Resim 22c – dtname veritaban×


302

Resim 22d – Projenin Œal×Ģm×Ģ hali ve birkaŒ minik ayar daha


303

Bu projede Œal×Ģt×rmay× baĢard×ğ×m×z veritaban× kay×t iĢlemleri; s×ralama (Œift y™n), listeleme (10'arl×
sayfalama), silme (onayl×), ekleme, gžncelleme, arama, filtreleme (ayr× bir tabloda), hesaplanan alanlar (ayr×
tabloda), kullan×c× giriĢi (kullan×c× ekleme, email ile Ģifre hat×rlatma).

?1? Eğer Ģu Ģekilde bir hata oluĢmuĢ ise:


Cannot open database requested in login 'dtname'. Login fails. Login failed for user 'EV\ASPNET'.
™zžm: Komut isteminde (BaĢlat*al×Ģt×r*cmd) Ģu ad×mlar× yap×n×z:

C:\>osql -E
1> use master
2> exec sp_grantlogin 'EV\ASPNET'
3> go
Granted login access to 'EV\ASPNET'.
1> use dtname
2> exec sp_grantdbaccess 'EV\ASPNET'
3> go
Granted database access to 'EV\ASPNET'.
1> exec sp_addrolemember 'db_datareader','EV\ASPNET'
2> go
'EV\ASPNET' added to role 'db_datareader'.
1> quit
C:\>_

EV yerine kendi bilgisayar ad×n×z× yazmay× unutmay×n. dtname yerine de kendi yapt×ğ×n×z veritaban×n×z olmal×.

?2? Eğer Ģu Ģekilde bir hata oluĢmuĢ ise:(UPDATE yerine SELECT, INSERT veya DELETE de olabilir)
UPDATE permission denied on object 'Tablo1', database 'dtname', owner 'dbo'.
™zžm: …stteki hatadaki gibi ad×mlar× izleyerek, 'db_datareader' yerine 'db_datawriter' yap×n×z.

Belki C: sžržcžsžne yazma hakk× yoktur. Yani C$ Ģeklinde. Sžržcžye sağ t×klay×p paylaĢ×ma aŒman×z
gerekebilir. Hata hala oluĢuyor ise google.com‟a hata mesaj×n×z× yaz×p Œ™zžm arayabilirsiniz. VB.NET 2005 veya
sonraki versiyonlarda veritaban× programc×l×ğ× muhtemelen Œok daha kolay olacakt×r. AĢağ×daki kodlara bak×nca, fazla
gibi geebilir. Kodlarla programa hakimiyet devam ediyor.

index.aspx‟in kodlar×:

Imports System.Web.Security
Imports System.Web.Mail
Public Class WebForm1
Inherits System.Web.UI.Page
Protected WithEvents Label1 As System.Web.UI.WebControls.Label
Dim cs, cv As DataView
Dim ds As New DataSet
Dim sifre As String = ""
Protected WithEvents Image1 As System.Web.UI.WebControls.Image
Protected WithEvents TextBox1 As System.Web.UI.WebControls.TextBox
Protected WithEvents TextBox2 As System.Web.UI.WebControls.TextBox
Protected WithEvents Submit1 As System.Web.UI.HtmlControls.HtmlInputButton
Protected WithEvents Label2 As System.Web.UI.WebControls.Label
Protected WithEvents Label3 As System.Web.UI.WebControls.Label
Protected WithEvents DataGrid1 As System.Web.UI.WebControls.DataGrid
Protected WithEvents Label4 As System.Web.UI.WebControls.Label
Protected WithEvents TextBox3 As System.Web.UI.WebControls.TextBox
Protected WithEvents TextBox4 As System.Web.UI.WebControls.TextBox
Protected WithEvents TextBox5 As System.Web.UI.WebControls.TextBox
Protected WithEvents TextBox6 As System.Web.UI.WebControls.TextBox
Protected WithEvents Label5 As System.Web.UI.WebControls.Label
Protected WithEvents Label6 As System.Web.UI.WebControls.Label
Protected WithEvents Label7 As System.Web.UI.WebControls.Label
Protected WithEvents Label8 As System.Web.UI.WebControls.Label
Protected WithEvents Label9 As System.Web.UI.WebControls.Label
Protected WithEvents Label10 As System.Web.UI.WebControls.Label
Protected WithEvents Label11 As System.Web.UI.WebControls.Label
Protected WithEvents TextBox10 As System.Web.UI.WebControls.TextBox
Protected WithEvents Label13 As System.Web.UI.WebControls.Label
Protected WithEvents Label12 As System.Web.UI.WebControls.Label
304

Protected WithEvents Button2 As System.Web.UI.WebControls.Button


Protected WithEvents Button1 As System.Web.UI.WebControls.Button
Protected WithEvents Label14 As System.Web.UI.WebControls.Label
Protected WithEvents Label15 As System.Web.UI.WebControls.Label
Protected WithEvents Label16 As System.Web.UI.WebControls.Label
Protected WithEvents Button3 As System.Web.UI.WebControls.Button
Dim dr As DataRow

Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init


'CODEGEN: This method call is required by the Web Form Designer
'Do not modify it using the code editor.
FormsAuthentication.SetAuthCookie(TextBox1.Text, False)
End Sub
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Put user code to initialize the page here
Dim s As String = "data source=localhost;initial catalog=dtname;integrated security=true"
Dim conn As New SqlClient.SqlConnection(s)
Try
conn.Open()
If conn.State = ConnectionState.Open Then
Label4.Text = "<em>Veritabanına bağlantı var...</em> "
Else
Label4.Text = "<em><font color=red>veritabanına bağlantı yapılamıyor!...</em> </font>"
End If
conn.Close()
Catch ex As Exception
Label4.Text = "<em><font color=red>Veritabanına bağlantı yapılamıyor!...</em></font>"
End Try
Application.Lock()
Application("Visitors") += 1
Application.UnLock()
Label4.Text &= "<br>Ziyaretci Sayısı= " & Application("Visitors")
End Sub
Function bul2(ByVal ad As String)
Dim email As String = "" 'bulunamazsa boşluk olur
Dim s As String = "data source=localhost;initial catalog=dtname;integrated security=true"
Dim conn As New SqlClient.SqlConnection(s)
Dim dp1 As New SqlClient.SqlParameter("@ad", SqlDbType.Char)
Dim da As New SqlClient.SqlDataAdapter("select * from kullanicis where ad=@ad", conn)
Dim ds As New DataSet
dp1.Value = ad
da.SelectCommand.Parameters.Add(dp1)
conn.Open()
sifre = ""
da.Fill(ds, "kullanicis")
If ds.Tables(0).Rows.Count > 0 Then
email = ds.Tables(0).Rows(0)(4)
sifre = ds.Tables(0).Rows(0)(2)
End If
conn.Close()
Return email
End Function
Function bul(ByVal ad As String, ByVal sifre As String)
Dim tamam As Boolean = False
Dim s As String = "data source=localhost;initial catalog=dtname;integrated security=true"
Dim conn As New SqlClient.SqlConnection(s)
Dim dp1 As New SqlClient.SqlParameter("@ad", SqlDbType.Char)
Dim dp2 As New SqlClient.SqlParameter("@sifre", SqlDbType.Char)
Dim da As New SqlClient.SqlDataAdapter("select * from kullanicis where ad=@ad and sifre=@sifre", conn)
Dim ds As New DataSet
dp1.Value = ad
dp2.Value = sifre
da.SelectCommand.Parameters.Add(dp1)
da.SelectCommand.Parameters.Add(dp2)
conn.Open()
da.Fill(ds, "kullanicis")
If ds.Tables(0).Rows.Count > 0 Then
tamam = True
End If
conn.Close()
Return tamam
End Function
Private Sub Submit1_ServerClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
Submit1.ServerClick
If ((TextBox1.Text <> "") And (TextBox2.Text <> "")) Then
305

If bul(TextBox1.Text, TextBox2.Text) Then


Application.Lock()
Application("Ad") = TextBox1.Text
Application("Sifre") = TextBox2.Text
Application.UnLock()

Response.Redirect("dataform1.aspx")
'TextBox1.Text = "olur"
End If
Else
TextBox1.Text = "hata"
End If
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


Dim email As String
email = bul2(TextBox6.Text)
If TextBox6.Text <> "" And TextBox5.Text <> "" And _
TextBox6.Text <> "admin" And _
TextBox4.Text <> "" And TextBox3.Text <> "" And TextBox4.Text = TextBox5.Text And _
email = "" Then
Dim s As String = "data source=localhost;initial catalog=dtname;integrated security=true"
Dim conn As New SqlClient.SqlConnection(s)
Dim dp1 As New SqlClient.SqlParameter("@ad", SqlDbType.Char)
Dim dp2 As New SqlClient.SqlParameter("@sifre", SqlDbType.Char)
Dim dp3 As New SqlClient.SqlParameter("@email", SqlDbType.Char)
Dim da As New SqlClient.SqlDataAdapter
Dim ds As New DataSet
da.InsertCommand = New SqlClient.SqlCommand
da.InsertCommand.Connection = conn
da.InsertCommand.CommandText = "INSERT INTO kullanicis (ad,sifre, email) VALUES (@ad, @sifre, @email)"
dp1.Value = TextBox6.Text
dp2.Value = TextBox5.Text
dp3.Value = TextBox3.Text
Label12.Text = "-" & da.InsertCommand.CommandText
da.InsertCommand.Parameters.Add(dp1)
da.InsertCommand.Parameters.Add(dp2)
da.InsertCommand.Parameters.Add(dp3)
conn.Open()
da.InsertCommand.ExecuteNonQuery()
conn.Close()
Label12.Text = "Üyelik ücretsizdir.<br>Üyelik kabul edilmiştir."
TextBox6.Text = ""
TextBox5.Text = ""
TextBox4.Text = ""
TextBox3.Text = ""
Else
Label12.Text = "Üyelik ücretsizdir.<br><font color=red>Üyelik formunda bir <b>hata</b>
oluştu!<br>Aynı isimde bir kullanıcı olabilir veya formda eksiklikler var...</font>"
End If
End Sub
Function SendMailEx(ByVal toAdress, ByVal toName, ByVal subject, ByVal Body)
Dim email As New System.Web.Mail.MailMessage
email.To = toAdress
email.From = "SenderAddress"
email.Body = Body
email.Subject = subject
email.BodyFormat = Web.Mail.MailFormat.Text
System.Web.Mail.SmtpMail.SmtpServer = "localhost"
'System.Web.Mail.SmtpMail.Send(email) 'şimdilik çalışmıyor
End Function

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click


Dim email As String
email = bul2(TextBox10.Text)
If email <> "" Then
SendMailEx(email, "Telefon Rehberi", "Şifre Hatırlat", "Şifreniz: " & sifre)
Label14.Text = "<b><font color=blue>Şifreniz email adresinize gönderildi.</font></b>"
'Label14.Text = email
Else
Label14.Text = "<b><font color=red>Üye bulunamadı!</font></b>"
End If
End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click


306

Application("Ad") = ""
Application("Sifre") = ""
Response.Write("<script>self.close();</script>")
End Sub

Private Sub InitializeComponent()

End Sub
End Class

dataform1.aspx.vb kodlar×:

Imports System.Web.Security
Public Class DataWebForm1
Inherits System.Web.UI.Page

Dim cs, cv As DataView


Dim ds As New DataSet
Dim dr As DataRow
Dim sira As String
Dim adT As System.Web.UI.WebControls.TextBox
Dim adTy As String
Dim no_T As System.Web.UI.WebControls.TextBox
Dim no_Ty As String
Dim telT As System.Web.UI.WebControls.TextBox
Dim tely As String
Dim emailT As System.Web.UI.WebControls.TextBox
Dim emaily As String
Dim not1T As System.Web.UI.WebControls.TextBox
Dim not1y As String
Dim not2T As System.Web.UI.WebControls.TextBox
Dim eskiad As String
Dim not2y As String
Dim eskino As String
Dim eskitel As String
Dim eskiemail As String
Dim eskinot1 As String
Dim eskinot2 As String
Protected WithEvents SqlSelectCommand1 As System.Data.SqlClient.SqlCommand
Protected WithEvents SqlInsertCommand1 As System.Data.SqlClient.SqlCommand
Protected WithEvents Label2 As System.Web.UI.WebControls.Label
Protected WithEvents siraLabel As System.Web.UI.WebControls.Label
Protected WithEvents yonLabel As System.Web.UI.WebControls.Label
Protected WithEvents Label5 As System.Web.UI.WebControls.Label
Protected WithEvents HyperLink1 As System.Web.UI.WebControls.HyperLink
Protected WithEvents Label1 As System.Web.UI.WebControls.Label
Protected WithEvents SqlCommand1 As System.Data.SqlClient.SqlCommand
Protected WithEvents Label3 As System.Web.UI.WebControls.Label
Protected WithEvents Button4 As System.Web.UI.WebControls.Button
Protected WithEvents Button2 As System.Web.UI.WebControls.Button
Protected WithEvents Button1 As System.Web.UI.WebControls.Button
Protected WithEvents TextBox5 As System.Web.UI.WebControls.TextBox
Protected WithEvents TextBox3 As System.Web.UI.WebControls.TextBox
Protected WithEvents TextBox2 As System.Web.UI.WebControls.TextBox
Protected WithEvents TextBox1 As System.Web.UI.WebControls.TextBox
Protected WithEvents TextBox4 As System.Web.UI.WebControls.TextBox
Protected WithEvents Button3 As System.Web.UI.WebControls.Button
Protected WithEvents TextBox6 As System.Web.UI.WebControls.TextBox
Protected WithEvents Button5 As System.Web.UI.WebControls.Button
Protected WithEvents CheckBox1 As System.Web.UI.WebControls.CheckBox
Protected WithEvents DataView1 As System.Data.DataView
Protected WithEvents DataGrid1 As System.Web.UI.WebControls.DataGrid
Protected WithEvents SqlCommand2 As System.Data.SqlClient.SqlCommand

#Region " Web Form Designer Generated Code "

'This call is required by the Web Form Designer.


<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.objDataSet21 = New wa2.DataSet21
Me.SqlConnection1 = New System.Data.SqlClient.SqlConnection
Me.SqlDataAdapter1 = New System.Data.SqlClient.SqlDataAdapter
Me.SqlCommand1 = New System.Data.SqlClient.SqlCommand
Me.SqlInsertCommand1 = New System.Data.SqlClient.SqlCommand
Me.SqlSelectCommand1 = New System.Data.SqlClient.SqlCommand
Me.SqlCommand2 = New System.Data.SqlClient.SqlCommand
307

Me.DataView1 = New System.Data.DataView


CType(Me.objDataSet21, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.DataView1, System.ComponentModel.ISupportInitialize).BeginInit()
'
'objDataSet21
'
Me.objDataSet21.DataSetName = "DataSet21"
Me.objDataSet21.Locale = New System.Globalization.CultureInfo("tr-TR")
'
'SqlConnection1
'
Me.SqlConnection1.ConnectionString = "workstation id=EV;packet size=4096;integrated security=SSPI;data
source=ev;persis" & _
"t security info=False;initial catalog=dtname"
'
'SqlDataAdapter1
'
Me.SqlDataAdapter1.DeleteCommand = Me.SqlCommand1
Me.SqlDataAdapter1.InsertCommand = Me.SqlInsertCommand1
Me.SqlDataAdapter1.SelectCommand = Me.SqlSelectCommand1
Me.SqlDataAdapter1.TableMappings.AddRange(New System.Data.Common.DataTableMapping() {New
System.Data.Common.DataTableMapping("Table", "tablo1", New System.Data.Common.DataColumnMapping() {New
System.Data.Common.DataColumnMapping("sira", "sira"), New System.Data.Common.DataColumnMapping("ad", "ad"), New
System.Data.Common.DataColumnMapping("no", "no"), New System.Data.Common.DataColumnMapping("tel", "tel"), New
System.Data.Common.DataColumnMapping("email", "email"), New System.Data.Common.DataColumnMapping("not1",
"not1"), New System.Data.Common.DataColumnMapping("not2", "not2")})})
Me.SqlDataAdapter1.UpdateCommand = Me.SqlCommand2
'
'SqlCommand1
'
Me.SqlCommand1.CommandText = "DELETE FROM tablo1 WHERE (ad = @ad)"
Me.SqlCommand1.Connection = Me.SqlConnection1
Me.SqlCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@ad",
System.Data.SqlDbType.VarChar, 10, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte),
"ad", System.Data.DataRowVersion.Original, Nothing))
'
'SqlInsertCommand1
'
Me.SqlInsertCommand1.CommandText = "INSERT INTO tablo1 (sira, ad, no, tel, email, not1, not2) VALUES
(@sira, @ad, @no" & _
", @tel, @email, @not1, @not2); SELECT sira, ad, no, tel, email, not1, not2 FROM " & _
"tablo1"
Me.SqlInsertCommand1.Connection = Me.SqlConnection1
Me.SqlInsertCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@sira",
System.Data.SqlDbType.VarChar, 10, "sira"))
Me.SqlInsertCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@ad",
System.Data.SqlDbType.VarChar, 10, "ad"))
Me.SqlInsertCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@no",
System.Data.SqlDbType.VarChar, 10, "no"))
Me.SqlInsertCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@tel",
System.Data.SqlDbType.VarChar, 10, "tel"))
Me.SqlInsertCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@email",
System.Data.SqlDbType.VarChar, 10, "email"))
Me.SqlInsertCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@not1",
System.Data.SqlDbType.Float, 8, "not1"))
Me.SqlInsertCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@not2",
System.Data.SqlDbType.Float, 8, "not2"))
'
'SqlSelectCommand1
'
Me.SqlSelectCommand1.CommandText = "SELECT sira, ad, no, tel, email, not1, not2 FROM tablo1"
Me.SqlSelectCommand1.Connection = Me.SqlConnection1
'
'SqlCommand2
'
Me.SqlCommand2.CommandText = "UPDATE tablo1 SET sira = @sira, ad = @ad, no = @no, tel = @tel, email =
@email, n" & _
"ot1 = @not1, not2 = @not2 WHERE (ad = @eskiad) AND (no = @eskino) AND (tel = @es" & _
"kitel) AND (email = @eskiemail) AND (not1 = @eskinot1) AND (not2 = @eskinot2)"
Me.SqlCommand2.Connection = Me.SqlConnection1
Me.SqlCommand2.Parameters.Add(New System.Data.SqlClient.SqlParameter("@sira",
System.Data.SqlDbType.VarChar, 10, "sira"))
Me.SqlCommand2.Parameters.Add(New System.Data.SqlClient.SqlParameter("@ad",
System.Data.SqlDbType.VarChar, 10, "ad"))
308

Me.SqlCommand2.Parameters.Add(New System.Data.SqlClient.SqlParameter("@no",
System.Data.SqlDbType.VarChar, 10, "no"))
Me.SqlCommand2.Parameters.Add(New System.Data.SqlClient.SqlParameter("@tel",
System.Data.SqlDbType.VarChar, 10, "tel"))
Me.SqlCommand2.Parameters.Add(New System.Data.SqlClient.SqlParameter("@email",
System.Data.SqlDbType.VarChar, 10, "email"))
Me.SqlCommand2.Parameters.Add(New System.Data.SqlClient.SqlParameter("@not1",
System.Data.SqlDbType.Float, 8, "not1"))
Me.SqlCommand2.Parameters.Add(New System.Data.SqlClient.SqlParameter("@not2",
System.Data.SqlDbType.Float, 8, "not2"))
Me.SqlCommand2.Parameters.Add(New System.Data.SqlClient.SqlParameter("@eskiad",
System.Data.SqlDbType.VarChar, 10, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte),
"ad", System.Data.DataRowVersion.Original, Nothing))
Me.SqlCommand2.Parameters.Add(New System.Data.SqlClient.SqlParameter("@eskino",
System.Data.SqlDbType.VarChar, 10, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte),
"no", System.Data.DataRowVersion.Original, Nothing))
Me.SqlCommand2.Parameters.Add(New System.Data.SqlClient.SqlParameter("@eskitel",
System.Data.SqlDbType.VarChar, 10, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte),
"tel", System.Data.DataRowVersion.Original, Nothing))
Me.SqlCommand2.Parameters.Add(New System.Data.SqlClient.SqlParameter("@eskiemail",
System.Data.SqlDbType.VarChar, 10, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte),
"email", System.Data.DataRowVersion.Original, Nothing))
Me.SqlCommand2.Parameters.Add(New System.Data.SqlClient.SqlParameter("@eskinot1",
System.Data.SqlDbType.Float, 8, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte),
"not1", System.Data.DataRowVersion.Original, Nothing))
Me.SqlCommand2.Parameters.Add(New System.Data.SqlClient.SqlParameter("@eskinot2",
System.Data.SqlDbType.Float, 8, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte),
"not2", System.Data.DataRowVersion.Original, Nothing))
'
'DataView1
'
Me.DataView1.Table = Me.objDataSet21.tablo1
CType(Me.objDataSet21, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.DataView1, System.ComponentModel.ISupportInitialize).EndInit()

End Sub
Protected WithEvents objDataSet21 As wa2.DataSet21
Protected WithEvents SqlConnection1 As System.Data.SqlClient.SqlConnection
Protected WithEvents SqlDataAdapter1 As System.Data.SqlClient.SqlDataAdapter
Protected WithEvents tablo As System.Web.UI.WebControls.DataGrid

'NOTE: The following placeholder declaration is required by the Web Form Designer.
'Do not delete or move it.
Private designerPlaceholderDeclaration As System.Object

Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init


'CODEGEN: This method call is required by the Web Form Designer
'Do not modify it using the code editor.
InitializeComponent()
ds = objDataSet21
SqlDataAdapter1.SelectCommand.CommandText = "select * from tablo1 order by ad asc"
siraLabel.Text = "ad"
yonLabel.Text = "asc"
sira = "ad"
Label2.Text = ""
tablo.SelectedIndex = -1
End Sub

#End Region

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


'Put user code to initialize the page here

If (Trim(Application("Ad")) <> "") And (Trim(Application("Sifre")) <> "") Then


LoadDataSet()
Else
Response.Write("<script> alert ('Şifresiz Giriş Yapılamaz!')</script>")
Button1.Enabled = False
Button2.Enabled = False
Button3.Enabled = False
Response.Redirect("index.aspx")
End If
Dim a As String
a = Application("Ad")
Label3.Text = "<b>Kullanıcı:</b> " & a
309

If Request("filtrele") <> "" Then


DataView1.RowFilter = "ad like '%" & Request("filtrele") & "%'"
DataView1.Sort = siraLabel.Text & " " & yonLabel.Text
DataGrid1.DataSource = DataView1
DataGrid1.DataBind()
DataGrid1.Visible = True
Label1.Text = "<b>Filtre metni:</b> *" & Request("filtrele") & "*"
Else
DataGrid1.Visible = False
End If
If Request("silinsin") = "evet" Then
Label1.Text = "<b>Silinen kayıt:</b> " & Request("silinecek")
SqlDataAdapter1.DeleteCommand.Connection.Open()
SqlDataAdapter1.DeleteCommand.Parameters.Item(0).Value = Request("silinecek")
SqlDataAdapter1.DeleteCommand.ExecuteNonQuery()
SqlDataAdapter1.DeleteCommand.Connection.Close()
Response.Write("<script> document.location.href='dataform1.aspx';</script>")
End If
'tablo.PagerStyle.NextPageText = "Sonraki - Aktif sayfa no: " & tablo.CurrentPageIndex
'yonLabel.Text = "DESC"
'yon = False

End Sub

Private Sub buttonLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Try
Me.LoadDataSet()
Me.tablo.SelectedIndex = -1
Me.tablo.DataBind()
Catch eLoad As System.Exception
Me.Response.Write(eLoad.Message)
End Try

End Sub
Function bul2(ByVal ad As String)
Dim sonuc As String = "" 'bulunamazsa boşluk olur
Dim s As String = "data source=localhost;initial catalog=dtname;integrated security=true"
Dim conn As New SqlClient.SqlConnection(s)
Dim dp1 As New SqlClient.SqlParameter("@ad", SqlDbType.Char)
Dim da As New SqlClient.SqlDataAdapter("select * from tablo1 where ad=@ad", conn)
Dim ds As New DataSet
dp1.Value = ad
da.SelectCommand.Parameters.Add(dp1)
conn.Open()
da.Fill(ds, "tablo1")
If ds.Tables(0).Rows.Count > 0 Then
sonuc = ds.Tables(0).Rows(0)(1)
End If
conn.Close()
Return sonuc
End Function
Public Sub LoadDataSet()
'Create a new dataset to hold the records returned from the call to FillDataSet.
'A temporary dataset is used because filling the existing dataset would
'require the databindings to be rebound.
sira = siraLabel.Text
If CheckBox1.Checked Then
yonLabel.Text = "ASC"
Else
yonLabel.Text = "DESC"
End If
If Request("filtrele") = "" Then DataGrid1.Visible = False
SqlDataAdapter1.SelectCommand.CommandText = "select * from tablo1 order by " & sira & " " &
yonLabel.Text
Dim objDataSetTemp As wa2.DataSet21
objDataSetTemp = New wa2.DataSet21
Try
'Attempt to fill the temporary dataset.
objDataSetTemp = CType(Me.objDataSet21.Clone, wa2.DataSet21)
Catch eFillDataSet As System.Exception
'Add your error handling code here.
Throw eFillDataSet
End Try
Try
'Empty the old records from the dataset.
310

objDataSet21.Clear()
'Merge the records into the main dataset.
objDataSet21.Merge(objDataSetTemp)
Catch eLoadMerge As System.Exception
'Add your error handling code here.
Throw eLoadMerge
End Try
SqlDataAdapter1.Fill(objDataSet21.tablo1)
tablo.SelectedIndex = -1
tablo.DataBind()
DataGrid1.DataBind()
Label2.Text = "<b>Sıralama: </b>" & sira & "<br><b>Yön:</b> " & _
yonLabel.Text & "<br><b>İşlemler</b>: sıralama(çift yön), listeleme(10'arlı sayfalama),
silme(onaylı)," & _
" ekleme, güncelleme, arama, filtreleme (ayrı bir tabloda), hesaplanan alanlar(ayrı tabloda),
kullanıcı girişi (kullanıcı ekleme, şifre hatırlatma)" & _
"<br> <i>(*) tam bitmedi</i><br><b>Kayıt sayısı:</b>" & _
Val(objDataSet21.tablo1.Count)
'tablo.PagerStyle.NextPageText = "Sonraki - Aktif sayfa no: " & tablo.CurrentPageIndex

End Sub
Private Sub tablo_PageIndexChanged(ByVal source As Object, ByVal e As
System.Web.UI.WebControls.DataGridPageChangedEventArgs) Handles tablo.PageIndexChanged
tablo.CurrentPageIndex = e.NewPageIndex
Label5.Text = tablo.CurrentPageIndex
'Session("sira") = sira
tablo.EditItemIndex = -1
LoadDataSet()
End Sub

Private Sub tablo_EditCommand(ByVal source As Object, ByVal e As


System.Web.UI.WebControls.DataGridCommandEventArgs) Handles tablo.EditCommand
tablo.EditItemIndex = e.Item.ItemIndex
tablo.SelectedIndex = e.Item.ItemIndex

adTy = tablo.SelectedItem.Cells(1).Text
no_Ty = tablo.SelectedItem.Cells(2).Text
tely = tablo.SelectedItem.Cells(3).Text
emaily = tablo.SelectedItem.Cells(4).Text
not1y = tablo.SelectedItem.Cells(5).Text
not2y = tablo.SelectedItem.Cells(6).Text

TextBox1.Text = IIf(adTy = "&nbsp;", "", adTy)


TextBox2.Text = IIf(no_Ty = "&nbsp;", "", no_Ty)
TextBox3.Text = IIf(tely = "&nbsp;", "", tely)
TextBox4.Text = IIf(emaily = "&nbsp;", "", emaily)
TextBox5.Text = IIf(not1y = "&nbsp;", "", not1y)
TextBox6.Text = IIf(not2y = "&nbsp;", "", not2y)
Button1.Enabled = True
Button3.Enabled = True
LoadDataSet()
End Sub

Private Sub tablo_DeleteCommand(ByVal source As Object, ByVal e As


System.Web.UI.WebControls.DataGridCommandEventArgs) Handles tablo.DeleteCommand
Label1.Text = "<b>Silinen kayıt:</b> " & tablo.Items(e.Item.ItemIndex).Cells(1).Text
SqlDataAdapter1.DeleteCommand.Connection.Open()
SqlDataAdapter1.DeleteCommand.Parameters.Item(0).Value = tablo.Items(e.Item.ItemIndex).Cells(1).Text
SqlDataAdapter1.DeleteCommand.ExecuteNonQuery()
SqlDataAdapter1.DeleteCommand.Connection.Close()
tablo.EditItemIndex = -1
LoadDataSet()
End Sub

Private Sub tablo_CancelCommand(ByVal source As Object, ByVal e As


System.Web.UI.WebControls.DataGridCommandEventArgs) Handles tablo.CancelCommand
tablo.EditItemIndex = -1
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
TextBox6.Text = ""
Button1.Enabled = False
Button3.Enabled = False
311

LoadDataSet()
End Sub
'kullanılmıyor
Private Sub tablo_UpdateCommand(ByVal source As Object, ByVal e As
System.Web.UI.WebControls.DataGridCommandEventArgs) Handles tablo.UpdateCommand
SqlDataAdapter1.UpdateCommand.Connection.Open()
SqlDataAdapter1.UpdateCommand.Parameters.Item(0).Value = ""
SqlDataAdapter1.UpdateCommand.Parameters.Item(1).Value = CType(e.Item.Cells(1).Controls(0),
System.Web.UI.WebControls.TextBox).Text
SqlDataAdapter1.UpdateCommand.Parameters.Item(2).Value = CType(e.Item.Cells(2).Controls(0),
System.Web.UI.WebControls.TextBox).Text
SqlDataAdapter1.UpdateCommand.Parameters.Item(3).Value = CType(e.Item.Cells(3).Controls(0),
System.Web.UI.WebControls.TextBox).Text
SqlDataAdapter1.UpdateCommand.Parameters.Item(4).Value = CType(e.Item.Cells(4).Controls(0),
System.Web.UI.WebControls.TextBox).Text
SqlDataAdapter1.UpdateCommand.Parameters.Item(5).Value = Val(CType(e.Item.Cells(5).Controls(0),
System.Web.UI.WebControls.TextBox).Text)
SqlDataAdapter1.UpdateCommand.Parameters.Item(6).Value = Val(CType(e.Item.Cells(6).Controls(0),
System.Web.UI.WebControls.TextBox).Text)
SqlDataAdapter1.UpdateCommand.Parameters.Item(7).Value = e.Item.Cells(1).Text
SqlDataAdapter1.UpdateCommand.ExecuteNonQuery()
SqlDataAdapter1.UpdateCommand.Connection.Close()

Label1.Text = "Kaydedilen: " & CType(e.Item.Cells(1).Controls(0),


System.Web.UI.WebControls.TextBox).Text & ", eski ad=" & e.Item.Cells(1).Text

TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
TextBox6.Text = ""
eskiad = ""
Button1.Enabled = False
Button3.Enabled = False
tablo.EditItemIndex = -1
LoadDataSet()
End Sub
'sıralama
Private Sub tablo_SortCommand(ByVal source As Object, ByVal e As
System.Web.UI.WebControls.DataGridSortCommandEventArgs) Handles tablo.SortCommand
Dim cv As DataView
cv = New DataView(ds.Tables("tablo1"))
cv.Sort = e.SortExpression

Label1.Text = "<b>Sıralanan alan:</b> " & cv.Sort


sira = e.SortExpression
siraLabel.Text = sira
tablo.EditItemIndex = -1
LoadDataSet()
End Sub
'seç komutu
Private Sub tablo_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
tablo.SelectedIndexChanged
Label1.Text = "<b>Seçili Kayıt:</b> " & tablo.SelectedItem.Cells(1).Text
adTy = tablo.SelectedItem.Cells(1).Text
no_Ty = tablo.SelectedItem.Cells(2).Text
tely = tablo.SelectedItem.Cells(3).Text
emaily = tablo.SelectedItem.Cells(4).Text
not1y = tablo.SelectedItem.Cells(5).Text
not2y = tablo.SelectedItem.Cells(6).Text
If eskiad = "" Then eskiad = tablo.SelectedItem.Cells(1).Text
TextBox1.Text = IIf(adTy = "&nbsp;", "", adTy)
TextBox2.Text = IIf(no_Ty = "&nbsp;", "", no_Ty)
TextBox3.Text = IIf(tely = "&nbsp;", "", tely)
TextBox4.Text = IIf(emaily = "&nbsp;", "", emaily)
TextBox5.Text = IIf(not1y = "&nbsp;", "", not1y)
TextBox6.Text = IIf(not2y = "&nbsp;", "", not2y)
Button1.Enabled = True
Button3.Enabled = True
Session.Add("eskiad", adTy)
Session.Add("eskino", no_Ty)
Session.Add("eskitel", tely)
Session.Add("eskiemail", emaily)
Session.Add("eskinot1", not1y)
312

Session.Add("eskinot2", not2y)
End Sub
'kullanılmıyor
Private Sub tablo_ItemDataBound(ByVal sender As Object, ByVal e As
System.Web.UI.WebControls.DataGridItemEventArgs) Handles tablo.ItemDataBound
Dim i As ListItemType
i = CType(e.Item.ItemType, ListItemType)
'If sira <> "" Then CType(e.Item.Controls(sira + 2), TableCell).Font.Bold = True
End Sub

'kaydet
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If Trim(TextBox1.Text) <> "" Then
eskiad = Session("eskiad")
eskino = Session("eskino")
eskitel = Session("eskitel")
eskiemail = Session("eskiemail")
eskinot1 = Session("eskinot1")
eskinot2 = Session("eskinot2")
adTy = TextBox1.Text
no_Ty = TextBox2.Text
tely = TextBox3.Text
emaily = TextBox4.Text
not1y = TextBox5.Text
not2y = TextBox6.Text

SqlDataAdapter1.UpdateCommand.Connection.Open()
SqlDataAdapter1.UpdateCommand.Parameters.Item(0).Value = ""
SqlDataAdapter1.UpdateCommand.Parameters.Item(1).Value = adTy
SqlDataAdapter1.UpdateCommand.Parameters.Item(2).Value = no_Ty
SqlDataAdapter1.UpdateCommand.Parameters.Item(3).Value = tely
SqlDataAdapter1.UpdateCommand.Parameters.Item(4).Value = emaily
SqlDataAdapter1.UpdateCommand.Parameters.Item(5).Value = Val(not1y)
SqlDataAdapter1.UpdateCommand.Parameters.Item(6).Value = Val(not2y)
SqlDataAdapter1.UpdateCommand.Parameters.Item(7).Value = eskiad
SqlDataAdapter1.UpdateCommand.Parameters.Item(8).Value = eskino
SqlDataAdapter1.UpdateCommand.Parameters.Item(9).Value = eskitel
SqlDataAdapter1.UpdateCommand.Parameters.Item(10).Value = eskiemail
SqlDataAdapter1.UpdateCommand.Parameters.Item(11).Value = eskinot1
SqlDataAdapter1.UpdateCommand.Parameters.Item(12).Value = eskinot2
SqlDataAdapter1.UpdateCommand.ExecuteNonQuery()
SqlDataAdapter1.UpdateCommand.Connection.Close()

Label1.Text = "Kaydedilen: " & adTy & ", eski ad=" & eskiad

TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
TextBox6.Text = ""
eskiad = ""
Button1.Enabled = False
Button3.Enabled = False
Else
Label1.Text = "Kayıt tamamlanamadı! Boş ad girişi yapılamaz."
End If
LoadDataSet()
End Sub
'Ekle
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim varmi As String
varmi = bul2(TextBox1.Text)
If varmi = "" And Trim(TextBox1.Text) <> "" Then
adTy = TextBox1.Text
no_Ty = TextBox2.Text
tely = TextBox3.Text
emaily = TextBox4.Text
not1y = TextBox5.Text
not2y = TextBox6.Text

SqlDataAdapter1.InsertCommand.Connection.Open()
SqlDataAdapter1.InsertCommand.Parameters.Item(0).Value = ""
SqlDataAdapter1.InsertCommand.Parameters.Item(1).Value = adTy
SqlDataAdapter1.InsertCommand.Parameters.Item(2).Value = no_Ty
313

SqlDataAdapter1.InsertCommand.Parameters.Item(3).Value = tely
SqlDataAdapter1.InsertCommand.Parameters.Item(4).Value = emaily
SqlDataAdapter1.InsertCommand.Parameters.Item(5).Value = Val(not1y)
SqlDataAdapter1.InsertCommand.Parameters.Item(6).Value = Val(not2y)
SqlDataAdapter1.InsertCommand.ExecuteNonQuery()
SqlDataAdapter1.InsertCommand.Connection.Close()

Label1.Text = "Eklenen: " & SqlDataAdapter1.InsertCommand.Parameters.Item(1).Value

TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
TextBox6.Text = ""
Else
Label1.Text = "Kayıt tamamlanamadı! Ad boş olamaz veya aynı ad ile giriş yapılamaz. " &
TextBox1.Text
End If
LoadDataSet()
End Sub

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)


If TextBox1.Text <> "" Then Button1.Enabled = True Else Button1.Enabled = False
If TextBox1.Text <> "" Then Button3.Enabled = True Else Button3.Enabled = False
End Sub
'sil
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Response.Write("<script> " & _
"cev=confirm('Seçili kayıt \'" & TextBox1.Text & "\' silinsin mi?'); " & _
"if (cev) document.location.href='dataform1.aspx?silinsin=evet&silinecek=" & TextBox1.Text & "'; " & _
"</script>")
End Sub

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click


TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
TextBox6.Text = ""
Label1.Text = "<b>Seçim iptal edildi...</b>"
Button1.Enabled = False
Button3.Enabled = False
tablo.EditItemIndex = -1
DataGrid1.Visible = False
LoadDataSet()
End Sub

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click


Response.Write("<script> " & _
"cev=prompt('Arama metni giriniz','');" & _
"if (cev) {cev='dataform1.aspx?filtrele='+cev;document.location.href=cev; }" & _
"</script>")
End Sub

Private Sub DataGrid1_PageIndexChanged(ByVal source As Object, ByVal e As


System.Web.UI.WebControls.DataGridPageChangedEventArgs) Handles DataGrid1.PageIndexChanged
DataGrid1.CurrentPageIndex = e.NewPageIndex
End Sub
End Class
314

19. okul3d (Sanal Gerçeklik Örneği - VRML)


(Ornekler\Diger\okul3d4.zip)

Bu uygulamam×zda, nihayet internet žzerinde de rahatl×kla Œal×Ģan bir 3d sayfam×z oluyor. Yap×m tarihinin
s×ras×na g™re aĢağ×da birkaŒ resmi g™ržyorsunuz.

Resim 23a – Yap×m aĢamalar×na g™re VRML site tasar×m×

ISB – Internet Scene Builder (parallelgraphics.com) program× ile bu ™rnek yap×ld×. Daha bitmedi asl×nda.
Eksikler animasyon ve gerekli sağlam linkler. Animasyon ile ilgili en gžzel Œal×Ģmam
“Ornekler\Diger\VRMLcalismalarim.zip” iŒindeki evim.wrl. Kap×lar otomatik aŒ×labiliyor, nesneler sžržklenebiliyor ve
Ģ™minede ateĢ yanma efekti bile var. Biz de okul3d‟de arabalar× hareket ettirebiliriz, kap×lar× sžrgžlž yapabiliriz,
aŒ×labilen raflar, kitapl×k gibi Ģeyler ekleyebiliriz. outline3d.com sitesinde gžzel emlakŒ×l×k ™rnekleri var. …ye olarak
yapt×ğ×n×z tasar×m× kaydedebilirsiniz. ok aramama rağmen sohbet kodlar×n× bulamad×m. 3d sohbet Œok ilginŒ olabilirdi.

VRML‟nin bilgisayar×m×zda Œal×Ģmas× iŒin ™rneğin Internet Explorer iŒin Cortona, CosmoPlayer veya Blaxxun
Contact gibi eklentiler gerekli. Birini rahatl×kla internet žzerinden indirebilirsiniz. „rneğin Cortona‟y× yžklediğimizde
art×k IE *.wrl dosyalar× tan×yor ve aŒabiliyor. Resimlerde de g™ržldžğž gibi sol ve alt k×s×mlarda araŒ Œubuklar× ile
yard×mc× olmaya Œal×Ģ×yor. Sahneye sağ t×klay×p diğer ayarlara ulaĢabilirsiniz. SeŒeneklerde dikkatimi Œeken bir ayar da
315

DirectX, OpenGL ve kendi 3d motoru aras×nda rahatl×kla geŒiĢ yap×labilmesi. FPS – frame per second h×z×n×z× art×rmak
iŒin ayarlar ile oynayabilirsiniz. Ya da makineni iyi ise ™rneğin real-time – antialiasing (gerŒek zamanl× kenar
džzeltme) yapabilirsiniz.

Sahnedeki baz× resimleri, dijital fotoğraf makinemle Œektim. Mesela duvardaki telefon gibi, yerdeki taĢlar gibi.
Ama abart×p daha gerŒek gibi g™zžksžn diye heryeri bžtžn olarak Œekip, duvarlar× ™yle kaplamak zor bir iĢ. Oyunlarda
genelde kžŒžk parŒalar halinde gerŒek pencere, duvar, nesne(hal×, tablo,…) resimleri Œekilerek d™Ģeniyor.

Animasyon iŒin en kullan×Ģl× program ISA – Internet Scene Assembler. Zaman Œizgisi žzerinde, Flash program×
gibi tasar×mlar yap×l×yor. HiŒbir programlama veya kod yaz×m× olmadan animasyon haz×rlanabiliyor. Karakter
animasyonu iŒin kullan×labilecek program da ICA – Internet Character Animator.

Metin edit™rž olarak VRMLPad kullan×larak *.wrl dosyalar džz yaz× dosyas× olarak aŒ×l×p değiĢtirilebilir.
Normalde Œok uzun dosyalar *.zip gibi s×k×Ģt×r×larak IE iŒinde g™sterilebiliyor. S×k×Ģt×rmaya rağmen VRMLPad gžzelce o
dosyay× aŒ×p džzenleyebiliyor.

Akl×ma BlueDream‟daki veya Yunus‟da 3d Œ×k×Ģ – export olarak VRML de eklemek geliyor, ama Œok uzun iĢ
olduğu iŒin Ģimdilik hayal olarak kal×yor. Ayn× PHP ve ASP Œ×k×Ģ fikri gibi. Yunus‟da HTML ile uğraĢ×rken bile Œok zaman
harcam×Ģt×m.

Resim 23b – ISB tasar×m ekran×

VRML tasar×m arac× olarak bence en kullan×Ģl× olan ISB‟yi tavsiye ediyorum. 3DMax ile de VRML Œ×k×Ģ
verilebiliyor. Ya da daha doğrusu tžm popžler tasar×m araŒlar× VRML desteklidir. Resim 23b‟de g™ržldžğž gibi tek
pencerede hemen canl× olarak hem tasar×m× hem de Œal×Ģma halini g™rebiliyoruz. Asl×nda bu program VRML1.0
destekli. Yani d×Ģar×dan nesne eklerken VRML2.0 ile yap×lm×Ģ olanlarda sorun Œ×k×yor. Bir nesne veya sahneyi yžzde
yžz ayn×s×n× yapacağ×m derseniz tek yapman×z gereken sab×rla uğraĢmak. Ġlle de t×pat×p ayn×s× olmak zorunda olmasa
da, daha ™nce gidilmiĢ bir yeri internet žzerinde g™rmek ilginŒ. Baz× havaalanlar×, mžzeler, Ģehirleri internet žzerinde
bulabilirsiniz. Hatta baz× siteler turistik gezi bile yapt×r×yorlar.
316

20. Net Pazar (PHP ve MySQL ile internette bit pazarı kurmak)
(Ornekler\Diger\netpazar.zip)

Bu projede yine PHP ile etkileĢimli sayfalar yap×yoruz. 30 saatlik k×sa bir Œal×Ģma ile iki hafta gibi sžrede, 1650
sat×r koda yaz×p, son haline geldik. Amac×m×z, insanlar×n üyelik gerektirmeden (žyelik formlar× hep hatal× ve yanl×Ģ
bilgilerle dolduruluyor ve Ģifre genelde unutuluyor) cep telefonu, kitap, otomobil gibi eĢyalar×n× duyuru olarak
b×rakmalar×, istendiğinde de duyurunun sžresini uzatabilmeleridir. Duyuru y™neticinin izin vermesi ile aktif hale
geliyor. Kabul tarihinden itibaren, eğer 7 gžnlžk sžre geŒmiĢse, duyuru resmi de varsa kendini siliyor. „nceki
projelerdeki gibi, burada da resim yollama ve eposta atma seŒenekleri de var.

Kulland×ğ×m program bu defa Crimson Editor değil, Dreamweaver MX 2004 oldu. Kod tamamlama,
renklendirme ve benzeri gžzel ™zelliklerinden dolay× bu sefer DW‟× seŒtim. ok az resim var ama, yine de Fireworks ile
bir iki džzeltme de yapt×ğ×m× s™ylemem gerek. DHTML kullanarak resimli duyurular× aŒmadan, fare ile žzerine gelince
resimlerini g™rebiliyoruz. Layer (katman) nesnesinin g™ržnžr veya gizli olma halini yine JavaScript olmasa yapamay×z.
Veritaban×n× tablo olarak g™sterirken yine Œok gerekli olan s×ralama, grup ya da blok halinde kay×tlar× listeleme
(SQL‟deki limit komutu tam bu iĢ iŒindir) ve arama da Œok gerekli kodlamalard×r.

Kurulum ad×mlar×:
1- "apache/htdocs/pazar" dizinine dosyalar× aŒ×n×z.
2- phpMyAdmin arabiriminde “vt.sql” dosyas×n× Œal×Ģt×rarak, 2 tabloyu (admin, netpazar) oluĢturunuz.
3- Linux‟da resim g™nderimi iŒin "apache/htdocs/pazar/yollanan" klas™ržne yazma hakk× verin. Windows iŒin
buna gerek yoktur.
4- "conf.php" dosyas×nda gerekli ayarlar× yap×n×z.
5- "http://localhost/pazar" Œal×Ģmal×d×r. Y™neticinin varsay×lan ad×:admin, Ģifresi:123‟džr.

Duyuru ekleme fikri yerine, dosya, resim, program ekleme de rahatl×kla bu projede olabilir. Ya da tek baĢ×na
download (dosya indirme) sitesi de yap×labilir. Eğer programc×l×kla ilgili bir site yap×lacaksa, kod yollama da olabilir.
Kategoriler mesela C, Java, Basic gibi olabilir. Buna benzer ASP&MDB ™rneğimiz B™lžm 7 – 12. konudaki myasp‟dir.
2001 tarihli Œal×Ģmamda brinkster.com‟da Œal×Ģacak Ģekilde 3 modžl; misafir defteri, link ekleme ve program ekleme
sitesi tasarlad×m. PHP kadar geliĢkin olmasa da…

Daha ™nce de dediğim gibi, internet programc×l×ğ× art×k Œok kolaylaĢ×yor. K×sa sžrede gžŒlž veritaban× alt yap×s×
ile fonksiyonel siteler haz×rlanabilir. Gžvenlik sorunu da halledilince ticari uygulamalar rahatl×kla internette Œal×Ģacak
Ģekilde yap×labilir.

Asl×nda ebay.com gibi duyurular žzerinde pazarl×k, aŒ×k art×rma da yap×labilir. Bunun iŒin žyelik sistemi
geliĢtirilmesi laz×md×r. Hatta kredi kart× ile sat×n alma, hemen sipariĢ etme, paypal.com gžvenli ağ arac×l×ğ× ile al×ĢveriĢ
de olabilir.
317
318

Resim 24 – Net Pazar‟×n tžm ekran g™ržntžleri


319

21. Trafik Simulasyonu (Flash Action Script)


(Ornekler\Diger\trafik.zip)

Resim 25 – Trafik ekran g™ržntžsž

Flash MX 2004 ile daha doğrusu Action Script 2.0 ile bu projeyi tasarl×yoruz, programl×yoruz. Delphi kullanarak
Beyoğlu Teknik Lisesinde buna benzer temrin yapm×Ģt×k. Ama kodlar× alamam×Ģt×m. Hemen hemen bu g™ržntžye
sahipti. Bu proje žzerinde 1 haftac×k uğraĢt×m. Script k×sm× biraz zorlasa da animasyon iŒin en iyi araŒ Flash galiba.
VRML olarak da ISA program×nda 3 boyutlu kavĢak ™rneği bulabilirsiniz.

Sar× ×Ģ×k seŒeneği ile arabalar×n serbest Ģekilde, ™nce gelen geŒerek trafik ak×yor. Normal ×Ģ×klara gelince
araŒlar×n zamanla y×ğ×ld×ğ× g™ržlebilir. Birbirlerine Œarpmamalar× iŒin etraflar×nda gžvenlik Ģeridi var. Fakat bazen tam
žst žste geldiklerinde iki araŒ da olduklar× yerde kal×yor. Bunun d×Ģ×nda bžyžk bir hata yok bence. Trafik ×Ģ×klar×n×n
sžresi Œok k×sa gibi. Asl×nda dinamik olarak, trafiğin yoğunluğuna g™re, sžre de değiĢtirilebilirdi. Temel olarak trafik
×Ģ×klar× yayalar iŒin yap×lm×Ģ. ġimdilik onlar yok, diğer tžrde araŒlar da yok. Yani kamyon, otobžs veya bisiklet de araŒ
olarak eklenebilmelidir.

AraŒ say×s× artt×kŒa žst sol k™Ģedeki fps (frame per second – saniyedeki kare say×s×) azal×yor. Aynen MyBoard
projemde de zamanla yavaĢlama oluyor hat×rlarsan×z. Normalde Delphi, VB veya baĢka dilde birŒok iŒ iŒe for, while
d™ngžsž rahatl×kla, h×z× etkilemeden kullan×labilirken, Flash iŒinde hemen h×z džĢžyor. Belki k™tž programla
y™ntemimden kaynaklan×yor veya her kžŒžk filme (movieClip) kod eklenmesi sonsuz d™ngžlere sebep oluyordur.
Demek ki Œok kar×Ģ×k olmayan, mesela fizik konusundaki kald×raŒ, kimya konusundaki mikroskop gibi ufak boyutlu
animasyonlar× Flash ile yapmak, sonra da onlar× HTML, PHP, ASP ile birleĢtirmek daha uygun.

Daha ™nceki Flash ile kayan yaz× ™rneğimizde de HTML ile Flash haberleĢiyordu. Trafik ve MyBoard‟×n Export
ayarlar×n× *.exe yapmaya g™re ayarlad×m. Ama bu iki proje web sayfas× iŒinde de olabilirdi.

Buna benzer tren duraklar× simžlasyonu da yapabiliriz. Daha kar×Ģ×k metro yollar×, iŒ iŒe, alt geŒitli, žst geŒitli
Œ™zžmlere de g™rsel olarak yard×mc× olabiliriz.

Flash ile ilgili birkaΠipucu:

1) Tam ekran uygulama


$$fullscreen = true;
fscommand("fullscreen", "true");
_quality = "HIGH";
320

2) Tžm nesneleri tarama


for (name in _root)
{
var obj = _root[name];
var ad = obj._name;
if (ad.substring(0, 9) == "bati_car_")
{
a++;
}
}

3) Yeni nesne tžretme


ara = _root.getNextHighestDepth();
_root.guney_araba.duplicateMovieClip("guney_car_"+ara, ara);
_root["guney_car_"+ara]._y = 200;

4) Zamanlay×c×(timer) oluĢturma
function ilerle(){
trace ("OK"); //output ekranına yazı yollama (Ctrl+Enter için geçerli)
}
myGlobalTimerIlerle = setInterval(ilerle, 100);

if (_root.islemBasladi == false)
{
clearInterval(myGlobalTimerIlerle);//timer iptal edilir
}

5) Sahne yžklendiğinde d×Ģar×dan film yžklenmesi


ifFrameLoaded (1)
{
for (name in _root)
{
removeMovieClip(_root[name]); //nesne silme
}
loadMovieNum("timer.swf", 10); //aktif swf'nin hemen yanında bulunmalıdır.
}

6) Fare ipuŒlar× yapma


on (rollOver) {
this.araba_adi.text = this._name;
this.araba_adi._visible = true;
}
on (rollOut) {
this.araba_adi._visible = false;
}

7) Alt nesnelere nas×l ulaĢ×r×z?


for (name in _root)
{
//tüm tiptouch lar gizlenir
if (name.substring(0, 4) == "mlzm")
{
var objt = _root[name];
for (each in objt) //işte burası!
{
var objin = objt[each];
if (objin._name.substring(0, 8) == "TipTouch")
{
objin._visible = false;
}
}
}
}

8) Ġki nokta aras×ndaki aŒ×n×n derecesi


321

aci = Math.atan((_root.sonNoktaY-_root.ilkNoktaY)/
(_root.sonNoktaX-_root.ilkNoktaX))
*180/Math.PI;

9) D×Ģar×ndan metin dosya ekleme


loadVariables("english.txt", "_root");
örnek içerik:
&durdur_metni=Stop
&calistir_metni=Run
...

10) Nesne seviyesini değiĢtirme


mx.behaviors.DepthControl.sendToBack(this);
mx.behaviors.DepthControl.bringForward(this);

11) Ġnternet adresi aŒmak


getURL("readme.txt","_blank");

12) Program× kapatmak


on (release) {
fscommand("quit");
}

13) Rasgele komutu ve case komutu orneği


function yonBelirle(kim) {
var objt = _root[kim];
yon = random(3);
switch (yon)
{
case 0 :
objt.yon_ileri._rotation = 0;
break;
case 1 :
objt.yon_ileri._rotation = 90;
break;
case 2 :
objt.yon_ileri._rotation = 270;
break;
}
}
322

22. Labirent Robotu Simulasyonu (Flash 8 Action Script)


(Ornekler\Diger\labir4.zip)

4x4 hžcrede bir robotun kendiliğinden yol bulmas×. ok az kod yazarak bu hale geldi. Asl×nda gerŒek bir yapay
zeka program× değil. Esnek duvarlar×n engellemesi ile araba kendi yolunu buluyor. Genelde hep belli bir yerde d™nžp
duruyor. Sadece sağ ve sol boĢ olunca random (rasgele sağ veya sol) karar veriyor. Okulda PIC ile yap×lm×Ģ bir
labirent robotundan ™rnek ald×m. Resimde de o robotun yollar× var. Benzer olarak Œal×Ģt×ğ×n× g™remedim ama, uzaktan
kumandal× (RF radio frequency – radyo sinyali) bir baĢka proje vard×. Delphi ile paralel porttan sinyallar araca
aktar×l×yor ve ileri geri sağ sol džğmeleri ile araŒ hžcrelerde geziyordu.

Daha geliĢtirilip, hedef hžcreye en k×sa hangi yoldan gidilir, harita kayd×, daha bžyžk alan, birŒok araŒ, durak
noktalar× gibi konular eklenebilir. Araca d™nme animasyonu da eklemedim. Ġlk bilgisayar oyunlar×nda da olan
labirentte džĢman ya da canavar sizi takip etmesi, tam tersi sizden kaŒmas× algoritmalar ile yap×labilir. Bu tžr k×sa
yoldan bir yere gitme problemi genelde oyunlar iŒin yaz×lsa da, gerŒek hayatta da telefon kablolar×, cep telefonlar×
ağlar×, ağ mimarilerinde de az maliyetli kurulum iŒin gereklidir.

Resim 26 – Labirent ekran g™ržntžsž

Kodlar:

var arabaGit:Boolean = false;


var hiz:Number = 100;
_root.hizStepper.value=hiz;
$$fullscreen = true;
fscommand("fullscreen", "true");
_quality = "HIGH";
ifFrameLoaded (1) {
_root.araba._rotation = 270;
}
function alphaAyar(gelenNesne) {
323

if (gelenNesne._alpha == 100) {
gelenNesne._alpha = 25;
} else {
gelenNesne._alpha = 100;
}
}
//sensorler
function onSensorDegdiMi() {
sonuc = false;
for (name in _root) {
var obj = _root[name];
var ad = obj._name;
if (name.substring(0, 5) == "duvar" && obj._alpha != 25) {
if (obj.hitTest(_root.araba.onSensor)) {
_root.araba.onSensor._alpha = 100;
sonuc = true;
break;
}
}
}
return sonuc;
}
function solSensorDegdiMi() {
sonuc = false;
for (name in _root) {
var obj = _root[name];
var ad = obj._name;
if (name.substring(0, 5) == "duvar" && obj._alpha != 25) {
if (obj.hitTest(_root.araba.solSensor)) {
_root.araba.solSensor._alpha = 100;
sonuc = true;
break;
}
}
}
return sonuc;
}
function sagSensorDegdiMi() {
sonuc = false;
for (name in _root) {
var obj = _root[name];
var ad = obj._name;
if (name.substring(0, 5) == "duvar" && obj._alpha != 25) {
if (obj.hitTest(_root.araba.sagSensor)) {
_root.araba.sagSensor._alpha = 100;
sonuc = true;
break;
}
}
}
return sonuc;
}
//action start or stop
function ilerle() {
_root.araba.onSensor._alpha = 10;
_root.araba.solSensor._alpha = 10;
_root.araba.sagSensor._alpha = 10;
if (_root.arabaGit == true) {
onSensorDegeri = onSensorDegdiMi();
solSensorDegeri = solSensorDegdiMi();
sagSensorDegeri = sagSensorDegdiMi();
trace(onSensorDegeri + "-" + solSensorDegeri + "-" + sagSensorDegeri + ":" + _root.araba._rotation);
//true - değiyor, false - değmiyor anlamındadır
if (onSensorDegeri == true && sagSensorDegeri == true) {
_root.araba._rotation -= 90;
//sola dön - tek yol _|
324

} else if (onSensorDegeri == true && solSensorDegeri == true) {


_root.araba._rotation += 90;
//sağa dön - tek yol -|
} else if (onSensorDegeri == true && solSensorDegeri == false && sagSensorDegeri == false) {
yonNere = random(2);
//IKI TARAF BOŞ
if (yonNere == 0) {
_root.araba._rotation += 90;
}
if (yonNere == 1) {
_root.araba._rotation -= 90;
}
//sağa dön - tek yol -|
} else if (onSensorDegeri == true && solSensorDegeri == true && sagSensorDegeri == true) {
_root.araba._rotation -= 180;
//her yer dolu geri dön - tek yol =|
} else if (onSensorDegeri == false) {
//ön boş
trace(_root.araba._rotation);
if (_root.araba._rotation == 90) {
//yön kuzey
_root.araba._y = _root.araba._y - 5;
} else if (_root.araba._rotation == -90) {
//yön güney
_root.araba._y = _root.araba._y + 5;
} else if (_root.araba._rotation == 0) {
//yön doğu
_root.araba._x = _root.araba._x - 5;
} else if (_root.araba._rotation == -180 || _root.araba._rotation == 180) {
//yön batı
_root.araba._x = _root.araba._x + 5;
}
}
}
}
myTimerIlerle = setInterval(ilerle, _root.hiz);
325

23. dbase uygulamaları


(Ornekler\Diger\ogrkay_dbase.zip ve MEDIA_dbase.zip)

DOS tabanl× dbase programlar× ve veritabanlar× Visual Studio 6‟n×n bir eleman× olan Microsoft Visual FoxPro
veya Visual dbase ile rahatl× aŒ×labiliyor. 1990‟l× y×llara geri d™ndžk. Kod k×sm×n×n basit bir dil olduğunu ogrkay
™rneğinin ana program× ile g™relim:

* program ANA MENU


set talk off
set echo off
set status off
set conf off ekran ayarlarını yapıyoruz
use ogrkay.dbf veritabanını seç
do while .t. sonsuz döngü
clear ekran temizle
@1,10 say "Genel Öğrenci Değerlendirmesi" menü
@2,10 say "*****************************"
@5,10 say "1. Öğrenci not kaydı"
@7,10 say "2. Sorgulama"
@9,10 say "3. Yazıcı"
@11,10 say "4. Indexleme"
@13,10 say "9. ÇıkıĢ"
@18,10 say "Seçiminiz="
sec=" "
@18,40 get sec pict "!" klavyeden giriş biçimi
read
do case çok if yerine case daha iyi
case sec="1"
do ogkay alt program çağırma
loop döngüye devam
case sec="2"
do ogsor
loop
case sec="3"
do yaz
loop
case sec="4"
close all
use ogrkay
index on nosu tag no
loop
case sec="9"
clear
return
otherwise
loop
endcase
enddo
return

dbase 3 ile Turbo Pascal gibi ™nce program× haz×rlay×p, daha sonra Œal×Ģt×r komutunu veriyorduk. FoxPro ile de
iĢlemleri menžlerden yap×yoruz. „rneğin Œal×Ģt×rmak iŒin ™nce *.prg dosya menžsžnden seŒiliyor, “Program*Do
Ctrl+D” ile de program Œal×Ģt×r×l×yor. “View*Browse…” ile de istediğiniz *.dbf veri dosyas×n× g™ržntžleme ve džzenleme
yapabiliyoruz. Form tasar×m sihirbaz× ile hoĢ veri giriĢ formlar× ve listeleme, raporlama oluĢturabilirsiniz.

Microsoft Access dururken bunlarla neden uğraĢt×k demeyin. dbase Microsoft‟tan ™nce vard×. ġu anda
neredeyse tžm programlama dilleri MS Access‟i destekliyor. Ġster internette veritaban× kullan×n ister yerel veritaban×
olarak kullan×n.
326
327

Resim 27 – G™rsel dbase


328

24. Ev Kon (internet üzerinden ev kontrolü)


(Ornekler\Diger\evkon2.zip)

Eski ASP, *.mdb ve VB6 ile Œok basit arabirimli bir proje. Tžm bilgisayarlarda (9x veya NT) paralel port
kullanarak evdeki ayg×tlar× kontrol ediyoruz. internals.com sitesinden VB ve C iŒin port kullan×m× iŒin winio.zip dosyas×n×
indiriniz.

Resim 28a – Ev Kon ekran g™ržntžsž

Temel fikir; en basit Ģekilde nas×l ev aletlerini uzaktan kontrol edebiliriz? Web žzerinden donan×ma ulaĢmak
zor olduğundan (Java ve CGI gerekli), akl×m×za hemen Delphi ve VB geliyor. ActiveX de kullan×labilirdi. Bu projede
ortak veritaban× olarak data.mdb kullan×lmas×na rağmen, tabii ki MySQL de olabilirdi. Bu projede tamamen Microsoft
žržnleri kullan×ld×. IIS web y™neticisi yerine bedava ASP destekli Baby Web Server‟× (pablosoftwaresolutions.com) da
tavsiye ederim. …stteki ilk resimdeki gibi kullan×m× Œok kolay ve az yer kapl×yor (220 KB).

Sadece 1 gžnde yapt×ğ×m iŒin; gžvenlik (Ģifreli giriĢteki, veritaban× gžvenliği), web kameras× desteği, cep
telefonu desteği, Flash ile g™rsel arabirim gibi birŒok eksik var. 5 ŒeĢit ev aleti de Œok az. Buna rağmen bilgisayar×n
portuna tak×lacak devrenin yetenekleri ile bu ihtimal daha da art×r×labilir. Mesela 4 bit seŒim adresi, 1 bit de veri olarak
džĢžnžlžnce 24 = 16 ayg×t desteklenebilir.

Alarm, gžvenlik sens™rleri, belli zamanda belli iĢlerin yerine getirilmesi, analog veri okuma ve yollama da
yap×labilir. Proje harici devre (™rneğin bir mikro kontrol™r – PIC, PLC gibi) ile PC gžcž birleĢtirilerek Œok daha iyi
yerlere gelebilir. Sadece paralel port değil, USB ve kablosuz bağlant×lar (Bluetooth, k×z×l™tesi - infrared, ses ™tesi -
ultrasound) da geliĢtirilebilir. H×rs×z alarm× olarak dersek, meydana gelen istenmeyen olaylar SMS ile mžĢteriye
aktar×labilir.
329

Resim 28b – Ev Kon resimleri, Ģifre 321.

Bilgisayar×n×z×n ADSL modem ayarlar×ndaki, 80 portunu d×Ģ džnyaya aŒarak, kendi ana bilgisayar hizmetinizi
verebilirsiniz. Yerel ağ iŒin bu ayar× yapman×za gerek yoktur. Adres k×sm×na ana bilgisayar×n IP‟sini girin yeterli.

ASP ve VB art×k Œok ilkel kalsa da džĢžk konfigžrasyonlu sistemlerde rahat Œal×Ģ×r. Ayn× proje PHP, MySQL,
Delphi ile de yap×labilir. Ana bilgisayarda port eriĢimini sağlayan program Œal×Ģ×r halde olmal×, d×Ģ džnya da ise sadece
gereken o bilgisayar×n TCP/IP numaras×.

Eğer dinamik IP ile internete bağlan×yorsan×z, no-ip.com ‟a žye olarak kullan×c×.no-ip.uzanti Ģeklinde adrese
sahip olursunuz. DynIP.com da alternatif. Haftan×n 7 gžnž 24 saat Œal×Ģacak makinenizin de ×s×nma problemi, gžŒ
kaynağ× problemi ve benzeri problemleri olacakt×r. RAM ve sabit diskin kaliteli olmas× iyi olur.

Kod k×sm×na bakacak olursak, 2 adet ASP sayfam×zda toplam 100 sat×r kod, tek formlu VB6 projesinde de
yaklaĢ×k 100 sat×rdan oluĢuyor. Tžm proje kodlar× ile s×k×Ģt×r×l×nca 40 KB yap×yor. H×zl× ama kirli de diyebilirsiniz.

Kodlar; VB kodlar×:

Private Sub BtnGet_Click()


Dim Result As Boolean
Dim PortVal As Long

Result = GetPortVal(Val("&H" + TxtPortAddr), PortVal, 1)

If (Result = False) Then


MsgBox " There is a problem with GetPortByte.", vbOKOnly + vbCritical, "VBDumpPort32"
Unload FrmVBDumpPort32
Else
TxtPortByte = Hex$(PortVal And &HFF)
End If
End Sub
Private Sub BtnQuit_Click()

End Sub
Private Sub BtnSet_Click()
Dim Result As Boolean

Result = SetPortVal(Val("&H" + TxtPortAddr), Val("&H" + TxtPortByte), 1)


330

If (Result = False) Then


MsgBox "There is a problem with SetPortByte.", vbOKOnly + vbCritical, "VBDumpPort32"
Unload FrmVBDumpPort32
End If
End Sub

Private Sub Check1_Click()


Data1.Recordset.Edit
Data1.Recordset.Fields(1).Value = Check1.Value
Data1.Recordset.Update
Data1.Refresh
End Sub

Private Sub Check2_Click()


Data1.Recordset.Edit
Data1.Recordset.Fields(2).Value = Check2.Value
Data1.Recordset.Update
Data1.Refresh
End Sub

Private Sub Check3_Click()


Data1.Recordset.Edit
Data1.Recordset.Fields(3).Value = Check3.Value
Data1.Recordset.Update
Data1.Refresh
End Sub

Private Sub Check4_Click()


Data1.Recordset.Edit
Data1.Recordset.Fields(4).Value = Check4.Value
Data1.Recordset.Update
Data1.Refresh
End Sub

Private Sub Check5_Click()


Data1.Recordset.Edit
Data1.Recordset.Fields(5).Value = Check5.Value
Data1.Recordset.Update
Data1.Refresh
End Sub

Private Sub Command1_Click()


Unload FrmVBDumpPort32
End Sub

Private Sub Command2_Click()


Data1.Refresh
Timer1.Interval = Text1.Text
End Sub

Private Sub Form_Load()


If InitializeWinIo = False Then
MsgBox "There is a problem with InitializeWinIo.", vbOKOnly + vbCritical, "VBDumpPort32"
Unload FrmVBDumpPort32
Else
Call BtnGet_Click
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call ShutdownWinIo
End Sub

Private Sub Timer1_Timer()


Dim lamba1, lamba2, lamba3, makine1, makine2
Data1.Refresh
331

lamba1 = Data1.Recordset.Fields(1).Value
lamba2 = Data1.Recordset.Fields(2).Value
lamba3 = Data1.Recordset.Fields(3).Value
makine1 = Data1.Recordset.Fields(4).Value
makine2 = Data1.Recordset.Fields(5).Value
If (lamba1 = 1) Then Check1.Value = 1 Else Check1.Value = 0
If (lamba2 = 1) Then Check2.Value = 1 Else Check2.Value = 0
If (lamba3 = 1) Then Check3.Value = 1 Else Check3.Value = 0
If (makine1 = 1) Then Check4.Value = 1 Else Check4.Value = 0
If (makine2 = 1) Then Check5.Value = 1 Else Check5.Value = 0
If (lamba1 = 1) Then Picture1.Visible = 1 Else Picture1.Visible = 0
If (lamba2 = 1) Then Picture2.Visible = 1 Else Picture2.Visible = 0
If (lamba3 = 1) Then Picture3.Visible = 1 Else Picture3.Visible = 0
If (makine1 = 1) Then Picture4.Visible = 1 Else Picture4.Visible = 0
If (makine2 = 1) Then Picture5.Visible = 1 Else Picture5.Visible = 0
If (lamba1 = 1) Then Picture6.Visible = 0 Else Picture6.Visible = 1
If (lamba2 = 1) Then Picture7.Visible = 0 Else Picture7.Visible = 1
If (lamba3 = 1) Then Picture8.Visible = 0 Else Picture8.Visible = 1
If (makine1 = 1) Then Picture9.Visible = 0 Else Picture9.Visible = 1
If (makine2 = 1) Then Picture10.Visible = 0 Else Picture10.Visible = 1

TxtPortByte.Text = Hex(lamba1 * 1 + lamba2 * 2 + lamba3 * 4 + makine1 * 8 + makine2 * 16)


BtnSet_Click
End Sub

Private Sub Toolbar1_ButtonClick(ByVal Button As ComctlLib.Button)


If Toolbar1.Buttons(1).Value Then Timer1.Enabled = False
If Toolbar1.Buttons(2).Value Then Timer1.Enabled = True

End Sub

Private Sub TxtPortAddr_KeyPress(KeyAscii As Integer)


If KeyAscii = 13 Then
Call BtnGet_Click
End If
End Sub

Kodlar; ASP kodlar× (evkontrolu.asp):

<p align="center" class="style1 style2"><em>


<%
dogruparola = "321"

veritabani = "Driver={Microsoft Access Driver (*.mdb)}; dbq=" & server.mappath("db/data.mdb")


set bag = Server.CreateObject("adodb.connection")
set ks = Server.CreateObject("adodb.recordset")
function temizle(metin)
metin=replace(metin,chr(10),"") 'satirbasi
metin=replace(metin,chr(34),"") 'tirnak
metin=replace(metin,"'","") 'tirnak
metin=replace(metin,"<","")
metin=replace(metin,">","")
temizle=trim(metin)
end function

if temizle(session("sifre")) = dogruparola then


girisOK="evet"
end if

If temizle(request("sifre")) = dogruparola or girisOK="evet" then


session("sifre")=dogruparola
if temizle(session("sifre")) = dogruparola then
if request("lamba1")<>"" or request("lamba2")<>"" or request("lamba3")<>"" or request("makine1")<>"" or
request("makine2")<>"" then
response.Write("Kayıt baĢladı")
bag.open veritabani
332

sql ="Select * from tablo1"


ks.open sql, bag, 1, 3
if request("lamba1")<>"" then
ks("lamba1") = request("lamba1")
end if
if request("lamba2")<>"" then
ks("lamba2") = request("lamba2")
end if
if request("lamba3")<>"" then
ks("lamba3") = request("lamba3")
end if
if request("makine1")<>"" then
ks("makine1") = request("makine1")
end if
if request("makine2")<>"" then
ks("makine2") = request("makine2")
end if
ks.update
ks.close
set ks = nothing
bag.close
set bag = nothing
response.redirect ("evkontrolu.asp")
else
response.Write("Evinize hoĢ geldiniz</em>")
if session("sifre")<>"" then response.write "<p class=style4>Oturum açıldı."
response.Write(" <a href=index.asp?cikis=evet class=style1 title='ÇıkıĢ'>Sistemden çıkıĢ</a>")
response.Write("&nbsp&nbsp <button onclick=location.href('evkontrolu.asp'); value=Tazele
title='Tazele'>Tazele</button>")
response.Write("&nbsp&nbsp <button onclick=window.close(); value=Kapat title='Pencereyi
Kapat'>Kapat</button>")
bag.open veritabani
sql = "Select * from tablo1"
set kayitlar = bag.execute (sql)
response.write ("<p class=style4>")
if kayitlar("lamba1") = "0" then
response.Write ("<br>Salon Lambası kapalı<a href=?lamba1=1><img src=kapali.gif border=0
align=absmiddle></a>")
else
response.Write ("<br>Salon Lambası açık<a href=?lamba1=0><img src=acik.gif border=0
align=absmiddle></a>")
end if
if kayitlar("lamba2") = "0" then
response.Write ("<br>Tuvalet Lambası kapalı<a href=?lamba2=1><img src=kapali.gif border=0
align=absmiddle></a>")
else
response.Write ("<br>Tuvalet Lambası açık<a href=?lamba2=0><img src=acik.gif border=0
align=absmiddle></a>")
end if
if kayitlar("lamba3") = "0" then
response.Write ("<br>Balkon Lambası kapalı<a href=?lamba3=1><img src=kapali.gif border=0
align=absmiddle></a>")
else
response.Write ("<br>Balkon Lambası açık<a href=?lamba3=0><img src=acik.gif border=0
align=absmiddle></a>")
end if
if kayitlar("makine1") = "0" then
response.Write ("<br>Televizyon kapalı<a href=?makine1=1><img src=kapali.gif border=0
align=absmiddle></a>")
else
response.Write ("<br>Televizyon açık<a href=?makine1=0><img src=acik.gif border=0
align=absmiddle></a>")
end if
if kayitlar("makine2") = "0" then
response.Write ("<br>Buz Dolabı kapalı<a href=?makine2=1><img src=kapali.gif border=0
align=absmiddle></a>")
333

else
response.Write ("<br>Buz Dolabı açık<a href=?makine2=0><img src=acik.gif border=0
align=absmiddle></a>")
end if
bag.close
set bag=nothing
end if
end if
else
response.Write("<p class=style1 >ġifreniz hatalı girildi!")
session("sifre") = ""
response.Write(" <a href=index.asp?cikis=evet class=style1 title='ÇıkıĢ'>Sistemden çıkıĢ</a>")

' response.redirect (Request.ServerVariables("HTTP_REFERER"))


end if
%>
<html>
<style type="text/css">
<!--
.style1 {
font-family: Arial, Helvetica, sans-serif;
font-weight: bold;
color: red;
}
.style2 {
font-size: large;
color: white;
}
.style3 {font-family: Arial, Helvetica, sans-serif;
font-size: middle;
color: black;
}
.style4 {font-family: Arial, Helvetica, sans-serif;
color: yellow;
}
-->
</style>
</head>

<body bgcolor=darkred>
<title>EV KON web arabirimi</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-9">
</head>

<p class="style4">made in turkiye (Meslek 4-10-2005 salı)


</p>
</body>
</html>
334

25. PIC (Peripheral Interface Controller)


(Ornekler\Diger\evkon2.zip)

Nihayet doğrudan donan×m (RISC iĢlemci Microchip PIC) žzerine projemiz de var. ġimdilik genel olarak ne
olduğunu g™sterelim. microchip.com ana sitesinden gerekli dokžman ve program olan MPLAB indiriniz. Sadece
assembly ile de PIC programlanabilir, veya PICBasic, PIC-C, JAL gibi yžksek seviyeli diller ile de program yazabiliriz.
Denemek iŒin de Labcenter ISIS Proteus ile “deneme kart×” yap×p, simžle edebiliriz. Hatˆlar× giderdikten sonra, son
ad×m olarak da oluĢan *.hex dosyay× gerŒek PIC‟e aktarmak (programlamak) kal×yor.

Resim 29a – Proteus ile ilk deneme kart×m×z 16f84

Ġnternet žzerinde k×sa bir araĢt×rmadan sonra, PIC ile ilgili birŒok dokžman ve program bulabiliriz. Mikro
kontrol™r olarak PIC‟in seŒilmesinin nedeni ucuz ve geniĢlemeye aŒ×k yap×da olmas×d×r. Daha ileri seviyede yani
16f84(18 pic) yetmediği durumlarda, 16f628(18 pin) veya 16f877(40 pin) kullan×labilir. Ayn× komutlar× (35 adet) bu
iĢlemcide de rahatl×kla kullanabiliriz. Hem h×zl× bir iĢlemcidir (20Mhz‟de 5 milyon iĢlem), hem de piyasada kolay
bulunur.

Programc×lar uzun sžre sadece assembler kodlar× ile programlama yapm×Ģlar, son y×llarda da aynen PC‟deki
geliĢme yolu gibi, yžksek seviyeli konuĢma diline benzer diller ile de PIC kodlama mžmkžn olmuĢtur. PICBIT ile
PLC‟deki g™rsel tasar×m gibi PIC‟de de program yazabiliriz. Ayr×ca yap×lan program×n Œal×Ģ×p Œal×Ģmad×ğ×n× bilgisayarda
da test edebilme imkˆn×m×z vard×r. uSim ve uEditor ile 877 haricindeki PIC‟leri programlay×p deneyebiliriz.

PIC‟e aktar×m olarak PICup gibi birŒok bedava program bulabilirsiniz. PIC Start Plus ise haz×r bir EPROM
programlama donan×m×d×r. COM yani seri port d×Ģ×na LPT (yaz×c×) ve USB ile de iletiĢim kurulabilir, programlanabilir.

Neredeyse birŒok program, džzenleyici, derleyici, Œevirici, ™rnek, dokžman, devre Ģemas× bedava olarak
bulabiliryoruz. Sadece Windows değil, Linux ve Macintosh ile de PIC programlama yap×labilir.

Genelde bir fabrikan×n otomasyonu žzerine Œal×Ģmalar yap×labilirken, gžnlžk hayat× kolaylaĢt×r×c× robotlar,
gžvenlik sistemleri, mžzikli alarm, saat gibi birŒok proje geliĢtirilebilir. PC‟den bağ×ms×z Œal×Ģan, sadece aŒma
džğmesine bas×larak Œal×Ģan basit arabirimden tutun, geliĢmiĢ LCD, radyo frekansl× arabirimli, sens™rlerle donat×lm×Ģ
karmaĢ×k devreler de yap×labilir.
335

“Ornekler\Diger\merdiven_oto.zip” iŒinde Proteus ve PicBasicPro ile yaz×lm×Ģ kžŒžk bir projemiz var. En altta
bununla ilgili k×sma ve resimlere ulaĢabilirsiniz.

„rnek *.asm program×m×z (okulumuz ™ğretmenlerinden Ġhsan KAR‟×n ™rneği):

;A1'e basıldığında sayı kaydedicisine 3 yükleyen


;a2'ye basıldığına 7 yükleyen
;a3'e basıldığında 255 yükleyen
;a0'a basıldığında yüklenen değerleri portb'de gösteren program

LIST P=16F84
INCLUDE P16F84.INC
SAYI EQU H'0C'
BSF STATUS,5 ;bank1'e geç
CLRF TRISB ;portb çıkış
MOVLW H'FF'
MOVWF TRISA ;porta giris
BCF STATUS,5 ;bank0 a gec
CLRF PORTB ;portb'yi temizle
BASLA
TEST1
BTFSC PORTA,0
GOTO TEST2
CALL GOSTER
GOTO BASLA
TEST2
BTFSC PORTA,1
GOTO TEST3
CALL YUKLE3
GOTO BASLA
TEST3
BTFSC PORTA,2
GOTO TEST4
CALL YUKLE7
GOTO BASLA
TEST4
BTFSC PORTA,3
GOTO BASLA
CALL YUKLE255
GOTO BASLA
336

GOSTER
MOVF SAYI,W
MOVWF PORTB
RETURNYUKLE3
MOVLW H'03'
MOVWF SAYI
RETURN
YUKLE7
MOVLW H'07'
MOVWF SAYI
RETURN
YUKLE255
MOVLW H'FF'
MOVWF SAYI
RETURN
END

„rnek bir *.jal JAL(Just another language, ™rnek JAL Edit program×ndan al×nd×, JAL tamamen bedava (GNU)
bir dildir, pascal‟a benzer) program×:

include 16f84_4
include jlib

pin_b0_direction = output --b0 pini çıkış


pin_a0_direction = input --a0 pini giriş

forever loop --sonsuz döngü


pin_b0 = on --b0 çıkışı ON
delay_100ms --100 milisaniye gecikme
pin_b0 = off
delay_100ms
end loop

BirŒok programlama dili alternatifimiz ve programlama edit™ržmžz var. En basit dil Basic ve en basit edit™r de
not defteri. En zor dil assembler ve en kar×Ģ×k arabirim de MLABIDE. Ortak olan konu ise ISIS Proteus. Yapt×ğ×m×z
projeyi PIC‟e yžklemeden ™nce bilgisayarda deneyebiliyoruz. Hem dijital, hem de elektronik deneylerin tžmžnž bu
program ile deneyebiliriz. Electronics Workbench ise eski bir program art×k. S×rf PIC iŒin yap×lm×Ģ simžlat™rler olsa da,
Proteus‟un yan×na yaklaĢam×yorlar. Osiloskop, ™lŒž aleti, sinyal jenerat™rž gibi Œok hoĢ eklentileri var.
337

BaĢka bir programlama y™ntemi de sadece Proteus‟un derlemesine b×rakarak *.asm kodlamad×r. Zaten
Proteus iŒinde MPASM derleyicisi vard×r. Ama 35 adet PIC komutunu iyice ™ğrendikten sonra istediğiniz program×
yapabilir hale geliyorsunuz. Asm her ne kadar karmaĢ×k g™zžkse de, kžŒžk *.hex dosyas× oluĢtuğu iŒin ve
programc×ya tam kontrol imkˆn× vermesi sebebi ile tercih edilir. Zaman k×s×tlaman×z yok ise *.asm ile uğraĢ×n×z. Ama
k×sa sžrede proje geliĢtirmeniz gerekirse, PBP (PicBasicPro) en iyisi. Mesela merdiven otomatiğini hiŒ *.asm‟den
anlamadan 1 saat gibi k×sa sžrede yapt×m, ve Proteus‟da Œal×Ģt×rd×m. 16f877 kulland×m. PortA, B, C, D ve E gibi birŒok
giriĢ Œ×k×Ģ ™zelliği var. 16f84‟de de Port A ve B var. Biraz uğraĢarak 84 ile de istediğimizi yapabiliriz. 16f84 art×k
žretilmiyor, bu arada.

„rnek bir *.bas PicBasic (ProtonIDELite ™rneklerinden al×nd× – demo olduğundan 50 sat×r derleyebilir):

' Show button press on LED


OPTIMISER_LEVEL = 6
Device = 16F877
XTAL = 4

ALL_DIGITAL = TRUE
PORTB_PULLUPS = ON ' Enable PORTB pull-ups
TRISD = 0 ' Set PORTD (LEDs) to all output

Loop:
PORTB = 0 ' PORTB lines low to read buttons
TRISB = $F0 ' Enable all buttons

PORTD = 0 ' All LEDs off


' Check any button pressed to turn on LED
If PORTB.7 = 0 Then ' If 4th button pressed...
PORTD.4 = 1 ' 4th LED on
Endif
If PORTB.6 = 0 Then ' If 3rd button pressed...
PORTD.5 = 1 ' 3rd LED on
Endif
If PORTB.5 = 0 Then ' If 2nd button pressed...
PORTD.6 = 1 ' 2nd LED on
338

Endif
If PORTB.4 = 0 Then ' If 1st button pressed...
PORTD.7 = 1 ' 1st LED on
Endif
Goto Loop ' Do it forever

Resim29b - PicBasicPro dilinin Pic Mate program× ile derlenmesi.


339

Resim29c - Mediven otomatiği, sžre kontrollž ve ek sžre de istenebiliyor

Merdiven otomatiğini programlama ve test etmesi sadece 1 saatimi ald×. Eğer alt seviye olan *.asm ile
yapsayd×m herhalde 1 hafta sžrerdi. Tabi *.asm kodlar×n× iyice ™ğrendikten sonra bu sžre daha da k×salabilir. PicBasic
kodlar× ise aĢağ×dad×r. YaklaĢ×k 60 sat×r. Program×n eksiği 7 parŒal× led g™stergelerde onalt×l×k say× sisteminde sžrelerin
g™sterilmesi. Yani gžnlžk hayatta bu proje kullan×lacaksa, g™stergede onluk say× olarak sžre g™sterilmelidir. Sžre
değeri 0A demek asl×nda 10 saniye demek.

Port B‟nin tžm 8 biti de kat lambalar×na bağl×. 8 kata kadar problem yok, ama asl×nda sadece 1 Œ×k×Ģ da bizim
iĢimizi g™ržrdž. Kat anahtar×n×n sadece 1 adet olmas× gibi. Kat anahtar× ve lambalar× istediğimiz kadar, d×Ģ devrede
Œoğaltabiliriz.

KžŒžk bir proje olsa bile neredeyse tžm portlar× kulland×k. Daha Œok giriĢ ve Œ×k×Ģ gerekseydi, biz de baĢka
yollara baĢvurabiliriz. Mesela bir port belli bir zaman giriĢ, belli bir zaman da Œ×k×Ģ olabilir, ya da tžm display‟ler tek bir
yerden s×ra ile sžržlebilir. Bu tžr numaralarda hem yaz×l×m olarak hem de donan×m olarak Œ™zžmler žretebiliriz. Eğer
Œare kalmam×Ģsa, birden fazla PIC kullan×labilir. Tam tersine 1 PIC Œok geliyor ise, o zaman da iŒine birden fazla
program yžkleyerek, tek merkezden h×zl× bir Ģekilde program gžncelleme, baĢka yard×mc× iĢler žstžnlžğž
kazanabiliriz. Mesela bir saat program×nda, alarm, sžre™lŒer gibi birŒok program bir yerden Œal×Ģabilir. Alarmda Œalacak
mžzik de baĢka bir yerde saklanabilir. Teknik konulara fazla girmiyorum biliyorsunuz.

trisa=%00011111 ' port a giriş, geri kalan portlar çıkış


trisb=%00000000
trisc=%00000000
trisd=%00000000
trise=%00000000

adcon1= 7 'digital input for A, normalde analog giriştir


porta=0:portb=0:portc=0:portd=0:porte=0
sure VAR BYTE
sure = 10 'varsayılan süre = 30 sn
asilsure VAR BYTE
asilsure = 10 'varsayılan süre = 30 sn
islem VAR BIT
islem = 0 'işlem hemen başlamasın
hak VAR BIT
hak = 0 'süre uzatma hakkı 1
340

portb.0 = 0 'kat lambaları


portb.1 = 0
portb.2 = 0
portb.3 = 0
basla:
if porta.1 = 0 and asilsure<$ff and islem = 0 then 'sure 1 sn artar
asilsure= asilsure + 1
pause 200 'yeter BOUNCE
endif
if porta.2 = 0 and asilsure>0 and islem = 0 then 'sure 1 sn azalır
asilsure= asilsure - 1
pause 200 'yeter BOUNCE
endif

portc = sure
portd = asilsure

if (porta.0 = 0) and (islem = 0)and(asilsure<>0) then


islem = 1
sure = asilsure
pause 200 'yeter BOUNCE
endif

if (porta.0 = 0) and (islem = 1) then 'ek sure de yapabiliyoruz


if hak = 0 then hak = hak + 1
endif

if islem = 1 then 'işlem başlamışsa


portb = %11111111 'kat lambaları
Pause 1000
sure = sure - 1
endif

if sure = 0 then 'süre bitmişse


if hak = 1 then 'süre uzatma hakkım var
sure = asilsure
hak = 0
else
portb = %00000000 'kat lambaları
islem = 0
sure = asilsure
hak = 0
endif
endif

goto basla
end
341

Ek 1 – Algoritma Oluşturmak
Bir problemin Œ™zžmžnde yard×mc×, ana hatlar× belirten dokžman veya aŒ×klay×c× nota algoritma denir.
Programlama dillerindeki g™sterimi ak×Ģ diyagram× veya Œizelgesidir. Her dile uygulanabilen genel uluslararas×
sembollerle Œizimi yap×l×r. Bir dilden diğerine algoritma yaparak geŒebilirsiniz.

baĢlang׌ veya bitiĢ d™ngž

bağlant×
veri giriĢ

iĢlem
veri Œ×k×Ģ

karar alt programlar

Ġkinci derece denklem ( ax2+bx+c=0 ) k™klerini (x1, x2 veya x) bulmak iŒin Ģu algoritma kullan×labilir:

baĢla

a,b,c gir

d=b2-4a.c

E
sanal k™k
d<0

E
d>0 x1=(-b - √ d)/2.a
x2=(-b+√ d)/2.a
H

x1, x2 yaz
x=(-b/2.a)

tek k™k
x yaz

bitir
342

Ek 2 – SQL
Delphi veritaban× nesnelerinden Query – sorgu iŒinde kulland×ğ×m×z SQL ™zelliği hakk×nda basit birkaŒ ipucu
veriyorum. Ayn× Ģekilde Microsoft Access ve dbase iŒinde de SQL - ( Structured Query Language – Yap×sal Sorgulama
Dili) kullan×l×yor. Oracle, InterBase, MSSQL Server ve MySQL de bu dil iŒin yaz×lm×Ģ ağ yaz×l×mlar×d×r.

SQL ile bir tablo filtrelenebilir, arama yap×labilir, belli kay×tlar silinebilir veya gžncellenebilir, tablolar
iliĢkilendirilebilir, hesaplanan alanlar oluĢturulabilir, kay×tlar s×ralanabilir.

„rnekleri “Ornekle\Delphi\SQL” dizinindeki program ile deneyebilirsiniz. ĠŒinde tek t×rnak veya Œift t×rnak ile
değer belirtebilirsiniz. Programda sadece žstteki ilk aŒ×l×r kutudan DBDEMOS seŒip aĢağ×daki ™rneklerden istediğinizi
select * from tablo yazan aŒ×l×r kutu iŒine yazman×z yeterlidir.

En Œok kulland×ğ×m×z deyimler select, from ve where‟dir.

select : * ile tžm alanlar× veya belli alan adlar× seŒeriz.


from : tablo ad(lar)× belirtilir
where : kriter belirtilir, where kullan×lmazsa tžm kay×tlar g™ržntžlenir.

„rnekler:

select * from country


country.db‟deki tžm kay×tlar× getirir. B™ylece Query ile Table ayn× etkiye sahip olur

select Name, Capital from country where population > 2000000

2.000.000‟dan bžyžk nžfuslu baĢkentlerin ad ve isimlerini al×r

select * from country where continent = ―South America‖ and population > 2000000

Gžney Amerikadaki 2.000.000 žstž nžfuslu žlkelerin listesi

select distinct Continent from country

Sadece k×ta adlar×n× g™sterir

select orders.orderno, orders.saledate, customer.company, customer.contact, employee.lastname from orders, customer,


employee where orders.custno = customer.custno and orders.empno = employee.empno

SipariĢi alan Œal×Ģan ve ĢipariĢi veren mžĢteri žŒ tablo birleĢtirilerek, ekrana beĢ alan× listeliyor

select * from country order by continent, name

K×ta ad×na sonra da žlke ad×na g™re tablo s×ralan×yor

select sum (orders.amountpaid), count (orders.amountpaid), avg (orders.amountpaid)


from orders, employee where orders.empno = employee.empno and employee.lastname = ―Johnson‖

Johnson soyadl× eleman×n toplam, say× ve ortalama ald×ğ× sipariĢ miktarlar× listelenir

select employee.lastname, sum (orders.amountpaid) from orders, employee


where orders.empno = employee.empno group by employee.lastname

Her eleman×n ald×ğ× toplam sipariĢ miktar×n× verir

select firstname,lastname from employee where firstname like ―%nn%‖ and lastname like ‗%en%‘

Ad×nda “nn” ve soyad×nda “en” geŒen personeli listeler, tabii ki her kelimenin baĢ ve sonunda % kullanmak
zorunda değilsiniz, “An%” gibi de olabilir (case sensitive – bžyžk kžŒžk harf duyarl×)
343

Ek 3 – ASCII Kod Tablosu


(American Standard Code for Information Interchange)

Askii diye okunur. 256 yaz× ve kontrol karakterinden oluĢan bu tablonun ilk 128‟si sabit, kalan 127 karakter
yaz×c×, bilgisayar ve dile g™re değiĢir.

Dec Hex Ctrl Ad× Anlam× Dec Hex Ctrl Ad× Anlam×
0 00 ^@ NUL null (end string) 16 10 ^P DLE data line escape
1 01 ^A SOH start of heading 17 11 ^Q DC1 dev ctrl 1 (X-ON)
2 02 ^B STX start of text 18 12 ^R DC2 device ctrl 2
3 03 ^C ETX end of text 19 13 ^S DC3 dev ctrl 3 (X-OFF)
4 04 ^D EOT end of transmission 20 14 ^T DC4 device ctrl 4
5 05 ^E ENQ enquiry 21 15 ^U NAK negative acknowledge
6 06 ^F ACK acknowledge 22 16 ^V SYN synchronous idle
7 07 ^G BEL bell 23 17 ^W ETB end transmit block
8 08 ^H BS backspace 24 18 ^X CAN cancel
9 09 ^I HT TAB horizontal tab 25 19 ^Y EM end of medium
10 0a ^J LF line feed 26 1a ^Z SUB substitute
11 0b ^K VT vertical tab 27 1b ^[ ESC escape
12 0c ^L FF form feed 28 1c ^\ FS file separator
13 0d ^M CR carriage return 29 1d ^] GS group separator
14 0e ^N SO shift out 30 1e ^^ RS record separator
15 0f ^O SI shift in 31 1f ^_ US unit separator

ASCII Kod Tablosu:

0 32 [space] 64 @ 96 `
1 33 ! 65 A 97 a
2 34 " 66 B 98 b
3 35 # 67 C 99 c
4 36 $ 68 D 100 d
5 37 % 69 E 101 e
6 38 & 70 F 102 f
7 39 ' 71 G 103 g
8 ** 40 ( 72 H 104 h
9 ** 41 ) 73 I 105 i
10 ** 42 * 74 J 106 j
11 43 + 75 K 107 k
12 44 , 76 L 108 l
13 ** 45 - 77 M 109 m
14 46 . 78 N 110 n
15 47 / 79 O 111 o
16 48 0 80 P 112 p
17 49 1 81 Q 113 q
18 50 2 82 R 114 r
19 51 3 83 S 115 s
20 52 4 84 T 116 t
21 53 5 85 U 117 u
22 54 6 86 V 118 v
23 55 7 87 W 119 w
24 56 8 88 X 120 x
25 57 9 89 Y 121 y
26 58 : 90 Z 122 z
27 59 ; 91 [ 123 {
28 60 < 92 \ 124 |
29 61 = 93 ] 125 }
30 62 > 94 ^ 126 ~
31 63 ? 95 _ 127
344

128 160 [space] 192 À 224 ‡


129 161 ¡ 193 Á 225 †
130 162 ¢ 194  226 ˆ
131 163 £ 195 à 227 Š
132 164 ¤ 196  228 ‰
133 165 ¥ 197 € 229 ‹
134 166 ¦ 198 Æ 230 æ
135 167 ¤ 199  231 Œ
136 168 ¨ 200 È 232 Ž
137 169 © 201 ‚ 233 
138 170 ª 202 Ê 234 
139 171 « 203 Ë 235 
140 172 ¬ 204 Ð 236 ’
141 173 - 205 Í 237 ‘
142 174 ® 206 Î 238 “
143 175 ¯ 207 Ï 239 ”
144 176 ° 208 Ğ 240 ğ
145 ' 177 ± 209 ƒ 241 •
146 ' 178 ² 210 Ó 242 —
147 179 ³ 211 Ñ 243 –
148 180 ´ 212 Ò 244 ˜
149 181 µ 213 Õ 245 š
150 182 ¶ 214 „ 246 ™
151 183 · 215 × 247 †
152 184 ¸ 216 Ø 248 ø
153 185 ¹ 217 Ö 249 œ
154 186 º 218 Ô 250 ›
155 187 » 219 Õ 251 
156 188 µ 220 … 252 ž
157 189 ´ 221 Ġ 253 ×
158 190 ¶ 222 ġ 254 Ģ
159 191 ¿ 223 ß 255 Ģ

Alt tuĢuna basarken mesela 65 rakam×na bas×p Alt tuĢunu b×rak×rsan×z ekrana “A” yaz×l×r. MS-DOS ve
Windows‟un yaz× karakterleri farkl×d×r. 200 ncž karakter DOS‟ta “╚” iken Windows‟ta “+” olarak Œ×kabilir. Enter,
Return, Cr – Carriage Return ayn× anlamda kullan×l×yor. Fakat nžmerik klavyedeki ve Backspace tuĢu alt×ndaki Enter
ayr× tuĢ kodu ile Œal×Ģ×r. Bunun sebebi nžmerik klavyedeki Enter‟×n ayr×ca 0xe0 değeri žretmesidir. Baz× tuĢlar (Ctrl,
Shift, Alt, Fn,...) tek kod žretmezler. “CD2\Programlama\HelpPC” dizinindeki programlardan ayr×nt×lar× elde
edebilirsiniz. Bizim iŒin en ™nemli karakterlerden baz×lar× 13 Enter, 27 ESC tuĢudur. VB dilinde vbCr (vbEnter değil),
vbTab, vbCrLf,... ; Delphi‟de VK_TAB, VK_RETURN, VK_ESCAPE gibi haz×r sabitler vard×r.

MsgBox (―Adı:‖ & vbTab & ―Ahmet‖) „VB‟de tuş kullanımı


ShowMessage( 'Adı:'+ chr(VK_TAB)+'Ahmet' ); //Delphi‟de tuş kullanımı

Bu arada s×k kulland×ğ×m×z baz× ™zel karakterlerin Ġngilizce yaz×m, okunuĢ ve TžrkŒe anlamlar× da Ģunlard×r:

boĢluk space (speys) ? soru question mark (kuesçın mark)


“ Œift t×rnak double quote (dabl kuvot) * y×ld×z asterisk (estıriks)
„ tek t×rnak single quote (singl kuvot) , virgžl comma (kama)
! žnlem exclamation mark (eksklameyşın) ; noktal× virgžl semicolon (semikalın)
^ Ģapka caret (karıt) : iki nokta žst žste colon (kalın)
# diyez number sign (nambır sayn) . nokta dot, period (piriıd)
+ art× plus (plas) @ gžzel a at sign (et sayn)
- tire, eksi hyphen (hayfın), minus (maynıs) ~ t×rt×l tilde (tayld)
$ dolar dollar sign (dalır sayn) / b™lme division (divijın), slash (sleş)
% yžzde percent (pörsınt) \ ters b™lme back slash (bek sleş)
& ve ampersand (empırsend), and | Œubuk, boru pipe (payp)
{} kžme brace (breys) _ alt Œizgi underline (andı:layn)
() parantez paranthesis (perıntezis) - Œizgi en dash (en deş)
[] k™Ģeli parantez square bracket (skver brekıt) – Œizgi em dash (em deş)
= eĢittir equal sign (ikuıl sayn) < kžŒžktžr less than (les den)
345

Ek 4 – InstallShield’in Kullanımı
InstallShield Express for Delphi 3.0 Program× Kullan×m×

Okul Ders Program×n×n kurulum disketleri haline getirilmesi InstallShield Express for Delphi 3.0 program× ile
gerŒekleĢtirilmiĢtir. Ġstediğiniz program×n kurulumunu bu ad×mlarla haz×rlayabilirsiniz.

Yeni sžržm InstallShield Express‟in arabirimi daha iyileĢirken genel proje yap×s× benzer. *.iwz uzant×l× eski
projelerinizi Delphi 6 veya žstž paketlerin yan×nda gelen kurulum program× ile de aŒabilirsiniz. Yeniliklerin baĢ×nda
olan web entegrasyonunun daha fazla olduğu dikkatinizi Œekebilir. Sadece Delphi‟de değil VB gibi dillerle yapt×ğ×n×z
program×n Access, BDE, OBDC, INI, dosya iliĢkilendirmeleri, registry gibi ince ayarlar×n× rahatl×kla yapabilirsiniz.

Resim 1 – InstallShield Express 1.11a versiyonunun g™ržntžsž

Delphi 3.0‟×n yan×nda gelen bu program yard×m× ile proje veya herhangi bir uygulaman×n standart kurulumu
yap×labilir. “Setup Checklist” denilen bu ana ekranda yapt×ğ×m×z veya eksik b×rakt×ğ×m×z ad×mlar× g™ržp istediğimiz
ad×ma rasgele atlayabiliriz. Listede iŒinde sağa doğru y™nlendirilmiĢ ok bulunan džğmelere t×klanarak alt menžlere
ulaĢ×l×r. „rnek olarak Okul Ders Program× projesinin kurulum aĢamalar× anlat×lacakt×r. Her ad×m×n iĢlendiğini
seŒeneklerin yan×nda beliren k×rm×z× bir check iĢareti ile anlayabiliriz.
346

Resim 2 – G™rsel tasar×m penceresi

Ġlk olarak kurulumuda genel olarak kullan×lan uygulama ad×, versiyon, kurulum penceresinin rengi kurulum
penceresinde yer alacak yaz× ve resimler, program×n kurulacağ× varsay×lan hedef dizin belirlenir. Kurulum bitince
Œal×Ģt×r×labilecek program da “Application Executable”‟e Browse – G™zat džğmesine bas×larak belirtilir.

Resim 3 – Veritaban× džzenlemesi

Ġkinci ad×mda program eğer veritaban× kullanacak ise Borland Database Engine (Borland Veritaban× Motoru)
iĢaretlenip programda kullan×lan alias (takma isim, veritabanlar×n×n bulunduğu dizininin takma ad×) “Settings”
džğmesi ile ayarlan×r.
347

Resim 4 – Kurulum tipi ve dosyalar×n ayarlanmas×

Veritabanlar×n×n kurulacak dizine g™re de aliaslar× ayarland×ktan sonraki ™nemli ad×m InstallShield‟in hangi
programlar× s×k×Ģt×racağ× ve hangi dosyalar× hangi dizine kuracağ×n×n ayarland×ğ× “Specify Components and Files”
seŒeneğinidir. Bu pencerenin kullan×m× Œok kolayd×r. “Launch Explorer…” džğmesi t×klanarak dosya veya dosyalar
sžržkle b×rak y™ntemi ile “File Groups”a aktar×l×r. “File Groups”un amac× kurulumdaki dosyalar×n kategorize edilip belli
kurulum tiplerinin belli dosyalar× kurmas×n×n sağlanmas×d×r. Yani “Typical” kurulumda sadece ™rgžn eğitimin program×
ve BDE ( Borland Database Engine ), “Compact” kurulumda sadece ™rgžn eğitim program×n×n kopyalanmas× sağlan×r.

Kurulumu haz×rlanan dosyalar asl×nda birŒok uygulama ve yard×mc× programdan oluĢabilir. Bizim projemizde
veritabanlar×, BDE, 3 adet uygulama program× ve bir yard×m dosyas× bulunuyordu. Bu dosyalar daha džzenli olmas×
bak×m×ndan “Add Group” džğmesi ile gruplan×r ve “Destination Directory”leri ayarlan×r. <INSTALLDIR> bir değiĢkendir
ve varsay×lan değeri bizim program iŒin “<Program Files>\Okul Ders Programi” dizinidir. <WINDIR> ve
<COMMONFILESDIR> da kullan×labilen diğer değiĢken dizin seŒenekleridir.

Resim 5 – Kurulum Diyalog kutular× belirlenmesi


348

Son ad×mlara yaklaĢ×rken kurulumda bize yol g™steren diğer menžlerin seŒimi ve ayarlar×n×n yap×ld×ğ× “Dialog
Boxes” menžsžne gelinir. HoĢ geldiniz ekran×, hoĢ geldiniz mesaj×, okubeni bilgisi, kullan×c× bilgisi, kurulum tipi,
program dizini seŒme, iĢlem durumu g™stergesi, kurulum bitti mesaj× ayarlar× yap×l×r.

Resim 6 – K×sayollar×n belirlenmesi ve son aĢama olarak disket veya CD haz×rlanmas×

Daha da programlar kopyaland×ktan sonra uygulama dosyalar×na “BaĢlat menžsž”ne k×sayollar×n×n


belirtilmesine s×ra gelir. “Run command”×n yan×ndaki iŒinde žŒ nokta bulunan džğmeye bas×p “.exe” dosyay× belirtip
“Add Icon” džğmesine bas×l×r. “Advanced” k×sm×ndan programlara simgeler belirtilir. Son ad×m olarak disketlerin
oluĢturmas× gelir. “Build” denilince geri bildirim penceresinden hata mesajlar× ve iĢlem durumu g™ržlebilir. ĠĢlem
bitince “Test Run” ve “Copy to Floppy” komutlar× verilebilir. “Test Run” ile ™rnek bir kurulum iĢlemi yap×l×r. “Copy to
Floppy” ile kurulum disketleri kopyalanarak haz×rlan×r.
349

Ek 5 – CD’de Neler Var?


 CD iŒeriği

 Dokuman (284MB) - Ekstralar, tutorial (™ğretici), Delphi ve VB iŒin component yani nesneler, ve bir Œok minik
program
 Programlama (236MB) - Shareware veya freeware olarak dağ×t×lan derleyiciler
 Utility (0MB) - S×k kulland×ğ×m faydal× shareware veya freeware programlar.
 Ornekler (136MB) - Assembler, Basic, C, Delphi, VB, Pascal ve diğer program ™rnekleri (ActiveX, VRML, PLC,
MSExcel)
 Yardim – CD iŒeriğini belirten *.html dosyalara eriĢebilirsiniz. Tžm dosyalar×n hepsine buradan link veremedim,
Windows Gezgini‟nden incelemenizi tavsiye ederim.

 Diğer

Component : Delphi ve Visual Basic iŒin basit birkaŒ nesne paketi.


ActiveSkin_VB : 30 gžn k×s×tlamal×, formunuza gžzel skin (deri) kaplamak isterseniz.
DelphiX : Delphi 3, 4 ve 5 iŒin DirectX kullan×m×. DirectSound, DirectPlay gibi DirectX ™ğeleri elinizin alt×nda.
GLScene : OpenGL destekli oyun veya endžstriyel programlar oluĢturabilirsiniz. glscene.org sitesine
giderseniz orada bir Tžrk arkadaĢ×nda žržnžnž g™rebilirsiniz.
Shape_Delphi4 : Organic Shape de demo sžržm. Yani rast gele zamanlarda program×n×z Œal×Ģ×rken uyar×lar
veriyor. Bu nesneler ile ActiveSkin gibi formunuza *.bmp resimleri deri olarak kaplayabilirsiniz.
WavMix : Bu sžržmž sadece Delphi 3 ile Œal×Ģ×yor. Ayn× anda birden fazla (en fazla 8 kanal) ses Œalabilmeniz
iŒin bunu kullanabilirsiniz.
ZPH211 : Bedava, Hint'lerinizi gžzelleĢtirin.
Extras : JavaScript, ipuŒlar×, utility (yard×mc× dosyalar)...
JDK : Java Development Kit. Java derleyicisi. ĠŒindeki ™rnekler hoĢunuza gidebilir.
Merlin, Genie, Peedy ve Robby : Microsoft Agent ™rnekleri. Sisteminizde MSAgent kurulu olmal×.
cdebnk23.zip, davetips.zip, ttricks.zip : Tips&Tricks mant×ğ× ile programc×l×k ve Windows ile ilgili ipuŒlar×.
ANIMENU.ZIP, jAVA sAAT.zip, JavaMENU97.ZIP, JavaOpenGL.zip, javascript.zip, MENU.ZIP,
NEON.ZIP, SUPANO.ZIP : Java ™rnekleri.
ica3.exe, isb30.zip, isa10.zip, cortvrml.exe, vrml10conv.exe, spazz_v24_full.exe, VRML.zip : VRML
edit™rlerinin ve yard×mc× programlar×n×n demolar×.
MEDIA_dbase.zip, ogrkay_dbase.zip : dbase'de yapt×ğ×m ™rnekler.
MEMTURBO.EXE, mphexer.exe, pn.zip, Recover4all 1.03.zip, tinypersfirewal.exe, UM270.EXE,
winkey.exe, mop.zip : Diğer sevdiğim shareware / freeware programlar.
3d_rotat.zip, astar[1].zip, cpu[1].zip, ExitWindows[1].zip, dis86.txt, MakeActor1_3.exe,
OktSysInfo[1].zip, sprite.doc, SuperForm[1].zip, XXEMF200en.exe : Programlama ™rnekleri
FAQ : GLScene ve Delphi3d s×k sorulan sorular×.
Tutorial : VB, C, C++, Flash, Excel ™ğreticileri. Linux-HOWTO d™kžmanlar×.

 Programlama

Gžn k×s×tlamal× veya freeware olarak deneyebileceğiniz programlama dillerini burada bulabilirsiniz.
AnfyJava143 : ĠŒindeki haz×r JavaScript'leri ™zelleĢtirerek sitenize ekleyebilirsiniz. Linkler internet žzerinde
Œal×Ģm×yor, demo yani.
Applet FloatingMenu Builder : Sitenize gžzel menžler yapmak isterseniz.
Asm : Turbo Assemler ile *.asm uzant×l× dosyalar×n×z× *.exe veya *.com yapabilirsiniz.
c-- : c++'a benzer bir dil. „rnekleri gžzel.
Delphi5Trial : Delphi5'in 60 gžnlžk deneme sžržmž. Ġnternet‟ten kay×tl× kullan×c× olarak ancak kurabilirsiniz. Hem de
yay×m sžresi geŒebilir. (expire yani) Kurulum zahmetli.
Dev-C++ : Bedava c++ edit™r ve derleyicisi.
Dev-Pascal1.2 : Bedava Pascal edit™r ve derleyicisi.
Genesis3D2 : 3D etkileĢimli džnya oluĢturma.
Help : MSHelpWorkshop, OasisSE, chm_help.exe ve helppad.zip kendi *.hlp / *.chm dosyalar×n×z× yapman×z
iŒin.
HelpPC : HELPPC.COM ve TH.EXE ile assembler, interrupt - kesmeler, PC donan×m bilgilerini edinebilirsiniz.
al×Ģt×rmak iŒin klas™rlerine gidin.
ipascal : Irie Pascal 2.01 ile *.pas dosyalar×n×z× edit edip, derleyebilirsiniz. Ama doğrudan olarak *.pas değil *.ipj
proje dosyalar×n× derleyebiliyor.
350

JavaDecompiler : Bu program ile *.class uzant×l× dosyalar× edit edebilir Œal×Ģt×rabilirsiniz. JDK'y× da kursan×z iyi olur.
VB5CCEIN.EXE : VB5'in bu ™zel sžržmž ile ActiveX veya standart EXE projeleri oluĢturabilirsiniz. Asl×nda Application
Setup Wizard k×sayolu ile ActiveX Control iŒiren projelerinizi internete yay×nlaman×z× sağl×yor. Yani EXE oluĢturmuyor.

 Utility

Bu klas™rdeki tžm programlar shareware / freeware olan ve benim s×k kulland×ğ×m programlard×r.
ACDSee30 : Resim izletici ve extralar× da (HTML Album Generator, Photo Enhancer...) olan program
Cyblox : 3D edit™r
Divx4 : Art×k standart bir g™ržntž s×k×Ģt×rmas× (MPEG4)
FerretSoft : WebFerret3.5001 ile internette arama yap×l×r - freeware
Gimp1.1 : Linux iŒin žretilmiĢ, MSPaint'in geliĢmiĢ hali
ISXpress1.1 : Delphi programlar×n×z× Setup haline getirir
Kashmir : 3D edit™r
Macromedia : Flash5 ve Dreamweaver4'in 30 gžn k×s×tlamal× žržnleri
MORE : Tweak program× - freeware
MPower : Sabit disk bilgilerini g™sterir - freeware
MultiOS : Boot manager - freeware
omentree : JavaScript ile yap×lan menž
Regclean : Registry temizleyici - freeware
Sensiva2.51 : HoĢ bir fare kullan×m× - freeware
Terragen0.8 : Kendi terrain'lerinizi(harita) žretin
Test CPU : Delphi ile yap×lm×Ģ gžzel bir uygulama - freeware
truespace : Truespace3 eski ama Œok hoĢ bir 3D edit™r - freeware
winrar203 : RAR
Winzip8 : Zip
WWEB1.51 : Ġngilizce-Ġngilizce s™zlžk - freeware

 Kitapta ĠĢlenen Diğer „rnekler

meraba.asm : Ġlk assembler ™rneğimiz


MAKRO.C : C dilinde basitce makro kullan×m×
union.c : union tipli değiĢken oluĢturmak
unionreg.c : union tipli değiĢken kullanarak sžržcž bilgileri listeleme
led : C dilinde paralel porttan bilgi okumak ve yollamak
speaker : C dilinde hoparl™rden bip sesi Œ×karmak
speaker2 : C dilinde hoparl™rden daha gžzel bip sesi Œ×karmak
speaker3 : C dilinde hoparl™rden *.wav dosya Œalmak
backproc : Delphi'de uzun iĢlemlerin nas×l yap×labileceği ™rneği
create : Delphi'de nesne oluĢturma ve yok etme
doner : Yuvarlak form iŒinde saat ™rneği
dosya : Writeln ve Readln ile dosyalama
gezgen : Metin, web sayfas×, film, ses ve resim dosyalar×n× g™steren ™rnek
sql : SQL komutlar×n× deneyebileceğiniz ™rnek
surukle : Sžržkle b×rak ile rapor oluĢturma
sysmenu : Sistem menžsžne kendi eleman×n×z× ekleme
tictoc : TicTocToe oyunu
tusbasimi : Fare ve klavye tuĢ bas×mlar×
dosyalistesi.xls : Excel'de recursive kullan×m ile dosya listesi Œ×karma
toplama.vbs : Windows Komut Dosyas× (WSH) kullan×m×
kopyala.bat : DOS'da komut otomasyonuna ™rnek
sendkeys : VB dilinde tuĢ bas×m× olaylar×

 „rnekler Dizinindekiler

 Assembler

Assembler (mikroiĢlemci iŒin yaz×lan en džĢžk seviyeli dil) ile haz×rlanm×Ģ ™rnek programlar×n kodlar×:
Diger - Burada birŒok k×sa ama iĢe yarar kod var.
Dir - Norton Commander'a benzer dosya y™netim program×
Drivers - Sžržcž listesi
editor - *.txt yaz×m edit™rž
351

fridge - Gžzel bir grafik efekti


RAPOR - DOS haf×za miktar×n× g™sterir
TEXT - *.txt dosyalar× *.exe'ye Œeviren Œevirir
TSRCLOCK - TSR olarak devaml× Œal×Ģan saat

 Basic

GWBasic ve QuickBasic dillerin ile haz×rlanm×Ģ ™rnek programlar×n kodlar×:


K™k dizinde grafik ile ilgili birkaŒ ™rnek var.
QBasic\Examples dizininde genel amaŒl× program ™rnekleri var.
GWBasic ile 80'li y×llara geri d™nžyoruz. "system" komutu ile GWBasic'den Œ×kabilirsiniz. Dosya yžklemek iŒin F3 tuĢu
ile load"+dosya ad× denir. al×Ģt×rmak iŒin F2 tuĢu...

 C Dili

C Dilinde haz×rlanm×Ģ ™rnek programlar×n kodlar×:


Dizinsay : Recursive fonksiyon kullan×m×
okul : Okulda yazd×ğ×m birŒok basit program
TSR2 : Terminate and Stay Resident programc×l×k
WordText : GeliĢmiĢ bir C projesi.

 Delphi

Delphi Dilinde haz×rlanm×Ģ ™rnek programlar×n kodlar×:


3Dfx - Voodoo ekran kart× olanlar iŒin basit grafik efekti
Agent - Microsoft Agent'lar×n×n kullan×m×na basit bir ™rnek
Atlar - At yar×Ģ× ile ilgili veritaban× programc×l×ğ× ( alias : atdata )
CD - G™rev Œubuğunda CD takma / Œ×karma yapabiliyor
Dergilerim - Bilgisayar dergilerim iŒin yapt×ğ×m veritaban× program× ( alias : dergiler )
DLL - ġifre ("B") kontrolž yapan program
Dolphin - WavMix nesnesi ile tasarlad×ğ×m hoĢ bir mžzik program×
Glared Test Bouncer - GLScene ile haz×rlanm×Ģ oda iŒinde z×playan top ™rneği
Meraba - Bir klas™rdeki *.bmp ve *.jp*g resimleri g™steren ekran koruyucusu
Ofis - Bir petrol ofisi iŒin haz×rlad×ğ×m veritaban× program× ( alias : sonmez )
ParalelPort - Paralel porttaki ledleri yak×p s™ndžrebilirsiniz
qcreator - Query Creator ile bir alias iŒindeki veritabanlar×n× g™ržp inceleyebilirsiniz
Shape - OrganicShape kullanarak yapt×ğ×m basit bir skin program×
Soru - S×nav sorusu program×
sozluk - Ġngilizce -TžrkŒe s™zlžk program× ( alias : sozluk )
surukle - Sžržkle b×rak ile QuickReport kullan×m×
TemplProto - Herhangi bir program yaparken yard×mc× olabilecek program kal×b×
Tercuman - Ġngilizce‟den TžrkŒe‟ye Œeviri yapmaya Œal×Ģt×m ama yar×m kald× ( alias : tercuman )
Thread - ĠĢlemlerinizi kanallara b™lerek daha h×zl× Œal×Ģmalar×n× sağlayabilirsiniz

 Diğer Diller

Diğer dillerde haz×rlanm×Ģ ™rnek programlar×n kodlar×:


ActiveX - Internet sayfas× iŒinde Œal×Ģan program
Excel - Basit birkaŒ tane makro ™rneği, YAZIYLA.XLS , tarih_goster.XLS ve userform.xls.
PLC - Programmable Logic Control, okulumuzun žrettiği simülatörü ve slide (Page up/dn ile ilerlenir) g™stericisi.
“Ornekler\Diger\PLC” dizininden istediğiniz *.bat dosyay× Œal×Ģt×r×n.
VRML – “Diger\Extras” dizinindeki programlarla siz de kendi žŒ boyutlu džnyan×z× oluĢturabilirsiniz. „rnek evim.wrl.

 Pascal

Pascal Dilinde haz×rlanm×Ģ ™rnek programlar×n kodlar×:


Diğer, Graf, Intro - Grafik ile ilgili bir Œok minik program
Har_Menu - Menu oluĢturma
Okul - Okulda yapt×ğ×m ilk deneyimler
Prince3D - ocuk gerŒekten iyi Œal×Ģm×Ģ, o bir Tžrk.
ScrSaver - Ekran koruyucusu
SM - Grafik ekrana geŒiĢ kodlar×
352

Staj - 1 ayl×k Œal×Ģmam Ariza ve arkadaĢ×n program ™rnekleri.

 Visual Basic

Visual Basic dilinde haz×rlanm×Ģ ™rnek programlar×n kodlar×:


BMP_Show - *.bmp resimleri g™sterir
Dosyalar - Asl×nda b™yle Œal×Ģmamak gerekirdi, ama tžm yapt×klar×m× tek dizine kaydetmiĢim.
Final - GerŒekten final gibi, hesap makinesi Œal×Ģmam. Klavye ve fare entegrasyonu iyi.
Fraktal - Ne olduğunu tam anlamad×m.
HesMak - ok basit bir hesap makinesi
LabelSoru - S×nav sorusu haz×rlama
Listbox - Arabirimi berbat ama Œal×Ģma hiŒ fena değil. Biraz inceleyin.
MsgBox - Mesaj kutusu žretir
RGB - Red green blue değerleri
Sinav_soru - Soru kay×t program×
SoruForm - S×nav sorular×n×n form hali
Telefon - Telefon kayd×
Winlines - 4 ayl×k, 2001 tarihli Œal×Ģmam. Basit bir oyun.
353

Ek 6 – Sözlük
İsim Okunuş Anlam
3D tri di üç boyutlu (3B)
access ekses erişmek
administrator ıdminıstreytır idareci
agent eycınt ajan, memur
allocate elokeyt atama, yer bulmak
application eplikeyşın uygulama
area eria alan
argument argyumınt parametre, argüman, fonksiyona veri gönderme
artificial artifişıl yapay
assemble ıssembl toplamak, bir araya getirmek
associate essoşieyt ilişkilendirmek
attribute ettribyut öznitelik, özellik
backup bekap yedekleme
base beyz taban, merkez, baz
batch beç toplu dosya
BIOS bayos bilgisayarın temel donanım bilgilerini tutan çip
binary baynıri ikilik sayı sistemi
boolean buuliın mantıksal değer
boot buut bilgisayarın açılışı (bootup)
branch branç programın başka yöne dallanması
buffer bafır ön bellek, tampon, ara hafıza
bug bag böcek, hata
C++ si plas plas C dilinin üst versiyonu
cache keyç ön bellek, kaşe
caret karıt ^ işareti, şapka
cartrige kartric kartuş
cascaded keskeydid basamaklı, azalan
CGI si ci ay internette veritabanı uygulamaları
chain çeyn zincir
char çar tek karakterlik değer (character – keriktır)
circuit sörkit devre
cluster klastır küme, her track – iz’deki sektör grubu
code kod kod, programda kullanılan komut kümesi
collapse kıleps göçmek, gizlemek
command kımand komut
compare kımpeyr karşılaştırmak, comparison – karşılaştırma
component kımpounınt nesne, bileşik
conditional kındişınıl şart, koşullu
conflict kınflikt çakışma
console konsoul ekran ve klayve arabirimi (CON)
convert kınvört çevirmek, biçim değiştirmek
current körrınt geçerli, şu anki
cursor körsır imleç, fare oku (mouse pointer)
database deytabeyz veri tabanı
debug dibag Windows’un böcek ayıklama programı
354

default difolt varsayılan


Delphi delfi Yunanistan’da Parnassus Dağı eteklerinde eski bir şehir
demonstration demonstreyşın reklam, tanıtım, demo
design dizayn tasarım, dizayn
destination destineyşın hedef
device divays alet, aygıt
diagnostic dayagnostik sebebi bilinmeyen bir hatayı giderme, diyagnoz
dialog dayalog diyalog, söyleşme
dimension daymenşın boyut
disassemble disessembl parçalamak
dot dot nokta, ekranın fiziksel en küçük ışık noktası (dpi di pi ay – dots per inch)
draft draft taslak
drag and drop dreg end drop fare ile sürükle ve bırak işlemi
driver drayvır sürücü
exceed eksiid aşmak
entry entri giriş (entrance)
environment envayırmınt ortam, çevre
evaluation evalueyşın değerlendirme
expanded ekspendid genişletilmiş
explorer eksplorır gezgin
extension ekstenşın uzantı
fail feyl hata, failure – başarısızlık
false fols mantıksal yanlış
FAQ ef ey kyu Frequently Asked Questions – Sık Sorulan Sorular
FAT fet File Allocation Table – Dosya Atama Tablosu
feature fyuçır özellik, aksam
file fayl dosya
float flout kayar noktalı gerçel sayılar
frag freg parça (fragment , defrag - birleştirmek)
frame freym çerçeve, iskelet, kare
function fankşın görev, işlev, fonksiyon
GUI ci yu ay Graphical User Interface – grafiksel kullanıcı arabirimi
guide gayd önder, kılavuz
handle hendl tutamaç, kulp, tanıtıcı
handshake hendşeyk el şıkışma, anlaşma
hexadecimal heksadesimıl onaltılık sayı sistemi
HTML eyç ti em el Web sayfalarının temelini oluşturan dil
IPX ay pi eks Internet packet exchange, başka bir internet / intranet bağlantı yapısı
icon aykın simge
identifier aydentifayır tanımlayıcı
image imic resim, imaj
inch inç 2.54 santimetre
information infomeyşın bilgi, enformasyon
initiation inişieyşın ilkleme, kullanıcı ayarlarının saklandığı dosyalar (*.ini)
install instol kurmak, installation – kurulum
instruction instrakşın komut
instrument instrumınt enstrüman, araç
integer intecır tamsayı
introduction introdakşın tanıtım, intro
355

item aytım nesne, öğe


java cevı Sun Microsystems tarafından çıkartılmış, platformdan bağımsız programlama dili
kernel kernıl çekirdek
log log kayıt tutmak, döküm yapmak
logical locikıl mantıksal, boolean
match meç uymak, oyun, birbirini tutmak
maximize maksimayz en büyük yapmak, ekranı kapla
message mesic mesaj, ileti
minimize minimayz en küçük yapmak, simge durumuna küçült
missing mising eksik, kaçırmak
multimedia maltimedya çoklu ortam
network netwörk ağ
object ıbcekt nesne
Optical Character Recognition – Optik karakter tanıma, yazılımı tarayıcıların yanında
OCR ou si ar
verilir
OpenGL oupın ci el Özellikle VC gibi bir dili kullanarak grafik kartını programlama
optimize optimayz en iyi hale getirmek, optimize
optional opşınıl isteğe bağlı, opsiyonel
page peyç sayfa
parameter perımitır parametre, argüman, anahtar
parity perıti parite, eşlik
partition partişın disk bölümü (c: gibi)
path pet yol, izlek, patika
pattern petırn doku, dizi
PCMCIA pi si em si ay ey Özellikle not defteri bilgisayarlara takılan dış kart veriyolları, PC kartı
perform pörform gerçekleştirmek
peripheral perifirıl çevresel birim
pin pin giriş çıkış için kullanılan port – veriyolu iğnesi
pixel piksıl Ekrandaki yazılımla elde edilebilen nokta (picture element/picture cell)
pointer pointır işaretçi, fare imleci
port port kapı, fiziksel iletişim hattı
present prezınt var olmak
previous priviıs önceki
primary praymıri birincil
priority prayoriti işlemciye yaptırılan işlemlerin öncelik değerleri
procedure pirısiicır yordam, prosedür
project pricekt proje, tasarı
prompt prompt uyarı, MS-DOS sistem hazır simgesi c:\> gibi
protect prıtekt korumak, protection – koruma
queue kyu kuyruk
real riıl kayar noktalı gerçel sayılar
recognize rikıgnayz tanımak
record rikırd rekor, kayıt
recover rikavır bilgileri kurtarmak
recursive rikörsiv kendini çağıran fonksiyon
register recıstır yazmaç, kayıtlı kullanıcı olmak
registry recıstri Windows kayıt bilgileri
356

reserve rizörv ayırmak, rezervasyon


revert rivört geri dönüştürmek, kurtarmak
root ruut kök, ana dizin
scene sin sahne
script sıkript yardımcı programlama dili, el yazısı
scroll skrol kaydırmak
Seri IDE bağlantıya göre daha gelişmiş bağlantı türü (Small Computer System
SCSI sıkazi
Interface)
sector sektır bölge, disk iz parçası
sequence sikuins sıra
server sörvır ana bilgisayar, sunucu
set set küme, takım, ayarlamak (setting)
sign sayn işaret, signature – imza
simulate simyuleyt benzetmek (simulation - benzetim)
slot slot yuva, kart takılan yarıklar
specify spesifay tanımlamak, belirtmek
speech spiiç konuşma
sprite sprayt grafik programcılığında kullanılan hareketli nesneler
SQL es kyu el Structured Query Language – Yapısal Sorgulama Dili
stack stek yığın, geçici bellek alanı
status steytıs durum; statement – deyim, komut
structure strakçır yapı
subdirectory sabdayrektöri alt dizin, klasör
substitute sabstityut başkasının yerine koymak
success sıkses başarı
supervisor supıvayzır yetkili
support sıport destek
surface söfıs yüzey, görünüş
suspend sıspend askıya almak
switch sviç anahtar, yer değiştirmek
Internetin çalışmasını sağlayan alt yapı (Transmission Control Protocol / Internet
TCP/IP ti si pi ay pi
Protocol)
terminal törminıl son, uçbirim
thread tred kanal
toggle togl iki şeyin birbirleri ile yer değiştirmeleri (swap)
track trek iz, fiziksel disk dairesi
true tru mantıksal doğru
truetype trutayp boyutu değiştirilebilir yazı tipi
try tray denemek
tutorial tyutıriıl öğretici
unit yunit kod yazılan alan
utility yutiliti yardımcı programlar
variable verayıbl değişken
virus vayrıs virus
volume volyum sürücü
warning worning uyarı
watch voç çalışma anında değişkenleri seyretmek
357

Dizin
*.mpg 146
*.msc 80
# *.obj 18, 28
*.ocx 231
#include 41 *.opt 80
*.pas 64
*.php 281
*.pl 257
$ *.prg 323
*.proje 272
$HTTP_COOKIE_VARS 290 *.rc 68
$HTTP_GET_VARS 290 *.res 67, 272
$HTTP_POST_VARS 290 *.rpm 289
$HTTP_SESSION_VARS 290 *.scr 93
*.swf 253
*.tga 146
* *.tlb 229
*.tpu 41, 64
*.* 155 *.txt 20, 223, 247
*.3ds 164 *.vbs 240
*.acs 69 *.vxd 110
*.asm 13, 333 *.wav 109
*.asp 257 *.wrl 164, 313
*.aspx 270 *.x 164
*.avi 43, 146 *.zip 164, 313
*.bas 27, 335
*.bat 241, 243
*.bmp 93, 168 .
*.bsp 165
*.c 40 .NET 270, 297
*.cgi 206
*.class 348
*.com 18
*.cpl 246
?
*.csv 80
*.db 84 ? (parametre) 13
*.dbf 84, 323 ? (print) 63
*.dll 89
*.dmf 189
*.dpk 164 ^
*.dsk 80
*.exe 18, 68 ^ operat™rž 64
*.fla 282
*.gif 146
*.hex 332 +
*.htm 247, 253
*.inf 80 ++ 29
*.ini 80
*.iwz 343
*.jal 334
*.jp*g 93
1
*.js 240
*.map 165 16f84 332
*.md2 164 16f877 332
*.mdb 279, 326
*.mov 43, 146
*.mp3 146
358

Application nesnesi 66
3 arama 36
Artificial Intelligence 5, 160
3d 312 asans™r 214
3d sohbet 312 ASCII 341
3Dfx 164 asm 42
3DMax 313 ASP 326, 364
3DSMax 164 ASP.NET 297
ASPack 272
assembler 332
6 Assembler 10
Atari 246
68000 246 auto 31
AutoCAD 43, 240
autoexec.bat 245
7 AutoLISP 240
AX 11
7447 282

B
8
Baby Web Server 326
80 portu 327 Backspace tuĢu 218
800x600 182 base 105
Basic 26
batch 241
bayrak 15
A bayram gžnleri 238
BDE 62
AbriaMerlin 279 BDE Administrator 84
Access 62 Benchmark 273
Action Script (Flash) 253 BeOS 7, 246
Action Script 2.0 317 BGI 56
Active Server Pages 257 BIOS 10
ActiveForm 230 bi – directional 103
ActiveSkin 347 bi – directional bubble sort 35
ActiveX 229, 247 binary 10
aŒ×l×Ģ disketi 245 binary (ikilik arama) 36
ADC devresi 110 bitmap 43, 67
Add all fields 86 bitsel iĢlemler 34
ADSL 327 BlueDream 274, 276
AGP 246 BlueDream projem 270
Akbil 107 Bluetooth 326
ak×Ģ diyagram× 339 boolean 30
alfa nžmerik 102 boot 10
algoritma 182, 339 Borland Graphic Interface 56
al×ĢveriĢ 314 Borland Pascal 55
alias 84 b™cekler 144
Alpha 246 brcc32.exe 67, 272
Alt tuĢu 217, 342 break 65
AMD 246 bubble sort 35
Amiga 246 buffer 103
analog 110 Build with runtime packages 62
and 10 bump mapping 43
animasyon 73, 313, 317 Button 81
anket 257 BX 11
antialiasing 313 ByteBool 65
Apache 206, 279, 289
API 110
App 66
Apple 246
C
application 120
C dili 29
359

C++ 7, 29, 46 Œ™zžnžrlžk değiĢtirme 164


CAB file 230
Cache 11
calculated field 209 D
call 19
canvas 64, 114 DAC devresi 110
Caps Lock 73 DanceEJay 189
Carriage Return 19, 342 data komutu 68
carry 15 data segment 30
case 44 dbase 116, 347
case sensitive 30, 340 dbase 3 323
Casio FX-880P 7 DBChart 176
CD 364 DBGrid 84
Centronics 106 DBNavigator 116
CGI 206, 257, 364 DC 10
char 30 dcc32.exe 274
Character 252 debug 5, 14
Chart 176 Debug menžsž 63
ChartFX 176 decode 102
chmod 290 decrypt 102
Chr(ascii_deger) 102 defrag 246
CISC 11 Delphi 62
collision 164 Delphi Tžrk Kod Bankas× 144
ColorDialog1 117 Delphi1.0 62
COM 241 DelphiX 164
COM port 107 demo 110
Combobox 84, 120 demonstration 110
Command1(Index).Caption 222 Denetim Masas× 245
Command16.SetFocus 222 denklem 294
CommandButton1 236 Dependency Walker 90
compile 62 derlemek 67
compiler 28 derleyici 28
component 83 Design Mode 237
Components 141 DHTML 314
config.sys 245 Dictionary On-Top 115
const 31 dijital 11
Control Panel 245 dinamik dizi 30
Control tuĢu 217 dinamik haf×za kullan×m× 33
Corel 240 dinamik IP 327
CorelDraw 43 dir |more 55
CorelScript 240 DirectX 164, 313, 347
Cortona 312 disassembler 63
cos 114 Disassembler 274
Counter-Strike 273 div 15
crack 364 dizi 222
Crimson Editor 279 diziler 30
cross kablo 107 dizin seŒme diyalog kutusu 67
crt žnitesi 64 DLL - Dynamic Linking Library 89
Ctrl+Enter 253 Dock – g™mžlme 168
CX 11 donan×m kesmeleri 19
Cyrix 246 Doom 165
DOS 18
DOS programc×l×ğ× 5
Ç dosyalama 223
DotNET 274, 291
Œerez 208, 290 Dreamweaver MX 2004 314
Œok iĢli 246 durak noktas× 63
Œok kullan×c×l× 246 duvar kağ×d× 168
Œokg™revlilik 120 Duyarl×l×k 296
Œoklu iĢlemci 246 duyuru 314
Œoktan seŒmeli sorular 290 džĢžnmeyi ™ğretmek 137
™zžcž Eklentisi 294 DVD 76
360

DX 11 for 44
DXSound 200 form 111
dynamic data exchange (DDE) 217 Form1.Canvas 114
Dynamic Text 252 Format fonksiyonu 65
formu fare ile sžržkleme 73
forum 257
E fotoğraf makineleri 246
Fourier 294
ECP – Extended Parallel Port 106 FoxPro 62
edit 27 fps 253, 317
Edit nesnesi 116, 128 FPS 313
ekran koruyucusu 93, 349 FPU 11, 15
eksabyte 17 frame 253
embed 255 freeware 347
empty() 290 from 340
Enable Macros 232 FTP 206
encode 102 full duplex 108
Encrypt 102
end. 64
Enter 128 G
Enterprise 230
environmental mapping 43 game port 110
eposta 314 GDI 89
EPP – Enhanced Parallel Port 106 gdi32.dll 89
EPROM 332 GeForce 164
ESC tuĢu 48 Gelecek Linux 2.0 289
ethernet 246 getch() 29
Events 62 getchar() 29
Excel 80, 232, 236 getche() 29
executable 28 Getimage 56
exit 65 gets() 29
Export Table 90 getURL(); 255
ext 246 giga 17
ext2 246 GiriĢ / ×k×Ģ 106
ext3 246 GLScene 164
extended filesystem 246 Google 290
extended ™zelliği 223 Goto 26
extern 31 gotoAndPlay (1); 253
g™rev Œubuğu 76
G™rev Œubuğu 67
F g™rev Œubuğunda simge 80
G™rsel Nesne Kžtžphanesi 62
F1 364 GPF 89
false 30, 65 grafik ekran 48, 56
fare 41, 67 grafik nesnesi 176
fare kullan×m× 48 gramer 200
fare t×klamas×n×n 67 GraphLayout 160
FAT 246 grid 160
fatura 198 GUI 62
fflush(stdin); 33 gžvence 66, 152
filtreleme 84, 301 GWBasic 26, 349
Flash 43, 252, 317, 347
Flash RAM 246
flat 137 H
flicker 114
Flip – Flop 10 haftal×k ders program× 179
float 30 haftan×n gžnž 44
FloatToStr 102 Half – Life 164
fly-by evaluation hints 63 half duplex 108
fonksiyon 27, 33, 38 harita 320
font 43 HasColumnHeader 117
FontDialog1 117 hashing (k×yma arama) 36
361

HelpPC 19
hesap makinesi 58, 218, 350
J
hesaplanan alanlar 198, 301
hex – edit™r 14 JAL(Just another language) 334
hexadecimal 10 Java 62, 364
hipotenžs 114 Java Development Kit 160
Histogram 294 JavaScript 69, 247, 252, 279, 282, 298, 314, 347, 364
Hizmetler (Services) 80 joker karakterleri 242
host 257 joystick 110
hourglass 120 J-script 240
HTML 7, 146, 252
httpd.conf 281
K
I kalem ile Œizim 213
kanal 120
I/O 106 Karakter animasyonu 313
IBM OS/2 246 Kate metin edit™rž 289
IDE 62, 297 kavĢak 317
IEEE 30 kayan yaz× 65, 247
IIS 206, 297 kayan y×ld×zlar 164
Image 111 kayd×rma 211
Image Editor 67, 137 kelimeyi aramak 256
Imagesize 56 kendi yaz× tipiniz 48
Index 84 kernel interface 246
InputQuery 66 kernel modu 246
InstallShield Express 343 kernel32.dll 89
InterBase 340 kesirli say×lar× 30
Internet Scene Builder 312 Key 84
IntraWeb 208 keyframe 253
IntToStr 102 K×z×l™tesi 108
ISIS Proteus 282 kilo 17
kilobyte 242
klavye 42
Konqueror 289
İ konsol uygulamalar× 206
kullan×c× modu 246
iconlib.dll 89 kžme iĢlemleri 65
identification 255 Kylix 206
idle – boĢ 120
iframe 247
32
iif deyimi
ikinci derece denklem 339
L
ikincil indeks 84
immediate 63 Labcenter ISIS Proteus 332
in deyimi 65 label 222
include 281 Label 117, 128
index 223 Label1 155
infrared 108 ladder diagram 10
Ġngilizce Œeviri 200 layer 253
initiation 80 Layer 43
inside – out activation 229 led – light-emitting diode 103
int değiĢkeni 30 Left$() 64
intel 11, 246 legal 364
interpreter 28 LILO 246
interrupt 19, 347 Lightwave 164
intro 110 Like 84
introduction 110 Line Feed 19
iODBC 279 linear (doğrusal arama) 36
istatistik 294 Linux 29, 246
iĢar 198 LoadFromFile 152
iterative (tekrarlan) 36 logo 43
long 30
362

LongBool 65 MSDN 69
Lookup field 86 MSDN Library 73
loop 253 MS-DOS 244
LPT 103, 106 msdos.sys 245
MSSQL Server 298
mul 15
M multi tasking 246
multi thread 120
Machintosh 246 multi user 246
Macromedia Flash 164, 252 Multiline 252
Macromedia FlashMX 2004 274, 282 MultiSelect 223
Magneto Optik Disk 246 multiservis 279
main() 29 Multitasking 120
makro 38 MySQL 279, 280, 285, 340
Mandrake 9.0 289
manuel 245
masažstžnžn resmi 213 N
maskeleme 106, 211
Masm 18 nano 17
math uniti 64 nanosaniye 246
matris 60 nesne oluĢturmak 81
MaxScript 240 Netscape 240, 279
May×n Oyunu 141 Norton Commander 348
mbr 246 Not giriĢi 209
md5 281 notepad 4, 27
mega 17 Novell Netware 10
mem 18 NTFS 246
Memo 152 Null Modem kablosu 107
memory 218 Num Lock 73
MemoX 270
menü 323
metin kutusu 48 O
MIPS 246
micro 17 OasisSE 189
Microchip 332 Object Inspector 62
microcontroller 10 Object Oriented Programming 47
Microsoft Access 37, 257, 281, 323 OCX 229
Microsoft Agent 69, 347 ODBC 62, 279
Microsoft Development Environment 6.0 248 Office 2000 69, 236
Microsoft Visual FoxPro 322, 323, 327 Office 97 69, 236
Microsoft Visual Studio 248 Office Asistan×n× programlamak 75
Microsoft Windows 4 Office XP 69
Mid$() 64 OLE 241
midas.dll 272 OLE Automation 229
mili 17 OmniHTTP 279
mirror set 246 OnIdle 121
misafir defteri 257 op-code 19
MMX 11 OpenGL 164, 246, 271, 313, 347, 364
MOD 246 Opera 279
Modem 246 Oracle 340
Module 233 Ord(tek_harf) 102
modžl 232 oturum 289
modžler 106 overflow 15
moricons.dll 89
Motion Tween 253
mouse 40
mov 19
Ö
movieClip 317
Mozilla 279, 289 ™zel karakterler 342
MPEG4 348
MPLAB 332
MS SDK Help Files 89
363

Publish (Flash) 253


P Putimage 56
PWS 257
Paint 168
PaintBrush 168
PalmPC 297
palmtop 270
Q
paralel port 326
parametre 13, 93, 120, 244 QReport 209
parametrik 110 QRExpression 209
parity 15 QRLabel 117
Pascal 347 Quake 164
Pascal žŒgeni 207 Query 340
patch 89 Query1 176
path 84, 243 quick sort 35
PC 246 QuickReport 117, 349
Peek 68 QuickView 90
Pentium 4
perabyte 17
Personal Web Server 257 R
Photoshop 43, 164
PHP 282, 285, 314 radyal 114
PHPConfig 281 RAID 246
phpMyAdmin 289, 314 RAM 11, 17, 18
PHPTriad 279, 289 RAMDISK 245
PIC 332 re deklere 33
PICBasic 332 read komutu 68
PIT – Programmable Interval Timer 108 Readln 152
Pi say×s× 114 real – time 43
Pic Mate 336 Record New Macro 237
PickList 84, 176 recursive 234
pico 17 Redundant Array of Independent / Inexpensive Disks
pifmgr.dll 89 (RAID) 246
pin 110 RefEdit.Ctrl 236
pixel 253 register 11, 31
PLA 10 register_globals 281, 289
PLC 349 ren komutu 244
plug-in 164 render 43
pointer 31, 65 reset 31
Poke 68 resim yollama 290, 314
PopupMenu 80, 117 resource 67
Port komutu (Pascal) 106 ResourceHacker 284
POST 17 Resume 120
potansiyometre 110 ret 19
pow (taban, žs); 29 reverse engineering 63
power(x,y); 64 RGB 110
PowerPC 11, 246 RISC 11, 332
primary index 84 Right$() 64
Prince3D 349 robot 320
Print Screen 21, 217 ROM 10
printer 60 root 257
printf(); 39, 44 RS-232 107
priority 120 run time 63
process 120 rundll32.exe 90
ProcessMessages 121, 155 RXD 107
program×n bir kere Œal×Ģmas× 66
Programmable Logic Controller 10
Projeksiyon 213 S
Properties 62
prosedžr 27, 33, 38 sample 110
protokol 108 Sample 164
prototip 33 sanal makine 246
364

SaveToFile 152
sayfalama 301
Ş
scale 283
scandisk 246 Ģifre Œ™zžcž 364
scanf(); 33, 44 Ģifreleme 102
scroll 165
Scroll Lock 73
SCSI 246 T
Secondary Index 84
select 340 Tab efekti 128
selection sort 35 Table (Access) 257
Sendkeys 217 tabulator 48
sequential 120 tag 253
seri port 107 takvim yapmak 238
session 281 taskbar 76
setup 84 Tasm 18
SetVariable 255 tatil gžnleri 238
shareware 347 telnet 246
shell32.dll 89 tera 17
Shift tuĢu 217 terminal 10
shl 15 Terminate and Stay Resident 46, 349
short 30 Terragen 164
ShowInTaskbar 64 Text nesnesi (Flash) 252
shr 15 Text Options 252
SHTML 269 texture 43
s×ralama 301 thread 120, 200
sin 114 ticari uygulamalar 314
sipariĢ 314 Time Critical thread 120
Sistem DSN 281 time sharing 120
sistem menžsž 126 Timer 111
sizeof() 31 Timer1 80
SMTP 246 toggle 63
SoleBee 270, 274 Tolerans 296
s™zlžk 200, 348, 349 Toolbar 168
speaker 108 ToolBook Instructor 229
speech 73 ToolBox 69
SpeedBar 62 ToolPak ™zžmleyicisi 294
SpeedButton 137 trafik 317
SPP – Standart Parallel Port 106 transist™r 11
SQL 62, 84, 209, 281, 298, 340 transparency 213
SSE 11 trigonometri 114
SSL 269 true 30, 65
stack segment 30 Truespace3 348
static 31 truetype font 43
stok 198 try except gžvencesi 66
strcmp 30 TSR 46, 80
stripe set 246 TTL 103
StrToFloat 102 Turbo Pascal 55
StrToInt 64, 102 turistik gezi 313
struct 31, 47 Tutorial 164
Studio Max 164, 240 TžrkŒe 64, 116
Sun Sparc 246 twip 65
Suspend 120 TXD 107
sžržkle 189 Type Library 229
sžržkle b×rak 48 type oluĢturma 31
sžržkle ve b×rak 117 typecast 65
sžržklemek 67
swap 60
Swap 246 U
UART 108
UDMA 246
365

uninstall 246
union 31
W
unit 64
Unix 29, 246, 257 WavMix 189
USB 246 Web Server Application 208
user interrupt 19 Webdings 137
user32.dll 89 WebModule 208
UserForm 236 where 340
uses 56 Win 3.1 62, 121
UTF-8 282 Win32API 89
utility 5 win386.swp 246
uzaktan kontrol 326 Windows 2000 246
Windows Gezgini 146
Windows Millennium 93
Windows NT 246
Ü Windows programc×l×ğ× 5
Windows Scripting Host 5, 240
žŒ boyutlu 43 Windows XP 289
Windows‟u kapatma 76
Windows\Command 243
V Windows\System 246
WinLines 160
var 29, 64 WordBool 65
Variable 252 Wordwrap 252
variant 65 Writeln (dosyalama) 152
VB.NET 2005 301 writeln() 64
VB6 326 www.microsoft.com 69
VBA 69, 364 WYSIWYG 43
VBScript 69, 364
VBX 62, 229
VCL 62 X
vcl50.bpl 62
vekt™rel 43 x – y džzlemi 114
veritaban× 257 X Window 246
View Code 236 XingMPEG Player 240
virtual machine 246 xorput 56
viržs 364
Visual Basic for Applications 231, 232
Visual Basic.NET 297
Visual Studio 6 323
Y
void 29
volatile 31 Yak×nsama 296
volume set 246 yapay zeka 320
Voodoo 349 yaz× tipleri 43
Voodoo Banshee 164 yaz×c× Œ×kt×s× 117
VRML 164 y×ğ×n dosyas× 241
VRML (Virtual Reality Markup Language) 5, 364 Yineleme 296
VRML2.0 313 yorumlay×c× 28
VRMLPad 313 Yunus 270, 274
VS Developers 297
VXD (Virtual Device Driver) 110
Z
zaman paylaĢ×ml× 120
zlportio.sys 272
366

Son söz
CD‟nizi kaybetmeyin. „rneklerimiz CD‟den bağ×ms×z da olsa, dikkat ederseniz Œoğu yerde Ģu CD‟nin Ģuras×nda
gibi ifadelerle CD ve kitap organik bir bağ iŒinde. Genel olarak CD‟yi incelerseniz ilgi alanlar×m×n grafik (VRML,
OpenGL...), iĢletim sistemleri, yard×mc× programlar olduğunu g™ržrsžnžz. Mžzik yapmak (sadece MP3 dinlerim), resim
iĢleme (Adobe Photoshop), CAD – Computer Aided Design, donan×m (robot, PIC) programlama pek ilgimi Œekmiyor.
ġimdilik kitapta sadece daha iyi bildiğim dillerden ™rnekler verdim. Diğer deneyimlerime burada yer vermek gereksiz
gibi geldi bana.

Bu arada legal – kanuni programlama yapmaya Œal×Ģt×k. Biliyorsunuz ki bu diller k™tž amaŒla da kullan×labilir.
Viržs, crack veya Ģifre Œ™zžcž gibi Ģeylerle uğraĢmad×m, tavsiye de etmem. „zellikle grafik, dosyalama, sistem
bilgilerini elde etme, programlama algoritmalar× ve problem Œ™zžmleri gibi konulara ağ×rl×k verdim.

SonuŒ olarak C, Basic ve Pascal‟×n hepsinden bir Ģeyler yapabilir halde olman×z gerekiyor. Birbirine yak×n
olduklar× iŒin, C dilinde Pascal, Delphi dilinde de VB ile ilgili bilgiler verdim. Eğer Basic biliyorsan×z ASP, VBScript, VBA
gibi diller sizin iŒin sorun olmaz, C dili biliyorsan×z CGI (si ci ay diye okunur), PHP (pi eyc pi diye okunur), JavaScript‟te
de sorun yaĢamazs×n×z. Ġlle de son versiyon dillere sahip olmak zorunda değiliz. Uzun sžre Delphi 3 kulland×m, Delphi
7 ve VB 6 Œoğu zaman her iĢinizi g™ržr. Eğer Œok temel değiĢimler olmam×Ģsa yeni versiyon sadece geliĢimin bir
uzant×s×d×r. Burada versiyon numaralar×ndan bahsetmek riskli asl×nda, Œžnkž her an yeni versiyonla veya isim
değiĢikliği ile karĢ×laĢabiliyoruz. „rneğin VB.NET gibi…

En bžyžk yard×mc×m×z F1 tuĢu. oğu dilde muhakkak burada iyi yard×m konular× bulabilirsiniz. Bunun yan×nda
yeni bir programc× isek, ilk yapacağ×m×z Ģeyler baĢkalar×n×n yapt×ğ× programlar× tekrar yazmak, onlar× incelemektir.
Ġleri programc×l×ğa geŒince de art×k sizi kimse tutamaz. Kendi stilinizi edinmiĢ ve bilgisayar size değil siz bilgisayara
istediğinizi yapabilir hale gelmiĢsinizdir. Yani efendi siz, k™le bilgisayard×r art×k. Bundan sonras×nda yapabileceğiniz
Ģeyler benim g™remediğim, hatal× yapt×klar×m× kendi fikirleriniz ile yoğurarak ilerlemeniz.

Beklediğiniz konular× bulamam×Ģ olabilirsiniz, ama daha film bitmedi. Belki baĢka bir kitapta g™ržĢmek žzere.
Programc×l×k kolay meslek değil, ama hevesli iseniz peĢinizi b×rakmaz! Zaten o her yerde sizi g™zetliyor!
367

Kaynaklar
 A‟dan Z‟ye C K×lavuzu – Kaan Aslan
 Algoritma GeliĢtirme ve Programlamaya GiriĢ – Fahri Vatansever
 ASP.NET & XML – Yžksel Ġnan, Nihat Demirli
 Bilgisayar „ğrenen Herkes ĠŒin – FONO
 Byte, Chip, PC World, PC Net, PC Magazine, PC Life dergilerinin 1995 – 2005 aras× ŒeĢitli say×lar× ve ekleri
 C++ ile Nesneye Dayal× Programlama – Fehmi Demiralp
 Delphi 2 – Mehmet ™mlekŒi
 Delphi 3 – Marco Cantu
 Delphi 3 – Serdar „zler
 Delphi 3 Super Bible – Thurrot, Brent,Tendon, Bagdazian
 Hatas×z Kodlama – Steve Maguire
 Ġnternet siteleri (delphiturk.com ve programmersheaven.com gibi)
 Kim Korkar Unix‟ten – Can Uğur Ayfer
 Linux ĠĢletim Sistemi – G™rkem etin
 Macromedia Flash 4.0 – Y.DoŒ.Dr. Adem Karahoca
 Microsoft Standart C – Bahattin Bayburan
 MikroiĢlemciler ve Bilgisayarlar – Dr. Haluk GžmžĢkaya
 MS-DOS ile al×Ģmak 6.22 – Van Wolverton
 Office 97 – Faruk ubukŒu
 PC Donan×m – Murat Y×lmaz
 PHP – Dr. Hakk× „cal PCLife Kas×m 2000
 …niversiteden kalan ders notlar×m ve program ™rnekleri
 Yap×sal Basic Prensipleri – Halim Korkmaz

You might also like