Professional Documents
Culture Documents
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 Bcek Ay×klama ............................................................................................................8
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, yntemler
gsterme 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 trl yapt×ğ×n×z program al×Ģm×yorsa, yaz×m hatalar×na ve kitapta verilen
tm 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 srmlerde 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
Trke kaynakl× m× bilmiyorum, fakat string ve text kelimeleri yerine metin kulland×m. Baz× Ġngilizce kelimelerin de
okunuĢlar×n× italik olarak belirttim, kitap sonundaki szlk ile tak×ld×ğ×n×z kelimeleri bulabilirsiniz. Yine de siz
yak×n×n×zda bir szlk 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× iin 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 byk ×, l kk le birbirine
benziyor. TuĢ birleĢimleri “Alt+Tab” deyimindeki gibi + ile birleĢtirilerek yazd×m. Men komutlar× “” iinde 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× dzgn olan Verdana yaz× tipini setim. Baz× blmlerde yer
tasarrufu iin iki kolon Ģeklinde bldm. 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 birok hata ve a×klanmas× gerekli konular var. Size hibir yaz×l×m×n veya
rnn kusursuz olmad×ğ×n× belirtmek istiyorum. Bu sebeple devaml× yeni srm programlar yaz×l×yor. Kitap iine
yay×lm×Ģ birok ipuçları bulunuyor. Tek sorun bu ipular×na hemen ulaĢamaman×z. oğu rnekte, bu rnekte Ģu olay×
da siz yapabilirsiniz, gibi deyimlerle al×Ģman×z iin fikirler vermeye al×Ģt×m. Yanl×Ģ anlamay×n, tm 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Ģnlrse, rneklere dayal× pratik yapmak daha ilgi ekici ve
ak×lda kal×c× olduğuna inan×yorum. Bol bol rneklerle her an dilleri birbiri iine girmiĢ Ģekilde kitaba aktard×m. Her
blm ad×m ad×m gemenize 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 grebilirsiniz. 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 dnyalar× ayr× dillerde ayn× beklentiye sahip olmak. Sizce de bu kod dnĢ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 amala 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 birok rneği a×klamalar× ile karĢ×laĢ×rken btn bu dillerin bilmek zorunda değilsiniz.
ok dil bilmekten daha nemli olan Ģey elinizdeki imkanlar× en iyi Ģekilde değerlendirmektir. rnekleri noktas×
virglne komut komut a×klayamayacağ×m. Yani bilmediğimiz, ezberlemediğimiz birok nokta olacak. Zaten buradaki
ama size tam olarak bu dilleri ğretmek değil, fikir vermek. Ne ile ne yapabilirsiniz gibi. Dile gre konu belirlemek
yerine, konuya gre istediğimiz dilde program yazabilmek as×l hedefimiz. Ama genel olarak sitenize misafir defteri
yerleĢtirmek istediğinizi dĢnrsek, 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. Dnyaya sadece belli a×lardan
bakarak değil hedefimize gre uygun alet edevat seerek ilerlemek gerekli. Art×k yaz×l×mlarda internet ağ×rl×k
kazan×yor. Ġnternet destekli olmayan programlar yavaĢ yavaĢ eleniyor. Temel neden gncellenebilirlik ve iletiĢim.
Ġnternet, bilgisayar dergileri, bilgisayar kitaplar× ve okul bizim bilgi kaynaklar×m×z. delphiturk.com,
programmersheaven.com, ve benzeri sitelerden her trl kod ve programlama bilgisine, en gncel haberlere ve
ipular×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 hibir
Pentium veya baĢka iĢlemcide sorun ×kt×ğ×m× grmedim. Ġlle de Ģu iĢletim sistemi ve iĢlemci olacak diye bir
sorunumuz yok. zellikle notepad - not defteri en byk yard×mc×m×z. “Windows\SendTo” iine not defterine k×sayolu
5
oluĢturarak, herhangi bir dosyay× sağ t×klay×p “Gnder*Notepad” yapabilirsiniz. Crimson Editor ise gzel bir not defteri
alternatifi. Kod renklendirme, bol geri alma, byk dosyalar× kolay ama gibi zellikleri bağ×ml×l×k yapabilir.
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. Editr 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 tm *.bas dosyalar× iĢler. {DOS programc×l×ğ×}
Visual Basic (*.mak veya *.vbp - proje dosyas×, *.frm - kodlar, *.bas - modl bilgileri) : VB4 ve zeri yeterli.
{Windows 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 gz at×n. Not defteri ile dzenlenebiliyorlar. {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 iin ayr×ca IIS kurmak gerekiyor. *.php
iin de Xampp tavsiyem. {Internet programc×l×ğ×}
VRML (*.wrl) : Virtual Reality Markup Language. Grntlemek iin cortvrml.exe gerekiyor. Internet Explorer'da
grebilirsiniz sonular×. “cd2utility\VRML” dizininde editr rnekleri bulabilirsiniz. isa10.zip‟i tavsiye ederim.
{Internet programc×l×ğ×}
Eğer hala değiĢik uzant×l× dosyalar grrseniz, Ģimdilik onlar bizim iĢimize yaram×yor. Mesela *.bak, *.~dp gibi
dosyalar programlama dilinin kendi yedek ve yard×mc× dosyalar×.
Siz de sonuta 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 tm
programlar ve iĢletim sistemleri bir programlama dili ile programc×lar×n elinden gemiĢ 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
mziğ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
geemese de, tak×m halinde olman×n verdiği zevk tek baĢ×na al×Ģmaktan ok ok daha fazla.
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
dzgn 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
grsel programlama iin uygun. Asl×nda bu szleri biraz iim burkularak sylyorum, nk keĢke Linux veya Unix iin
bunlar× syleseydim.
Bir ara elime bir el bilgisayar× olan Casio FX-880P gemiĢti. Ġindeki 64KB belleğine fazla uzun bir Ģey
yaz×lam×yordu, ama yine de Basic benzeri dili ile Shell ad×nda Trke programlama dili, ark×felek, Say× bulma, Batak
kağ×t gibi oyunlar yapm×Ģt×m. Kitab×n×n dkmantasyonu ok hoĢuma gitmiĢti. Sade ve tm 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 iin 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 Fakltesi Ġ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 iinde Okul Ders
Program× adl× program ile cebelleĢmeye baĢlam×Ģt×k ve bir y×l boyunca (yaklaĢ×k 750 saat) birok Ģeyi zevkle zdk.
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 iin ok ağ×r. Delphi ile Visual C‟yi karĢ×laĢt×rmay× pek gerek yok, ama Delphi de VC kadar zengin
ktphanelidir. 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 btn ayr×nt×lar× ile bir dilde bir program nas×l yaz×l×r anlatmayacağ×m. Bunun iin 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 geilir. Asl×nda Basic‟den uzak durulmas× da tavsiye ediliyor. nk insanlara kt al×Ģkanl×klar kazand×r×yormuĢ.
Grsel programlama ile kod yazmaktan kurtulunuyormuĢ gibi zannedilse de iyi bir program yazd×ğ×n×zda belki
program×n×z yzlerce, 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 / Trkiye
Doğruluk
Ġyi bir program×n temel zellikleri; bunlar×n s×ras× sizin stilinizi belirler:
: Verilen grevlerin tam olarak yerine getirilmesi.
Dayanıklılık : Beklenmedik hatalardan dolay× program×n al×Ģmas× kesilmemeli.
Genişleyebilme : Ġleri aĢamalarda grevlerin 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 kk paralara ayr×larak yazmak.
Anlaşılırlık : BaĢkas×n×n yazd×ğ× program elden geirilirken rahata okunabilmeli.
Koruma : Modller birbirlerine mdahale etmemelidirler.
Bilgisayar kullan×m× ile ilgili bir ka ipucu:
Windows‟unuz devaml× gyor, mavi ekranla karĢ×laĢ×yorsan×z, bunun sebepleri ya o s×rada al×Ģan hatal× bir
program yada ucuz donan×m paralar×d×r. Markal× RAM ve iyi bir anakart al×n.
Antivirs program×n×z× devaml× al×Ģmas× gerekli. Klasre ve dosyaya sağ t×klay×p da “Virs kontrol yap” diyebilen
antivirs yaz×l×m× kullanabilirsiniz.
9
Masastnde 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× gz en az yoran faktrdr. (sar× zerine siyah
gibi...)
Masastndeki gereksiz k×sayollar×n hepsini silin. Bylece Windows bir de onlar× gncellemekle uğraĢmaz. Zaten
Windows Gezgini (Win+E) yeterince kullan×Ģl× bir programd×r.
Dosya uzant×lar×n×n “Klasr Seenekleri*Grnm*Bilinen dosya trlerinin dosya uzant×lar×n× gizle” seeneğini iptal
ederek gzkmelerini sağlay×n.
Klavye k×sayollar× iyi bilgisayar kullananlar×n en byk 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
dneceksiniz, 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 szlk bulunsun. WordWeb32, Moonstar program× ok kullan×Ģl×.
Devaml× haf×zada yer iĢgal eden gereksiz btn programlar× a×l×Ģtan – “BaĢlat*al×Ģt×r... *msconfig” ile iptal edin.
Eğer gzelce al×Ģan bir donan×m×n×z var, ve siz de “Dur Ģunu daha h×zland×ray×m!” diye yola ×km×Ģsan×z, byk
bir ihtimalle elinize mahvolmuĢ bir Windows veya bilgisayar geer. zellikle BIOS ve registry – Windows Kay×t
Veritaban× ayarlar× ok tehlikelidir.
Donan×m upgrade – gncelleme iĢlemi ancak zaman×nda yap×l×rsa gncellemedir, yoksa para kayb×d×r.
Bilgisayarda radyo dinlemek, televizyon seyretmek gzel Ģ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. Dzgn masa, sandalye, ergonomik klavye ve fare, rahat grebileceğiniz monitr ve ekran
znrlğ gibi...
Bilgisayar×n×za ne kadar zen gsteriyorsan×z ayn× Ģekilde evrenizin de temiz ve dzenli olmas×n× sağlay×n.
Kitaplar×n×z×, CD/DVD ‟lerinizi y×pranmaktan koruyun. Park ve baheleri de...
Murphy‟nin Yasalar×:
Ters gidebilecek bir Ģey mutlaka ters gidecektir. Hatta tersliğin en az mmkn grldğ anda bile.
Siz spermen değilsiniz.
Aptalca grnen 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Ģsndr.
Tm 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 iinde ise sen de ylesindir.
Dost ateĢi dostun ateĢi değildir.
Yapabildiğin her Ģey vurulmana yol aabilir, hi bir Ģey yapmaman da dahil.
stne gelen dĢman ateĢinden daha isabetli olan tek Ģey, stne 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 dnya amatrlerle doludur.
Sng kanunu der ki, mermisi olan kazan×r.
Kusursuz planlar, kusursuz değildir.
SavaĢta niformas× daha gsteriĢli olan taraf kaybeder.
Eğer dĢman× grebiliyorsan o da seni grebilir.
10
Bölüm 1 – Assembler
Tm dillerle doğal olarak uyumlu olan mikroiĢlemci programc×l×ğ× baz×lar× iin ok ilgi ekici olabilir. Hata
mesajlar×n× dikkatli okuman×z gerekiyor. MS-DOS da hi hata mesaj× grmeden makineniz kilitlenebilir. Genellikle eliniz
kolunuz bağl× gibi hissedebilirsiniz. Yani mikroiĢlemci programc×l×ğ× bir fili emekleyerek veya srnerek avlamaya
benzer. Yine de avantajlar× da var. Ġleri blmlerde Delphi ve diğer diller iinde bile hala Assembler kodlar×
kullan×ld×ğ×n× grebilirsiniz. nk ok az kod yazarak donan×ma (grafik ekrana gemek, paralel bağlant× noktas×na
sinyal yollamak, ...), iĢlemciye eriĢebilir ve h×zl× (srnerek 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 ykleyerek iĢimizi grrz. Tabii hepimizin evinde byle bir EPROM –
erasable programmable read only memory silici ve yaz×c× olmad×ğ×na gre, 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 grnt belleği, Expanded – geniĢletilmiĢ; kalan tm 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 kk, 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.
Bilgisayar×m×z transistr, diren, kondansatr gibi binlerce elektrik ve elektronik paralardan oluĢuyor. En
temel değer elektrik var “1”, elektrik yok “0” ‟d×r. Yani oyunlar, mzik paralar×, 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. Tm 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 ieriyorsa iki yazmac× birleĢtirerek yani
normalleĢtirerek 1A200H adresini elde ederiz. CS ve IP 16 bit iken, sonu 20 bit olmas× iin 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 iin 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 srlen
16 bitlik 4.77 MHz 8086 ile geriye uyumlu al×Ģmak zorunda olduğu iin 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 kmeleri geriye doğru uyumlu değildir.
CISC – Complex Instruction Set Computer (KarmaĢ×k komut kmeli bilgisayar) yntemi ile programland×ğ× iin
intel, geniĢ komut kmesi ile esnek fakat h×z× dĢk iĢlemcidir. PowerPC gibi RISC – Reduced Instruction Set
Computer (azalt×lm×Ģ komut kmeli 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 yazmalar×m×z bu kadar. Ama iĢlemci iinde sadece bunlar yok. Cache – n bellek, FPU –
floating point unit, giriĢ / ×k×Ģ yol arabirim mant×ğ×, code cache – kod n haf×za, tamsay× yrtme birimleri, komut kod
zc, ve buna benzer nitelerden oluĢur. ĠĢlemcinin anakart bağlant×lar× da iindekine benzer. D×Ģ cache, RAM –
Random Access Memory, sistem veri yollar×, giriĢ / ×k×Ģ yollar×, disk kontrolcs gibi blmlere bağlan×r ve onlar×
ynetir. Donan×m ile ilgili baz× rneklerimizi ilerleyen blmlerde bulabilirsiniz.
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 BX‟den byk olduğu iin 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.
AĢağ×da baz× rnekler ise *.asm uzant×l×d×r. Bunlar× derlemek iin 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 ieriği Ģyle:
Ġ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 iin, bu rneği not defteri ile a×p hepsini sein ve kopyalay×n.
“BaĢlat*al×Ģt×r...” ‟dan “debug” (dibag diye okunur) komutu verin. ×kan siyah komut isteminin pencere halinde
olmas× iin 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 stndeki mavi.com‟un tek yapt×ğ× Ģey mavi bir metin ekran oluĢturmak.
48 byte boyundaki mavi.com dosyam×z× bir hex – editr ile aarsak, bizim doğrudan bir Ģey anlamad×ğ×m×z Ģu
yaz×lar× grebilirsiniz:
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:
BaĢka bir zaman tekrar debug‟da yazd×ğ×m×z bu program× yklemek istersek L yani load komutunu verebiliriz:
Tm say×lar tamsay×d×r, negatif ve ondal×kl× yani virgll rakamlar bayraklar ve diğer yard×mc× yazmalarla
kullan×l×yor. FPU – Floating Point Unit denilen blm ile kayar noktal× iĢlemler daha h×zl× hesaplan×r. ĠĢlemci
yazmalar×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, yn direction – DF, taĢma overflow – OF ile blme, arpma gibi iĢlemler yap×l×r.
On taban×ndaki kayar noktal× bir say× herhangi bir say× sistemine evrilirken; tamsay× k×sm× 0 ×kana dek o say×
sistemine blnp 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 grebiliriz. Komutlar×n haf×zada kaplad×ğ× alan kadar
onlar×n iĢlemci iinde ne kadar zaman harcad×ğ× da nemlidir. Mesela div - blme komutu 80486 iin 24 saat darbesi
ile biterken, benzer grevi yapan shr – sağa kayd×rma sadece 3 saat evrimine ihtiya duyar. Ġkiye blmek veya
arpmak iin en h×zl× ve pratik komutlar shl arpma ve shr blmedir. 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
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 drt 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. Blmede de div bl gibi
bir byte blme 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=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=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.
Ġkilik sistemden de birka rnek yapal×m, genellikle yaz×mda drder drder ayr×l×rlar:
Eminim 128, 256, 1.44, 65535, 1024 gibi rakamlar× bir yerlerde grmĢsnzdr. 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 grrsnz. 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× iin en yak×n say× 210 yani
1024‟dr.
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 gn getike daha byk ve daha kk birimlere
ihtiyac×m×z artt×ğ× iin değiĢik birimlerle karĢ×laĢacağ×z. Mesela perabyte PB 1015, eksabyte EB 1018 gibi...
18
Bir metin editr 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 kktr nk sadece MS-DOS geleneksel haf×za blgesi olan 1 MB iine yerleĢebilir, boyut olarak 64
kilobyte‟× gemezler; *.exe dosya ise RAM‟in herhangi bir yerine yerleĢir ve byklkleri mega byte‟larca olabilir. DOS
– Disk Operating System komut isteminde mem komutunu vererek, *.com dosyalar iin en fazla ayr×labilen boĢ alan×
grebilirsiniz. ġ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 iin, MS-DOS Komut isteminde Ģunlar× yapabilirsiniz. Eğer Tasm hata mesajlar×
veriyorsa bunlar× dzeltmeden 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:
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× grebilirsiniz. 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 dnĢ ASCII* kodu 13, LF – Line Feed sat×r besle ASCII kodu ise 10‟dur.
Birok int komutundan nceki ax veya ah yazmac×na at×lan değerlere gre 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 iinde 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 drt byte
dallan×lacak adres bilgisi olan yer kaplar. Bir kesmenin alt fonksiyonlar× AH yazmac× ile belirtilir. AH sekiz bit olduğu
iin en fazla 256 fonksiyon tan×mlanabilir. MikroiĢlemci interrupt komutu ald×ğ× anda, o anki yazma bilgilerini ve
program adresini saklar ve kesmeyi gerekleĢ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 blm gibi hatalara karĢ× kulland×ğ× birok internal – i kesmeleri de bulunur.
“Ornekler\Asm\asm.zip*user_interrupt.txt” rneğinde int 60‟× kendimiz programlay×p, belli bir haf×za blgesine
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.
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 dnlebilir.
Assembler dilini donan×ma ulaĢmak iin bize yard×mc× olan dil olarak grebiliriz. Bu sebeple bilgisayar×m×z×
kilitleme ihtimalimiz bir hayli fazla, dikkatli yaz×n×z. Dediğim gibi tm 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? Sonuta
haf×za veya yazmalarla 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 yazmalar hakk×nda ayr×nt×l× bilgiler veriyor.
*
Ek 3 – ASCII Kod Tablosuna bak×n×z.
20
.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 kk harfli on karakter girin ve Enter‟a bas×n. On harfli olmas×na dikkat edin.
Program× değiĢtirebilmek iin edit veya not defteri ile kucuk.asm dosyas×n× aabilirsiniz. Ġlk kez not defterinde
aĢağ×daki program× yaz×p kaydederken de ift t×rnak iinde “dosyaadi.asm” Ģeklinde yaz×p kaydedin, bylece sonu
*.txt kalmaz.
21
Klavyeden yn 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 gryor zaten)... Bu rneği de nceki rnekteki gibi derleyebilirsiniz. Ekran×n d×Ģ×na da ×kmaya al×Ģmay×n, garip
hatalar greceksiniz.
kes.asm dosyas× da buna benzer bir rnek, renk seimi dahil edilmiĢ. Hatta bilgisayar×n×z× bile kilitleyen kay×t
bile var. Biraz inceleyin, belki sizin hoĢunuza gider.
.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
Assembler dilinde yap×lm×Ģ hoĢ bir grafik efekti program×. Gerekten kaliteli bir al×Ģma. *.com olarak
derlemeniz gerekiyor. Ġngilizce a×klamalar× zebilirseniz siz de gzel değiĢiklikler yapabilirsiniz. Siz de “buzdolab×n×
kapat” laf×n× rahatl×kla değiĢtirebilirsiniz:
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
sub ax,[es:di]
mov dx,ax
sar dx,5
sub ax,dx
stosw ; mov [es:di],ax add di,2
loop @@w
cmp dx,0
jnl SHORT @@d1
mov dl,0
@@d1: cmp dx,255
jng SHORT @@d2
mov dl,255
@@d2:
add di,64
cmp si,0
jne SHORT @@o
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
Bölüm 2 – Basic
Basic (Beginner‟s All Purpose Symbolic Instruction Code) dili ile olduka uğraĢmama rağmen burada pek yer
vermeyeceğim. Pascal veya C dilini grnce 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 gzlğ takm×Ģ gibi gitmemizi istiyorlar.
1. piyano.bas (müzik)
(Ornekler\VB\EskiBasic\GWBASIC.zip*piyano.bas)
Bir metin – yaz× giriĢi ile nota al×n×yor. GWBasic ile yazd×m. Resimde grldğ 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 kldr ekrana verir, eğer program uzunsa
yani. F2 al×Ģt×rma, F3 dosya ykleme. Eğer dosya ad×n× hat×rlam×yorsan×z “files” komutu ile dosyalar× grebilirsiniz.
Ekranda renkler birbirine girerse F10 ile varsay×lan siyah beyaz ekrana geri dnebilirsiniz. “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 gzel değil mi? Bu arada sanatmuz.bas bir Trk mzikseverin yapt×ğ× GWBasic
ile program, “Ornekler\VB\EskiBasic\QBasic.zip*Examples” dizininde (Qbasic 4.5 ile rahat al×Ģ×yor). Muhakkak
inceleyin, gzel mzikler var.
27
*.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.
ORTX = (A + C) \ 2
ORTY = (B + D) \ 2
XX1 = ORTX
XX2 = ORTX + 2
YY1 = ORTY
YY2 = ORTY + 2
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 iindeki alt programlara - subroutine ulaĢabilirsiniz. Ana modlde (programda)
Sub deneme (degisken)
yazd×ğ×n×z anda kendinizi ayr× bir dnyada ana program d×Ģ×nda program yazmaya devam ettiğimizi
grrsnz. Bu insanda bağ×ml×l×k yap×yor, nk diğer DOS programlama dillerinde tm kod ayn× yerde oluyor.
Burada ise ayr× pencerede prosedr veya fonksiyon oluĢturuyorsunuz.
Prosedr iine veri yollanabilir fakat prosedr değer dndrmez. Oysa fonksiyon iine değer alabilir fakat her
zaman kendi ad× zerine değer dnderir. Dnen fonksiyon sonucunun değiĢken tipi metin, tamsay× veya kayar noktal×
olduğu muhakkak belirtilir. Bir alt program×n prosedr m yoksa fonksiyon olarak m× yaz×lacağ×na byle karar
veriyoruz.
“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 byle 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…
Tm bunlar×n sebebi Basic dilinin asl×nda interpreter – yorumlay×c×, diğer dillerin compiler – derleyici olarak
al×Ģmas×ndand×r. Yorumlamak demek tm 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 dzey ve Basic, C, Pascal gibi diller de yksek seviyeli olarak
kabul ediliyor. Yksek seviyede komutlar konuĢma diline yak×nd×r. Yksek 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 tm 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 gze arp×yor. En
iyi yntem 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 yntemlerle 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, gncellemeler programc×lar×n daha ok zaman harcad×klar× konulard×r. Zor bir problemi gidermek, bazen
kolay gzken bir iĢlemden daha k×sa srebiliyor. Algoritman×n diğer faydalar× da, daha az kodlama ile problem
zm sunmas×, komut hatalar×n× en aza indirmesi ve daha k×sa srede program oluĢturulmas×d×r.
ğrenmek istediğiniz dilde değiĢken tan×mlama, (aritmetik) operatrler, karĢ×laĢt×rmalar, sayalar, dngler
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 editr 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.
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 bcek ay×klama ile ilgili
yaz× daha ok bu diller iin geerli. Dilin okunakl×l×ğ× da ok nemli. Eğer algoritmas×z, karmakar×Ģ×k kod yazarsak
kendimiz bile iĢin iinden ×kamay×z.
Hemen her dilin ayr×lmaz paras× 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
ktphaneler iindeki komut kmeleri yle zengindir ki iĢlevsel olarak program×n×zda hangisini kullanacaksan×z
seimde zorlanabilirsiniz. Mesela getchar() Enter tuĢunu bekleyen ekrana gzken tek tuĢ okuma, getch() Enter tuĢu
beklemeyen ekrana gzkmeyen tek tuĢ okuma, getche() Enter tuĢu beklemeyen ekrana gzken 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 operatr kmesi de (+, -, *, /,
>, <, &, =, ++, %, !=, >>, ^, ->, ?:, sizeof() …) geniĢtir.
s almak iin pow (taban, s); kullan×labilir. Makine dili
seviyesindeki tm operasyonlar×n C dilinde karĢ×l×ğ× bulunur. Yani sistem programc×l×ğ× ve benzeri ileri seviye
programc×l×ğ×na elveriĢlidir.
Ana program main() iinde olmal×d×r. Eğer main() iinden 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 dnderen, 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 dndrmeyeceğini bildiririz. Birden fazla main fonksiyonu
tan×mlanamaz. Pascal dilinde ise prosedrler değer dndrebilmesi iin var deyimi kullan×l×r:
Tm değiĢkenler kullan×m alanlar×n×n stnde tan×mlanmak zorundad×rlar. Mesela tm programda geerli
olacak değiĢkeni “main(){” deyiminden nce yazabilirsiniz. { } bloklar× iinde kullan×lacak değiĢkenler de “{”
iĢaretinden hemen sonra yaz×l×r. Statik – durağan tan×mlanan değiĢkenler data segment – veri blgesi, dinamik
değiĢkenler de stack segment – y×ğ×n blgesi 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 :: operatr ile bir st bloktaki ayn×
isimdeki değiĢkene ulaĢabilirsiniz.
Komutlar yaz×l×rken kk byk karakter fark eder. (case sensitive – harf duyarl×) rneklerdeki gibi aynen
kullanman×z gerekir. VB dilinde DenemeDeger tan×mlay×p sonra denemeDeger yazarsan×z tm değiĢken adlar×n× son
değiĢikliğe gre gncellenir.
Bir Ģart eğer doğru ise 1, yanl×Ģ ise 0 değeri dnderir. Bu sebeple Ģart ifadeleri hesap iĢlemlerinde
kullan×labilir.
kalan+=(notu<0.5); //unary işlemler
anlam× notu 0.5‟den kk ise kalana 1 ekle.
0 – s×f×r d×Ģ×ndaki tm 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
grebiliyor. 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 grlebilir.
Trke karakterleri kullanmak iin ASCII kod tablosunun ikinci sayfas×ndan faydalanabilirsiniz.
Ġlgin kullan×mlar:
DeğiĢkenler int – tamsay×, float (flout diye okunur) – real (riıl diye okunur) gerel 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 iin 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 gre 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
trlerdeki uyumsuzluklara rağmen, char değiĢkeni (bir Byte) kullanmak en pratik ve ekonomik hale geliyor.
Kesirli say×lar× saklayan float drt byte haf×za kullan×rken, kesirli k×s×m farkl× Ģekilde saklan×r. IEEE – The
Institute of Electrical and Electronics Engineers standard×na gre 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 paralar halinde saklan×r. Bu say×lar×n blme ve arpma gibi karmaĢ×k hesaplar× iĢlemcinin iindeki
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() operatr 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 iin boyutlar×na dikkat edin. Yard×m dosyalar×nda
ayr×nt×l× bilgi bulabilirsiniz. Tamsay×, gerel say× ve metin tipleri aras×ndaki dnĢm komutlar×n×n kullan×m× da
nemlidir.
auto, register, static, extern, const ve volatile gibi yer ve tr bildirimleri vard×r. Genellikle biz bunlar×
kullanmadan değiĢkenlerimizi tan×mlar×z. Ġleri programc×l×lar değiĢkenlerini daha dzenli 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. Ġ ie 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
Tm değiĢkenler madem haf×zaya yerleĢiyor, onlara adres belirterek de ulaĢabilirsiniz. Bunun anlam× pointer –
iĢareti. Bir değiĢkenin adresi bir pointer değiĢken ile saklanarak doğrudan pointer zerinden iĢlemlerimizi
gerekleĢtirebiliriz. Bylece 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, geersiz iĢlem hatalar×na, DOS iin ise reset – tekrar baĢlatma gibi etkilere sebep olur.
Bu arada pointer da bir değiĢken olduğuna gre ona da pointer (**), pointer pointer‟a da pointer
tan×mlanabilir. Neyse boĢ verin! Bu kadar× da fazla :) ĠĢaretiler genellikle char (bir byte), int (iki byte) ve float (drt
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 iinde 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× iin klavye haf×zas×n×n boĢalt×lmas× gerekebilir:
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
2. Değer alan ve / veya değer dndrebilen: (pointer kullan×m× ile birden fazla değer dnmesi sağlanabilir)
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;
}
#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 sonuta ekrana gelecek olan 0001 1001 evriminin drdnc
basamağ×n×n değerini bize veriyor. Son basamak s×f×r s×ra numaras×na sahip olduğu iin nc değil drdnc
basamağa bak×n×z.
ESC tuĢu bas×lana dek yaz×lanlar×n kelime, harf, paragraf ve sat×r say×s×n× hesaplar ve rapor eder. if deyimine
gzel 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
Dizilerde s×ralama iin en ok seerek – 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 gre
h×z gereken yerde h×zl× s×ralama, basit birka say× s×ralanacak ise de balon s×ralamas× kullan×labilir. Balon s×ralamas×nda
iteki for‟dan geriye doğru giden bir tane daha yaz×larak ift ynl – bi–directional balon s×ralamas× olarak
h×zland×r×labilir. Pascal, Basic dillerinde de algoritma değiĢmiyor. Delphi‟nin “Demo\Threads” dizininde gzel bir rnek
var. Tabii ki s×raland×ktan sonra dizinin ilk eleman× en kk, son eleman× da en byk rakam olur. Bu sayede
minimum ve maksimum kendiliğinden ortaya ×k×yor. Byk veri y×ğ×nlar×nda yani veritabanlar×nda ise SQL* deyimleri
olan basit komutlar kullanarak istediğiniz alan× veya alanlar× s×ralayabilirsiniz.
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 mmkn değil. Debug‟a yap×Ģt×rd×ktan sonra
adreslere bak×p buralar× dzeltiriz. Bu adres iĢlemi Microsoft Programmers Workbench adl× program ile veya baĢka dil
iinde 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
yazmalar×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 geilir.
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
byk dizilerde bu yntem 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 dng devam eder. Burada recursive (kendini ağ×ran) veya iterative (tekrarlan) yntemler
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
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;
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 byk dizilerde de bu yntem 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 gerek 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.
#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‖);
}
#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
Birka konuyu bir araya getirirsek, iĢlemcimizin yazmalar×na ulaĢmak iin Ģunu kullanabilirsiniz:
#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);
dl yada DL yazmac×na 0 değeri yollad×ğ×m×z zaman varsay×lan src olan “c:” raporlan×r. 2 GB st iin yanl×Ģ
rapor verebilir. Ġsterseniz 1 değeri atay×p, disket bilgileri ile program× test edin. Byte yerine kilo byte olmas× iin
değerleri 1024‟e blebilirsiniz. O zaman printf‟lerdeki “%9.f B” yerine “%9.2f KB” yazman×z gerekli.
40
Bu program iki *.c dosyas×ndan oluĢuyor. mousetst.c ve mouse.c dosyas×. AĢağ×daki kod mousetst.c ‟dir.
#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;
//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 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× klasre 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 iine
#include <mouse.c>
diye ekleyebilirsiniz.
Pascal‟da da *.tpu unit oluĢturarak “TP\TPU” dizinine genel program prosedr ve fonksiyonlar×
oluĢturabilirsiniz. diyot1.pas rneğine bakabilirsiniz. Asl×nda Ģunu yapmak mmkn; madem fareye mikroiĢlemci
kodlar× ile ulaĢ×l×yor, bunu al×p Basic ve Pascal iinde de kullanabilirsiniz. Yani Pascal rneğimiz olan hesapmak.pas
hesap makinesi fare ile de al×Ģsa ne gzel olurdu... “Ornekler\C\Grafikli.zip*grafikli.c” tam istediğimiz gibi, fare ve
grafik ekran kullan×m× ile ilgili...
42
Assembler blmndeki cizim.asm gibi bu da ekrana klavyeden izim yap×l×yor. w, a, s, d yn iin, q ×k×Ģ, e
silme, r izim, f atlama, g bitiĢik pixel izme iin kullan×l×yor. Dikkat ettiyseniz her iki *.c rneğimizde asm sat×rlar×
var. Her dil donan×ma doğrudan komut yollayabilmek iin bu tip kodlanmaya gidiyor. Bu sayede grafik ekrana
(320*200 znrlk) geip renkli nokta bas×yoruz. cizim.asm rneğinden farkl× olarak ekran×n d×Ģ×na ×k×lmamas× iin
nlemler al×nm×Ģ.
#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(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 rn bitmap – bit haritalama (sadece renk ve koordinat bilgileri saklan×r) trndedir.
CorelDraw, AutoCAD, Flash ise vektrel izim yapmam×z× sağlayan programlard×r. Vektrel izimin avantaj×
zoom yani bytlse bile bozulmamas×d×r ve matematiksel olarak izimler hesaplan×p kaydedildiği iin dosya olarak da
az yer kaplamalar×d×r. Yaz× yazmak iin kulland×ğ×m×z truetype font – gerek yaz× tipleri de asl×nda minik vektrel
resimlerdir. WYSIWYG – what you see is what you get ne grrsen onu al×rs×n mant×ğ× ile yaz×c×m×zdan ekranda
grdğmz yaz×lar× kltp byterek 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 grnt retir ve filtrelemelerle resimler zerinde gereki efektlerle
oynamam×z× sağlar. Layer tekniği ile katman olarak oluĢturulan resimlere mdahale etmek daha kolaylaĢ×yor.
Bilgisayardaki boyutlu dnya ise gittike daha gereki olmaya devam ediyor. Eskiden render – tekrar
oluĢturma komutu ile uzun srede elde edilebilen kaliteli iki boyutlu grntler, art×k real – time gerek zamanl×
olarak oyunlarda ve sinemalarda grlebilir. Bump mapping – kabar×k haritalama, texture – doku kaplama,
×Ģ×kland×rma ve glgelendirme, environmental bump mapping – evresel haritalama, sis gibi zellikler art×k standart.
Fakat hala sa, toz, amur, bitkiler, dinamik ×Ģ×k etkisi, gerek 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 endstriyel amala, siz de kendi bedava boyut editrlerinizi
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. Tmnde animasyon haz×rlama ve
materyal dzenleme imkan× var. CD‟mizde bulabileceğiniz TrueSpace 3SE ile yerekimi, rzgar, elastiklik, kat×l×k,
k×r×lganl×k gibi birok efekt uygulanabiliyor. Ayr×ca CD‟de Blender, Amapi ve Kashmir gibi bedava birka yaz×l×m daha
bulabilirsiniz. Sonuta *.avi veya *.mov film elde etmek yan×nda Export komutlar× ile projeleri diğer programlar×n
desteklediği trlere dnĢtrebiliriz. Bu arada Bryce 3D program× da gerekten ok zgn menlere sahip bir render
ve animasyon program×. Macromedia Fireworks ile iki boyutta hoĢ yaz× efektleri elde edebilirsiniz.
44
Okulda yapt×ğ×m×z haftan×n hangi gn 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 gn değil iki tarih aras×ndaki gn 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 gn iinde de geen dakikalar hesaplanm×yor. Tarihler hatal× girilirse –111 gibi bir
rakam retiliyor. (Ornekler\Pascal\Diger\gun.pas)
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 iindeki haz×r tarih fonksiyonlar× zaten bu tr karmaĢ×k mant×ktan bizi uzaklaĢt×r×yor. Bir iki sat×r
ile gn 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
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× ykseliyor... Windows XP‟de ise art×k TSR yok.
#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;
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 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.
#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
Fare ve grafik ekran komutlar×n× birleĢtirerek, basit bir uygulama iin 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 modler 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 iin garip kodlar yazmak biraz zor geliyor. Metin kutular× daha esnek olabilir. Mesela oklarla iinde
dolaĢarak Delete, Insert, Home ve Backspace tuĢlar× daha etkili kullan×labilir. Dğmelere de bas×lma efekti verilebilir.
Daire gibi zellikler iin trigonometri komutlar× gerekebilir. Eski bir mzik alma program×nda ekran×n scroll –
kayd×r×lmas× gibi ilgin bir kullan×m grmĢtm. 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
grnt 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Ģ mens (altta kalan blge getPixel (x,y) deyimi ile n belleklenebilir) ve ana men gibi
daha profesynel nesneler de ok hoĢ olabilir. Ġsterseniz d×Ģar×dan *.bmp, *.gif gibi dosyalar× da programa dahil
edilebilirsiniz. Yaz× tipleri iin leklendirme ile daha kk veya daha byk font byklkleri de elde edilebilir.
Buradaki rnekte yaz× tipleri bitsel iĢlemlerle oluĢturulurken, izgiler ve eğrilerle yapt×ğ×n×z kendi yaz× tipinizi
leklendirmeyi deneyebilirsiniz. Bir harf beĢ stun, sekiz sat×r bilgisinden oluĢuyor. Her sat×r×n ikilik dzendeki değeri
bulunarak pixel konulup konulmayacağ×na karar veriliyor. En alt sat×r alt izgi iin kullan×l×yor. Asl×nda alt izginin fontu
bir paras× 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 kk 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 (srkle b×rak) zelliği iin de ekrandan resim bilgisi olarak pixel okuyup tampon bellekte
saklamay× dĢnebilirsiniz. Farenin etraf×nda oluĢan istenmeyen grntler iin de internetten fare temizleme
komutlar× bulabilirsiniz. Daha yksek ekran znrlkleri ve yaz×c× kullan×m×n× ğrenebilirsiniz. Ġmlecin yan×p
snmesini 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× iinde 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 gre ikinci bir kod retiliyor. Fare ile seili
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 gerek x ve y koordinatlar× srekli gncelleniyor. Ses ile geri besleme sağlad×m, ama yine de aĢ×r×ya
kamamak gerekli. Her an bip sesleri zamanla s×kmaya baĢl×yor. Ama piyano yapabilirsiniz...
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 iin 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
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.
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;
Metin tabanl× dosyalar× aar ve ieriğini ekrana listeler. Uzun dosyalarda h×zla tmn gsterip 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 gre Pascal daha kolay. Bir komut ile ilgili yard×m almak isterseniz TP – Turbo Pascal veya BP – Borland
Pascal editrnde komut zerine imleci getirerek Ctrl+F1 tuĢuna bas×n×z.
56
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 paradan oluĢuyor. Eğer bu Ģekilde istemezseniz “grafik.pas” dosyas×n×n iini
“diyot1.pas” iine 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 iin bu geerli 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 znrlğ 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 iin aĢağ×daki programda grafik komutlar× olan Imagesize, Getimage ve
Putimage kullan×lm×Ģt×r. Eski grnt xorput deyimi ile silinerek ilerlendiği iin biraz k×rp×l×yor. (Ornekler\Pascal\okul\
diyot3.pas)
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.
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
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 karekk, kare, 1/x benzeri bir komut ekleyebilirsiniz.
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)
Sonuta matematik ile programlama ok yak×n konular. Trigonometri, matris ve benzeri konular×, grafik veya
bilimsel iĢlemler ieren program retirken kullanmam×z gerekiyor. Basit bir izginin etraf×nda dnderilmesi iin sins
ve kosins fonksiyonlar×n× kullanarak yapabiliriz. Delphi rneklerindeki saat projesine bir gz at×n×z. Ya da dizi ve
matris ile ayn× biimdeki byk veri y×ğ×nlar× ile kolayca uğraĢabiliriz.
Ġki boyutlu olan a[1..4, 1..4] değiĢkenimiz iin klavyeden 16 değer giriyoruz. Ekrana tekrar bu say×lar× bize
gsteriyor. 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
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 sryor. Eğer CD‟niz yok ise bu bilgilere bakarak programlar×n×z×
haz×rlayabilirsiniz.
Delphi‟yi yada Visual Pascal da diyebiliriz, ğrenmek iin Object Pascal dilini bilmeniz gerekiyor. Pascal temiz
ve dzenli al×Ģmay× sevenlerin dilidir. Byk kk harfli kod kullan×lmas× fark etmiyor ama okunakl× olmas× a×s×ndan
yazarken ya byk harf, ya da kk 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 iindeki rnek programlar× VB ve VC kadar geniĢ değil ama programc×y×
tkezlemeden rahat bir ortam sunuyor. Pencerelere ve aptalca arabirimlerle programc×y× boğmadan tasar×m imkan×
veriyor.
Object Repository – Nesne deposu, yani “File*New...” mensn incelerseniz application – uygulama,
component – nesne, DLL, ActiveX Form, Thread Object, Web Server Application gibi zengin nesneleri grebilirsiniz.
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 iine
“Component*Import ActiveX Control...” mensnden entegre edilebilir.
Delphi IDE – Integrated Development Environment (Entegre GeliĢtirme Ortam×) ile h×zl× ve rahat biimde
zgn programlar retebilirsiniz. VCL – Visual Component Library (Grsel Nesne Ktphanesi) yani nesnelerimiz
kullan×m amalar×na gre ana menmzn alt×nda grupland×r×lm×Ģlard×r. Standart, veritaban×, raporlama, internet ve
diğer yard×mc× konularda nesneler s×ralanm×Ģt×r. Geriye uyumluluk iin 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 gzel yak×Ģ×r. Eğer bileĢen paletinizde tm sayfalar gzkmyorsa 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 seili 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 byğne bytmek, Send to Back – geriye yollamak, Space equally – yatay dikey
eĢit aral×k vermek kolayd×r. Seili nesneyi fare ile değil de klavyeden de konumland×rmak boyutland×rmak iin Ctrl
veya Shift ile yn tuĢlar×n× deneyebilirsiniz.
Genellikle Delphi‟yi ilk kurduğumda “Tools*Environment Options” diyerek Ģunlar× iĢaretlerim; Show compiler
progress – Derleme iĢlemini gsterir, Minimize on run – Program×m×z× al×Ģt×r×nca Delphi grev ubuğuna klr,
Show component captions – Nesne baĢl×klar×n× gsterir. 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 grerek 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 hibir Ģey koymasan×z, hi kod yazmasan×z da projenizin *.exe dosyas× ok byk olabilir. Kk
olmas× iin “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× iin 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 byk de olsa compile - derleme
iĢleminin ne kadar h×zl× olduğunu grebilirsiniz. Oysa VB ve CBuilder‟da bu sre daha uzundur.
*
Ek 2 – SQL k×sm×na bak×n×z.
63
F9 : al×Ģt×r
Ctrl+F9 : Sadece hatalara bak ve derle...
Ctrl+F12 : Unit listemiz
Shift+F12 : Form listemiz
F11 : Object Inspector‟u gsterir
F12 : Form ile unit aras×nda geiĢ 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 dner
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 : Srpriz, form nesneleriniz art×k yaz× biiminde, ince iĢ yapanlara...
Tabii ki bir program×n al×Ģmas×n× belli bir sat×rda durdurmak iin 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× iin fly – by evaluation hints – fare ile bir değiĢkenin zerine gelince ipucu olarak onu değerini
grebilir, F8 ile al×Ģmaya sat×r sat×r devam ederken değiĢkenlerimizin değerinin nas×l değiĢtiğini grebiliriz. 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 stnde ise bu seyretme iĢi diziler iin ok hoĢ bir
hale gelmiĢtir. Yani tm 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 mhendislik de denir.
Sonu olarak Watch iĢlemi kurt programc×lar×n eli koludur, al×Ģt×ğ×n×z dilin bcek 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 Trke‟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...
Prosedr ve fonksiyonlar×m×z× Unit (yunit diye okunur) – nite denilen editr 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 byle kolay olmuyor :) Pascal rneklerindeki diyot1.pas rneğinde kendi nitemizi *.tpu olarak tan×mlamay×
gryoruz. 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 ktphaneleri eklememiz gerekebilir. Bunlar×n s×ralar× nemli değildir. Art×k rneğin
Unit2‟deki bir prosedr unit1 iinde 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 gittike
kalabal×klaĢ×nca en iyisi daha yazarken end; // if (a<... gibi a×klamalar eklemektir.
Bir nesneye kod yazmak iin “NesneAdiOlayAdi()” gibi rneğin, Button1‟in OnClick – t×kland×ğ×nda olay×
Button1Click() olarak oluĢur. Olay×n cinsine gre ( ) parantez iindeki parametreler değiĢir. Dikkat ettiyseniz olaylar×n
baĢ×nda Procedure yaz×yor. Prosedre değer yollanabilirken, onlardan değer dnemez. Bunun iin 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 prosedrleri rneklerde grebilirsiniz:
...
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 iin Delphi‟de biraz uğraĢmak gerekiyor. Bir de “^” operatr ile s almak VB‟de doğal iken
Delphi‟de math unitini ekleyip power(x,y); demek gerekiyor. VB iin ok basit bir hareket olan formun ShowInTaskbar
zelliği ile grev ubuğunda uygulaman×z×n gzkmemesi 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 iin 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 iin ByteBool, WordBool ve
LongBool veri tiplerinde True –1, False 0‟d×r.
zerilerinde matematiksel iĢlem yap×labilir:
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.
Kme 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 iinde ise iĢlem yap×l×r:
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 trl değiĢkenin tipine karar
verememiĢseniz, yavaĢ al×Ģan Variant tipi ile değiĢken tan×mlayabilirsiniz.
Yine C dili ile benzer olarak break ve exit komutlar× Pascal‟da da kullan×r. break ile for, while gibi dnglere
devam edilir, exit ile prosedr veya fonksiyondan ×k×l×r.
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 gl metin biimleme 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 iin bu komut kullan×labilir.
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
...
Delphi‟de hata olmas× muhtemel yerlere try (tray diye okunur) – dene komutu ile gvence verebilirsiniz.
...
try
Memo1.Font.Name:=‘Arial Tur‘;
Memo1.Font.Size:=18;
except
on Exception do ShowMessage(‗Fontta bir sorun var!‘);
end;
...
Veri giriĢi iin 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,...) basite srklemek iin Ģu k×sa kod yeterlidir:
Fare t×klamas×n×n taklit edilmesi, yani baĢka bir nesne – Edit1 t×klan×nca sanki dğme – Button2 t×klanm×Ģ gibi
yapmak:
program Beep;
uses
Windows;
begin
MessageBeep (0);
end.
Uygulaman×zda birok 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 iine dahil etmiĢ olursunuz. TicTocToe rneğimizde sadece resim olduğu iin bu
yntemi kullanmad×m.
Grafik iin:
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 iin:
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, menlerimizin dilini Ġngilizce, Trke ve Almanca gibi
farkl× dillerde kullan×labilmesi iin oluĢturabiliriz. GWBasic dilindeki sat×r numaralar× gibi rneğin 1000 sonras× Trke,
2000 sonras× Ġngilizce gibi ayarlayabiliriz.
Casio FX-880P‟de Basic ile yapt×ğ×m kağ×t oyununda bilgileri Ģu Ģekilde program iine 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 editr ile
*.exe dosyan×n iindeki bu bilgilere eriĢilerek, mesela kullan×c×lar×n bilmemesi gereken bilgiler grlebilir. Tavsiyem bu
tip veriyi Ģifrelemenizdir. Bylece 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×. Srpriz olarak bu s×rada tm bilgileri silen program da yazm×Ģ ve al×Ģt×rm×Ģt×m(?!). Tabii
yedekleme diye bir Ģey olmad×ğ× iin yapt×ğ×m tm emeklerim silinmiĢti. “Ornekler\Basic\peek.bas” rneğini
inceleyiniz.
Deneye deneye birok zellikleri buldum. Ġnternet‟ten araĢt×rarak eklentiler yap×labilir. Microsoft‟un sitesi olan
MSDN ktphanesi yeterince geniĢ.
Office 2000 ve st ile birlikte kurulan Microsoft Agent “Windows\MsAgent” klasrne yerleĢiyor. Robby,
Peedy, Genie ve Merlin gibi diğer karakterleri yklerseniz “Windows\MsAgent\Chars” dizinine bunlar×n yerleĢtiğini
grrsnz. microsoft.com‟dan da MSAgent ykleyebilirsiniz. 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 Seimi” dğmemiz ile “Windows\MsAgent\Chars” dizinindeki
veya baĢka bir yerdeki *.acs karakterleri aabiliriz. Office ajanlar×n× aabildiğimiz halde onlar×n hareket isimleri tam
buradaki gibi değil.
Ajanlar× Office VBA dili ile, web sayfas× iinde 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 iin “Component*Import ActiveX Control...” dedikten sonra “Microsoft Agent
Control (Version 2.0)” gibi ifadeyi bulun, Palette page‟i ActiveX seerek Install deyin. ġapkal× bir vatandaĢ×n
nesnelerinize eklendiğini greceksiniz. VB iin de ayn× Ģekilde ToolBox iine dahil edilebilir. Delphi rneği sonundaki VB
rneğinde birden fazla karakterin de kullan×labildiğini grebilirsiniz.
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
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}
Application.HintColor:=claqua;
end;
end.
Asl×nda sadece Agent değil, form srkleme yap×p, durum ubuğunda Num Lock, Caps Lock ve Scroll Lock gibi
bilgileri de gsterdik. Formu sol t×klay×p srkleme imkan× da veriyoruz.
Visual Basic dilinde de animasyon haz×rlamak kolayd×r. PeĢpeĢe komutlarla sanki bir olay× anlat×yorlarm×Ģ
grnts 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 ktphane 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 iinde tasarlarken bir liste kutusu, drt dğme, metin kutusu, etiket ve bir agent nesnesi
kullan×yoruz. Merlin, Robby ve Genie‟yi kurmay× unutmay×n.
74
Resim 2.1 – VB‟de Agent nesnesinin kullan×m×, grev ubuğundaki simgelere dikkat!
Eğer Office Asistan×m×za uygulamak istersek, Ģu kodlar× bir modln iine yazabilirsiniz. VBA Dzenleyicisinde
iken “Tools*Preferences” listesinden “Microsoft Office 9.0 Object Library” ktphanesini ve Asistan× da Office
kurulumunda semeyi unutmay×n. Buras× ille de Excel olmak zorunda değil, Word veya PowerPoint iinde de
deneyebilirsiniz. Bu dediklerimizi Office‟in karakterli olan her srmnde kullanabiliriz:
Sub Assist ()
With Application.Assistant
.Visible = True
.Animation = msoAnimationGreeting
End With
End Sub
Bu programda grev ubuğuna - taskbar simge ekleme, srcden CD – compact disk ×karma, geri takma,
Windows‟u kapatma, yeniden baĢlatma komutlar×n× gryoruz. Takma ×karma iĢlemi DVD - digital video disk iin de
geerli. En fazla 4 adet olabilen CD‟leri otomatik olarak bulup, resimdeki gibi gsteriyoruz.
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.
Grev ubuğundaki gereksiz program simgeyi yok etmek iin yazacağ×m×z unit:
unit formkapa;
interface
implementation
initialization
IsLibrary := True;
end.
Kodlar×m×z:
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;
cdsayisi:=0; end.
80
Form zerinde sadece bir Timer1 ve PopupMenu1 var. PopupMenu‟y oluĢturmak iin zerine ift t×klay×n ve
s×rayla Windows‟u Tekrar A, Windows‟u Kapat, 1.CD A, 2.CD A ve Kapat menlerini ekleyin. Bu fare sağ tuĢ
mensnn grev 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 iin TSR, Win 3.1 iin simge halinde al×Ģma ve Windows 9x iin ise grev ubuğunda simge olarak
devaml× al×Ģan hizmet programlar vard×r. XP, 2003 ve stnde 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×” mensne k×sayolunu ekleyin.
Siz de bu menye 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 iinden bu tip basit programlar
iin en kullan×Ģl× olan× *.ini‟dir. Meraba.scr‟de bir rneğini grebilirsiniz. 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× grebilirsiniz. Veritaban×
kullanmak da basit iĢler iin 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 gzkyor. HTML ile birlikte
al×Ģarak veya Delphi iine Microsoft XML, v3.0 (Version 3.0) nesnesi eklenerek kullanabiliriz.
*.csv comma delimited – virglle ayr×lm×Ģ bilgileri Excel‟de oluĢturabilir okuyabilirsiniz. *.csv normal metin
dosyas× olduğu iin, Delphi‟de uzun ve benzer bilgilerle dolu olan verilerinizi bu tip dosyalara kaydedebilirsiniz. Tabii
bilginin ieriğinde de “;” karakteri olmamal×d×r; ama “” iine istediğinizi yazabilirsiniz. “a;b;a”;333 gibi...
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.
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 iin 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 dkm al×nabilir. BaĢl×k, koordinat, ykseklik, geniĢlik gibi belli baĢl× zelliklerini değiĢtirip kaydetmek
yeterlidir. Dğmeleri iin ise ayr×ca *.txt veya *.pas olarak kod k×s×mlar× kaydedilebilir. ġimdilik tekrar at×ğ×m×z form
ğeleri kod k×s×mlar×n× hissedemiyor, sadece grnm olarak var oluyorlar. Belki kendi dosya kaydetme yntemimiz ile
yapsayd×k daha rahat kontrolleri idare edebilirdik. rnekle ayn× klasrde Yunus isimli bir projem var. Burada birok
eksiği giderdim. Hatta minik bir Trke 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
Ama, bilgisayar dergilerinde bulunan belli konulardaki yaz×lar× listelemek ve aramak. Veritaban×
uygulamam×z.
Bunun iin Delphi‟nin veritaban× yneticisi 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” iinde bir a×l×r kutu iine o dizindeki tm *.db ve *.dbf dosyalar× getirmesi.
Bylece “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 byle farkl× farkl× tipte haz×rlamak mecburiyetinde değilsiniz. Tek veritaban× da iĢ grr, fakat yeni dergi ad×
ekleme, silme iin adlari.db isminde veritaban×, genel k×sm× iin de genel.db oluĢturdum.
Dergi adlar×n×n hi değiĢmeyeceğini dĢnseydik, DBGrid‟in istediğimiz stunundaki bilgiye PickList zelliği
sayesinde sabit bilgiler girebilirdik. DBGrid‟e ift t×klay×n, ×kan menye sağ t×klay×p “Add All Fields” deyin. Eklenen
alan adlar×ndan istediğinizi seip PickList‟ini doldurun.
Yap×lar× oluĢturduktan sonra veri.dbf iinde 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 gre
karma indeks oluĢturmam×z× sağlayacak.
Paradox‟da Key stunundaki “*” 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 byle bir k×s×tlama yoktur.
Program×m×z× haz×rlarken de indeksler aras×nda geiĢ yapabilmek iin Combobox – a×l×r kutu kullan×yoruz.
Combo combine – birleĢtir kelimesinden tremiĢtir. Aramak iin de tablo filtreleme yap×yoruz. Aramak iin wind*
yaz×p, Enter tuĢuna bas×n, wind ile baĢlayan konular× filtrelendiğini grdnz. Maalesef *98* gibi yaz×p iinde 98 geen
konular× arayam×yoruz. Bu Ģekilde aramak isterseniz Query – sorgu nesnesi kullanman×z gerekiyor. SQL* iindeki Like
komutu tam bize gre.
*
Ek 2 – SQL k×sm×na bak×n×z.
85
Hala iĢimiz bitmedi. nk DergiAdi ve Genel stunundaki 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
stununun 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
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
Dynamic Linking Library – dinamik bağ ktphanesi 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 birok 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 tm 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 yklenen bir *.dll dosyay× birden fazla
program kullanabilir. Program×n×z× tekrar derlemek yerine sadece yeni bir *.dll srm 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 iinde birok simge grmĢsnzdr.
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 klasrn incelemektir.
Windows kernel – ekirdek (kernel32.dll), user – kullan×c× (user32.dll) ve GDI – Graphical Device Interface
(gdi32.dll) merkezli olarak al×Ģ×r. Diğer ktphaneler ise denetimler, donan×m srcs, yaz× tipleri gibi uzant×lard×r.
Tm al×Ģan programlar bu *.dll dosyalara bağl×d×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 tm Windows fonksiyonlar×n×n elimizin alt×nda olduğunu
grebilirsiniz. Bir DLL‟de hangi fonksiyon veya prosedrler var ğrenmek iin Dependency Walker
(Diger\Extras\DEPENDS.EXE) adl× program×n× kullanman×z× tavsiye ederim:
“rundll32.exe” DLL dosyalar× al×Ģt×rabiliriz. Rundll32 iin aĢağ×daki gibi, nce *.dll ad× ard×ndan virglle
fonksiyon ad× olacak Ģekilde bir k×sayol oluĢturabilirsiniz ve “BaĢlat*al×Ģt×r...” ile deneyebiliriz:
Ġ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.
Windows Millennium iinde gelen “Resimlerim Ekran Koruyucusu” „na benzeyen bir ekran koruyucusu. Bizim
ekran koruyucumuz *.bmp ve *.jp*g dosya ieren bir klasrdeki resimleri rasgele veya s×ral× gsteriyor.
Windows‟taki ekran koruyucusu Ģifresini alam×yor. ġifre “meraba.ini” dosyas×n×n iinde aynen grlebilir,
gvenlik geliĢmemiĢ. Program sonunda ek bir program olarak basit bir Ģifreleme algoritmas× veriyorum. Diğer resim
formatlar×, mzik almas×, resimlerin geiĢ efektlerini size b×rak×yorum. Hatta daha ileri gidip alt klasrlerin de
resimlerini dahil etmek isteyebilirsiniz, makrolardaki dosyalistesi.xls ve Delphi‟deki Dosyalistesi rneklerinden
faydalanabilirsiniz.
Temel olarak btn ekran koruyucular× normal *.exe dosyalar×d×r. Ayarlar× grmek iin “/c”, n izleme yapmak
iin “/s” parametresi isterler. “Windows” veya “Windows\System” klasrne kurulurlar. Ekran koruyucu dosyalar×na
sağ t×kland×klar×nda S×na, Yap×land×r ve Ykle gibi seenekler ×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× klasrde yok ise hata mesajlar× ile ekran×n×z dolabilir. En iyisi “Windows”
iine *.scr dosyam×z× at×p, “Bilgisayar×m*Denetim Masas×*Grnt*Ekran Koruyucusu” „ndan *.scr‟mizi seip, Ayarlar
ile resim klasrmz belirtmek. Bylece 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 gsteriliyor, Form2 ayarlar, Form3 Ģifre ve AboutBox hakk×nda iin 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.
Grldğ 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
{$R *.DFM}
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;
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;
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;
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.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;
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
var
Form3: TForm3;
implementation
uses Unit1;
{$R *.DFM}
end.
101
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}
end;
end.
Ord(tek_harf) ve Chr(ascii_deger) fonksiyonlar× sadece char tipli yani tek karakterlik iĢlemlerde kullan×l×r. Eğer
bir kelimenin tmn say×sal değere dnĢtrmek veya bir say×y× metin / alfa nmerik tre dnĢtrmek isteseydik
StrToInt, IntToStr, StrToFloat veya FloatToStr gibi fonksiyonlar kullan×rd×k. Tr dnĢ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 yntemlerin 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 dndrlmesi imkans×z olur. Ters algoritma kullan×larak eski değere
aynen ulaĢ×labilmelidir. Fakat kolay algoritmalar× deneme yan×lma yntemi ile zmek kolayd×r. rneğin bizim rnekte
kelime yerine 123 gibi bir rakam girildiğinde 246 elde edilmesi, Ģifre k×r×c×lar iin zlmesi gerekten de kolay bir
yntem olduğu grlebilir. Encrypt (enkript diye okunur – Ģifreleme / encode) edilince ayn× boyutta Ģifre elde etmek
sak×ncal×. Gerek değer iine basamaklar aras×na rasgele ĢaĢ×rt×c× değerler sokulabilir. Kriptonun tersine decrypt
(dekript diye okunur – Ģifre zme / decode) denilir.
Yaz×c× bağlant× noktas× olan LPT1 – Line Printer‟i bi-directional – ift ynl yani veri yollamak veya almak iin
kullanabiliriz. Ad× stnde paralel bağlant× imkan× olduğu iin biz de ayn× anda iki led – light-emitting diode
kullanabiliyoruz. Ġsterseniz daha fazla bağlant× da yapabilirsiniz. Biraz da elektronik bilginiz varsa rlelerle ev aletlerini
kontrol edebilirsiniz. Tm pinler TTL – Transistor Transistor Logic seviyesindedir. Yksek 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 iin bu
anlat×lanlar geerli 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 drdnc (k×rm×z×) ×k×Ģ pinlerini kullanan, trafik ×Ģ×klar× olarak grebilirsiniz.
Form nesneleri:
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 grebilirsiniz. Ayn× yolu izleyerek klavye 0060H, birinci seri
bağlant× noktas× 03F8H ve ikinci seri port 02F8H adresine sahip olduğunu grebilirsiniz. XP iin ise
“System*Hardware*Device Manager” ile donan×m listesine ulaĢabilirsiniz.
13 1
8 7 6 5 4 3 2 1
Toprak Kontrol Portu
25 14
Resim 13 – 25 ulu paralel port bağlant× yerleri
Yaz×c×ya bir belge yollan×nca Ģu ad×mlar gerekleĢir: Strobe hatt×na en az 0.5 ms - mikrosaniye alak darbe
yollan×r, Autofeed hatt×na alak sinyali verilir, Init hatt×na en az 50 ms alak sinyal yollan×r, yaz×c×y× semek iin
Select‟e alak sinyali yollan×r, kesme kabul edilince Acknowledge hatt× 0.5 ms kadar alak darbesi taĢ×r, yazma
baĢlayacağ× iin Busy ykselir, sayfa sonlar×nda Paper Out (Paper End) hatt× ykselir, hata anlar×nda Error yaz×c×
taraf×ndan alağa ekilir, yaz×c× seili olunca Select in ykseğe ekilir.
Tabloda grldğ gibi on yedi sinyal hatt×n×n sekizi veri, drd kontrol, beĢi de durum hatt× olarak kullan×l×r.
On iki veri ×k×Ģ× var iken beĢ hatt× da giriĢ iin kullanabiliriz. Led bacaklar× resimdeki bir ve ikinci noktalara tak×l×r,
diğer toprak bacaklar× istenirse kasaya değdirilebilir, istenirse ayn× resimde grdğnz kahverengi renkli noktalara da
tak×labilir. Ġki led‟in de birbirine değmemesini sağlay×n. Eğer yanm×yorlarsa ynlerini değiĢtirin.
Program×n mant×ğ× 2‟den fazla led iin pek uygun değil. nk 2 led iin 2 2=4 ihtimal olduğu iin if – eğer
bloğundan drt adet kullan×yorken, rneğin sekiz led iin, 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.
SPP – Standart Parallel Port : ISA uyumlu, AT tipli tek ynl standart.
EPP – Enhanced Parallel Port : GeliĢtirilmiĢ daha h×zl× paralel port (1 - 2 MB aras×). PS/2 portunu emle
edebilen, paralel port ağ× oluĢturabilen ift ynl 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 ynl 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 gre 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 Yneticisi” ‟ne gelip, Bilgisayar simgesi
ift t×klan×p, GiriĢ / ×k×Ģ (G/ veya Input / Output - I/O) iĢaretlenerek de kim hangi adresi kullan×yor grebilirsiniz.
0378H iin 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Ģ iin kullan×l×yor.
Ġsterseniz Delphi ve assembler dillerini veri giriĢ ve ×k×Ģ× iin daha modler kullanal×m:
function PortIn(IOPort:word):byte;
assembler;
asm
mov dx,ax
in al,dx
end;
Pascal dilinde haz×r Port komutu kullanarak da paralel port‟ta drt 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.
/* 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);
stteki led.c program×m×z iin devremizde iki diren, birer adet Led ve anahtar bulunuyor. 330 , 10 K
diren değerleridir.
Data 0 portu
+5V
Anahtar / Dğme
10 K
11
BUSY (terslenir)
18
Toprak / GND
Seri portumuz olan COM – communication (iletiĢim) portlar×ndan iletiĢim ise daha basit gibi gzkse de,
asl×nda paralel porta gre daha kolay değildir. Akbil ve TOM (Touch Memory) gibi ayg×tlar seri iletiĢimle veri
al×ĢveriĢinde bulunuyor. RS-232 standard×na gre 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 gvenlik ve daha h×zl× veri transferi iin 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×Ģ dnya ile veri al×ĢveriĢinde bulunur. Asl×nda bu
ip seri iletiĢimi paralele evirir. COM1 iin 03F8H – 03FFH, COM2 iin de 02F8H – 02FFH adresleri aral×ğ×n×
kullanabiliriz. Veriler paket halinde peĢ peĢe yolland×ğ× iin veri gndermeden 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 grdm. K×z×ltesi (infrared) iletiĢim de ancak seri
olabilir. Modem‟in anlam× da modlatr, demodlatr yani sese evirip tekrar dijital bilgiye evirebilmedir, ki bu
iĢlemler seri iletiĢim sayesinde gerekleĢ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 ynl iletiĢime half duplex –
yar× iki yn, her iki ynde iletiĢime de full duplex – tam iki yn denir.
Open ―com1:300,e,7,1‖ as #1 „300 baud hızında, parite even – çift, 7 bit veri, 1 stop – bitiş biti
Biraz konudan kay×yoruz ama benzer bir konu olarak, bilgisayar×m×z×n speaker – hoparlrn kullanarak
basite 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 gzel 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 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;
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. Gerekte 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 srkleyerek 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×Ģ dnya analog olduğuna gre ×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.
Monitrlerimize de RGB – Red Green Blue bilgileri DAC devreleri ile oluĢturulur.
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 iinde Ģekilde donan×ma (sabit disk, ses kart×, bağlant× noktalar×) eriĢilebilir: doğrudan giriĢ ×k×Ģ,
ayg×t srcleri (*.vxd ve Kernel modu) ve API kullan×m×. Win 3.x/95/98/ME iin doğrudan giriĢ ×k×Ģ komutlar×
rahatl×kla kullan×labiliyorken, NT ve zeri iin 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
srcler ile de NT/2000/XP zerinde eriĢim hakk× vard×r. Windows API kullanarak da yapabiliriz fakat onun da
dezavantajlar× tm 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×
grmek, 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
Sistem saati ve tarihini ekrana yuvarlak bir form iinde gsteren bir Delphi6 uygulamam×z.
Resimde grldğ gibi Windows‟un Tarih/Saat mens ile birlikte, saatimizin değerleri karĢ×laĢt×rabilirsiniz.
Form zerinde sadece Timer1, SavePictureDialog1 ve Image1 nesnesi bulunuyor.
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.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;
else begin
ReleaseCapture;
FORM1.perform(WM_SysCommand, SC_DragMove, 0);
end;
end;
Image1‟in Canvas – yzey zelliğini Form1.Canvas‟a gre tercih etmemizin sebebi, daha kal×c× etki elde
etmemizdir. Eğer Form1.Canvas yapsayd×k, form zerinden bir pencere geince yapt×ğ×m×z Ģekiller silinecekti, yada
sama Ģekillerle karĢ×laĢabilirdik. Windows her pencerenin zerini resim olarak saklam×yor. 1280x1024x16 milyon
renk znrlkte 4MB haf×zay× bitmap grntye ay×rmak byk haf×za kayb× olurdu. Biz de istersek formumuzu sağ
t×klad×ğ×m×zda saatimizi *.bmp olarak kaydedebiliyoruz. Saniye veya diğer izgilerin dnmesini trigonometri ile
hallediyoruz. Timer1 her 1000 milisaniyede “donder” prosedrn ağ×r×yor.
200-a,150-b
c
b
a×
200,150
a
Resim 16 – Biraz trigonometri bilgisi
Hipotens yani c, rneğin akrep iin 50 piksel uzunluğunda olmas× gereken değerdir. c değeri her an ayn×
değerde olurken, a ve b kenarlar× her a× iin ayr× değer kazan×yor. yleyse a ve b‟yi hesaplamam×z yeterlidir.
360 derecede 12 saat olduğu iin, 360/12 sonucu olan 30 0 ile saati arp×yoruz. Fakat dakikan×n değeri saate
eklenmesi iin de, 30/60 yani 0.5 0 ile dakikay× arp×p saate ekliyoruz. Dakika ve saniyenin toplam a×s×n× bulmak iin
360/60 = 60 rakam× iĢimize yar×yor.
Sin ve cos fonksiyonlar×n×n iini “-” negatif yaparak saat ynnde dnmesi sağlar×z. Pi yani ∏ asl×nda system
unit‟inde tan×mlanm×Ģ bir fonksiyondur ve değeri 3.1415926535897932385‟dir. 180 0 = ∏ olduğuna gre; 10 = ∏ / 180
olur. Bu radyal dnĢmn istediğimiz a×ya uygulayarak, doğru sins ve kosins 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 dzlemi karĢ×laĢt×rmas×, sadece y‟de farkl×l×k vard×r.
115
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}
end.
Grldğ gibi sadece edit1 ve edit2 iine iki sat×r kod yazm×Ģ×z. Ama iki veritaban× iinden kelime alan×na
dayal× arama yapmak. Basit bir tasar×m ile iĢlevsel bir szlk elde ettik. Yeni kay×t yap×lmas×n× DBNavigator
nesnelerinde kapatt×m, asl×nda hi gerek yok. Kullan×c× kendi szcklerini de szlğe ekleyebilir veya varolan
kelimelerde dzenlemeler yapabilir. KarĢ×laĢt×ğ×m en byk sorun dbase‟e szlğ aktar×rken Trke karakterlerin
garipleĢmesi idi. Biraz gayret ederek tablonun dilini Trke yap×nca sorun zld.
117
Bu projede as×l amac×m yaz×c× ×kt×s×n× al×Ģma an×nda zelleĢtirmekti. ġimdilik sadece Label – etiketler rahata
hareket ettirilebiliyor (drag and drop – srkle ve b×rak). Ġsterseniz kay×t ve ykleme gibi yap×lan dkm kaydetmeyi
de ekleyebilirsiniz, sadece drt 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 srkle b×rak var. Program×n×za d×Ģar×dan dosya srklenmesi gibi kodlar× da
DelphiTurk.com sitesinden elde edebilirsiniz.
Kod k×sm× ok uzun gibi. “case” komutu iin daha iyi bir zm aranabilir. nk daha fazla nesne
eklendiğinde program gereksiz yere uzayacak. Label‟lara sağ t×kland×ğ×nda “Yaz× Tipi” ve “Renk” seimleri ×kacak olan
bir PopupMenu koyuyoruz. Yaz× tipi FontDialog1‟i, Renk de ColorDialog1‟i al×Ģt×r×yor.
nizleme sayfas×na bir adet QuickRep ve drt 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.
Kodlar:
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
Windows‟da dosya ararken vazgeerseniz, “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
sren bir iĢleminizi kanala atars×n×z, istediğiniz zaman duraksat×r, devam ettirir veya iptal edebilirsiniz, hatta nemine
gre 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 dzenlemekle grevlidir. 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 gre geiĢ yap×l×r. Yeni prosesler haz×rda, beklemede veya
al×Ģma hallerini geerek 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 – okgrevlilik sayesinde bir prosesin bitimini beklemek yerine, o proses
idle – boĢ konuma getiği anda diğer proses uygulan×r.
Normal bir application – uygulama projemize kanal zelliği vermek iin “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 gryoruz. Combobox değiĢtirildike 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 grebilirsiniz. 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 grdğnz gibi
karmaĢ×k kod ve bilgisayar× smrrcesine kullanmas× dezavantajlar×d×r.
Farkl× yntemlerle de uzun srecek iĢlemlerimizi yapabiliriz, bu yntemlerle 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 mdahale etmenin imkans×z
olduğunu unutmay×n.
end;
HourLabel.Caption := IntToStr (NPrimes) + ' below ' + IntToStr (Max);
finally
Screen.Cursor := crDefault; //normale dönüş
end; end;
121
2) Uygulamay× yavaĢlatan ama hala mdahale imkan× kazand×ran, uygun bir yere Ģu tek sat×r× eklemek:
Application.ProcessMessages; Tm iĢlemin bitmesini beklemeden tekrar al×Ģt×r×labilir ki bu byk sorunlara yol
aabilir. nlem olarak devam ad×nda bir boolean değiĢken oluĢturup tekrar al×Ģt×r×lmay× nleyebilirsiniz. Bu
yntem 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 prosedr oluĢturmak. YavaĢt×r
ama uygulamaya mdahale 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}
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.
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}
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.
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
Sistem mensne kendi komutlar×n×z× eklemek iin Ģ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 mensn etkilemiyor.
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}
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}
end;
if not (key in ['0'..'9',#8]) then begin //sadece rakam girişi
key:=#0; beep;
end;
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 iin daha kullan×Ģl×.
129
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
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;
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
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;
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
SpeedButton3.Enabled:=true;
SpeedButton4.Enabled:=true;
SpeedButton5.Enabled:=true;
SpeedButton6.Enabled:=true;
SpeedButton7.Enabled:=true;
SpeedButton8.Enabled:=true;
SpeedButton9.Enabled:=true;
end;
50x50 leğ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 – dz 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Ģ hcreyi kullanarak, rasgele
dizilmiĢ hcreleri 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Ģ hcre 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
Form zerinde 4x4 yani 16 adet SpeedButton oyun hcresi iin, 2 adet SpeedButton men iin ve bir adet de
Timer1 nesnesi var. Timer1 ile kazanma an× ve sre kontrol ediliyor.
Kodlar×m×z:
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
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Ģ hcrelerin
etraf×ndaki boĢ olan diğer hcreleri patlatmamak. Form zerinde 5x5 yani 25 adet SpeedButton, bit Timer1 ve bir
MainMenu1 bulunuyor. SpeedButton‟a resim, oyuna da ses efektleri eklenebilir. Sre lm ve buna gre
oynayanlar×n rekor srenin 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. Tm SpeedButton‟lar×n OnClick olay× SpeedButton1‟e
ynlendirilmiĢ durumda. “Form1.Components” komutu iin gzel bir uygulama...
142
Kodlar:
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);
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
Dikkat ederseniz 3x3, 4x4 ve 5x5 hcreler halinde yapabileceğimiz oyunlardan son oyundaki hcre 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 gzel programlar yazabiliriz. “Diger\Extras\codebankv2.zip” ile kurabileceğiniz Delphi Trk Kod Bankas×
program×ndaki say×y× yaz×ya evirme algoritmalar×na bakarsan×z, birden fazla eĢit olduklar×n× grebilirsiniz. Hem k×sa
hem de gvenilir kod retmemiz gereklidir. Bu arada h×z iin gvenlikten dn vermek birok bceğe sebep olabilir.
Hala bizim gremediğimiz bcekler, program iinde kullan×c×lar iin ortaya ×kabilir. Tek are bol bol tasar×m×m×z×
denemektir.
Metin, HTML, *.avi ve resim dosyalar×n× gsteren, 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 mensnn 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.
Nesne ve kodlar×m×z:
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;
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 yntem 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 iin 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 olduka uzun kod yazmam×za bağl× ve bu kodlar da hataya ok
a×k. Yani gvencelerle 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.
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;
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 grebiliriz. En az×ndan ok uzun aramalarda kullan×c× Dur tuĢu ile aramay×
kesebiliyoruz. Bunun iin 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 klasrn ka KiloByte olduğunu da bulabilirsiniz.
Memo1 nesnesi yerine ListBox veya ListView gibi nesneler konulup, daha hoĢ listeler elde edilebilir. Ġsterseniz
elinizdeki CD ieriklerini, Memo1 nesnesine sağ t×klay×p Kaydet komutu sayesinde ayr× bir dosyaya kaydedip, bir
dosyay× bulmak iin o CD‟yi daha sonra tak×p ×karmaktan kurtulabilirsiniz. Windows komutlar×n× kullanarak da
istediğiniz klasr kopyalama, silme, taĢ×ma, karĢ×laĢt×rma gibi zellikler de ekleyebilirsiniz. Yedekleme yap×lan
klasrdeki dosyalar× gncelleme amal× da olabilir.
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
Kod k×sm×:
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
Bu rnekteki ama birbirlerine olan uzakl×ğ× lerek, 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 gre pek olmuyor. nk aralar×ndaki takipci izgilere bakarsan×z bazen birbiri zerilerine geip
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×
grebilirsiniz.
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
gl makineleri bile zorlayan byk programc×l×k gc gerektiren bir konudur. Yine de bu konuda biraz kafa yormak
ve sonuta 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:
Kodlar×m×z:
Kitab×n konular× iinde en ağ×r olan× bu k×sm×. Delphi dili Quake veya Half – Life oyunlar× benzeri, endstriyel
robot tasar×m× veya t×p alan×nda grsel tasar×m oluĢturmak iin ideal... DelphiX ve GLScene nesnelerini tan×tarak basit
iki rnek yapacağ×z. KarĢ×laĢt×ğ×m sorunlar× grerek 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 grnt
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.
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. Uak ve araba simulasyonlar× gzel. Yine de sitelerine giderek yenilikleri ve
geliĢmiĢ rnekleri bilgisayar×n×za indirebilirsiniz. Tutorial – ğretici ve Sample – rnekler bir Ģeyler yapabilmemiz iin
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
iin hata mesaj× verebilir. Ama eğer kodlar×n× incelerseniz, istenen boyutta (orant×lanarak) izgilerle dijital rakam
yazma, kayan y×ld×zlar, dnen bir alt×gen, znrlk 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 aktr dosyas×d×r. Sadece aktrler değil onlar×n silahlar× da *.md2 format×ndad×r.
Elimizde basit de olsa bir materyal editr ve harita editr gerekli. Sadece Delphi‟de maalesef arad×ğ×m×z×
bulam×yoruz. Terragen, Photoshop gibi programlarla yeryz Ģekilleri oluĢturmak, Lightwave veya Studio Max ile aktr
ve malzeme haz×rlamak st seviyeye ×kmasak da karĢ×laĢt×ğ×m×z ad×mlar. Bir sokak veya ev tasar×m×, mzik, efektler,
yang×n, duman, sis, hareketli – animasyonlu nesneler (k×p×rdayan ağalar, Ģelale, ×Ģ×k parlamalar×, paralanabilen
nesneler), su, ×Ģ×k, ayna, bulutlar×n hareket ettiği gkyz, etkileĢimli nesneler (dğme, kol, may×n, tuzaklar, asansr,
kap×, pencere, cam k×r×lmas×, delinebilen duvarlar, k×r×labilen tahta, sand×k), kamera a×lar×, zoom – bytme /
kltme, kar, yağmur, amur, yer ekimi, uzay gibi bir ok aĢ×lmas× gereken problem var. Bunlar× asl×nda eski DOS
oyunlar×nda bile gryoruz. yleyse art×k dnyada baz× standartlar oluĢmuĢ olmal×d×r. Tekrar Amerika‟y× keĢfetmek
yerine internetten arad×ğ×n×z eĢitte ve yntemde bilgiye ulaĢabilirsiniz.
En az×ndan *.wrl yani VRML – Virtual Reality Markup Language (sanal gereklik dili) ile uğraĢt×ğ×n×zda basit
collision – arpma, yer ekimi, cam, a×labilir kap×lar, dğmeler, madde tasar×m×, aktr 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
dnyaya kavuĢabilirsiniz. CORTVRML.EXE ile VRML plug-in – eklentisini elde ediyoruz. Daha profesynel editrler de
arayabilirsiniz. spazz_v24_full.exe program×n× da tavsiye ederim. Studio Max‟de de Export mensnden yapt×ğ×n×z
al×Ģmalar× *.wrl olarak kaydedebilirsiniz. AutoCAD‟de tasarlanm×Ģ nesneleri de *.wrl biimine dnĢtrebilirsiniz.
Bir nerim de, 3DSMax gibi st seviye bir programa gemeden nce basit editrleri kullanarak nc boyuta
×s×nmakt×r. rneğin Quake, Half – Life Counter Strike iin modifikasyonlar yani haritalar yapabiliriz. Baz× oyun
CD‟lerinde kendi editrleri ile karĢ×laĢabilirsiniz. Bulamazsan×z internette muhakkak dĢk boyutlu editr 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 dnĢtrme iĢini yap×yor.
“Ornekler\Diger\cs_maps.zip” ile yapt×ğ×m baz× haritalar× grebilirsiniz.
Programlama k×sm× nerede olacak diye baĢlarda zorlanabiliriz, rneklerin yard×m× ile yavaĢ yavaĢ zyoruz.
Art×k bildiğimiz form nesnelerini tamamen terkederek, men, arabirim, ayarlar gibi k×s×mlar× yapabiliriz. Pencere
grnmnden tam ekran grntye geebiliriz.
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 bytme (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, nmerik
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
ykleniyor. Ana menden diğer aktrler de grlebilir. Ortadaki kutu gibi yere arparak hareket edememe gibi
duvarlara arp×nca iine girilmemesi sağlanabilir, ama titreme nas×l engellenebilir bilmiyorum. Ayr×ca kavun ii renkli
166
kk kreye arpmay× baĢarabilirseniz patlad×ğ×n× grebilirsiniz. AteĢ etmek iin ×Ģ×n (ThorFX) kullanmak da sama
gelebilir, daha basit bir zm bulamad×m. Bir de klavye tuĢlar× ayn× anda kullan×lam×yor, hem ateĢ hem eğilme gibi
kombine hareketler yok. Ġkinci rnekte ise znrlk değiĢtirme, renk ayarlar×, form ve fare ayarlar×, dnen nesneler,
ekranda zaman, FPS – frames per second (saniyedeki kare say×s×), izgiler, daire izmek, resim yklemek gibi
zellikler bulabilirsiniz. Trk yap×m× oyun olan Pusu gibi bir Ģeyler de yapmak bizim iin Ģ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
dnem 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Ģnrsek zaten kod y×ğ×n×n×n hibir anlam× olmaz. Ġlk program×m×z olan
ActorTwoCam rneğimiz iki formdan oluĢuyor. Ġlki as×l pencere ve diğeri oyuncu seme penceresi.
Ara ubuğu basit. Ayr× bir dosya olarak kaydedebilme ve ama 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× menlere ulaĢabilirsiniz. Mavi kpler dikkatinizi ekmiĢtir.
Bunlar gzkmezler fakat bizim iin referans noktalar× ve gruplar oluĢtururlar.
DummyCube – Yapay Kp‟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.
Tek nesne iinde bu kadar zellik ilk kez gryoruz. Alt elemanlar× t×klay×p zelliklerini kar×Ģt×rabilirsiniz,
zamanla bu ayarlar× zebilirsiniz. GLScene nesnesini anlad×ğ×n×zda tm program× avucunuzun iinde bulabilirsiniz.
ChartFX nesnesi de gzel ama bu gerekten daha yetenekli.
Nesnelerin s×ralar× nemli.
stte ve altta olmas× nceliği belirtir. Alt katmana eklenmesi de grubun iindeki
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 kp iindeki koordinat), Scale
(leklendirme), 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 dzenleniyor. Mesela animasyon olarak bir uağ×n dĢmesi ve iinden canl× ×kan kahraman×n sahnesi gibi
dĢnlebilir. GLScene iinde Pathcontrol ad×ndaki bir rnekte belli bir yol zerinde hareket eden kp bulabilirsiniz.
Ayr×ca diğer rneklerde gerekten de ok hoĢ alev, partikl, ×Ģ×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 iine
ilk a×l×Ģta GLActor1‟in yklenmesi, silah×n×n yklenip Actor1 ile senkron olmas×, yer Ģekillerinin dokular×n×n yklenmesi
gibi olaylar× yaz×yoruz. Eğer CD‟den kodlar× incelerseniz, bir ok yerde a×klama sat×rlar× halinde kodlar grebilirsiniz.
Klavye tuĢ bas×mlar× ve fare tuĢlar× ayarland×ktan sonra projemizi al×Ģt×r×p denemelerde bulunabiliriz. GLCadencer1
nesnesinin tek olay× olan GLCadencer1Progress iine devaml× izlenen olaylar olan tuĢ bas×m× ve may×n kremizin
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 gereki materyaller elde etmek geliyor.
Ġkinci rnek platform (Mario benzeri) oyunlar× iin daha uygun. Grsel olarak tasarlamak yerine herĢeyi
kodlarla yapman×z gerekli. Programlamay× sevenlere gre... DXTimer ve DXDraw nesneleri bizim iin yeterli. Geri
kalan nesneler resim, mzik ktphaneleri, joystick ve network – ağ ayarlar× gibi iĢlemleri yaparlar. Ġsterseniz sadece
iĢinizi gren ses ktphanesini 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 bkm, kĢe gibi bilgileri saklan×r.
D3DUtils.pas dosyas×n× incelerseniz poligon, izgi, vektrler, matrisler ile ilgili matematiksel kodlar
bulabilirsiniz. DX2 klasrndeki rneğimizde, saydam bir sand×ğ× klavye yn tuĢlar× ile dnderdiğimi, ileri geri hareket
ettirdiğimi grebilirsiniz. DXImageList kullanarak sand×ğ×n yz dokular×n× yklyoruz.
MSPaint veya diğer ad× ile PaintBrush program×na benzer bir program yaz×yoruz. *.bmp dosya trnde dosya
ama, 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, byte 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 srklenebildiği dikkatinizi ekebilir. YerleĢtireceğiniz Panel‟lerin koordinesi ile
tekrar eski yerlerine almay× yapabilirsiniz. Ara ubuklar×n×n Dock – gmlme 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 dnĢtrme ve f×ra gibi aralar× siz de ekleyebilirsiniz. Geri al komutu yerinde yeller
esiyor...
Kodlar:
ğ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. Sonuta tm haneler tutturulunca oyun bitiyor. Eski
yazd×ğ×n×z rakam× yandaki ListBox1 nesnesinde grebilirsiniz. En az say×da bilmek nemli, sre 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.
Delphi nesnelerinde gzat×nca Chart, VTChart, DBChart ve ChartFX gibi birok grafik nesnesi ile karĢ×laĢ×yoruz.
Sonuta her trl uygulamalarda basit de olsa bir veri dizisinin grafiğini kullanmam×z gerekebilir. Sabit veri giriĢlerinin
grafiğinin ×kar×lmas× iin oluĢturduğumuz “Ornekler\Delphi\grafik_Chart\Project1.dpr” rneğini inceleyebilirsiniz.
ġimdiki rneğin verileri ise database yani veritaban×ndan geliyor.
Tabii ki cinsiyeti Bay/Bayan, eğitim durumunu Ortaokul, Lise, Yksekokul gibi bir listeden almas× kullan×c×n×n
veri giriĢini daha kolaylaĢt×r×yor. Bunun iin DBGrid1 nesnesine ift t×klayoruz, ×kan kk pencereye sağ t×klay×p “Add
All Fields” komutunu vererek istediğimiz alan×n PickList zelliğini dolduruyoruz.
Grafiğin temel fikri, bir tr veride yzde ka giriĢ yap×lm×Ģ olduğunu Pie – pasta grafik Ģeklinde grmektir.
Diğer grafik tiplerine gre Bar – ubuk ve Pie – pasta daha anlaĢ×l×r. Bir grafiğin zelliklerine eriĢmek iin ona ift
t×klay×n×z.
DBChart1 nesnesini Cinsiyeti iin kullan×rsak Ģyle yapabiliriz. Form zerine att×ğ×m×z Query1 nesnesinin SQL
zelliğine:
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 szmemizi 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 iin aĢağ×daki Ģekile bak×n×z.
Bundan sonra da yine resimlerdeki gibi bir grafik elde etmek isterseniz her trl 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
gncellemek iin gerekli birka sat×r komut yaz×yoruz.
Kodlar:
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
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
dkmleri al×nabilir.
Batur Baykan arkadaĢ×m ile yapt×k, aradan uzun bir zaman getiği iin art×k kitaba da ekleyebilirim diye
dĢndm. YaklaĢ×k 850 saatlik al×Ģma, 11000 sat×r olan kodlar×n× CD‟den bakman×z gerekli, burada sadece baz×
ekran grntleri ve algoritmas×n× ekledim. Delphi 7 ile tasarlad×ğ×m×z iin son srm QuickRep ykl Delphi‟de
rahatl×kla a×l×p değiĢiklikler yap×labilir.
Bu srmn lise ders program×na gre zelleĢtirdim. Yani niversitede gnlk 12 ders var iken lisede 10 ders
saati var olacak Ģekilde değiĢiklik yapt×m. Cumartesi de ders yap×labiliyordu. Byle tasarlamam×z daha ileriye dnk
bir al×Ģma olmas×n× sağlam×Ģ, ders saati, gn eklemek zor olurdu.
O y×llarda Trke karakter, baz× bilgisayarlarda kt grnm veriyordu, baz× menlerde Trke karakterler
var iken baz×lar×nda × yerine i kullan×nca biraz tuhaf olmuĢ. Elimden geldiğince bu hatalar× dzelttim. En byk
sorunumuz ise 800x600 ekranda tasarlanan program×n yksek znrlkte 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 Ykleme”ye gvenmemek laz×m. Program o s×rada al×Ģt×ğ× iin
veritabanlar× zerine yeni dosyalar yklemez. O yzden en iyisi program kapal× iken, elle yedekleri geri almak.
Program yapmak iin 3 yntemimiz 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 iinde olduğundan, 3. yntemi kullanabiliyoruz. El ile 2‟de veriler tamamen serbeste 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
grlyor. Ders kodlar×n×n tam yaz×lmas× gerekli. Kk byk harf fark× var. Mesela DĠJ9 aynen yaz×l×rsa dkm
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 dkmnde iki ğretmen grlyor.
Program×n al×Ģmas×nda, a×l×Ģ ekran×ndan veritabanlar×na kadar hi gvenlik nlemi al×nmam×Ģ. Yani veriler
Ģifreli değil, kullan×c× hesaplar× yok. Zaten en byk eksiklik ağ desteğinin olmamas×. Program sadece bir bilgisayarda
al×Ģs×n diye dĢnld. Excel‟e aktar×m ile birazc×k (tek ynde) d×Ģ dnyaya 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 srmnde 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” klasr 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 byk hatalarda, program×n kapan×p gitmesi engelleniyor. Baz× hallerde veri
diske kaydedilemeden, program kapanabilir. Ve tm 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 gn ve saat seme
2- Ders blme, Ģube birleĢtirme, atlye grubu oluĢturma,
3- a- Otomatik ders haz×rlama (farkl× nceliklere gre,
Ģube ve derslik kapasitesine gre bak×larak)
b- El ile dzenleme (srkle b×rak yntemi, tek dersi
otomatik yerleĢtirme)
c- Tamamen k×s×tlamas×z el ile mdahale ve dzeltme formu
- ak×Ģma ve yerleĢmeyen bilgileri listeleme, renklendirme
4- Yaz×c× dkm, tm s×n×flar×n dkm, Excel'e veri ×k×Ģ×
5- Teneffs saatleri dzenlenebilir, okul ad×, ğrenim y×l× değiĢtirilebilir
6- Veri yedekleme, silme, arama, s×ralama, bak×m, grafik gsterim
7- Windows standart grnmnde rahat kullan×m zellikleri
(ipular×, 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 birok okul ve
blm de yap×labilir.
Uyar×lar:
* Yaz×c× ×k×Ģ×n×n dzgn olmas× iin 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)
Tm programlama dillerinde bir uygulama geliĢtirmeye baĢlamadan nce yap×lacak program iin bir algoritma
haz×rlamak gereklidir. OluĢturulacak bu algoritma program yaz×lmaya baĢland×ğ×nda byk 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 gerekleĢir. Bu nedenle bu blmde Okul
Ders Program×n×n algoritmas× a×klanm×Ģt×r.
Okul Ders Program× algoritmas× drt ana blm halinde dĢnlmĢtr. Bu blmler veri giriĢi, otomatik ders
program× haz×rlama, el ile ders program× haz×rlama ve raporlamad×r. Diğer blmlerin dayand×ğ× temel blm veri giriĢi
olduğundan nce bu blmn algoritmas× haz×rlanm×Ģt×r.
Yukar×da belirtildiği gibi veri giriĢi blm temel blmdr. Bu blmde diğer blmlerin kullanacağ× ve
program×n grevini yerine getirebilmesi iin gerekli bilgilerin bilgisayara girilmesi gerekleĢtirilir. Veri giriĢi blm de
kendi iinde iki k×sma ayr×l×r. Program okul ders program×n× haz×rlayacağ×na gre 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.
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.
Bu blmde ğretim elemanlar×n×n ad ve soyadlar×, unvanlar×, isim ve soyadlar×n×n baĢ harfleri ve her ğretim
eleman× iin bir numara girilir. Ayr×ca her ğretim eleman×n×n tercihine gre 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
gnleri olan Pazartesi, Sal×, arĢamba, PerĢembe, Cuma ve Cumartesi gnleri iin 12 ders saati zerinden
dĢnlmĢtr.
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
Yukar×daki veritaban× yap×s×na istenilen say×da kay×t girilebilir. Ad Soyad alan×na ğretim grevlisinin tam ad×
girilir. Unvan alan×nda Prof.Dr. 1 ile, Doc.Dr. 2 ile, Yrd.Doc.Dr. 3 ile, ğretim Grevlisi 4 ile ve AraĢt×rma Grevlisi 5 ile
belirtilir. Ders program× haz×rlan×rken ncelik yksek unvanl× ğretim elemanlar×n×n derslerine tan×nacağ× iin 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 gnlerinin
her biri iin 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 grldğ gibi Ali Aksoy isimli ğretim grevlisi iin Pazartesi1 ve Pazartesi2 alanlar×na True değeri
verilerek ders program× haz×rlan×rken ad× geen kiĢiye Pazartesi gn ilk iki saate ders konulmamas× sağlanabilir. Eğer
kiĢi tm bir gn kilitlemek isterse o gne 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 gn hangi saatte hangi dersi bulunuyor, yine Sal× gn hangi saatte hangi dersi
var gibi bilgileri tm ders gnleri iin 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× iin
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 gn iin a×l×r. Yine Tablo 2‟de grldğ gibi her bir kay×t on iki ders saati ierir. Bu iki tablo yap×s×
aras×ndaki iliĢki Tablo 3‟de daha iyi grlebilir.
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 gre ilk tabloda herhangi bir ğretim eleman×n×n kayd× silindiğinde, o kiĢinin ikinci
tablodaki alt× kayd× da silinir. Bylece ×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 blm ğ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 blm bilgileri kay×tl×d×r. Yine ğretim elemanlar×
verilerinde olduğu gibi Ģubeler iin de ders saatleri kilitleme imkan× sağlanm×Ģt×r. Yani tm ders gnleri iin 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
ġube ad× alan×nda Ģubelerin isimleri tutulur. Mevcut alan× ders program× haz×rlan×rken uygun dershane
bulmakta kullan×l×r. Blm alan×nda ise Ģubenin dahil olduğu blm belirtilir. Blm bilgisi ders program×n×n
raporlanmas× aĢamas× iin 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 iin ders program× tablosu
Ġlk tabloya girilen her yeni Ģube iin ikinci veritaban×nda otomatik olarak alt× kay×t a×l×r. Bu alt× kay×ttan her
biri bir ders gn iindir. Ġ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 blm ile ayn×d×r. Birinci veritaban× tablosunda dershane kodu,
dershane mevcudu ve a×klama bilgileri depolan×r. Dershane kodu dershanenin ad× olarak dĢnlebilir. 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
Ġkinci veritaban× ile de tm dershanelerin ayr× ayr× haftal×k programlar× tutulur. Diğer iki k×s×mda olduğu gibi
yine ilk tabloya girilen yeni kay×t iin ikincide otomatik olarak alt× gn iin 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 iin 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 blmn 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 iin bir alan
tan×mlanmal×d×r. Bu yap× aĢağ×daki Ģekilde oluĢturulur.
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. Blm dersin hangi blmn 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 gre iĢleme konulur.
ğretim elemanlar× ders verileri k×sm×nda ise ilk blmde 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 blmde 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 grlen 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 grevlisinin ad ve soyad× tutulur. ğretim grevlisi daha nce anlat×lan ğretim Elemanlar×
Verileri tablosundaki kay×tlar aras×ndan seilir. 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 seilir. Ders kodu seildiğ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 drt Ģubeye birden verilebileceğinden
ġube1, ġube2, ġube3 ve ġube4 adl× drt alan bulunur. ğretim grevlisinden dersi ayn× saatte ortak alan Ģubeler s×ra
ile bu alanlara yerleĢtirilir. Eğer ayn× dersi alan Ģubeler, bu dersi farkl× saatlerde grecekler ise her Ģube iin ayr× kay×t
girilmelidir. rneğin yukar×daki tabloda grldğ gibi Ahmet Ok isimli ğretim grevlisi SCI102 kodu Matematik
dersini 2B1 ve 2B2 Ģubelerine ayr× zamanlarda gstereceğinden her bir Ģube iin ayn× ğretim eleman× ad×na iki ayr×
kay×t a×lm×Ģt×r. Ayn× Ģekilde Ali Aksoy isimli ğretim grevlisi ELC114 kodlu Programlama dersinin 3 saat olan teori
blmn 2B1 ve 2B2 Ģubelerine ayn× saatte ve ayn× derslikte beraber gstereceğinden bu iki Ģube iin sadece bir
kay×t a×lm×Ģt×r. Ancak bu iĢlem sadece teori saatleri iin geerlidir. Ders program× haz×rlan×rken laboratuar saatleri her
Ģube iin, teoriler ortak olsa bile, ayr× ayr× yerleĢtirilir.
Sonra gelen Ders-Lab BirleĢtir, Teori Bl, Laboratuar Bl 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 iin 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 Bl alan×na True atanmas× ile ise dersin
teori saatlerinin ikiye blnerek ayr× gnlere yerleĢtirilmesi sağlan×r. rnekte Ahmet Ok adl× ğretim grevlisinin
Matematik dersi kay×tlar×nda Teori Bl alan×na True atanarak dersin 6 saat olan teori k×sm×n×n er saat halinde ayr×
gnlere yerleĢtirilmesi sağlanabilir. Son olarak Lab Blme alan×n× True yaparak dersin laboratuar saatlerini A ve B
grubu olarak iki gruba ay×rmak mmkndr. Tablo 9‟da bunu Ali Aksoy‟un Programlama 1 dersi kayd×nda
grebilirsiniz.
Son iki alan olan Lab1 ve Lab2 alanlar×na ise dersin varsa laboratuar k×sm×n×n gsterileceği laboratuarlar×n
kodu girilerek laboratuar saatlerinin bu dersliklere yerleĢtirilmesi sağlan×r. Baz× dersler iin 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× ile temel veriler (dersler, Ģubeler, dershaneler, ğretim elemanlar× veri tabanlar×) ve
ğretim elemanlar× iin 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 iin bu ders belirtilmiĢ ise
her Ģubeye farkl× gnlere ders atan×r. Yani ğretmenlik uygulamas× 4BB iin pazartesi, 4BE iin sal× gn 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 blme ve uygun saat arama iĢlemleri yap×l×r. zel ders
ise derslik ve ğretim elemanlar× gzard× edildiği iin daha basit bir saat kontrol yap×l×r.
Teorik blnecek ise dng iinde teorik dersin yar×s× bir gne, diğer yar×s× ayr× bir gne 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 iin derslik aran×r. Bu ders iin belirtilmiĢ her Ģube iin ayr× ayr× laboratuarlar yerleĢtirilir, fakat hepsi ayn×
derslikte ayn× saatte teorik derslerini iĢlerler. Ayr×ca laboratuar blme (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 iin laboratuar blme 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 prosedrdr. Her ağr×ld×klar×nda haftan×n ilk gn ilk
saatinden itibaren iĢlemler ilerler. rgn eğitimde, dersler yerleĢtirilirken uygulamalar iin s×n×r 12 saat iken, teorik
iin bu 8 saattir. Yani 8. saatten sonra sadece labaratuar konulur. Ġkinci ğretim iin her iki s×n×r 8‟dir. Buradaki
ama gndz ğ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 gre s×ralan×r. Blm ayr×m×
yapmaks×z×n dersleri yerleĢtirir. Yani bilgisayar blm ile elektrik blmnn dersleri ayn× anda yerleĢtirilir. Bunun
anlam× blm ayr×m×n×n sadece ders kodu ve Ģube iin geerli olduğudur. Bylece farkl× blm ğ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 iin o saatlere ders
yerleĢtirilmez. rneğin D410 dershanesi pazartesi gnnn tm iĢaretlenmiĢ ise bu saatlerde ders burada
iĢlenmez. Bu sayede derslik baĢka amalar iin kullan×labilir. Bu ğretim elemanlar× ve Ģubeler iin de geerlidir.
Ġstenen Ģubeye istenen saatlerde, istenen ğretim eleman×na istenen saatlere ders konulmaz.
ğretim eleman×, ilk Ģube, ikinci Ģube, nc Ģube, drdnc Ģube, ilk derslik ve ikinci derslik ayn× gn 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 gn ve
saat değerleri değiĢtirilmeye devam edilir. Gn ve saat bittiği halde hala ders yerleĢmemiĢ ise, ana prosedr olan
baĢlang×ca dnlp, 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 byk veya eĢit, dershanenin kapasitesinin 20 fazlas×ndan kk veya eĢit
ise bu derslik uygun demektir. Bylece rneğin 24 mevcutlu 4BB‟nin dersi, 200 kiĢi kapasiteli D102 dersliğine
konulmaz.
Bu blmde de Veri GiriĢi blmnde girilen bilgiler kullan×l×r. El ile Ders Program× Haz×rlama blmnn
algoritmas× dershanelerin haftal×k ders programlar×na dayan×r. Yani ekrana seilen bir dershanenin haftal×k ders
program× izelgesi gelir. Her gn iin on iki ders saati vard×r ve her ders saatinin yan×nda drt Ģube iin ayr×lm×Ģ
alanlar vard×r. Bunun nedeni daha nce belirtildiği gibi drt ayr× Ģubenin ayn× dersi ayn× anda alabilme olas×l×ğ×d×r.
Dershaneler iin haftal×k program cizelgesi Tablo 10‟da ki Ģekildedir.
Tablo 10‟daki izelgede sadece Pazartesi ve Sal× gnleri grlmektedir. Ancak doğal olarak izelge tm ders
gnlerini kapsar. Yukar×da rnek olarak bu iki gn 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 iin Veri GiriĢi blmnde 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 gz nne
al×narak listelenirler. Bylece ġube alanlar×n× doldurma iĢlemi bu listeden seilerek 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× iin ğretim grevlilerinin 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 gn iindir. Ayn× iĢlem Ģubeler ve dershaneler iin de geerlidir. ĠĢte dershanelerin ders
program× izelgesine el ile girilen bilgiler sz 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 iin aĢağ×da a×klanm×Ģt×r.
Tablo 10‟da D410 dershanesine Pazartesi gn ilk alt× saat iin 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 gn iin 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 gn iin a×lm×Ģ kay×t bulunur ve Ders1‟den Ders6‟ya olan alanlar iin 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 gstermekle grevli ğretim eleman×n×n ad× ve baĢ harfleri ğrenilir. rnekte grevlinin ad×n×n Ahmet Ok ve
baĢ harflerinin AO olduğu varsay×lm×Ģt×r. Ayn× Ģekilde ğretim grevlilerinin ders program×n× tutan veritaban×
tablosunda ilgili kiĢinin Pazartesi gn iin a×lm×Ģ kayd× bulunur. Ders1‟den Ders6‟ya olan alanlar kontrol edilir. Tm
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 grlmek 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 grldğ gibi SCI201 dersi ğretim eleman×n×n, Dershanenin ve Ģubenin Pazartesi gn 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 blmnde otomatik veya el ile haz×rlanan ders programlar×n×n dkmleri al×n×r. Raporlama drt
tipte olabilir. ġube ders program×, ğretim eleman× ders program×, dershane ders program× ve genel ders program×. Bu
dkmleri oluĢturmak iin ğ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 iin ders program× raporunda ders, ğretim eleman× ve derslik bilgileri vard×r. Bu dkm oluĢturulurken
Ģubelerin ders programlar×n× tutan veritaban×ndan istenilen Ģubenin Pazartesi, Sal×, arĢamba, PerĢembe, Cuma ve
Cumartesi gnleri iin a×lm×Ģ kay×tlar× esas al×n×r. ncelikle Ģubenin Pazartesi gnne 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 gnne ait
tm kay×tlar ile karĢ×laĢt×r×l×r. Pazartesi gnne ait kayd×n×n Ders1 alan×ndaki ders kodu bilgisi Ģubeninki ile ayn× olan
ğretim grevlisi Ģubenin raporuna yaz×l×r. Ayn× iĢlem derslik iin de tekrar edilir. Pazartesi gn kayd×n×n Ders1
alan×ndaki bilgi aran×lan ders kodu ile birbirini tutan dershane dersin iĢleneceği dershane demektir. Pazartesi
gnndeki tm ders saatlerinin ders kodlar×, ğretim grevlileri ve dershaneleri bulununca diğer gnlere geilir.
Dershane raporunun mant×ğ× da ayn× Ģekildedir. Dershane program× dkmnde ders kodu, dersi alan Ģubeler
ve ğretim grevlisi bilgileri bulunur. Bu raporda istenilen dershanenin program× esas al×n×r ve yukar×da a×klanan
yntem ile her ders saati iin Ģubeler ve ğretim eleman× bilgileri bulunarak raporda yazd×r×l×r. Tek fark dersler drt
Ģubeye kadar ortak grlebildiğinden Ģubelerin veritaban× dosyas× drt kere taran×r ve aranan ders koduna uygun tm
Ģ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 blmler gz al×narak haz×rlan×r. Yani bir blme
mensup olan tm Ģubelerin ders, ğretim eleman× ve dershane verilerini ieren raporlar× ayr× ayr× haz×rlan×larak
birleĢtirilir ve blmn genel ders program× haline getirilir.
191
May×s 2001 tarihli 2 hafta sreli bu proje asl×nda DanceEJay‟den geliyor. WavMix nesnesini kullanarak 8 kanal
mzik al×yoruz. Basit olarak A Kaydet diyaloglar×, durum ubuğu kullan×m×, thread kullan×m× ve Ģekilli form ve form
srklenmesi yap×yoruz. Yard×m dosyas×n× OasisSE ile yapt×m. TListBox'dan TStringGrid nesnesine eleman
srkleyebiliyoruz. Mzik paralar×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.
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×:
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
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;
Daha geliĢtirdiğim Dophin2 de ise, DSMixer v1.51 yani DirectX‟in DirectSound komutlar× ile kaliteli mzik
alabiliyoruz. Maalesef DSMIX klasrndeki rneği Dolphin‟e tam uyarlayamad×m. Eh, yine size iĢ ×kt×!
200
Mart 2001 tarihli 1500 sat×rdan oluĢan bir iĢyeri iin askerde yapt×ğ×m program. Sade bir Ģekilde faturalama,
veri giriĢi ve listeleme yntemlerimiz var. Bu program ile ilk kez yapt×ğ×m programc×l×ktan para kazanacağ×m×
ummuĢtum, fakat olmad×. Neyse, nemli değil...
ok az programlama yaparak kk 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 gndz zamanlar×nda, gvenilir bir eleman stoktan ne kadar rn sat×ld×ğ×n× pompalardan
bakarak iĢaretler, bu s×f×rlamay× kağ×da da dkebilir, tabi bu arada mĢterilerin ald×ğ× malzemeler de fatura edilerek
dkm 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 blnebiliyor. Kt bir fikir
olarak da, a×k var olduğu dĢnlmĢ 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 trde kk 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
Ekim 2001 tarihli, yaklaĢ×k 1000 sat×rdan oluĢan bu programda basit bir szlk, ona bağl× olarak aynen
(gramer olarak değil yani) Ġngilizce‟den Trke‟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×ğ× iin
istediğimiz zaman ara verip, sonra devam edebiliyoruz veya tamamen iĢlemi bitirebiliyoruz. Szlğ baĢka bir
programdan alm×Ģt×m, bu szlk zerinde dzeltme ve silme gibi iĢlemler rahatl×kla yap×labilir.
Ġlk versiyonda gramer iin ok uğraĢ×rken, daha sonra seslendirmeyi eklemek isteyince buna pek zaman
ay×ramad×m. Yani cmleyi evirmeye değil, Ģimdilik kelime kelime karĢ×l×k yazarak idare ediyoruz. Ama Ġngilizce eviri,
Trke‟yi baĢka bir dile evirmekten kolay. nk Trke‟de fiiller ve cmledeki kelimelerin yerine gre anlam
değiĢmesi ok fazla. Sonu olarak evrilen k×sm× farkl× kaydedebilir, yaz×c×dan da ×karabiliriz. Sonraki srmlerde site
, eposta eviri ve okumas× eklenebilir. Cmleleri “.” iĢareti ile bitirmek gerekli.
Dolphin mzik 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 sylemeye
al×Ģmak yanl×Ģ. Mesela k harfi, ke, k, k, ko, ki, k× gibi birok Ģ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.
Ana kod:
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.
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;
Byte Aral×k 2004 say×s×ndaki bir rnek ile Delphi 7‟nin ‟Demos\Internet\CGIs‟ rneği birleĢtirerek gzel 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 kk dizini olan wwwroot iine aabilirsiniz. AĢağ×daki
resimdeki gibi web sitesinde CGI al×Ģs×n diye bir ayar da yapmam×z(al×Ģt×rma izinleri) gerekli:
CGI uzant×l× dosyalar× yrtlebilen yani al×Ģt×r×labilen dosya olarak grlmesi iin 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 klasrlere „Yazma“ hakk×
da vermek gereklidir.
Kylix yani Delphi‟nin Linux versiyonunda da ayn× uygulama yap×labilir. Linux‟da genellikle Apache sunucusu
al×Ģt×ğ× iin, httpd.conf‟da baz× ayarlar yaparak, program×n×z× aktifleĢtirebilirsiniz. Bu dosyadaki a×klamalar× okuman×z×
tavsiye ederim.
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.
Bylece dosyam×z×n normal bir dosya değil, uygulama olduğunu sunucuya belirtiriz. Kod editrde 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.
{$apptype console}
begin
WriteLn('content-type: text/html');
Writeln;
WriteLn('Hello world!');
end.
@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×:
Resim 36b – Basit rnek(Pascal geni) ve biraz daha ileri(A×k Port Tarama) bir uygulamam×z...
Delphi 6 ve st srmlerde Web Server Application olarak, haz×r CGI uygulamas× yap×labilir. WebModule iine
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
Okulda 2005 y×l×nda bir dneme (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 klasre bu zip dosyay× a×p,
al×Ģt×rabilirsiniz. K×saca Ģunlar× greceksiniz: 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 srm ise
seminer al×Ģmas× olarak yapt×k. OBI1‟i s×f×rdan tekrar baĢka yntemler kullanarak oluĢturduk. Her iki rnekte
bitmeyen k×s×mlar var ise de, bana gre en byk eksik, dkm k×sm×nda 1. ve 2. dnem ortalamas×n×n al×nmam×Ģ
olmas×. Karne dkm en son iĢ olmas× gerekir. O da yok Ģimdilik. Mezunlar da bir tarafa tabi.
OBI1 daha ok grnt 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 gn – 18 saat) pratik ve minimalist yani az form ve az nesne ile
al×Ģman×n rn.
Not hesab×n× bazen bildiğimiz FOR dngs ile, bazen tablolara calculated field – hesaplanan alan ekleyerek,
bazen de SQL sorular× ile ve son olarak da QReport iinde QRExpression nesneleri ile yapt×k. Not ok nemli olduğu
iin, virgl 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 tr durumlar× engelleme de pek iĢe yaramaz.
Gzel bir algoritma ile bu iĢ bitirilebilir.
Ama her zaman dediğim gibi gvenlik (Ģifreli giriĢ ve veritabanlar×n× koruma) ve ok kullan×c× al×Ģma
eksiklerimiz var.
212
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 seip , 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 seersek, sonu
3 olur. Temel iĢlem komutlar× AND (ve ile maskeleme), SHR (sağa kayd×rma), OR (sonu değerlerini biraraya
getirme).
ğretmenlere yard×mc× olmak iin, ders anlat×rken ekranda fare ile iĢaret etme yerine veya kalk×p lazer
iĢaretleyicisi ile gstermek yerine, bu program× haz×rlad×m. 500 sat×r gibi, fakat DelphiTurk KodBankas×‟ndan birok
haz×r kod ald×m ve geliĢtirdim.
Ekran zerine istenen renkte, istenen kal×nl×kta kalem ile izim yapman×n yan×nda, pano kullan×m×, resim
ama, kaydetme, boĢ ekran gsterme, saati gsterme, arkaplan mziği, fare oku gizleme gibi gzel zelliklerimiz var.
Program mensnde saatin yan×na yerleĢen simge ile de daha az yer kaplayan grnm sağlan×r. H×zl× geiĢler iin 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 kt 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 gzkmesi nemli değilse,
nce C ile ekran× temizleyip, D ile masastnn resmi getirilir. Bylece sanki tam ekran bir resim izme program× gibi
masastndeki program×n grnts zerinde oynama yapabiliriz.
Yap×lan hareketlerin geri al×nabilmesi zelliği iyi olurdu. Ayr×ca farkl× f×ra seenekleri de yap×labilir. Dikdrtgen
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 klasre kopyalan×p, istenirse slayt gsterisi gibi gsterilebilirdi. BoĢluk ve
BackSpace tuĢlar× ile dersler aras×nda geiĢ yap×labilirdi mesela. Trke dil desteği de laz×m.
Projeksiyon ile ders anlat×rken, makinenin Freeze (dondur) seeneğ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
Okulda ğrencilerle yapt×ğ×m asansr rneği. 2 gnde 5 saat uğraĢ×p, 150 sat×r kod yazd×m. Thread (iĢlemci
kanallar×) ile yap×labilirdi. Ayn× zip dosya iinde kanall× rnek de var.
Resim 40 – Asansr
Delphi 6-2005 aras× rahatl×kla al×Ģ×r:
AppActivate npad
SendKeys ("Sonuç=" & "^v"), True
End Sub
Ne yapt×k bylece? 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 yntem 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 uağ×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
Label9
Command2
Command1
Command16
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
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
noktali_b = False
arti_eksi_a = False
arti_eksi_b = False
Command16.SetFocus
End Sub
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 iin 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
gsteriliyor.
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 ykmz hafiflettik. Hangi dğmeye
t×kland×ğ×n× Command1(Index).Caption gibi bir ifade ile anl×yoruz.
Command16.SetFocus ile de tm hesaplamalar× “=” tuĢuna ynlendiriyoruz. Genel anlamda rneğin,
Command21_KeyPress(KeyAscii As Integer)– tuĢ bas×m×, Command18_Click()– fare t×klamas× olaylar× anlam×na geliyor.
Asl×nda daha dzgn olmas× iin form zerine b×rakt×ğ×n×z nesnelere sayilar_Command, islem_Command,
gosterge_Label gibi anlaml× isimler verebilirsiniz.
225
Dosyalama iĢlemlerine bir rnek. *.txt veritaban× oluĢturmak, kay×t silmek, kay×t say×s×, kay×t gncelleme 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 seimini,
extended – geliĢmiĢ yaparsan×z kullan×c× birden fazla değeri Ctrl+fare sol t×klamas× ile seerek Kay×t Sil ile bunlar×
silebilir. Kod olarak son seilenden yukar× doğru silerseniz seililerin 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 iin istenen değerler silinemez.
Kod k×sm×:
VB dilinde de Pset (x, y) komutu ile form zerine nokta basabiliriz. Bu rnekte kullan×lan forml, karmaĢ×k
say×lar olarak bildiğimiz matematik konusuna dayan×yor. i ve j değerlerini kullanarak değiĢik fraktal grntler elde
edebilirsiniz. Formun DrawMode zelliği kullan×larak noktalar×n stili belirlenebiliyor. Blgesel Ayarlarda ondal×k simgesi
“.” ise metin kutular×n× noktal× olarak değiĢtirmeniz gerekebilir. ġu anda “,” virgl Ģeklinde. al×Ģm×yor diye k×zmay×n!
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
ActiveX‟i neden Delphi blmne koymad×n derseniz; bu dosyan×n “websProj1.htm“ dosyas×n× al×Ģt×rd×ğ×n×zda,
“Windows\Downloaded Program Files” klasrnde “webs Control” ad×nda bir dosya oluĢturmas×. Bu oluĢan
“websproj1.ocx” art×k hemen hemen tm dillere gmlebilir hale geliyor. Asymetrics ToolBook Instructor adl× pek
kullanmay× bilmediğim programlama diline, Visual Basic‟e ve benzeri grsel dillere rahatl×kla “ActiveX Control” olarak
dahil edilebiliyor. Yani sadece web sitesi iinde 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 iinde grebilir, 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 yntemleri kullan×r, ActiveX denetimleri de zellik, yntem 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 – iten d×Ģa etkinleĢtirme) aktif edilerek kullan×l×r.
Delphi‟de “View*Type Library” komutu ile oluĢturduğumuz ActiveX denetiminin zellikleri grebiliriz. Asl×nda
a×lan bu pencerede websProj1.tlb dosyas×n× gryoruz. *.tlb Type Library – tip ktphanesi anlam×na gelir.
Delphi5‟in Enterprise srmnde (baĢka bir srmde bu ad×mlar× farkl× yntemlerle yapabilirsiniz) ActiveX
ad×m ad×m Ģyle oluĢturuluyor:
3. “Project*Web Deployment Options” doldurulur: (“Use CAB file compression” ile s×k×Ģt×rmay×
deneyebilirsiniz)
7. ActiveXDenemeProj1.htm‟ye kk bir mdahale etmemiz gerek. Dosyam×z× Internet Explorer‟da a×n, boĢ
bir yere sağ t×klay×p “Kaynağ× Grntle” yap×n. AĢağ×daki k×s×mdaki dizin ismini silerek klasr 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"
ToolBox‟a sağ t×klay×p “Components...” komutunu verince listede websProj1 Library‟sinin veya sizin deneme
iin yapt×ğ×n×z ActiveXDenemeProj1 Library‟sinin de bulunduğunu grrsnz. Nesneleri ekleyin ve formun zerine
birini atal×m. Sonu:
Tabii ki tam tersini de yapabilirsiniz. VB‟de haz×rlanm×Ģ bir *.ocx Delphi iine gmlebilir. Ġsterseniz Word veya
Excel‟de de VBA (Visual Basic for Applications)‟i aarak makronuza bu denetimi yani nesneyi ekleyebilirsiniz.
234
Bu Excel makrosu ile bir hcre iinde “=yaziyla(12345)” gibi komut vererek, “onikibinyzk×rkbeĢ” gibi yaz×
halini elde edebiliriz. Ayn× mant×kla roma rakamlar×, Ġngilizce say×lar× yazma yap×labilir. Makrolu bu dosyalar× aarken
×kan uyar×ya “Enable Macros” diyerek gein.
“Tools*Macro*Visual Basic Editor” ile VBA (Visual Basic for Applications) a×l×r. Buradaki modl iindeki
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
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$ = ""
e$ = e$ + y$(c(2)) + b$(c(3))
s$ = s$ + e$
Next x
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× aa-
rak, nce “Insert*Module” komutu verin.
stteki kodlar× buraya yazabilirsiniz. Sonra Excel‟e geri dnerek yani VB‟yi
kapatarak, bir hcrede deneme yapabilirsiniz. Dikkat ederseniz Function yaziyla$(sayi) Ģeklinde olan makromuz metin
bir değer dndryor. “=yaziyla(2001)” yada bilgisayar×n kafas×n× kar×Ģt×rabilecek byk rakamlar girin. Hatalar× gr-
meye al×Ģ×n. Virgll rakam yasak, negatif say× da deneyebilirsiniz.
236
AĢağ×daki rnekte de bir prosedr olarak belli bir klasr ve iindeki alt klasrlerindeki belli dosyalar× (yani
recursive – kendini ağ×ran, rikörsiv diye okunur) listeliyor:
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
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 hcreden itibaren, bir klasrdeki 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
Kendi formunuzu yapmak isterseniz Excel buna da izin veriyor. Yeni bir Excel kitab×nda “Tools*Macro*Visual
Basic Editor” ile VBA‟y× aarak, nce “Insert*UserForm” komutu verin. Aynen Visual Basic‟deki gibi bir form olduğunu
greceksiniz. 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 hcre değerleri almak, formdan sayfam×za değer yollamak.
RefEdit1
CommandButton1
TextBox1 ComboBox1
ListBox1
ToolBox‟a sağ t×klay×p “Additional Controls” diyerek “RefEdit.Ctrl” nesnesini ekleyin. Bununla hcre aral×ğ×
seme nesnesini formumuza ekleyebileceğiz.
Bu arada Excel sayfam×z zerine bir dğme koyup bununla formumuzu a×yoruz. Bunun iin 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, bylece CommandButton1‟i oluĢturdunuz.
239
“(Exit) Design
Mode” ile tasar×mda
kalabilir veya
×kabilirsiniz.
OluĢturduğumuz dğmeye “Design Mode” aktif iken ift t×klay×p Ģunu yaz×n:
Eğer byle 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 dzenleyicisi ile
mdahalelerde 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 gre
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 iin ayr× ayr× davran×r. Word makro kodlar×n× Excel‟de kullanmak genellikle
mmkn olmaz. tarih_gster.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 hcrelere tarih aktar×l×yor.
Okulda ğretmenlerin ders saatlerinin tutulduğu izelgede, belli bayram gnleri ve tatil gnlerini “X” ile
dolduran bir programa ihtiya duyulmuĢtu. Bu program ayn× zamanda takvim yapmak iin de kullan×labilir. Kolay
eriĢim iin 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 srkle 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 gn listelenebilir. Ka adet
olacağ× ile ilgili hcrelere değer verilerek yap×labiliyor. Ay iin rakam girmek yerine ComboBox nesnesi de
kullan×labiliyor.
241
Excel dosyas× zerine grsel programlarda grdğmz dğme, ek kutusu, a×l×r kutu, liste gibi nesneleri
yerleĢtirebilir, onlar× belli hcrelere 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
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 iin Program Ekle / Kald×r „dan WSH
eklentisini ykleyebilirsiniz. Fakat WinME kendiliğinden ykl olarak geliyor. Eğer baĢka bir program rneğin
XingMPEG Player *.vbs dosyalar× kendine ynlendirmiĢ ise o zaman ancak registry yedeğini geri al×p eski WSH bağ×n×
kazanabilirsiniz.
Bu arada script deyince akl×ma Office iinde VBA, Corel iinde CorelScript, AutoCAD iinde AutoLISP ve Studio
Max iinde de MaxScript gibi bu uygulamalar×n kendi yard×mc× dilleri olduğu geliyor. Flash iinde 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 iinde “toplama.vbs” olarak kaydedin, sonra dosyan×n zerine ift
t×klay×n o kadar.
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
Microsoft‟un as×l amac× bizi DOS iinde kulland×ğ×m×z *.bat (batch – y×ğ×n dosyas×) dosyalardan kurtarmak.
Yani metin halindeki bu minicik dosyalar ile programlar aabilir, 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 tm iĢlemler artalanda yap×labilir.
...
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 iin 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
Windows Scripting Host kullanarak Excel iine 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 drt
karakterine gre Excel sayfas× iine Word dkmanlar×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 gnderilebilir. 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 iinde buna benzer bir
kodlamaya ihtiya duyabilirsiniz. *.vbs olan bu rneğimizi VB dilinde rahatl×kla kullanabilirsiniz.
*.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 klasrdeki *.com,
*.exe veya *.bat dosya m× ve en son da path ile tan×mlanm×Ģ klasrlerde 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 aarak Ģunlar×
deneyin. ( Enter demektir)
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 src veya dizinde “kopyala *.* a” gibi bir komut
246
verebilirsiniz. Hatta “BaĢlat*al×Ģt×r...*kopyala yedek.* a” gibi de komut verebilirsiniz. Eliniz src ad×ndan sonra “:”
yazmaya al×Ģm×Ģ ise birka sat×r× dzelterek bu desteği de verebilirsiniz.
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.
Kaynak ve hedef dosya ad× parametre olarak komut isteminde yaz×l×yor. rnekteki gibi isim değiĢtirmek iin
kullan×lan ren komutuna benzer de kullanabiliriz. “Ornekler\Pascal\Graf\plasma.pas” rneğinde de ayn× dosyalama
komutlar×, d×Ģardan resim dosyas× amak amac× ile kullan×lm×Ģ.
Asl×nda hep yapmak istediğim ama bir trl hala yapamad×ğ×m; birden fazla Windows kurulu olan makinede
aralar×nda geiĢ yapabilmek, yani boot menu oluĢturmak. XP boot mensn 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 iin gerekli komutar× da bulabilirsiniz. RAMDISK sayesinde RAM‟inizin bir k×sm×n×
src olarak atayabilirsiniz. Eğer en az×ndan 512 MB RAM sahibiyseniz, swap dosyan×z× RAM zerine ynlendirebilmek
PC‟nizi olduka h×zland×rabilir.
config.sys iindekiler:
[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
@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 iindeki bir iki sat×r ile manuel – el ile Ģu sat×rlar× gncelleyerek 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 yntem, “Program Files” iindeki 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× amak istersek Ģu Ģekilde kullanabiliriz:
*.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 geilmemesi
sağlan×yor:
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 dnya 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 yzlerce megahertz iĢlemcimiz,
yzlerce megabyte RAM ve gigabyte‟larca sabit diskimizi yaz× yazmak, oyun oynamak, internete bağlanmak iin
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 (kt 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× iin paylaĢt×r×labiliyor. Ayn×
bilgisayarda birok terminal ekran× (virtual machine – sanal makine) birbirinden bağ×ms×z olarak fonksiyon tuĢlar× ile
a×labilir. Ticari bir amala retilmeyen, donan×mdan bağ×ms×z bu iĢletim sistemi zerinde al×Ģmak zere birok
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 kmsenmemeli) 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 klasr eriĢim haklar× FAT iin 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‟dr. MS-DOS uygulamalar× kontrolsz 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 geici bellek alan× iin Linux ayr× bir src 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 src
oluĢturulduğu volume set – hacim kmesi, her diskten ayn× byklkte blm al×n×p tek src oluĢturulduğu stripe
set – Ģerit kmesi, birbiri ile eĢ sabit disklerin mirror set – ayna kmesi 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 yzey zerinde gerekleĢ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× iin kullan×l×r. Birok firma
birbiri ile uyumlu olmayan byklk ve kapasitede bu RAM‟lerden retilmiĢlerdir. EriĢim sreleri 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
paras× 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 – Telekomnikasyon 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
srclerinizi bularak onlar× gncelleyebilirsiniz. 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, Trke karakter problemi nas×l zlr, 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 srcsnden 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
Hedefimiz bir *.txt dosyadan web sayfas× iinde 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 gvenlik sorusuna Evet diyerek gememiz
gerekiyor. Disk ile ilgili iki iĢlem yap×ld×ğ× iin st ste iki kere bu soru soruluyor. Biraz can s×k×yor gibi olsa da nemli
bir soruĢturmad×r. Ġnternette dolaĢ×rken byle bir soruya Evet derseniz diskinize zarar veren komutlara da izin vermiĢ
olursunuz. ActiveX komut ve nesneleri gvenlik ynnden ok zay×ft×rlar. Ayr×ca Internet Explorer web taray×c×s× iin
gvenlik ayarlar×ndan ActiveX ve JavaScript izinlerini bu rnekler iin simdilik amak gerekiyor. Deneyim iin
yapt×ğ×m×z basit dosyalama iin bu yntemi tavsiye etmem, onun yerine cookie – erez kullan×m× daha rahat ve kolay.
ana.htm iinde alt.htm dosya iframe (in line frame) – i ereve (Netscape bu komutu desteklemiyor) iinde
gsteriliyor. 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 gzkyor. Rahata
değiĢken tan×mlamak, istediğiniz yere kod yazmak, grsel diller kadar gl olan sayfa zerindeki nesnelere
250
ulaĢabilmek, bilgisayar kaynaklar×n× neredeyse tam kullanabilmek gibi birok hoĢ zellik vard×r. Eğer bilgisayar×n×zda
Microsoft Visual Studio‟nun bir ğesi kurulu ise web sayfas× iinde 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 iinden
“Grnm*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.
<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
<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">
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” klasrnde saklanan metin tabanl× boyutu kk, kullan×c×n×n gezdiği sitelerin
geici 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 kk metin dosyalar×
sayesinde olur. Netscape firmas×n×n etkileĢim iin ×kard×ğ× bu sistem ile sitelerin davran×Ģ× kullan×c×n×n zelliklerine
gre 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. Bylece 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 Trke, bedava ve internetten
gncellenebiliyor.
<%
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
%>
<%
a=Request.Cookies("cerezimiz")("a")
b=Request.Cookies("cerezimiz")("b")
c=Request.Cookies("cerezimiz")("c")
Response.Write a
Response.Write b
Response.Write c
%>
C=Deneme+3&B=Deneme+2&A=Deneme+1
Deneme 1
254
stteki kayan yaz× rneğinin Macromedia Flash ile benzerini oluĢturabiliriz. Sonuta 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 gvenlik sorgulamas×n×, ilk a×l×Ģta
sorulan tek soruya indirmektir. Bu arada stteki rnekteki yazi.txt iindeki 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 iindeki 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
dzenlemeleri yapabilirsiniz. Variable – değiĢken ad×na tekst demeyi unutmay×n. JavaScript ile bu değiĢkene değer
yollayacağ×z.
Yaz× k×sm× haz×rlan×nca ilk frame – ereve (zaman izgisinde 1 numaral× ereve) zerine sağ t×klay×p “Create
Motion Tween” komutu veriyoruz. Son ereve iin layer1 zerinde 30‟ncu kare t×klan×p F6 tuĢu ile keyframe – anahtar
ereve ekliyoruz. Yaz×n×n yukar× doğru gitmesi iin bu son erevede yaz×y× klavyeden Shift tuĢuna (yanlara
kaymamas× iin) basarken yukar× taĢ×y×n. Yine 30‟ncu ereve 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 dner demek istiyorum.
Resim 15‟de grebileceğ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× mendeki
Background Color ile mavi gibi bir renk seebilirsiniz, 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 grebiliriz. “File*Publish Settings...” ile *.htm ve *.swf seili olursa, “File*Publish Shift+F12”
dediğimizde alt.htm iinde kullanacağ×m×z <object> tag – etiket kodlar×n×n haz×r olarak gelmesini sağlayabiliriz.
<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
Flash iine komut yollaman×n yan×nda getURL(); ile d×Ģar×ya yani Internet Explorer penceresine de komutlar
yollayabiliriz. Bu web sayfas× iindeki bir JavaScript fonksiyonu da olabilir. Nesne veya dğmenin Action komutlar×na
Ģu rnekleri yazabilirsiniz:
getURL (―JavaScript:dosyaAc();‖);
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");
}
Verilen hedefte(bir movie clip olabilir) rneğin pop menler gibi kontroller yapmak iin:
tellTarget (―hedefadi‖)
{
gotoAndPlay(5); //burada başka işlemler de yapılabilir
};
258
Sayfa iinde belli kelimeyi aramak ve ka adet olduğunu bulmak iin bu kodlar× kullanabiliriz. Netscape iin
farkl× komut kullan×m× gerekebilir. Netscape‟e zel kod ile uğraĢmama nedenim dnyada byk 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">
<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
Temel olarak *.asp dosyalar olan Active Server Pages – etkin sunucu sayfalar× ile, internet veya intranet
zerinde veritaban× ve gvenlik 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 profesynel
sayfalar yapmak mmkndr. Ayr×ca Macromedia Flash gibi animasyonlu web sayfalar× rahatl×kla ASP ile
iliĢkilendirilebilir. Genellikle tm 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 ierirler. Brinkster yeliği sonras×nda db klasrne att×ğ×n×z *.mbd iin 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× grdğ halde asl×nda bu sayfa sunucu zerinde al×Ģan *.asp dosyas×d×r. Form bilgileri
ve seeneklere gre *.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 gittike yavaĢlamaya
baĢlayabilir. JavaScript istemci taraf×nda al×Ģ×rken, ASP sunucu taraf×nda al×Ģ×r. Bylece web browser – taray×c×
program× ne olursa olsun *.htm kodunu kullan×c× rahatl×kla grecektir. 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 gremeyecek ve sadece zet bilgi gibi nne gelen *.htm ile yetinecektir.
Orijinal *.asp kodu rneğin 3KB iken, sonu *.htm dosyas× 1KB‟dan MB seviyesine kadar byk dosya olabilir. nk
sonu en az×ndan basit bir hata mesaj× olabilir veya byk bir veritaban×n×n ekrana tablolanmas× da olabilir.
Kendi bilgisayar×m×zda *.asp sayfalar× oluĢturmam×z iin 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 – kk dizin sorulduğunda “C:\Belgelerim\My Webs” gibi
bir klasr ad×n× belirledikten sonra, saat simgesinin yan×ndaki basit menlere sahip olan PWS program×na
ulaĢabilirsiniz. NT ve zeri iin 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
grebilirsiniz. Ġsterseniz “Denetim Masas×*Ağ” k×sm×ndan bilgisayar ad×n× değiĢtirerek “http://server” gibi de
adland×rabilirsiniz. Perl iin *.pl uzant×l× dosyalar×n aktif hale gelmesi ActivePerl adl× program sayesinde olur.
MS Access ile “My Webs\db” isimli bir dizin iine 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
modlleri. Arabirimleri ayn× fakat gruplar×(Type) farkl×d×r. Yani ayn× veritaban×na kaydolurken, kayd×n trne gre filtre
amac× ile numara veriyoruz. Mesela misafir defteri 1, program ekleme 2 ve site ekleme 3.
index.html misafir deferi iin, index1.html program ekleme iin ve son index2.html de site ekleme iin
gereken ana sayfad×r. Tek ana sayfa da yap×labilirdi. Kullan×c×lar ye yap×larak, kendi misafir defteri de yapma imkan×
olabilirdi. Bylece misafir defteri hizmeti de verebilirdik.
260
Ana men yani veri giriĢ ve listeleme iin, “My Webs\index.html” iine sayfa oluĢturuyoruz:
Bilgileri index.html‟den al×p kontrol ederek kaydeden dosyam×z ise “GuestBook.asp” ‟dir:
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
<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>
<%@ 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>
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"
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
%>
<%
'######################################################################
265
%>
<%
'=================================================
%>
<% 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">
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 "http://")<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
%>
<% 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 "http://")<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
'------------------------------------------------------------------------------------------------
%>
delete.asp iinde silme, gncelleme, ekleme iĢlemleri var. GuestBook.asp‟de kay×t yap×lmadan nce tm
alanlar×n doldurulup doldurulmad×ğ× kontrol ediliyor ve kullan×c×n×n yorum gibi k×s×mlara HTML kodlar× girilmesi
gvenlik amac× ile engelleniyor. Ekrana kay×t numaralar× ile birlikte tm 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 gvenlik gerektiren (kredi kartlar×
bilgileri, e-ticaret gibi) alanlarda da SHTML – Secure HTML (Gvenli Yuva Katman× veya SSL) kodlamas×n× ğrenmenizi
tavsiye ederim.
JavaScript rneklerimizdeki tm iĢlemleri *.asp olarak VBScript kodlama ile de yapabiliriz. “Ornekler\Diger
\ASP\extra” dizininde Dr. Hakk× cal‟×n al×Ģmalar×n× grebilirsiniz. rneğin bilgisayar×m×zdaki src listesini almak
hemen hemen ayn×:
*
Ek 2 – SQL k×sm×na bak×n×z.
272
Nihayet Nisan 2004 tarihinde kendi projemi de kitaba ekliyorum. ġu anki son srm 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 kk bir iĢlevsel programlama dili yap×labileceğidir. Multimedya ve veritaban× gibi gzel
zellikleri daha kolay ve kullan×Ģl× bir Ģekilde biraraya getiriyoruz. Fakat eksikleri daha var ve asl×nda bitmiĢ bir srm
değil. Balinalar ile yar×Ģabilmesi iin sadece benim değil, bir ok insan×n ilgilenmesine abal×yorum. zellikle birok
programlama sitesine ye olarak tan×t×m yap×yorum. Hala tam istediğim gibi bir seviyede destek bulamad×m.
Yunus ismi Delphi‟den geliyor. Delphi, dolphin yani yunus‟a benzediğinden bu ad× verdim. Dolphin diye bir
mzik 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 modler yapma dĢncem var. Yani
istenen program iinde program yapabilme eklentisi yeteneği verilebilir.
Yunus‟un daha geliĢtirilmiĢ hali olarak da BlueDream projem de var, fakat birok nesnenin biraraya gelmesi ile
yapt×ğ×m iin, devam× ok zor gzkyor. nk Mart 2003 tarihinden itibaren baĢlad×ğ×mdan bu yana Shareware
Greatis Form Designer‟×n daha yenisini yapt×lar ve bu srmn eklemek iin uğraĢt×ğ×mda uyumsuzluklarla
karĢ×laĢt×m. Yunus ise tamamen benim yazd×ğ×m kodlarla meydana geldiği iin gncellemem daha kolay olabilir. BD
iinde ok uğraĢt×ğ×m 3 boyut dzenleme penceresi ve nesne zellikleri pencereleri art×k Yunus iinde 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×) hibir 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 – avuii bilgisayarlar) zelliklerine g×pta etmekten baĢka yapabileceğimiz yok. Delphi.NET
yani Delphi 9 srmnde 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 srmlerde 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 gzden geirilecek.
oğunlukla Visual Basic benzeri kodlama sistemimiz var. Asl×nda hoĢuma giden Pascal ve C++ komutlar× da
ekledim. Sonuta Trke veya baĢka bir dilde zelleĢtirilebilen basit bir eğitim amal× script dilimiz var.
Examples klasr iindeki rnekleri inceleyerek genel kullan×m hakk×nda bilgi alabilirsiniz.
Birka ipucu:
# DeğiĢken trleri ve tan×mlanmas× yoktur. Tm 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 gerek), metin ve mant×ksal (True - Evet, False - Hayir) kendiliğinden dnĢtrlyor. 1E3 rakam×
1000 anlam×nda kullan×labilir. Gerek say×larda "," virgl 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Ģnyorum.
# "+", "-", "*", "/", "&" (metin birleĢtirme), "^" (exp - s alma), “\” (div - tam blm), "%" (mod - kalan), "@"
(mant×ksal ve), "~" (mant×ksal veya) hesaplama bağlac×d×r. Ġie 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 tm iĢlemler (+, -, *, /, ^, %, &, \, @, ~) iin kullan×labilir. a+ =1
gibi operatr ve eĢittir aras×na boĢluk b×rakmay×n×z.
# Hesap yn soldan sağad×r. arpma ve blme 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×ğ×
grlebilir.
# sin(gerek), cos(gerek), random(tamsay×), int(gerek), 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 iine almak gerekebilir. Mant×ksal değer olan “Evet” ve “Hayir” ift t×rnak iine al×nmal×d×r.
# Byk kk harf ayr×m× yoktur. Komutlar, nesne zellikleri ve değiĢkenler istenilen byklkte kar×Ģ×k yaz×labilir.
# Eger komutu tek veya ok Ģartl× olarak kullan×labilir. ġart k×sm×nda AND iin "@" ve OR iin de "~" gibi bağlalar×
destekliyor.
# Eger komutunda "=" ">" "<" "<>" "<=" ">=" kullan×labilir. Ġie 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 iie kullanabileceğimiz dng komutumuz var.
# iken ġart Ģeklinde sonu "Yanl×Ģ" olana dek dnen komut vard×r. ikenBitti ile de bittiği belirtilir.
# Kullan×c× kendi Fonksiyon'unu tan×mlanabiliyor.
# "//" a×klama sat×r× yapar. Sat×r ii 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 getiğinde silindiğini grebilirsiniz. Tazele komutu ile de formu temizleyebilirsiniz.
# sesCal dosyaadi ile *.wav mzik 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 hcrenin değeri al×nabilir, değiĢtirilebilir, sonrada
kaydedilebilir. Yeni dosya oluĢturma yoktur.
# BenchmarkStart ve BenchmarkEnd kodlar× aras× milisaniye olarak h×z lm 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× iindir. 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× iin “Yuklenince - OnLoad”,
kapanirken de "Kapanirken - OnClose" olaylar× oluĢturulabilir.
# 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 seimi 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 tm nesnelerin komutlar× ile birlikte al×Ģabilmeleri
Yunus.exe tek baĢ×na al×Ģsa da, ayn× klasrde midas.dll (XML desteği iin), zlportio.sys (Windows NT ve st
iin port kullan×m×), yunus.chm (Yard×m dosyas×), *.exe oluĢturmas× iin gerekli Kalip klasr olmal×, ve kod dkm
iin 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*Seenekler…”den silinebilir. Yani sisteme en az yk 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 iin “menu.rc” dosyas× yapm×Ģ×z. Bu yzden de isteyen kendi lkesinin dil
evrimini yapmak isterse, Delphi‟nin kurulu olmas× ve Yunus‟un tekrar derlenmesi gerekiyor. Tasarim klasrnde
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 klmesi sağlan×yor. Bunu
ssadece Borland dosyalar× iin kullanabilirsiniz. Visual Basic ile yap×lan exe dosyalar× s×k×Ģt×rm×yor.
YaklaĢ×k 70 adet komutun “Proje*Komutlar” mensnden zelleĢtirilmesi ise Ġngilizce ve Trke dilleri iin
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 gesek de pek faydas× olmayan ve kodlar×n yavaĢlamas×na sebep olan bir
seenek. 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 seilse dosya
adlar× ayn× olduğu iin proje a×l×r. Birden fazla form kayd×n× daha yapamad×ğ×m iin bir sorun yok.
ok karmaĢ×k gibi gzkt biliyorum, asl×nda diğer profesynel uygulamalara gre 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×ğ× iin minicik programlar yap×yoruz. Bu tr
programlama dillerinin bir avantaj× da sadece yorumlama program× gncellenerek projelerin al×Ģmalar× daha
iyileĢtirilebiliyor. Eğer daha h×zl× al×Ģan algoritmalar yapabilirsek, uzun sren (dngler gibi) iĢlemler daha abuk
bitirilebilir.
Tek tek menleri ve komutlar× anlatmak zor, onun yerine rneklerden baz×lar×n× anlatal×m. Mesela
YatayAtisProblemi.proje (Ġngilizce men ve kod) ve hesapmak.proje (Trke 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 formllerle bulunuyor:
x= Vo*cos(α)*t
275
Counter-Strike oyunundan ald×ğ×m ses dosyalar×n× belli anlarda al×yoruz. Eğer klasr 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
tm 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 sonular×da grntlenebiliyor. Kod bloğunun ka milisaniyede al×Ģt×ğ×n× grebiliriz.
Ses almayla ilgili syleyebileceğ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 mzik ve ses dosyalar× desteklenmiyor.
Bu rnekte program durdurulsa da “Persistent Variables – Kal×c× DeğiĢkenler” seeneği seildiğ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 seeneklere ulaĢabiliriz.
Bu pencerede diğer dillerdeki “Watch – Gzetle” imkan× kendiliğinden haz×r olduğu grlebilir. 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 geen 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 lmcl
hatalarda (sabit diskin bozulmas× gibi) bu kay×tlar bile tutulamadan ana program kapan×yor.
ift t×rnaklar iine yaz×lanlar metin olarak alg×lansa da ilk baĢlarda iinde =, +, / gibi iĢleler iiren kelimelerde
onlar da al×Ģt×r×lmaya al×Ģ×ld×ğ× iin, zorlanm×Ģt×m. message "x=0" komutu maalesef ekrana x=0 mesaj× ×karm×yor. =
276
yerine : kullanabilirsiniz. AĢağ×da grldğ gibi mesela “Kaan =”&kacan gibi kullan×m art×k sorunsuz. Hatta “”
kullan×lmadan da atama yap×labiliyor. Ama o zaman da iinde =, + geiyorsa hatal× bir kullan×m olur. “True – Evet” ve
“False – Hayir” ift t×rnak iine 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.
Sins ve kosins al×n×rken radyan değil doğrudan a× değeri kullan×l×yor. Birok 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”
klasrndeki 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 grlebilir. nk zaten isteyen istediği program× o
dilde yapabilir. Ayn× Ģekilde HTML ×kt×da da komutlar JavaScript veya VBScript‟e dnĢtrlemiyor, ama grnm,
neredeyse yzde 95 gibi, as×l tasarlad×ğ×m×za benziyor. Ġlk ad×mlar×m×z umut verici. Bunlara ek olarak da VB, VC ,ASP
ve PHP dnĢmleri de olabilir. D×Ģardan Yunus‟a exe ve html alma daha yok. Etrafta buna benzer bir Ģey hi
grmedim zaten. ResHacker gibi programlar formlar× filan okuyabilse de normal dilin kodlar×na eriĢim hibir yerde yok.
Disassembler (makine dilini gsteren) programlar× bu iĢi gryor 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 srm olacakt×r herhalde.
Bir trl yapamad×ğ×m diğer zellik de, daha fazla form ekleyebilme. Form oluĢturma kolay olsa da, kod
ekleme byk problem. Kod ve formlar× kaydederken, isimleri ne olacak, her form iin ayr× bir Yunus mu al×Ģacak,
karara varamad×m. Proje yneticisi gibi bir ekleme silme penceresi olmal×. Ana form hangisi olacak, ilk a×l×Ģta kimler
gzkecek…
Ġlk a×l×Ģ ekran×n× basit tutmaya al×Ģt×ğ×m iin, tek pencerede ana men, ara ubuklar×, zellikler, olaylar
birleĢtirilmiĢ halde. Ama yeni eklentiler olduka 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 grnm var. Yine de bu programlar× taklit amal× olmamaya gayret ettim.
S×k kullan×lan baz× Delphi kodlar×n× da prosedr haline getirip, Yunus iinde komut olarak ekleyebiliriz. rneğin
internetten yani TCP/IP kullanarak baĢka bilgisayara bilgi yollama komutu ekleyebilirsiniz. netbaglan, netDosyaYolla,
netMesajYolla gibi… Daha uuk 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 ktphane veya dosya dahil etme
gibi bir imkan×m×z olsayd×. BaĢkalar×n×n yapt×ğ× gzel kodlar× kendi program×m×za da ekleyebilirdik. Delphi‟deki “Install
ActiveX” seeneği gibi, OCX dosyalar× nesne paletimize de eklememiz profesynel bir al×Ģma olabilirdi.
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
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
stnlk sağlama değil, iĢlerimizi basit yollardan halletmeye al×Ģmak. Ġlk kez grsel programlama yapan biri iin
Yunus rahat ve basit bir programlama ortam×.
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 Trke 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 Dzenleme
Penceresi”, “Yaz×c× nizleme” diyebilirim. Genel grnm ve menlerin tasar×m× da az da olsa zaman×m× ald×.
Bu projenin devam etmeme nedenlerinin baĢ×nda yeni ×kan ve gncellenen nesneleri BD iine 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 iin, BD‟deki gibi geliĢmiĢ
“Nesne zellikleri”ne gerek yok da denilebilir. Ya da basit zellikler ve geliĢmiĢ zellikler diye programc×ya seenek
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, dzenlenmelerine al×Ģ×yoruz. Her ne kadar tm zellikler ve olaylar listelense bile form
zerindeki nesneler ile iletiĢim tam değil. Mesela Form‟un Action zelliği aktif değil.
280
3 boyut yani OpenGL rahatl×kla GeForce ve ATI ekran kartlar×nda al×Ģ×yor. Kre, dikdrtgen prizma, yay, yaz×,
gen, tp, 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 sonuta al×Ģt×r×l×yorlarsa, bu penceredekileri
denemek iin sahne iinde 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× skp baĢka programlarda kullanmay× maalesef zor buluyorum. Programlama k×sm×nda
modlerlik kural×na pek uymad×ğ×m×z iin. 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 dzenli programlama
olduğundan az bir uğraĢla kendi program×ma bunlar× ekledim.
281
PHP (Personal Homepage) ile yapt×ğ×m bu program ile bir ktphane iin gerekli kitap kayd×, kitap dn
verme alma iĢlemlerinin takibi ve istatistik al×Ģmalar× yap×labiliyor. PCNet dergisinden bulduğum birok Mac ikonlar×
ssl psl olmas×n× sağlad×. PHP tek baĢ×na bu kadar grsellik sağlam×yor. Ayr×ca birok JavaScript ve DHTML kodu
da arkaplanda al×Ģ×yor. Bunlar iin 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 iin kulland×m.
ASP ile dinamik sayfa yapmak ok kolay, ayn× Ģekilde PHP‟de *.mdb dosyalar× ODBC ile veritaban× kullan×larak
iĢlerimizi grebiliriz. 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 (Trke) baĢlang× ayarlar×n× bilmeyenler iin haz×r
paketlerdir. Toplam 40-50MB aras×nda olan bu programlarda bol miktarda rnek ve ğretici dokman var. Az yer
kaplayan birok bedava alternatif de var. Mesela Abyss Web Server ve BadBlue gibi. OmniHTTP ile PHP de
kendiliğinden kuruluyor ve kurulumdan k×sa sre 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 iin 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 birok seenek 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 grnebilir.
282
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.
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 ynlendirip kapatal×m.
3) Windows dizinindeki php.ini dosyas×ndaki “register_globals = on” sat×r× olmas×na dikkat edelim.
4) Projeyi “http://localhost/kutuphane” diye at×ğ×m×zda, oturum kay×tlar×n× kk dizininde saklad×ğ×m×z
iin muhtemelen “c:\” de sess_ef2b2b6ded… gibi dosyalar oluĢacak. Daha sonra bunlar× rahatl×kla
silebilirsiniz. Linux‟da ise kk dizine yazma hakk× verilmez, o sebeple oturumlar “/tmp” gibi yerlere
ynlendirilmelidir. Her *.php dosya iindeki session_save_path("/tmp"); olarak dzenlenebilir.
5) nobetci ismi ve Ģifresi ile giriĢ yap×l×nca kitap al×Ģ veriĢi yap×labilir; admin ise kullan×c× aabilir, 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” klasrndeki turkish.php ve english.php dosyalar×nda gerekli
dzenlemeler yap×larak baĢka dillere destek veriliyor. Hem de baĢka blm var ise, mesela matbaa
blmnn ktphanesinde kullan×lacaksa, turkish.php iindeki Bilgisayar geen yerleri Matbaa diye
yerdeğiĢtirmek yetiyor.
7) Microsoft Access ile “apache\htdocs\kutuphane\inc” klasrndeki kutuphane.mdb dzenlebilir. Yeni
ktphane aanlar buradan eski kitaplar×, kay×tlar× silebilirler.
8) Bu projede kullan×c× giriĢi iin 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 gzel sonular 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:
Genellikle en ok form elemanlar×na ulaĢma, ilerini gncelleme, uyar×lar, metin kutular×, onay kutular×n×n
al×Ģmalar× gibi konularda JavaScript‟e mecbur kalmak tuhaf. Grsel k×s×mlarda PHP‟nin hibir yeteneği yok.
Extensions – geniĢleme eklentilerini de al×Ģt×ramad×ğ×m iin grafik komutlar× gibi gzel unsurlardan yoksun kald×m.
Ayr×ca php.ini ve httpd.conf gibi dosyalar×n iine girip, ayar yapmak bana zor geliyor. PHPConfig (analogx.com) biraz
yard×mc× olsa da iĢin iinden ×kamad×m. Unix kullananlar en basit ayar× bile not defteri benzeri programlar ile
yapmaya al×Ģ×kt×rlar, ama Windows kullananlar iin anlaĢ×lmas× zor.
Trke ve Ġngilizce desteğini d×Ģ dosyalar× “include” ile ederek sağlarken, asl×nda bu program× baĢka amalar
iin de kullanma imkan× ortaya ×kar×l×yor. Mesela bilgisayar kelimelerini elektronik ile değiĢtirdiğinizde, elektronik
blmnn ktphanesi de yap×lm×Ģ oluyor. Tabi tablolar× da ona gre 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
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 gzkmyor. Flash arabirimine bir trl al×Ģamad×m. Minicik pencere ve yaz×lar, bir sr k×sayol, k×s×tl× yard×m
dosyalar× ve sonuta gittike yavaĢlayan bir *.fla dosya beni b×kt×rd×. Biraz daha kafa yorsayd×m ve sabretseydim,
“al×Ģt×r” da olabilecekti.
K×sayollar×:
BoĢluk = al×Ģt×r / Dur
Ctrl + F = Tam Ekran
Ctrl + W = ×k×Ģ
Shift + srkle = Eleman× serbest taĢ×
Oklar = Eleman× 10 pixel taĢ×
Shift + Oklar = Eleman× 1 pixel taĢ×
Delete = Seili eleman× siler
Esc = Pencere grnm
Bu program× da bedava ve a×k kaynak kodlu proje olarak yapt×m. Men ve ipular×nda, Ġngilizce ve Trke dili
desteği var. english.txt dosyas×n× değiĢtirerek baĢka dilde de destek sağlanabilir. Trke dosyas×n× not defteri ile
iĢlerken UTF-8 kodlama seilerek kaydetmeyi unutmay×n. Yoksa Trke karakterler Flash‟da okunmuyor.
YerleĢtirilen nesnelerin iğne veya bacak ular× t×klan×nca kablo durumuna geilir. Tekrar ayn× u t×klan×nca
vazgeilir, ya da baĢka bir nesneye bağlan×r. Kablo durumunda srkleme 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. Trke men yapamad×m. Paste yani yap×Ģt×rmak iin 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 iinde 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 geer ve mr k×sal×r. 7 paral× Led gsterge de (Display) 7447 gibi
elemanlarla kullan×l×r. Yine program×m×zda iinde varolduğunu dĢnerek tasar×m yap×yoruz. Zaten bu arada tm
nesneler de gerek 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 iine girince PHP, JavaScript gibi yard×mc× dillere
ihtiya duyuluyor. Gvenlik neden ile olsa gerek. Ama stand-alone dosya yani exe dosya olarak bilgisayar×m×z×n
diskinden kullanacağ×m×z program iin baĢka zm bulmak gerekli. PHP ile de site haz×rlarken HTML ve JavaScript
olmadan oğu Ģeyleri yapam×yoruz.
285
Bu projede Flash‟× tercih etmemin en byk sebebi, pencereye sağ t×klay×p byt, klt komutlar×n×
verebilmemiz. Kalite bozulmadan bu iĢlemler yapabiliriz. Normalde programlama dillerinde grafik olarak scale
(leklendirme) yapman×n bir sr tuhafl×klar× oluyor. Flash iindeki tm izilen nesneler(yaz×lar, izgiler, daireler,
poligonlar… - bitmap resimler ise net olmayabilir) vektrel 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 gre değiĢmeli. Ya k×sadevre durumu nas×l değerlendirilecek? Nesnelere mi davran×Ģ
vermeliydim yoksa bir prosedr 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× syleyebilirim. 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 ie ok blok varsa daha standart grnm elde ediyoruz. Biimlendirmede baz×
seenekler “Auto Format Options…” ile grlebilir. Yine de kod yaz×m×, VB veya Delphi‟nin yan×nda ok snk ve
yard×mseverlikten uzak. Nereye ne yazd×ğ×m× ilk baĢlarda bir trl anlayamad×m. Movie Explorer(Alt+F3) ve Library
(Ctrl+L) kar×Ģ×k, kafa kar×Ģt×r×c×… macromedia.com‟dan tm pdf dosyalar× indirsem de bunlar× pek kullanmad×m.
google.com‟dan arama ile bir sr pratik bilgiye ulaĢabilirsiniz. Flash‟×n yetenekleri bol olsa da, neredeyse yar×s×n×
kullanmad×m. Ktphanesindeki bir sr gzel elemanlar pek iĢimi grmedi.
Resim 19b‟deki gibi 17” ekran 1024*768 znrlk yetersiz… F4 ile tm 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 – ereve
ile al×Ģ×yoruz. Programlar×n oğu MovieClip – film kliplerine yaz×ld×. Belki de projemizi yavaĢlatan Ģey, klip iinde
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 – dnĢtrme iĢlemine sokmad×ysan×z, ana ereve ile ayn× x y birimine sahip
oluyorlar. Fakat ykseklik ve geniĢlikle oynay×nca nesnenin uzay×, birimi farkl× oluyor. Bir de bunlar×n eĢdeğerini
bulmaya al×Ģ×rken iyice iĢin iinden ×kamad×m. Sonradan nesne oluĢturduğumuzdan istediğimiz yere getirmek, kablo
ekmeye al×Ģmak zor oldu.
var ilkNoktaX:Number = 0;
var ilkNoktaY:Number = 0;
var sonNoktaX:Number = 0;
var sonNoktaY:Number = 0;
C dilindeki gibi byk kk 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
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Ģ mensn ve ana meny 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 sama.
287
Yine PHP (Personal Homepage) ile yapt×ğ×m bu program ile de s×nav otomasyonu yap×yoruz. KPro kodlar×n×
kullanarak yapt×ğ×m iin iki projenin grnmleri benziyor. YaklaĢ×k 6600 sat×r sren bu programda MySQL RDBMS
(Remote Database Management System – Uzaktan veritaban× ynetim sistemi) veritaban× kullanmay× tercih ettim.
Resim 20e – ye listesinde mail komutu ile yeye elektronik mesaj at×labilir
Okuldaki Linux trevi Gentoo ile nas×l al×Ģabilir ynnde 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
byğ kurulum s×ras×nda blmlendirme yaparken, tm bilgilerimin silinmesi oldu. Asl×nda dikkatsiz bir Ģekilde
kurulumdaki bir ad×m× geince byle oldu. Gelecek Linux 2.0 ve Mandrake 9.1 kurulum denemelerim tam istediğim
gibi değildi. zellikle MySQL kendiliğinden kurulmad×ğ× iin rpm dosyas×n× internetten ve kurulum CD‟lerinin iinde
aramak zorunda kald×m. Bu arada her Linux srm diğer Linux srmlerinin *.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 grsel bir arabirimden al×Ģt×r×l×p
durdurulabiliyorlar.
Birka gn uğraĢt×ktan sonra Windows XP ve Mandrake 9.0 kurulu bilgisayar×ma kavuĢtum. Asl×nda ille de
PHP‟nin al×Ģmas× iin Linux gerekli değil. Ayn× ortam× Windows ile de oluĢturabiliyoruz. Zaten k×sa bir sre sonra
kullan×m kolayl×klar×ndan dolay× Windows‟a geri dndm. zellikle Kate metin editr 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.
Kurulumu kendi ayarlar×m×za gre değiĢtirmemiz gerekli. Bunun iin 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
Sizin veritaban×n×n ad× da duyuru olmak zorunda değil. Oturumun kaydedileceği klasr de belirttikten sonra,
son olarak projemizdeki “sinav/yollanan” isimli klasre herkes iin yazma hakk× verilmesi gerekiyor. Eğer ftp ile ana
bilgisayara dosyalar× at×yor iseniz, giriĢ yapt×ktan sonra bu klasre 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× dzenledikten 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. Yz yze,
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 gre hareket edersek, ğretmenlerin Ģifrelerini ğrencilere
belli etmemeleri de iyi olur :)
Eposta adresi gizli olmayan ğretmenlere ve ğrencilere, adlar× geen yerlerde (istatistik, baĢar× listesi, soru
bask× nizlemesi), eposta atma penceresi kullanarak eposta yollanabiliyor.
Basite bir ay sreli mr olan bir erez kullanarak, dil, son giriĢ yapan×n ad×, tr saklanabiliyor. “Beni
Hat×rla” seeneğini iptal etmek iin de, seimi kald×r×p, giriĢ yapmak yeterlidir.
admin ise soru oluĢturma, kullan×c×(ğretmen) ve ye(ğrenci) dzenleme silme yetkisine sahip. ğretmen ve
admin‟in puanlar× derecelenmede etkili olmasa da, istatistikte girdikleri s×navlar belli olduğu iin puanlar×n× grebilirler.
Sorular ortak bir havuzda tutulduğu iin, rneğin Edebiyat ğretmeni diğer derslerdeki Trke yaz×m hatalar×n×
dzeltebilir. Bylece gittike daha gzel 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
gre değil, konular×na gre ders al×Ģ×rlar.
Veri giriĢi uzun sryor, 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× gerek 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…*BiimlendirilmiĢ Metin(RTF)”
olarak yap×Ģt×r denilince biraz da olsa iĢe yarar Ģeyler elde edebiliyoruz. Yap×Ģt×rma iĢleminde HTML biimi seilirse
resimler de yap×Ģt×r×labiliyor.
Sadece belli bir haftada s×nav sorular×n×n aktif olmas× istenirse, “Dersi Kilitle” Ģeeneği kullan×l×yor. Bylece o
dersin tm 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
hibir yerde grlemiyor. Soru dkmne de cevaplar× eklemedim. Bu sayede ğrenci araĢt×rma yapmaya da
ynlendiriliyor. Bilemediği sorular× internetten arayabilir veya ğretmenine sorabilir.
Soru ve derslerin zorluk derecesi de zamanla cevapland×ka, s×navlar yap×ld×ka, değiĢiyor. Genellikle tek
seenekli sorular en zorlar×. Bir harf hatas× olursa yanl×Ģ oluyor. Soru haz×rlarken eğer tek seenek de kullan×lsa, cevap
k×sm×na bir harf girilmesi gerekir. Eğer rneğin B seeneği boĢ b×rak×l×p C, D yaz×lsa bile, s×nav s×ras×nda B seeneği
gsterilmeyip, C, D olarak devam ediyor. Yani soru haz×rlan×rken boĢ b×rak×lan seeneklerin harfleri dzeltilmiyor. A, C,
D olarak gidiyor.
En iyisi oktan semeli sorular. En fazla 5 seeneğe kadar seenek sunarak soru haz×rlanabilir. Soru metni ve
seeneklere resim de eklenebiliyor. Bunun iin “sinav/yollanan” klasr kullan×l×yor. Ayn× resim baĢka sorularda da
kullan×labilir. Ġstenirse hem yaz× hem de resim birlikte olabilir. Desteklenen dosya trleri 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 grntleniyor.
293
Ġleriki aĢamalar olarak, s×navlar×n sreli olmas×, daha estetik grnm, isteyenlere kolayl×k derecesine gre
s×nav seeneği sunma gibi Ģeyler yap×labilir. Flash ile de sorulara animasyon desteği verilebilir.
Bu proje ile ilk kez neredeyse tm 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 dnĢtrebilirsiniz. Normalde port numaran×z 80 olduğu iin, rneğin; apache iin
81, IIS iin 80 numaral× portu seerek, ayn× anda ASP ve PHP al×Ģt×rabilirsiniz. http://localhost ASP iin,
http://localhost:81 PHP iin 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 gl ve bedava bir
konfigrasyon. Windows + IIS + MSSQL ise biraz pahal× ve gvenlik a×klar× bol bir sistem. Asl×nda Linux iinde
gvenlik sorunlar×ndan bahsedebiliriz fakat, internetten rahatl×kla kk gncellemeler ile bunlar×n stesinden
gelebilirsiniz.
Sonu olarak tek noktadan al×Ģarak, tm dnyada geerli 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× grmek srpriz 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 Ynetim 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. Zrih
niversitesi‟nde yap×lm×Ģ. Administrator yani ynetici tm 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 grsel btnlk konusunda
ok eksiklerimiz var. Resim dzenleyici de ekleme isterdim. ğretmen sorular× eklerken, soru metnine resim yaparak
da daha gzel anlatabilir. Metin dzenlemede bedava Protopad (http://www.xtort.net/xtort/protopad.php) ve
fckeditor.net yard×mc× olabilirdi. WYSIWYG metin dzenleme kolay ama, resim iĢlemede alternatif bulamad×m.
E-eğitimde ierik haz×rlamak iin en iyi yol Flash. oğu bilgisayarda Flash Player ykl veya internetten
kurmas× ok kolay. Powerpoint ile de ders anlat×m× yap×labilse de yayg×n değil. Uzun belgeler genelde *.pdf olarak site
iine ekleniyor. Her ne kadar Java ve JavaScript ile dinamik grnt yapabilsek de Flash kadar etkili değiller.
294
295
Byte 1998 Mart say×s×ndan yapt×ğ×m bu rnekde, 2 yntemle “n. dereceden bir bilinmeyenli denklem”, 2
yntemle de “birinci dereceden n bilinmeyenli denklem” zlebiliyor. Microsoft Excel‟in bir eklentisi olan “zc
Eklentisi” kurulu olmal×d×r. Ġsterseniz istatistik al×Ģmalar× iin de “ToolPak zmleyicisini” ykleyin.
Sonular× Yan×t Raporu, Duyarl×l×k Raporu ve S×n×rlamalar Raporu olarak grebiliriz. zmeden nce
Seenekler mensnden de Yineleme, Tolerans, Yak×nsama ve Duyarl×l×k gibi ayarlar× yapabiliriz. Forml girdikten
sonra yeĢil olarak renklendirdiğim hcrelere rakam girerek sonucu deneme imkan×m×z var. Ama bu denemeleri
neyseki Excel otomatik olarak bitiriyor. Yani sonular 0 olana kadar belli aral×kta denemeler yap×yor.
Formllerde grdğnz x, y ve z gibi harfleri hcrelere isim vererek yap×yoruz. Mesela D8 hcresi x değerine
denk gelecek ise, “Ekle*Ad*Tan×mla…” mensnde isim verebiliriz. Bu sayfada istediğiniz yerde formllerde D8 yerine
x yazabilirsiniz. Ġstediğimiz zaman da forml ubuğunun solundaki “Ad Kutusu”na x yazarak o hcreye gidebiliriz.
zc parametreleri pencerelerinde hcre isimleri $ simgeleri ile yaz×lmal×d×r. Bylece referans× sabit olan
hcre isimleri elde ediyoruz.
299
Microsoft, .NET ile programc×lar iin en rahat ortam× sunmaya al×Ģ×yor. Gerekten de art×k kkten bir değiĢim
gibi gzken ama, tm programc×lara hitap eden bir arabirimi var. Resimde grldğ 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” klasr
bizim ana dizinimiz olacak. Visual Basic.NET‟de yeni proje diyerek, “ASP.NET Web Application” seince ana dizinin
alt×nda wa2 gibi uygulamam×z oluĢur. Son aĢamada, sitemizi “http://localhost/wa2/index.aspx” diye internet
gezginimizden grebiliriz.
ASP.NET kurulduktan sonra otomatik oluĢan ASPNET kullan×c×s×na, yetki vermemiz gereklidir. “BaĢlat*Ayarlar
*Denetim Masas×*Ynetimsel Aralar*Bilgisayar Ynetimi*Sistem Aralar×*Yerel Kullan×c×lar ve Gruplar*Users” dan
ASPNET seilerek
yelik k×sm×na Administrators, VS Developers ve Users ekliyoruz. Asl×nda Administrator hakk×
vermek ok tehlikelidir, ama Ģimdilik ğrenmek iin kendi bilgisayar×m×zda bu ayar× yapabiliriz.
Kullan×lacak tablolar× SQL Server‟a “dtname” veritaban× alt×na tablo1 (telefon bilgileri), kullanicis (kullan×c×
bilgileri) oluĢturuyoruz. Tasar×m penceresindeki “Server Explorer” mensne sağ t×klay×p “Add Connection…” ile
dtname eklenir.
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 mensndeki dtname‟ye “Tables*New Table” ile tablolar×
ekleyiniz. Asl×nda dtname iine otomatik olarak tablolar× oluĢturan SQL komutu da (CREATE TABLE) verebilirdik.
SiPro‟da MySQL iin “vt.sql” yapm×Ģt×k hat×rlarsan×z. Tam srm 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 iinde de tm sitenin stil ayarlar× var.
301
Bu projede al×Ģt×rmay× baĢard×ğ×m×z veritaban× kay×t iĢlemleri; s×ralama (ift yn), listeleme (10'arl×
sayfalama), silme (onayl×), ekleme, gncelleme, arama, filtreleme (ayr× bir tabloda), hesaplanan alanlar (ayr×
tabloda), kullan×c× giriĢi (kullan×c× ekleme, email ile Ģifre hat×rlatma).
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'.
zm:
stteki hatadaki gibi ad×mlar× izleyerek, 'db_datareader' yerine 'db_datawriter' yap×n×z.
Belki C: srcsne yazma hakk× yoktur. Yani C$ Ģeklinde. Srcye sağ t×klay×p paylaĢ×ma aman×z
gerekebilir. Hata hala oluĢuyor ise google.com‟a hata mesaj×n×z× yaz×p zm 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
Response.Redirect("dataform1.aspx")
'TextBox1.Text = "olur"
End If
Else
TextBox1.Text = "hata"
End If
End Sub
Application("Ad") = ""
Application("Sifre") = ""
Response.Write("<script>self.close();</script>")
End Sub
End Sub
End Class
dataform1.aspx.vb kodlar×:
Imports System.Web.Security
Public Class DataWebForm1
Inherits System.Web.UI.Page
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
#End Region
End Sub
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
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
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()
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
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()
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
Bu uygulamam×zda, nihayet internet zerinde de rahatl×kla al×Ģan bir 3d sayfam×z oluyor. Yap×m tarihinin
s×ras×na gre aĢağ×da birka resmi gryorsunuz.
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 gzel al×Ģmam
“Ornekler\Diger\VRMLcalismalarim.zip” iindeki evim.wrl. Kap×lar otomatik a×labiliyor, nesneler srklenebiliyor ve
Ģminede ateĢ yanma efekti bile var. Biz de okul3d‟de arabalar× hareket ettirebiliriz, kap×lar× srgl yapabiliriz,
a×labilen raflar, kitapl×k gibi Ģeyler ekleyebiliriz. outline3d.com sitesinde gzel 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× iin rneğin Internet Explorer iin Cortona, CosmoPlayer veya Blaxxun
Contact gibi eklentiler gerekli. Birini rahatl×kla internet zerinden indirebilirsiniz. rneğin Cortona‟y× yklediğimizde
art×k IE *.wrl dosyalar× tan×yor ve aabiliyor. Resimlerde de grldğ 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. Seeneklerde dikkatimi eken bir ayar da
315
DirectX, OpenGL ve kendi 3d motoru aras×nda rahatl×kla geiĢ yap×labilmesi. FPS – frame per second h×z×n×z× art×rmak
iin ayarlar ile oynayabilirsiniz. Ya da makineni iyi ise rneğin real-time – antialiasing (gerek zamanl× kenar
dzeltme) yapabilirsiniz.
Sahnedeki baz× resimleri, dijital fotoğraf makinemle ektim. Mesela duvardaki telefon gibi, yerdeki taĢlar gibi.
Ama abart×p daha gerek gibi gzksn diye heryeri btn olarak ekip, duvarlar× yle kaplamak zor bir iĢ. Oyunlarda
genelde kk paralar halinde gerek pencere, duvar, nesne(hal×, tablo,…) resimleri ekilerek dĢeniyor.
Animasyon iin en kullan×Ģl× program ISA – Internet Scene Assembler. Zaman izgisi zerinde, Flash program×
gibi tasar×mlar yap×l×yor. Hibir programlama veya kod yaz×m× olmadan animasyon haz×rlanabiliyor. Karakter
animasyonu iin kullan×labilecek program da ICA – Internet Character Animator.
Metin editr olarak VRMLPad kullan×larak *.wrl dosyalar dz yaz× dosyas× olarak a×l×p değiĢtirilebilir.
Normalde ok uzun dosyalar *.zip gibi s×k×Ģt×r×larak IE iinde gsterilebiliyor. S×k×Ģt×rmaya rağmen VRMLPad gzelce o
dosyay× a×p dzenleyebiliyor.
Akl×ma BlueDream‟daki veya Yunus‟da 3d ×k×Ģ – export olarak VRML de eklemek geliyor, ama ok uzun iĢ
olduğu iin Ģ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.
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 tm popler tasar×m aralar× VRML desteklidir. Resim 23b‟de grldğ gibi tek
pencerede hemen canl× olarak hem tasar×m× hem de al×Ģma halini grebiliyoruz. 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 yzde
yz 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 grmek ilgin. Baz× havaalanlar×, mzeler, Ģ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 srede, 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 sresini uzatabilmeleridir. Duyuru yneticinin izin vermesi ile aktif hale
geliyor. Kabul tarihinden itibaren, eğer 7 gnlk sre gemiĢse, duyuru resmi de varsa kendini siliyor. nceki
projelerdeki gibi, burada da resim yollama ve eposta atma seenekleri de var.
Kulland×ğ×m program bu defa Crimson Editor değil, Dreamweaver MX 2004 oldu. Kod tamamlama,
renklendirme ve benzeri gzel zelliklerinden dolay× bu sefer DW‟× setim. ok az resim var ama, yine de Fireworks ile
bir iki dzeltme de yapt×ğ×m× sylemem gerek. DHTML kullanarak resimli duyurular× amadan, fare ile zerine gelince
resimlerini grebiliyoruz. Layer (katman) nesnesinin grnr veya gizli olma halini yine JavaScript olmasa yapamay×z.
Veritaban×n× tablo olarak gsterirken yine ok gerekli olan s×ralama, grup ya da blok halinde kay×tlar× listeleme
(SQL‟deki limit komutu tam bu iĢ iindir) 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 gnderimi iin "apache/htdocs/pazar/yollanan" klasrne yazma hakk× verin. Windows iin
buna gerek yoktur.
4- "conf.php" dosyas×nda gerekli ayarlar× yap×n×z.
5- "http://localhost/pazar" al×Ģmal×d×r. Yneticinin varsay×lan ad×:admin, Ģifresi:123‟dr.
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 Blm 7 – 12. konudaki myasp‟dir.
2001 tarihli al×Ģmamda brinkster.com‟da al×Ģacak Ģekilde 3 modl; 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 srede gl veritaban× alt yap×s×
ile fonksiyonel siteler haz×rlanabilir. Gvenlik 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 iin yelik sistemi
geliĢtirilmesi laz×md×r. Hatta kredi kart× ile sat×n alma, hemen sipariĢ etme, paypal.com gvenli ağ arac×l×ğ× ile al×ĢveriĢ
de olabilir.
317
318
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 grntye
sahipti. Bu proje zerinde 1 haftac×k uğraĢt×m. Script k×sm× biraz zorlasa da animasyon iin en iyi ara Flash galiba.
VRML olarak da ISA program×nda 3 boyutlu kavĢak rneği bulabilirsiniz.
Sar× ×Ģ×k seeneği ile arabalar×n serbest Ģekilde, nce gelen geerek trafik ak×yor. Normal ×Ģ×klara gelince
aralar×n zamanla y×ğ×ld×ğ× grlebilir. Birbirlerine arpmamalar× iin etraflar×nda gvenlik Ģeridi var. Fakat bazen tam
st ste geldiklerinde iki ara da olduklar× yerde kal×yor. Bunun d×Ģ×nda byk bir hata yok bence. Trafik ×Ģ×klar×n×n
sresi ok k×sa gibi. Asl×nda dinamik olarak, trafiğin yoğunluğuna gre, sre de değiĢtirilebilirdi. Temel olarak trafik
×Ģ×klar× yayalar iin yap×lm×Ģ. ġimdilik onlar yok, diğer trde aralar da yok. Yani kamyon, otobs veya bisiklet de ara
olarak eklenebilmelidir.
Ara say×s× artt×ka 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 birok i ie for, while
dngs rahatl×kla, h×z× etkilemeden kullan×labilirken, Flash iinde hemen h×z dĢyor. Belki kt programla
yntemimden kaynaklan×yor veya her kk filme (movieClip) kod eklenmesi sonsuz dnglere 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 gre ayarlad×m. Ama bu iki proje web sayfas× iinde de olabilirdi.
Buna benzer tren duraklar× simlasyonu da yapabiliriz. Daha kar×Ģ×k metro yollar×, i ie, alt geitli, st geitli
zmlere de grsel olarak yard×mc× olabiliriz.
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
}
aci = Math.atan((_root.sonNoktaY-_root.ilkNoktaY)/
(_root.sonNoktaX-_root.ilkNoktaX))
*180/Math.PI;
4x4 hcrede bir robotun kendiliğinden yol bulmas×. ok az kod yazarak bu hale geldi. Asl×nda gerek bir yapay
zeka program× değil. Esnek duvarlar×n engellemesi ile araba kendi yolunu buluyor. Genelde hep belli bir yerde dnp
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× gremedim 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 hcrelerde geziyordu.
Daha geliĢtirilip, hedef hcreye en k×sa hangi yoldan gidilir, harita kayd×, daha byk alan, birok ara, durak
noktalar× gibi konular eklenebilir. Araca dnme animasyonu da eklemedim. Ġlk bilgisayar oyunlar×nda da olan
labirentte dĢman ya da canavar sizi takip etmesi, tam tersi sizden kamas× algoritmalar ile yap×labilir. Bu tr k×sa
yoldan bir yere gitme problemi genelde oyunlar iin yaz×lsa da, gerek hayatta da telefon kablolar×, cep telefonlar×
ağlar×, ağ mimarilerinde de az maliyetli kurulum iin gereklidir.
Kodlar:
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
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 dndk. Kod k×sm×n×n basit bir dil olduğunu ogrkay
rneğinin ana program× ile grelim:
dbase 3 ile Turbo Pascal gibi nce program× haz×rlay×p, daha sonra al×Ģt×r komutunu veriyorduk. FoxPro ile de
iĢlemleri menlerden yap×yoruz. rneğin al×Ģt×rmak iin nce *.prg dosya mensnden seiliyor, “Program*Do
Ctrl+D” ile de program al×Ģt×r×l×yor. “View*Browse…” ile de istediğiniz *.dbf veri dosyas×n× grntleme ve dzenleme
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 tm programlama dilleri MS Access‟i destekliyor. Ġster internette veritaban× kullan×n ister yerel veritaban×
olarak kullan×n.
326
327
Eski ASP, *.mdb ve VB6 ile ok basit arabirimli bir proje. Tm bilgisayarlarda (9x veya NT) paralel port
kullanarak evdeki ayg×tlar× kontrol ediyoruz. internals.com sitesinden VB ve C iin port kullan×m× iin winio.zip dosyas×n×
indiriniz.
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
rnleri kullan×ld×. IIS web yneticisi 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 gnde yapt×ğ×m iin; gvenlik (Ģifreli giriĢteki, veritaban× gvenliği), web kameras× desteği, cep
telefonu desteği, Flash ile grsel arabirim gibi birok 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 seim adresi, 1 bit de veri olarak
dĢnlnce 24 = 16 ayg×t desteklenebilir.
Alarm, gvenlik sensrleri, belli zamanda belli iĢlerin yerine getirilmesi, analog veri okuma ve yollama da
yap×labilir. Proje harici devre (rneğin bir mikro kontrolr – PIC, PLC gibi) ile PC gc birleĢtirilerek ok daha iyi
yerlere gelebilir. Sadece paralel port değil, USB ve kablosuz bağlant×lar (Bluetooth, k×z×ltesi - infrared, ses tesi -
ultrasound) da geliĢtirilebilir. H×rs×z alarm× olarak dersek, meydana gelen istenmeyen olaylar SMS ile mĢteriye
aktar×labilir.
329
Bilgisayar×n×z×n ADSL modem ayarlar×ndaki, 80 portunu d×Ģ dnyaya aarak, kendi ana bilgisayar hizmetinizi
verebilirsiniz. Yerel ağ iin 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 konfigrasyonlu 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×Ģ dnya 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 gn 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. Tm proje kodlar× ile s×k×Ģt×r×l×nca 40 KB yap×yor. H×zl× ama kirli de diyebilirsiniz.
Kodlar; VB kodlar×:
End Sub
Private Sub BtnSet_Click()
Dim Result As Boolean
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
End Sub
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>")
<body bgcolor=darkred>
<title>EV KON web arabirimi</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-9">
</head>
Nihayet doğrudan donan×m (RISC iĢlemci Microchip PIC) zerine projemiz de var. ġimdilik genel olarak ne
olduğunu gsterelim. microchip.com ana sitesinden gerekli dokman ve program olan MPLAB indiriniz. Sadece
assembly ile de PIC programlanabilir, veya PICBasic, PIC-C, JAL gibi yksek seviyeli diller ile de program yazabiliriz.
Denemek iin de Labcenter ISIS Proteus ile “deneme kart×” yap×p, simle edebiliriz. Hatlar× giderdikten sonra, son
ad×m olarak da oluĢan *.hex dosyay× gerek PIC‟e aktarmak (programlamak) kal×yor.
Ġnternet zerinde k×sa bir araĢt×rmadan sonra, PIC ile ilgili birok dokman ve program bulabiliriz. Mikro
kontrolr olarak PIC‟in seilmesinin 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 sre sadece assembler kodlar× ile programlama yapm×Ģlar, son y×llarda da aynen PC‟deki
geliĢme yolu gibi, yksek seviyeli konuĢma diline benzer diller ile de PIC kodlama mmkn olmuĢtur. PICBIT ile
PLC‟deki grsel tasar×m gibi PIC‟de de program yazabiliriz. Ayr×ca yap×lan program×n al×Ģ×p al×Ģmad×ğ×n× bilgisayarda
da test edebilme imkn×m×z vard×r. uSim ve uEditor ile 877 haricindeki PIC‟leri programlay×p deneyebiliriz.
PIC‟e aktar×m olarak PICup gibi birok 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 birok program, dzenleyici, derleyici, evirici, rnek, dokman, 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, gnlk hayat× kolaylaĢt×r×c× robotlar,
gvenlik sistemleri, mzikli alarm, saat gibi birok proje geliĢtirilebilir. PC‟den bağ×ms×z al×Ģan, sadece ama
dğmesine bas×larak al×Ģan basit arabirimden tutun, geliĢmiĢ LCD, radyo frekansl× arabirimli, sensrlerle donat×lm×Ģ
karmaĢ×k devreler de yap×labilir.
335
“Ornekler\Diger\merdiven_oto.zip” iinde Proteus ve PicBasicPro ile yaz×lm×Ģ kk bir projemiz var. En altta
bununla ilgili k×sma ve resimlere ulaĢabilirsiniz.
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
Birok programlama dili alternatifimiz ve programlama editrmz var. En basit dil Basic ve en basit editr 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 yklemeden nce bilgisayarda deneyebiliyoruz. Hem dijital, hem de elektronik deneylerin tmn bu
program ile deneyebiliriz. Electronics Workbench ise eski bir program art×k. S×rf PIC iin yap×lm×Ģ simlatrler olsa da,
Proteus‟un yan×na yaklaĢam×yorlar. Osiloskop, l aleti, sinyal jeneratr gibi ok hoĢ eklentileri var.
337
BaĢka bir programlama yntemi de sadece Proteus‟un derlemesine b×rakarak *.asm kodlamad×r. Zaten
Proteus iinde MPASM derleyicisi vard×r. Ama 35 adet PIC komutunu iyice ğrendikten sonra istediğiniz program×
yapabilir hale geliyorsunuz. Asm her ne kadar karmaĢ×k gzkse de, kk *.hex dosyas× oluĢtuğu iin ve
programc×ya tam kontrol imkn× vermesi sebebi ile tercih edilir. Zaman k×s×tlaman×z yok ise *.asm ile uğraĢ×n×z. Ama
k×sa srede proje geliĢtirmeniz gerekirse, PBP (PicBasicPro) en iyisi. Mesela merdiven otomatiğini hi *.asm‟den
anlamadan 1 saat gibi k×sa srede yapt×m, ve Proteus‟da al×Ģt×rd×m. 16f877 kulland×m. PortA, B, C, D ve E gibi birok
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):
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
Endif
If PORTB.4 = 0 Then ' If 1st button pressed...
PORTD.7 = 1 ' 1st LED on
Endif
Goto Loop ' Do it forever
Merdiven otomatiğini programlama ve test etmesi sadece 1 saatimi ald×. Eğer alt seviye olan *.asm ile
yapsayd×m herhalde 1 hafta srerdi. Tabi *.asm kodlar×n× iyice ğrendikten sonra bu sre daha da k×salabilir. PicBasic
kodlar× ise aĢağ×dad×r. YaklaĢ×k 60 sat×r. Program×n eksiği 7 paral× led gstergelerde onalt×l×k say× sisteminde srelerin
gsterilmesi. Yani gnlk hayatta bu proje kullan×lacaksa, gstergede onluk say× olarak sre gsterilmelidir. Sre
değeri 0A demek asl×nda 10 saniye demek.
Port B‟nin tm 8 biti de kat lambalar×na bağl×. 8 kata kadar problem yok, ama asl×nda sadece 1 ×k×Ģ da bizim
iĢimizi grrd. Kat anahtar×n×n sadece 1 adet olmas× gibi. Kat anahtar× ve lambalar× istediğimiz kadar, d×Ģ devrede
oğaltabiliriz.
Kk bir proje olsa bile neredeyse tm 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 tm display‟ler tek bir
yerden s×ra ile srlebilir. Bu tr numaralarda hem yaz×l×m olarak hem de donan×m olarak zmler retebiliriz. Eğer
are kalmam×Ģsa, birden fazla PIC kullan×labilir. Tam tersine 1 PIC ok geliyor ise, o zaman da iine birden fazla
program ykleyerek, tek merkezden h×zl× bir Ģekilde program gncelleme, baĢka yard×mc× iĢler stnlğ
kazanabiliriz. Mesela bir saat program×nda, alarm, sreler gibi birok program bir yerden al×Ģabilir. Alarmda alacak
mzik de baĢka bir yerde saklanabilir. Teknik konulara fazla girmiyorum biliyorsunuz.
portc = sure
portd = asilsure
goto basla
end
341
Ek 1 – Algoritma Oluşturmak
Bir problemin zmnde yard×mc×, ana hatlar× belirten dokman veya a×klay×c× nota algoritma denir.
Programlama dillerindeki gsterimi ak×Ģ diyagram× veya izelgesidir. Her dile uygulanabilen genel uluslararas×
sembollerle izimi yap×l×r. Bir dilden diğerine algoritma yaparak geebilirsiniz.
bağlant×
veri giriĢ
iĢlem
veri ×k×Ģ
Ġkinci derece denklem ( ax2+bx+c=0 ) kklerini (x1, x2 veya x) bulmak iin Ģu algoritma kullan×labilir:
baĢla
a,b,c gir
d=b2-4a.c
E
sanal kk
d<0
E
d>0 x1=(-b - √ d)/2.a
x2=(-b+√ d)/2.a
H
x1, x2 yaz
x=(-b/2.a)
tek kk
x yaz
bitir
342
Ek 2 – SQL
Delphi veritaban× nesnelerinden Query – sorgu iinde kulland×ğ×m×z SQL zelliği hakk×nda basit birka ipucu
veriyorum. Ayn× Ģekilde Microsoft Access ve dbase iinde de SQL - ( Structured Query Language – Yap×sal Sorgulama
Dili) kullan×l×yor. Oracle, InterBase, MSSQL Server ve MySQL de bu dil iin yaz×lm×Ģ ağ yaz×l×mlar×d×r.
SQL ile bir tablo filtrelenebilir, arama yap×labilir, belli kay×tlar silinebilir veya gncellenebilir, 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 seip aĢağ×daki rneklerden istediğinizi
select * from tablo yazan a×l×r kutu iine yazman×z yeterlidir.
rnekler:
select * from country where continent = ―South America‖ and population > 2000000
SipariĢi alan al×Ģan ve ĢipariĢi veren mĢteri tablo birleĢtirilerek, ekrana beĢ alan× listeliyor
Johnson soyadl× eleman×n toplam, say× ve ortalama ald×ğ× sipariĢ miktarlar× listelenir
select firstname,lastname from employee where firstname like ―%nn%‖ and lastname like ‗%en%‘
Ad×nda “nn” ve soyad×nda “en” geen personeli listeler, tabii ki her kelimenin baĢ ve sonunda % kullanmak
zorunda değilsiniz, “An%” gibi de olabilir (case sensitive – byk kk harf duyarl×)
343
Askii diye okunur. 256 yaz× ve kontrol karakterinden oluĢan bu tablonun ilk 128‟si sabit, kalan 127 karakter
yaz×c×, bilgisayar ve dile gre 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
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
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 nmerik klavyedeki ve Backspace tuĢu alt×ndaki Enter
ayr× tuĢ kodu ile al×Ģ×r. Bunun sebebi nmerik 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 iin 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.
Bu arada s×k kulland×ğ×m×z baz× zel karakterlerin Ġngilizce yaz×m, okunuĢ ve Trke anlamlar× da Ģunlard×r:
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
gerekleĢtirilmiĢtir. Ġstediğiniz program×n kurulumunu bu ad×mlarla haz×rlayabilirsiniz.
Yeni srm 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 aabilirsiniz. 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.
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× grp istediğimiz
ad×ma rasgele atlayabiliriz. Listede iinde sağa doğru ynlendirilmiĢ ok bulunan dğmelere t×klanarak alt menlere
ulaĢ×l×r. rnek olarak Okul Ders Program× projesinin kurulum aĢamalar× anlat×lacakt×r. Her ad×m×n iĢlendiğini
seeneklerin yan×nda beliren k×rm×z× bir check iĢareti ile anlayabiliriz.
346
Ġ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 – Gzat dğmesine bas×larak belirtilir.
Ġ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
Veritabanlar×n×n kurulacak dizine gre 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”
seeneğinidir. Bu pencerenin kullan×m× ok kolayd×r. “Launch Explorer…” dğmesi t×klanarak dosya veya dosyalar
srkle b×rak yntemi 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 rgn eğitimin program×
ve BDE ( Borland Database Engine ), “Compact” kurulumda sadece rgn eğitim program×n×n kopyalanmas× sağlan×r.
Kurulumu haz×rlanan dosyalar asl×nda birok uygulama ve yard×mc× programdan oluĢabilir. Bizim projemizde
veritabanlar×, BDE, 3 adet uygulama program× ve bir yard×m dosyas× bulunuyordu. Bu dosyalar daha dzenli 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 iin “<Program Files>\Okul Ders Programi” dizinidir. <WINDIR> ve
<COMMONFILESDIR> da kullan×labilen diğer değiĢken dizin seenekleridir.
Son ad×mlara yaklaĢ×rken kurulumda bize yol gsteren diğer menlerin seimi ve ayarlar×n×n yap×ld×ğ× “Dialog
Boxes” mensne gelinir. HoĢ geldiniz ekran×, hoĢ geldiniz mesaj×, okubeni bilgisi, kullan×c× bilgisi, kurulum tipi,
program dizini seme, iĢlem durumu gstergesi, kurulum bitti mesaj× ayarlar× yap×l×r.
Dokuman (284MB) - Ekstralar, tutorial (ğretici), Delphi ve VB iin 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 ieriğini belirten *.html dosyalara eriĢebilirsiniz. Tm dosyalar×n hepsine buradan link veremedim,
Windows Gezgini‟nden incelemenizi tavsiye ederim.
Diğer
Programlama
Gn 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 gzel menler yapmak isterseniz.
Asm : Turbo Assemler ile *.asm uzant×l× dosyalar×n×z× *.exe veya *.com yapabilirsiniz.
c-- : c++'a benzer bir dil. rnekleri gzel.
Delphi5Trial : Delphi5'in 60 gnlk deneme srm. Ġnternet‟ten kay×tl× kullan×c× olarak ancak kurabilirsiniz. Hem de
yay×m sresi geebilir. (expire yani) Kurulum zahmetli.
Dev-C++ : Bedava c++ editr ve derleyicisi.
Dev-Pascal1.2 : Bedava Pascal editr ve derleyicisi.
Genesis3D2 : 3D etkileĢimli dnya oluĢturma.
Help : MSHelpWorkshop, OasisSE, chm_help.exe ve helppad.zip kendi *.hlp / *.chm dosyalar×n×z× yapman×z
iin.
HelpPC : HELPPC.COM ve TH.EXE ile assembler, interrupt - kesmeler, PC donan×m bilgilerini edinebilirsiniz.
al×Ģt×rmak iin klasrlerine 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 srm ile ActiveX veya standart EXE projeleri oluĢturabilirsiniz. Asl×nda Application
Setup Wizard k×sayolu ile ActiveX Control iiren projelerinizi internete yay×nlaman×z× sağl×yor. Yani EXE oluĢturmuyor.
Utility
Bu klasrdeki tm 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 editr
Divx4 : Art×k standart bir grnt s×k×Ģt×rmas× (MPEG4)
FerretSoft : WebFerret3.5001 ile internette arama yap×l×r - freeware
Gimp1.1 : Linux iin retilmiĢ, MSPaint'in geliĢmiĢ hali
ISXpress1.1 : Delphi programlar×n×z× Setup haline getirir
Kashmir : 3D editr
Macromedia : Flash5 ve Dreamweaver4'in 30 gn k×s×tlamal× rnleri
MORE : Tweak program× - freeware
MPower : Sabit disk bilgilerini gsterir - 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×Ģ gzel bir uygulama - freeware
truespace : Truespace3 eski ama ok hoĢ bir 3D editr - freeware
winrar203 : RAR
Winzip8 : Zip
WWEB1.51 : Ġngilizce-Ġngilizce szlk - freeware
rnekler Dizinindekiler
Assembler
Assembler (mikroiĢlemci iin yaz×lan en dĢk seviyeli dil) ile haz×rlanm×Ģ rnek programlar×n kodlar×:
Diger - Burada birok k×sa ama iĢe yarar kod var.
Dir - Norton Commander'a benzer dosya ynetim program×
Drivers - Src listesi
editor - *.txt yaz×m editr
351
Basic
C Dili
Delphi
Diğer Diller
Pascal
Visual Basic
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
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 ^ operatr 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 asansr 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 gnleri 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 nmerik 102 boot 10
algoritma 182, 339 Borland Graphic Interface 56
al×ĢveriĢ 314 Borland Pascal 55
alias 84 bcekler 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
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 srkleme 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
grev ubuğu 76
Grev ubuğu 67
F grev ubuğunda simge 80
Grsel Nesne Ktphanesi 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 gvence 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 gn 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 – editr 14 JAL(Just another language) 334
hexadecimal 10 Java 62, 364
hipotens 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 editr 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×ltesi 108
ISIS Proteus 282 kilo 17
kilobyte 242
klavye 42
Konqueror 289
İ konsol uygulamalar× 206
kullan×c× modu 246
iconlib.dll 89 kme 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
masastnn 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
modl 232 oturum 289
modler 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
SaveToFile 152
sayfalama 301
Ş
scale 283
scandisk 246 Ģifre zc 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 gnleri 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 mens 126 Timer 111
sizeof() 31 Timer1 80
SMTP 246 toggle 63
SoleBee 270, 274 Tolerans 296
szlk 200, 348, 349 Toolbar 168
speaker 108 ToolBook Instructor 229
speech 73 ToolBox 69
SpeedBar 62 ToolPak zmleyicisi 294
SpeedButton 137 trafik 317
SPP – Standart Parallel Port 106 transistr 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 gvencesi 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 Trke 64, 116
Sun Sparc 246 twip 65
Suspend 120 TXD 107
srkle 189 Type Library 229
srkle b×rak 48 type oluĢturma 31
srkle ve b×rak 117 typecast 65
srklemek 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
vektrel 43 x – y dzlemi 114
veritaban× 257 X Window 246
View Code 236 XingMPEG Player 240
virtual machine 246 xorput 56
virs 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ğ iinde. Genel olarak CD‟yi incelerseniz ilgi alanlar×m×n grafik (VRML,
OpenGL...), iĢletim sistemleri, yard×mc× programlar olduğunu grrsnz. Mzik 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 kt amala da kullan×labilir.
Virs, crack veya Ģifre zc gibi Ģeylerle uğraĢmad×m, tavsiye de etmem. zellikle grafik, dosyalama, sistem
bilgilerini elde etme, programlama algoritmalar× ve problem zmleri 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× iin, C dilinde Pascal, Delphi dilinde de VB ile ilgili bilgiler verdim. Eğer Basic biliyorsan×z ASP, VBScript, VBA
gibi diller sizin iin 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 sre Delphi 3 kulland×m, Delphi
7 ve VB 6 oğu zaman her iĢinizi grr. 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 byk 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 geince 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, kle bilgisayard×r art×k. Bundan sonras×nda yapabileceğiniz
Ģeyler benim gremediğ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 grĢmek zere.
Programc×l×k kolay meslek değil, ama hevesli iseniz peĢinizi b×rakmaz! Zaten o her yerde sizi gzetliyor!
367
Kaynaklar
A‟dan Z‟ye C K×lavuzu – Kaan Aslan
Algoritma GeliĢtirme ve Programlamaya GiriĢ – Fahri Vatansever
ASP.NET & XML – Yksel Ġ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 mleki
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 – Grkem etin
Macromedia Flash 4.0 – Y.Do.Dr. Adem Karahoca
Microsoft Standart C – Bahattin Bayburan
MikroiĢlemciler ve Bilgisayarlar – Dr. Haluk GmĢkaya
MS-DOS ile al×Ģmak 6.22 – Van Wolverton
Office 97 – Faruk ubuku
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