You are on page 1of 186

C#a Balang Kitab

Memik Yank
memiky@superonline.com memikyanik@hotmail.com www.memikyanik.com

Mart 2009

Memik Yank - C#a Balang Kitab

nsz
Son yazdm C# kitabmda balang dzeyi konularn arln azaltmay tercih ettiim iin C# konusunda henz yolun banda olanlar zorluk ekmesin diye birka makale hazrlayp kiisel sitemde yaynladm. Sonra bu makaleleri elden geirip e-book haline getirdim. E-booklarda sayfa snrlamas olmad iin metni az sayfaya sdrma gibi bir kaygm olmad. Baka bir deyile bu e-booku, yakn zamanda kan C# 3.0 kitabma yardmc veya hazrlayc bir kitap olarak deerlendirmek mmkndr. Bu e-booku inceleyenlerin fark edeceklerini sandm bir dier konu ise C# gibi bir programlama dilinin nasl kolay anlatldn grmeleri olacaktr. Baka bir deyile bu metin iin rahatlkla dnyann e kolay okunan C# kitab denilebilir. Yllardr Memik Yank hep balang dzeyi kitaplar yazmakla sulayanlar bakalm bu e-booku grdklerinde neler syleyecekler? Yllardr kendisini bilen bilmeyen birok kii Memik Yank eviri yapmakla suluyor. Memik Yankn ngilizcesinin eviri yapmaya yetmedii gereini bir tarafa brakalm ve u soruyu soraym: Madem Memik Yank Trkeye bu kadar hakim ve yazdklar kolay okunuyor hangi akla hizmet yabanc bir yazarn kitabnda eviri yapar? Hem Memik Yank ngilizceyi anadili gibi bilse bile hangi mantkla kendine zel cmle kurmak yerine gidip baka bir yazarn cmlelerini alr? Bu e-bookta kenar boluklar normal basl kitaplara gre daha azdr, fontu ise daha byktr. Dolaysyla bu metni normal kitap olarak deerlendirmek istemi olsaydm sayfa says aa yukar ayn olurdu. E-bookun sonunda C# 3.0 kitabm hakknda yazdm bir yaz ve C# 3.0 kitabmdan alnma bir blm bulunmaktadr.

BLM 1 C# LE PROGRAMCILIK
Bundan yaklak 1.5 yl nce(Aralk 2007) kiisel web sitemde yaynlamak zere C#, Visual Basic ve Delphi hakknda balang dzeyi bilgi ieren ve ders eklinde dzenlediim makaleler hazrladm. Bu makaleleri ilk yazmaya baladmda her programlama dili iin 5 yaz dnmtm. C# ve Visual Basic iin hazrladm derslerin says 4te kalrken Delphi iin yazdm yazlarn says te kalmt. Dersleri tam gaz kaleme alrken deiken ad benzerlii davas yazma hevesimi krmt. nk programclk renmek isteyenlere tecrbelerimi aktarrken deiken ad alma sulamas ile kendimi sank pozisyonunda hakim karsnda bulmutum. 2008 ylnn son aylarnda bir yl nce yarm braktm dersleri tamamlamak zere yeninden almaya baladm. Dersleri ilk kaleme aldm zaman C#, Visual Basic ve Delphi dersleri birbirine paralel gidiyordu. Yani nce bir C# dersi, birka gn sonra benzer konular Visual Basic iin kaleme alyordum. Ancak bu kez yle yapmadm. ncelikle C# derslerini bitirmeye altm. C# derslerini tamamladktan sonra bu kez Visual Basic derslerini yeniden hazrlayp yaynlamaya karar vermitim. C# ilgili dersleri kaleme alrken bir yl nce kaleme aldm dersleri gzden geirip eklemeler yapacam. Dorusu geen yl(2007 sonu) bu programclk derslerini okuyup sonra da az ok programclkla uraanlara bu derslerin yeni halinin fazla bir katks olmayacaktr. nk bu derslerin hedef okur grubu C#, Visual Basic veya Delphi ile programclna yeni balayanlar olacaktr. Baka bir deyile bu dersleri, geen yl yaynlanan derslerin geniletilmi basks olarak deerlendirebilirsiniz. Aradan biraz zaman geip C# derslerini tamamlaynca tekrar gzden geirip e-book olarak C# renmek isteyenlere sunmaya karar verdim. Bylece dersleri okumak kolaylam olacaktr. Bir makale veya kitap kaleme alnrken bir okur grubu hedeflenir ve ona gre bir anlatm dzeyi seilip konular ulalmak istenen hedef okur grubunun "tahmini" beklentilerine gre sralanr. Bu e-bookun hedef okur grubu daha nce C# programlama dilliyle uramam olanlardr. Ya da C#la ilgili derslerde hocalarn izlemekte zorluk eken rencilerdir, aldklar kitab okuyup anlamakta zorlananlardr, her hangi bir sitede rastladklar makalede kullanlan kavramlara uzak olanlardr. retim yeleri veya programclk dersini veren hocalar rencilere ders anlatrken ne fazla bilgili rencileri ne de o programlama diliyle daha nce hi yaknl olmayanlar referans alrlar. Dersleri veren hoca snfn ortalamasna gre bir anlatm dzeyi tutturmaya alr. Tekrar etmek gerekirse bu e-book oluturan dersleri C# veya sz edilen dier programlama dilleri hakknda henz bilgisi olmayanlar iin kaleme aldm.

Memik Yank - C#a Balang Kitab

Bu dersleri kaleme alrken gerekte klasik anlamda bir amacm yoktu: Programclk zerine yazmay seviyorum. Programclk zerine yazdklarm nceleri(yani bundan 17 yl kadar nce) bilgisayar dergilerinde yaynlayarak, kitap eklinde dzenleyerek sizlere ulatrdm. Eskisi kadar olmasa bile kitap yazmay srdryorum. Her ne kadar birok insan srf Memik Yank programclk konulu kitaplar yazmasn diye seferber olmu olsa bile yine de yazmay srdryorum. Yllardr bilgisayar ve programclk zerine yazarken temel ilkem veya n artm yazdklarmn ilk okumada anlalmasn salamakt. Bundan vazgemi deilim. Daha nce herhangi bir ekilde herhangi bir dilde 2 satr kod yazdysanz ve programcla meraknz varsa burada yazlanlar ilk okumada mutlaka anlarsnz. Bu nedenlerdir ki bu derslerin ayrt edici zellii kolay okunmasdr. Yoksa bu derslerde verilen bilgileri baka sitelerde ve programclk kitaplarnda bulabilirsiniz. Bu derslerin asl ilevi programclk renmeye karar vermi olanlarn veya programclk derslerini zevkle izlemek isteyenlerin nn amaktr, renme srelerini ksaltmaktr. evrenizde C#, VB, Delphi veya C++ programlama dilini bilenlere gpta m ediyorsunuz veya C#, Delphi'yi nasl renirim diye kara kara dnyor, okulunuzda grdnz C#, C++, Visual Basic derslerinden nasl geerim diye kayglanyorsanz ilk olarak bu olumsuz dnceleri bir tarafa brakn derim. Yllarca kitaplarmn arkasnda byk puntolarla Memik YANIK tarafndan yazlan kitaplarda ilk okumada anlalmayan hibir konu yoktur yazdrdm. Bu cmle birok insann bana saldrp hakaretler edip kfrler savurmasna neden olsa bile bu iddiadan vazgemi deilim. Hatta birileri hzn alamayp Memik Yank kitaplarnda verdii 35 satrlk ksack kodlarda kulland deikenlere ad seerken benim kitaptan yararlanp deikenlerimin adn almtr diye sulad. Birok forumda her gn ismi cismi belli olmayan ok sayda kiinin Memik Yanka hakaretler dzmesinin tek nedeni yazdklarmn ilk okumada mutlaka anlalyor olmas deildir elbette. Tepki ekmemin 2. bir nedeni deiik konularda kitaplar yazmamdr. Bir ok kii Bir kii nasl olurda hem Visual Basic, hem Delphi hem de Clipper hakknda kitaplar yazabilir? Olsa olsa bakasna yazdryordur veya eviri yapyordur eklinde grler ileri srdler. Sanki bir gn Clipper kitabn, birka gn sonra ise Visual Basic kitabn yazp yaynlamm gibi sulanyorum. Hal bu ki btn bu kitaplar tam 17 ylda yazdm. Baz kitaplarmn arkasna "bu kitap telif bir kitaptr yabanc yazarlarn kitaplarndan araklanmad" diye yazm olmama ramen inandrc olamadm. Gerekte programclk kitaplarnda kimse bilim yapmyor, kimse yeni bir ey retmiyor. Yaplan tek ey; btn zellikleri ortada olan programlama dilini

Memik Yank - C#a Balang Kitab

kendi anlayyla kendi cmleleri ile anlatmaktr. rnein yz yllardr ak zerine yazlm on binlerce roman vardr, ak konulu binlerce film vardr. Ayn ekilde C# zerinde yazlm yzlerce kitap vardr. Btn yazarlar ayn konular anlatp, ayn metotlardan, ayn snflardan sz ediyorlar. O zaman C# konulu kitaplarn arasndaki fark nedir diye soranlara verilecek cevap udur: Fark anlatm eklindedir. Elinize aldnz kitapta yazarn anlatm ekli, cmleleri, konular sralay vs size uygunsa o kitap sizin iin iyidir. Bu dersleri izleyen okurlar bir konuda uyarmak istiyorum: Siz siz olun yazdnz kodlarda tanmlayp kullandnz deikenlere ad seerken dikkatli olmalsnz. Olur ya bo bulunup daha nce register(!) edilmi veya kullanm haklar kapatlm i, j, sayi, dosya gibi adlara sahip deikenler tanmlarsanz ve bu tespit edilirse banz belaya girebilir. Bu uyarya ramen u aklamay yapmay gerekli grmekteyim: Bu derslerde kullandm deiken adlarnn mevcut Trke programclk kitaplarndaki deiken adlar ile benzerlik gstermesi tesadf eseridir.

C# Programcs in Gerekli Aralar


Daha nce herhangi bir programlama dili ile az ok kod yazdysanz off imdi bu C# kim renecek, Microsoft firmas bu programlama dilini keke hazrlamasayd, bir sr Class, yeni bir dil diyorsanz bu dncenizden sizi uzaklatrmaya yz binlerce kiiye programclk retmi Memik YANIK olarak talibim. Daha nce Visual Basic 6 ile az ok program yazdysanz C# yerine Visual Basicin .NET uyumlu srmn tercih edebilirsiniz. tesi, C# ile Visual Basicin .NET srmnn yeteneklerini karlatrdmzda aralarnda nemli bir fark yoktur. Kiisel grme gre C# renmek, .NET uyumlu Visual Basici renmekten daha zor deildir. Daha ak bir anlatmla Visual Basicin NET srmn tercih etme nedeniniz C#n daha zor renilen bir dil olacan sanma dncesi olmasn. Daha nce C ile az ok uratysanz C#n sz dizimine abuk alacaksnz. Nesneye ynelik programclk kavramlar hakknda bilgi sahibiyseniz, baka bir deyile C++ zerinde az ok altysanz C# renmek sizin iin daha kolay olacaktr. Benzer ekilde daha nce JAVA hakknda bilgi edinmi olanlarn C# renmeleri kolay olmaktadr. Birileri bu dersleri 2 cmle ile anlatn derlerse syleyeceklerim unlardr: Bu dersler bir programla dili nasl renilir sorusuna cevap verme urasdr diyebilirim. Bu derslerin sonuna gelindiinde C# hakknda temel bilgilere sahip olacak ve bu derslerde sz edilmeyen .NET snflarn kolayca renebileceinizi biliyor olacaksnz, C# programcs olma yolunda en zor engeli am olacaksnz. Baka bir anlatmla bu dersleri sonuna kadar izleyen kiilerde programlama dili renme korkusu olmayacaktr. Tabii bu

Memik Yank - C#a Balang Kitab

dersleri okuyan baz arkadalar 200 sayfalk balang dzeyi C# kitaplarna dnp bakma ihtiyalar kalmayacaktr. Her ne kadar bu balkta C# ile program yazmak iin gereken aralar bir bir sayp anlatacak olsam bile mutlaka gerekli olan renme isteidir. C# renmek sizin iin nem arz ediyorsa ister bu dersleri izlemi olun ister izlememi, bir ekilde C# renirsiniz. Zaten ksa srede C# renmeleri zorunluluk olanlar gidip kitap alacaklar veya programclk eitimi veren bir kuruma bavuracaklardr. Orada burada Memik YANIK ve kitaplar aleyhine konuan, yazan birilerini grrseniz(ki grmeniz yksek bir ihtimaldir) onlara hemen inanmayn derim. ncelikle bu sayfalarda yazlanlar okuyun derim. Bu arada kiisel sitemde bilgisayar kitaplar hakknda yazdklarma biraz gz atmanz neririm(www.memikyanik.com/kitaplar/kitaplarim.htm). Tabii ki yazdm kitaplarda hi hata yoktur hepsi eksiksizdir diyecek deilim. Benim itirazm kitaplarmn incelenmeden, okunmadan karalanmasdr. Baz arkadalar ise yllar nce yaynlanan, oktandr sattan kalkan kitaplarm bugnn artlarna gre deerlendiriyorlar. rnein 2007 ylnda yaynlanan Delphi 2007 kitabm dururken kalkp 2000 ylnda yaynlanan Delphi kitabm zerine konuuyorlar, 2000 ylnda yaynlanan programclk kitabn 2008 ylnn ihtiyalarna, artlarna gre deerlendiriyorlar. C# programlama dili ile ilgili bu dersleri izleyebilmek iin balangta bilgisayarnzda .NET Frameworkn kurulu olmas yeterlidir. nk .NET Framework ile birlikte C#, Visual Basic for .NET ve C++ derleyicileri zaten geliyor. Maddeler halinde yazmak gerekirse C# programlama dili ile program yazmak iin size

.NET Framework Not Defteri

gereklidir. Buna gre Not Defteri ile C# programnz yazp CS uzants ile kaydedersiniz. Sonra DOS penceresine geip .NET Framework ile gelen C# derleyicisi(CSC.EXE) sayesinde derleme yapp EXE dosyay hazrlarsnz. Hi meraklanmayn bu ilemin ayrntlarn bir sonraki C# konulu derste anlatacam. Hemen eklemek gerekirse; .NET Framework Microsoft cretsiz datmaktadr ve Windows Vista ile birlikte gelmektedir. Bu nedenle iletim sistemi olarak Vista kullanyorsanz microsoft.comdan indirip kurmanz gerekmez. Kullandnz bilgisayarda Windows XP kuruluysa .NET Framework' Microsoftun sitesinden indirip kurabilirsiniz. Birka yl nce .NET Framework 1.1 vard. Sonra 2005 ylnn banda .NET Framework 2.0 hazrlanp

Memik Yank - C#a Balang Kitab

datld. Yakn bir zamanda ise .NET Frameworkn 3.0/3.5 srmleri piyasaya verildi. Microsoft firmas nceleri .NET Framework 2.0a baz yeni snflar ve yardmc aralar ekleyip buna .NET Framework 3.0 dedi. Sonrasnda ise .NET Framework 3.5 hazrland. Bu dersler boyunca anlatlanlar izleyip kk rnekleri deneyebilmeniz iin size .NET Framework 2.0 yeterli olacaktr. Tabii kurmuken en son srm olsun diyenler bilgisayarlarna .NET Frameworkn 3.5 kurabilirler. .NET Framework 1.0 ve 1.1 ile C# derleyicisinin srm nosu 1.0 iken .NET Framework 2.0 ile gelenin srm nosu 2.0'dr. .NET Framework 3.5 ile gelen C# derleyicisinin srm nosu 3.0'dr. orada burada C# 2005 veya C# 2008 adnda kitaplar grrseniz bilin ki bu kitaplarn adlar yanltr.

Visual Studio
Bu derslerin sizin iin verimli olmas iin daha sonra sz edilecek Visual Studio 2005 veya 2008i edinip bilgisayarnza kurmanz veya C# iin hazrlanm cretsiz Express Edition Microsoftun sitesinden indirip kurmanz gerekir. Express srm edinmek kolay olduu iin bu derslerde Express srme arlk vereceim. Tabii bilgisayarlarna Visual Studioyu kurmu olanlar da gzeteceim. Bu dersleri izlerken Visual Studionun 2005 veya 2008 srm kullanlabilir.

Memik Yank - C#a Balang Kitab

Bu paragraf yukarda .NET Frameworkn srmlerimden sz edilen paragraf ile birlikte okuyanlarn bir ksm bu Visual Studioda ne oluyor diye sorabilirler. Hemen aklayaym. Gerekte C# veya .NET Framework uyumlu herhangi bir programlama dili ile program yazmak iin .NET Framework ve Not Defteri gibi bir editr program yeterli olmaktadr. Ne var ki ok sayda dosyadan meydana gelebilen C# uygulamalarn Not Defteri gibi kstl zelliklere sahip bir editrle yazmak sonra da DOS penceresinde derlemek imkansz olmasa bile zahmetlidir. Bu nedenle konu .NET Framework uyumlu programlama dilleri olduunda Microsoft ancak bu dillerde program yazma ve derleme ilemini kolaylatran Visual Studioyu satarak para kazabilmektedir. leri ki konularda derleyici nedir, IDE nedir gibi sorular sizin iin bilinmez olmayacaktr. Son 2 paragraftan kafas karanlar iin ek aklama: Microsoft firma .NET Framework ad verilen bir snf kitapln hazrlad. Bu snf kitaplnda program yazarken gerek duyabileceiniz ok sayda snf bulunmaktadr. rnein yazdnz programda bir dmeye gerek duyduunuzda .NET Framework ile gelen Button snfndan, TextBoxa gerek duyduunuzda TextBox snfndan yararlanabilirsiniz. Bu snf kitaplklar C#, Visual Basic ve C++ gibi .NET uyumlu programlama dilleri ile kullanlabildii iin Microsoft firmas bu 3 programlama dilinin derleyicilerini .NET Framework ile birlikte cretsiz datmaktadr. Baka bir deyile kullandnz bilgisayara .NET Framework kurmanz halinde elinizde hem Visual Basic hem de C# derleyicisi olmu oluyor.

Express Edition
Visual Studio son derece gelimi ve program yazmay kolaylatrd gibi yksek fiyatla satlan bir program gelitirme aracdr, yani bir IDEdir. Microsoft firmas korsan kullanm azaltmak, C# ve .NET uyumlu dier programlama dillerini henz renenleri dnerek Express Edition ad verilen Visual Studioya gre kstl zelliklere sahip IDEler hazrlayp datmaya balad.

Memik Yank - C#a Balang Kitab

Visual Studio ile C#, Visual Basic, C++ ve ASP.NET uygulamalar gelitirmek mmkn iken Express Editionlar "dile" zeldir. Yani .NET uyumlu hangi programlama dili kullanlacaksa o dil iin hazrlanm Express Edition ad verilen IDEyi yani program gelitirme aracn Microsoftun sitesinden indirip kurmak gerekiyor. Hemen eklemek gerekir ki C# iin hazrlanm olan Express Edition bir programlama dili olmayp C# uygulamalarn kolayca hazrlayabilmeniz iin Microsoft tarafndan hazrlanp cretsiz olarak datln bir IDEdir, yani bir yardmc programdr. Karklk olmasn diye bir konuyu tekrarlayalm:C# derleyicisi .NET Framework ile birlikte datlmaktadr. .NET Framework 1.0 ve 1.1 ile birlikte C# derleyicisinin 1.0 srm verilirken .NET Framework 2.0 ile birlikte C# derleyicisinin 2.0 srm gelmektedir. Geen yl kullanma sunulan .NET Framework 3.5 ile birlikte ise C# derleyicisinin 3.0 srm gelmektedir. C# derleyicisinde 1.0dan 2.0 srmne gelindiinde nemli gelimeler olmutu. C# derleyicisinin 3.0 srmnde ok sayda yenilik olmasna ramen hepsi dile yaplan birer ektir. Baka bir deyile C# 2.0 iin yazlan kodlar C# 3.0 ile sorunsuzca derlenebilmektedir. Ksaca anlatmak gerekirse Visual C# iin hazrlanm Express Edition, Visual Studioyu edinemeyip ancak programlarn Not Defteri ile hazrlamak

10

Memik Yank - C#a Balang Kitab

istemeyenlere uygundur. Bana sorarsanz C# renirken Express Edition size yeterli olacaktr. Visual Studioyu edinme imkannz varsa Express Editiona kaytsz kalabilirsiniz. Bu derslerde C# 3.0 ile gelen yeniliklerden sz edilmeyecei iin Express Editionn 2005 srm kullanlabilir. Tabi en son srm olsun diyenler 2008 ylnda kullanma sunulan srm indirip bilgisayarlarna kurabilirler. Daha sonra C# iin hazrlanan Express Editionn nasl kurulduu anlatlacaktr.

BLM 2 C# PROGRAMI YAZMAYA BALIYORUZ


Bir nceki blmde C# programlama diline balama konusunda biraz sohbet etmitik. Bu blmde ise kod yazmaya balayacaz. C# konulu hangi kitab alrsanz aln, C# konulu hangi kursa gidiyorsanz gidin, C# programlama diliyle ilgili dersleri hangi fakltede alyorsanz aln C#la almaya bu dersleri okumakla balamanz neriyoruz. Bu sayede C#a ayrmanz gereken zaman byk oranda azalacaktr. Yllardr konu programclk zerine yazmak olduunda asl olann anlatma ekli olduunu savunuyorum. Yoksa sz konusu programlama diliyle ilgili olarak hemen her ey ksa srede sylenmekte, hemen her sorunun zm bir ekilde anlatlmaktadr. Yoksa programclk zerine yazan birisinin okurlar ile paylat bir yenilikten sz etmesi uzak bir ihtimaldir. Bu durumda programclk zerine yazanlar ancak anlatma biimleri ile vnebilirler, ancak kurduklar cmlelerin dzgnl ile fark yaratabilirler. Yoksa bu blmde anlattm her eyi C#la az ok uram herkes biliyordur. Yani bu makalede yeni bir ey sylemem ihtimal ddr. Bu nedenle anl anl bir niversitemizin Prof unvanl retim yesinin birisi bu metnin alnt olduunu orada burada yazarsa glp gein. .NET Framework Kurmak Herhangi bir programlama dili ile allp uygulama gelitirilmek istendiinde ilk yaplmas gereken derleyici edinmektedir. Ancak konu .NET Framework uyumlu programlama dilleri olduunda derleyici aramak zorunda kalmyorsunuz. nk C#, Visual Basic ve C++ derleyicileri .NET Framework ile birlikte cretsiz olarak datlmaktadr. Buna gre C# programlar yazabilmek iin bilgisayarmza .NET Frameworkn kurulu olmas yeterlidir. Kullandnz bilgisayarda Windows Vista kurulu ise ayrca .NET Framework kurmanz gerekmiyor. nk .NET Framework Vista ile birlikte geliyor. Kullandnz bilgisayara Windows XP kurulu ise microsoft.comdan istediiniz .NET Framework indirip kurmanz gerekir. u gnlerde kullanma sunulan .NET Frameworkn en son srmnn numaras 3.5. Daha nce iaret edildii gibi bu derslerde rnek olmas iin verilen kk programlar yazp deneyebilmeniz iin .NET Frameworkn 2.0 srm yeterlidir. Bilgisayarnza .NET Frameworkn ykl olup olmadn veya ykl ise hangi srmn ykl olduunu renmek iin Windowsun Program Ekle veya Kaldr penceresine bakabilirsiniz. Kullandnz bilgisayara .NET Framework kurulu ise hemen C# programlar yazabilirsiniz. Not Defteri ile C# kodu yazp CS uzants ile herhangi bir klasre kaydedip sonra da .NET Framework ile gelen C# derleyicisi(yani

12

Memik Yank - C#a Balang Kitab

csc.exe dosyas) sayesinde derleme yapp EXE dosya hazrlayabilirsiniz. Bu derste ncelikle C# programlarn Not Defteri ile yazp derleyeceiz. Devamnda C# iin hazrlanm Express Editiondan yararlanacaz. imdi microsoft.coma urayp .NET Framework 3.5 indireceim. Bu amala microsoft.comda arama yapp indirebileceim linki buldum. Bulduum linki tklaynca ekrana aada verdiim diyalog kutusu geldi.

Yaklak 3 Mblk bu dosyay indirip bilgisayarma kaydettikten sonra altrdm. .NET Framework 3.5 gerekte 72 MB olduu iin indirdiiniz dosyay altrp kurmaya baladnzda geri kalan Microsoftun sitesinden indiriliyor. Baka bir deyile nete bal deilken bu 3 Mblk dosya ile kurma ilemi yaplamyor. Bu metni kaleme aldm srada .NET Framework 3.5 iin SP1 kmt.microsoft.comda SP1i indirip kurmanz nerilir.

Program Yazmaya Balyoruz.


Konu .NET uyumlu programlama dilleri ve zellikle C# olduunda ilk karlamamz gereken kavram Class kavramdr. C# programlar Class eklinde dzenlendii iin en bandan Class kavramndan sz etmek gerekmektedir. Programlar Classlar halinde dzenlemenin saysz yararlar vardr. Ancak bunlar burada anlatmayacam. Classlar hakknda bilgi sahibi olmadan Visual Basic 6 ve Delphi gibi programlama dilleri ile program gelitirmek mmkn iken C++, C# ve Java gibi diller Classlar hakknda bilgi sahibi olmanz zorunlu klmaktadr. Kayglanmanza gerek yok; bu dersi sonuna kadar okuduunuzda bir de bakarsnz ki Class'lar hakknda temel bilgilere sahip olmusunuz. Yoksa dier kitaplarda yapld gibi sizlere Classlar hakknda teorik bilgi vermeyi dnmyorum. Quick Basic, Pascal ve C gibi klasik programlama dillerinde kod dosyalar iinde fonksiyonlar ve procedureler bulunuyordu. Hatta Cde fonksiyon

Memik Yank - C#a Balang Kitab

13

procedure ayrm da yoktur. Baka bir deyile programclar yapmak istedikleri ilemlere uygun fonksiyonlar yazp gerek duyduka bunlar arrlard. Zamanla programlar byyp karmaklatka paketlenmesi ihtiyac dodu. Fonksiyon ve metotlarn Classlar halinde paketlenmesi ile birlikte Class iinde bulunan fonksiyonlarn kullanlmas, organize edilmesi ihtiyac dodu. Gnmzde yaygn olarak kullanlan programlama dillerinde Classlar metotlardan baka Interfaceleri, Olaylar, zellikleri, Delegateleri ve Yapc metotlar ierebilmektedir. Ltfen olay nedir zellik nedir ki diye sormayn. Zaman gelince bu konular hakknda bilgi verilecektir. Yerli yabanc ayrm yapmadan bugne kadar hangi kaynaa baktysam konu nesneye ynelik programclk olduunda ilk birka sayfada biyolojiden, memelilerden, tlerden arabalardan vs. sz edilmektedir. Her yazar nesneye ynelik programcln 3 temel kavramn kendince anlatmaktadr. Uzatmadan belirtmek isterim ki anlay renmeyi zorlatrmaktadr. stediiniz ayrntda polimorfizmden sz edin, istediiniz kadar biyolojiden memelilerden rnek verin bu kavramlarn kod karl grlmeden verilen bilgiler havada kalyor. Bu nedenledir ki bu blmde nesneye ynelik programcln temel kavramlarndan sz etmeden bu konuyu anlatmak istiyorum. Esasnda burada bilim yapmyoruz, olsa olsa sizlere C# programlama dili ile nasl program yazabileceinizi anlatmak istiyoruz. Amacmz en basit ekilde programclk tecrbesi olmayanlar programcla altrmaktr, onlar C# programlama dillini renebileceklerine inandrmaktr. Aada en basit veya en kstl, en az satra sahip bir C# program bulunmaktadr. Bu kodu Not Defteri penceresine yazp CS uzants ile kaydedip .NET Framework ile gelen C# derleyicisi ile derleyip EXE yapabilirsiniz. Bu ilemin nasl yapld ileriki sayfalarda anlatlacaktr. Ey niversite hocalar ey programclk zerine yazanlar baka bir kaynakta "Deneme" adnda bir Class grrseniz bilin ki bu isim benzerlii tesadfdr. Yoksa bu Class'a deneme yerine "tecrube" ya da "deneyimsiz" gibi bir ad vermek marifete tabi deildir.

14

Memik Yank - C#a Balang Kitab

Buna gre C# kodu yazmak istiyorsanz nce mutlaka bir Class blou hazrlamanz gerekmektedir. C# programlarnn balang noktas Main() metodu olduundan Main() metoduna yer vermek zorundasnz. Bu C# kodu CS uzantl bir dosyaya yazlp kaydedilip derlenip hazrlanan EXE dosya altrlrsa herhangi bir hata ile karlalmaz. Ancak bu program bu hali ile herhangi bir ilem yapmaz. En az satra sahip bu C# programndaki Main() metodunun hem static hem de void olduunu iaret ettim. C# programlarnn balang noktas olan Main() metodu(C programlama dilinde Mainden fonksiyon diye sz edilir) statik olmak zorundadr ama void olmas zorunlu deildir. Metot geriye bir deer gndermeyecekse metot adndan nce void yazlr. Daha sonra metotlarn geriye nasl deer gnderdikleri konusunda bilgi verilecektir. Bu ksacak programda bile Classtan sz ettik, metottan sz ettik. Size nerim balangta verdiim ksacak kodlarda kullanp ancak szn etmediim deyimlere veya metotlara kaytsz kalmanzdr. rnein bu ksacak rnekte bile szn etmediim, dikkatinizden karmak istediim bir eyler var. Dikkat ederseniz Main() metodunun adndan sonra parantezlerin arasna string[] args yazdm. Bu parantezin iine yazdklarm gerekte dizi deiken tanmlamaktan baka bir ey deildir Ancak u anda bundan sz etmeyeceim. Bu nedenle bu derslerden azami verimi almak istiyorsanz anlatlmayanlara deil anlatlanlara odaklanmalsnz. Main metodu iinde tanmlanan dizi deikene "args" adn vermek C# programclarnn bir alkanldr. Tabi benzer alkanlk saysal bilgileri saklamak amacyla tanmlanan deikenlere ad seerken de vardr ve "i" ve "j" sk kullanlan deiken adlardr. Her ne kadar i ve jnin deiken ad olarak kullanlmas btn dnyann bir alkanl olsa bile Trkiyede baz retim yelerine gre i ve j adnda deikenler tanmlamak sutur. imdi yukarda verdiim C# programnn balang noktas olan Main() metodu iinde bir deikene yer vereceim. Bu deikeni Main() metodu iinde tanmladm. Deikeni Main() metodu tarafndan snrlanan kod blou yerine Class blou iinde tanmlayabilirdim. class Deneme { static void Main(string[] args) { int yil; } } Grdnz gibi C# programlarnda deiken tanmlanrken nce deikenin tipi sonra ad yazlmaktadr. Buradaki int bu deikenin integer yani tamsay tipindeki bilgileri saklayabileceini iaret etmektedir.

Memik Yank - C#a Balang Kitab

15

Programclkta deiken tanmlamay gnlk hayatta telefon edip bir otelde yer ayrmaya benzetmek mmkndr. Bu deikeni tanmlamakla derleyiciye demi oluyorum ki, programn ileriki safhalarnda integer bilgileri bellekte tutma gereini duyabilirim. Bu nedenle bana bellekte bu amala kullanacam bir yer ayrt. Bu ksacak kodu iki cmle ile yorumlamak gerekirse unlar sylenebilir: Bu programdaki Deneme adl Classn Main() adnda bir metodu bulunmaktadr. Main() metodu iinde yaayabilecek yil adnda ve Integer tipindeki bilgilerin aktarlabilecei bir deiken tanmlanmtr. Bu deikeni Main() metodu iinde tanmladm iin yalnzca Main() metodunun snrlar iinde yaar. Fark etmi olabileceiniz gibi C# programlarnda Class ve metot balatlan satrlar hari her satrn sonuna ; konulmaktadr. Bu kodu NET uyumlu Visual Basic iin yazsaydm biraz farkl olurdu. Ancak temel mantkta pek farkllk yoktur. .NET uyumlu Visual Basic'te de zorunlu olmamakla birlikte uygulamalar Class halinde dzenlenmekte ve Classlarn iinde metotlar, alanlar(yani deikenler), zellikler, olaylar, Interfaceler olabilmektedir. Ltfen olay nedir, zellik nedir, Interface nedir gibi sorularla imdilik megul olmayn. imdiye kadar incelediim btn kaynaklarda, btn kitaplarda deikenler adnda bir blm mutlaka vard. Kitaplarda deikenler adl blmn olmas doal olmasna doal da deikenler sanki C, Basic ve Pascal programlama dillerindeki deiken kullanm gzetilerek anlatlmaktadr. Bu derslerde deikenler Class balamnda ksaca anlatlacaktr. Yukarda belirtildii gibi Classlar metotlar barndrabilmektedir. Ayrca C# programlarnda Main() metodunun bulunmas zorunludur. Yukarda verdiim en kstl C# program iinde hazrladm Classta deiiklik yapp 2. bir metoda yer verdim. Herhangi bir satr iermeyen bu metot bu hali ile herhangi bir ilem yapmaz. Bu metodu da hem static hem de void olarak iaret ettiimi fark etmi olmalsnz. Yarn bir gn metot ad benzerlii sulanmak istemeyenler bu metoda Trke yerine gavurca bir ad verebilirler. Mesajn Trke bir kelime olmad gereine ramen class Deneme { static void Main(string[] args) { int yil; } static void Mesaj() { } }

16

Memik Yank - C#a Balang Kitab

Daha nce C#, C++, Delphi gibi bir programlama dili ile program gelitirmi iseniz yani az ok kod yazdysanz bu derste anlatlanlar size basit gelecektir. Programclkta tecrbeli arkadalara bir nerim var; sizler bu yazda ne anlatld ile deil, nasl anlatld ile ilgilenebilirsiniz. Belki bir niversitenin retim grevlisisiniz, belki de bir Microsoft eitim merkezinde eitmensiniz. Bu yazdaki amacm C# gibi bir programlama dilinin nasl kolay renilebilecei konusunda deneme yapmaktr. imdi yukarda verdiim basit C# kod dosyas iinde Mesaj() adn verdiim metodu Main() metodunun iinden ileteceim. Hazrladm metot ayn snfn iinde olduu iin herhangi bir hazrlk yapmadan direk adyla arp iletmek mmkndr. class Deneme { static void Main(string[] args) { int yil; Mesaj(); } static void Mesaj() { } } Bu hali ile bu C# program veya CS uzantl kod dosyas DOS penceresinde derlenip EXE hazrlanp altrlrsa Main() metodu otomatik olarak iletilir. nk yukarda sylendii gibi C# programlar Main() metodundan itibaren almaya balarlar. Bu program aadaki gibi dzenlemi olsaydm deien bir ey olmazd. nk C# derleyicisi Main() metodunu bulup programn balang noktas yapar. Bu ksa rnekte yil adn verdiim deikeni hi kullanmadm iin C# derleyicisi derleme srasnda uyar mesaj verir. class Deneme { static void Mesaj() { } static void Main(string[] args) { int yil; Mesaj(); } }

Memik Yank - C#a Balang Kitab

17

imdi bu Mesaj() adn verdiim metoda mdahale edip iletildii zaman ekrana bilgi yazlmasn salayacam. Konsolda yani DOS penceresinde alan C# projelerinde ekrana bilgi yazma ilemleri .NET Framework ile gelen Console snfnda tanml olan Write() veya WriteLine() metotlar ile yaplmaktadr.

Tam bu noktada elime frsat gemiken biraz kendimi savunmak istiyorum. Yllardr Memik YANIK aleyhine konuanlarn en genel geer sulamas uydu: Memik YANIK kitaplarn ekran grntleri ile doldurup iiriyor. Grdnz gibi yukarda Not Defteri ile hazrladm toplam 12 satrdan meydana gelen kodun kendisini vermek yerine kodu yazm olduum Not Defteri penceresinin ekran grntsn verdim. Bu metni kitap iin yazm olsaydm ekran grntsn belli bir oranda kltp kitapta daha az yer kalmasn salardm. Aada ise bu ekran grntsn verdiim Not Defteri penceresine yazm olduum kodun kendisi var. Sizce kitap metni iinde hangisi ok yer kaplar, ekran grnts m yoksa kodun kendisi mi? Seilen puntoya bal olarak deise bile aralarnda nemsenecek bir farkn olmadn syleyebilirim. Ne ki ekran grnts halinde verilen ksa kodlar incelemek bazen daha kolaydr. Neden mi bazen? nk kitap metni iinde kullanlmak istenen kod 15-20 satr kadarsa kodun kendisi yerine kodu yazld ekran grnts verilebilir. Ancak kod uzunsa ekran grnts yerine kodun kendisini vermek gerekir. class Deneme { static void Main(string[] args) { int yil; Mesaj(); }

18

Memik Yank - C#a Balang Kitab

static void Mesaj() { System.Console.WriteLine("Fenerbahe"); } } Bu ekilde dzenlenen C# uygulamas DOS penceresinde derlenip altrldnda ekrana Fenerbahe yazdrldktan sonra programn almas sona erer. nk C# ile gelitirilmi programlarn almas Main() metodunun sonuna gelindiinde biter. Mesaj() metoduna yazdm satr hakknda biraz konumak gerekirse; System.Console.WriteLine("Fenerbahe"); satrndaki System bir namespacetir. imdi diyeceksiniz Namespace nedir? Cevabm hazr: Ltfen meraknz sonraya saklayn; halk dili ile sylemek gerekirse zm ye ban sorma. Ksaca anlatmak gerekirse Classlar Namespacelerin iine yerletirilmektedir. System adl Namespace .NET Framework ile gelen en nemli Namespacetir ve ok sayda Class barndrmaktadr. DOS penceresine veya konsola bilgi yazmak zere hazrladm satrdaki Console bir Classtr. ok sayda metoda sahip olan bu Classn sayesinde konsol yani DOS penceresi ile ilgili istenen ilemler yaplabilmektedir. Bu satrdaki WriteLine() ise Console snfnn bir metodudur. Bu konuyu bir okulda, bir dershanede veya seminerde anlatyor olsaydm C# hakknda biraz bilgisi olanlar Memik bey WriteLine() static bir metot deil mi? diye sorabilirlerdi. Soruyu soranlara cevabm evet, WriteLine() metodu statik bir metottur. Tabii dersi veya semineri izleyenlerin bazlar statik olanla olmayan metot arasnda ne fark vardr diye soru soracaklard, bazlar ise keke bu konuulanlar anlasaydm diye i geireceklerdi. Frsat bu frsat deyip hemen statik olan ve olmayan metotlar hakknda uzun aklamalar yapmayacam. Arkadalar ltfen biraz sabr.

Programlar Derlemek
Bazlarnz bu ksacak rnei bile hemen denemek, bu CS uzantl dosyay derleyip EXE dosya hazrlamak istiyor olabilir. Bu istee uyup CS uzantl kod dosyasn derleyip EXE yapma zerinde duracam. Not Defteri ile hazrlayacanz kod dosyalarn yerletirmek zere ayr bir klasr hazrlamanz neririm. Bu klasr C: srcsnn kk klasrnde olursa ulalmas kolay olur.

Memik Yank - C#a Balang Kitab

19

C#n kurallarna uyarak yazdnz programlar derleyip EXE dosya hazrlayacak program dosyas(CSC.EXE) Windowsun kurulu olduu klasrn altnda Microsoft.NET\Framework klasrnde yer almaktadr.

.NET Frameworkn baka srmnden yararlanyorsanz bu klasrn ad farkl olabilir.

Hazrlayacanz CS uzantl dosyalar bu CSC.EXE dosyasnn bulunduu klasre kaydetmeli veya Denetim Masasndaki Sistem seenei ile ekrana getirilen Sistem zellikleri diyalog kutusunda Gelimi sekmesindeki Sistem Deikenleri seeneinden yararlanmalsnz. Path seeneinin

20

Memik Yank - C#a Balang Kitab

ieriine aada verdiim satrlardan birisini ekleyip bilgisayar yeniden balatrsanz istediiniz yerden CS uzantl kod dosyalarn derleyebilirsiniz.
C:\WINDOWS\Microsoft.NET\Framework\v3.5; "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;"

Kullandnz bilgisayara Visual Studio 2008'i kurulu ise Balat mensnden Visual Studio 2008 Command Prompt komutu verilerek alan DOS penceresinde yukarda anlatlan ekilde Path ayarlamas yaplmasa bile C# programlarn istediiniz yerde derleyebilirsiniz.

C# derleyicisinin kullanm ekli ve parametreleri hakknda bilgi edinmek istiyorsanz DOS penceresinde CSC /? yazp enter tuuna basabilirsiniz. imdi sra geldi bu program derlemeye. Bu amala bir DOS penceresi ap komut satrna CSC ILK.CS yazp Enter tuuna basnca C# program derlenmeye baland. Yazdm programda herhangi bir hata olmad iin EXE dosya hazrland.

Yazdm C# programnda Main() metodu iinde yil adnda ve int tipinde bir deiken tanmlam olmama ramen bu deikeni hi kullanmadm iin derleyici uyarda bulundu. Bu uyar ILK.CS dosyasndan yola klp ILK.EXE dosyasnn hazrlanmasna engel deildir. Derleyici uyar yerine hata mesaj vermek zorunda kalsayd EXE dosya hazrlanmazd.

Memik Yank - C#a Balang Kitab

21

Tekrarlamak gerekirse yukardaki gibi yaplan derleme sonucu CS uzantl C# program ile ayn ada sahip bir EXE dosyas hazrlanr. Aada verdiim ekran grntsn bu EXE dosyay altrdktan sonra aldm. Derleme sonucu hazrlanan EXE dosya ancak .NET Framework kurulu bilgisayarda alr. Bu EXE dosyay alp .NET Framework 2.0 kurulu olmayan(nk yukarda derleme ilemini .NET Framework 2.0 ile gelen C# derleyicisi ile yaptm) baka bir bilgisayara gtrdnzde almaz. Aada verdiim ekran grntsn hazrladm EXE dosyay altrdktan sonra aldm.

Hazrlayp derlediim C# program ekrana bu bilgiyi yazdktan sonra yani Main() metodunun sonuna gelindiinde almas otomatik olarak sona erer. imdi bu rmekte yle bir ayarlama yapalm ki programn veya EXE dosyann almas Enter tuuna basncaya kadar devam etsin. Programn almasnn Enter tuuna basncaya kadar devam etmesini salamak zere Deneme adn verdiim Class'n Main() metoduna baz eklemeler yaptm.
class Deneme { static void Main(string[] args) { int yil; Mesaj(); System.Console.WriteLine(); System.Console.Write("kmak iin Enter Tuuna Basn"); System.Console.Read(); } static void Mesaj() { System.Console.WriteLine("ampiyon Fenerbahe"); } }

Grdnz gibi Console snfnn WriteLine() metodunu Mesaj() adn verdiim metodun iinden baka bir deyile Main() metodunun iinde kullandm. Bu rnekte Main() metodu iinde nce Mesaj() adn verdiim metot arld iin ekrana nce ampiyon Fenerbahe yazlr. Mesaj() metodunun arld satrdan sonra yine WriteLine() metodu kullanlmaktadr. Bu kez WriteLine() metoduna ekrana yazlmak zere bilgi parametre olarak verilmedii iin ekrann o satr bo kalr. Bir sonraki satrda ise WriteLine() yerine Write() metodunu kullandm.

22

Memik Yank - C#a Balang Kitab

WriteLine() metodu kendisine parametre olarak verilen bilgiyi ekrana yani DOS penceresine yazdktan sonra imleci bir sonraki satrn bana alr. Write() metodu ise WriteLine() metodundan farkl olarak imleci bir sonraki satrn bana almaz. Burada programn almasnn kendiliinden sona ermesini engelleyen metot ise Read(). Bu ekilde dzenlenen C# program derlenip altrldnda aadaki gibi bir sonu alnr.

Console snfnn Read() metodu gerekte kullancnn girecei bilgileri programa veya bir deikene aktarlrken ilevsel olmaktadr. Bu rnekte kullancnn bilgi girmesini istemediim iin Console snfnn Read() metodundan nce herhangi bir deiken ad yazmadm. Dier yandan yukarda verdiim rnekte asl anlatmak istediim uydu: C# programlar Classlar eklinde hazrlanmakta ve Classlarda ilem yapan kod bloklar metot eklinde dzenlenmektedir. Bu dnce ile hazrladm ksack rnekte Main() metodundan baka Mesaj() adnda bir metot hazrlayp Main() metodu dahilinde ilettim. imdi bu rnekte deiiklik yapp Mesaj() adn verdiim metodu silip alma annda yil adn verdiim deikene bilgi aktarmaya alacam. class Deneme { static void Main(string[] args) { int yil; System.Console.Write("Hangi Yldayz : "); yil = System.Console.Read(); } } Bu ekilde deitirdiim C# programnda nce Console snfnn Write() metodu ile kullancya mesaj verdikten sonra bir sonraki satrda Read() metodu sayesinde kullancdan istenen bilgiyi yil adn verdiim deikene aktardm. Aada verdiim ekran grntsn bu ksa program derleyip altrdktan sonra aldm.

Memik Yank - C#a Balang Kitab

23

Ekrana mesaj yazarken Write() yerine WriteLine() metodunu kullansaydm imle bilgi girii iin bir sonraki satrda beklerdi. imdi bu C# programna ekleme yapp kullancdan istenip yl adn verdiim deikenine aktarlan bilgiyi WriteLine() metodu ile tekrar ekrana yazacam.
class Deneme { static void Main(string[] args) { int yil; System.Console.Write("Hangi Yldayz : "); yil = System.Console.Read(); System.Console.WriteLine(); System.Console.Write("Girdiiniz Yl :"); System.Console.WriteLine(yil); } }

Bu ekilde dzenlenen rnek derlenirken hata vermedii gibi altrldnda da hata vermez ama girilen yl bilgisi ile sonradan WriteLine() metodu ile ekrana yazlan yl bilgisi birbirinden farkl olur. Aada verdiim ekran grntsn bu C# programn derleyip altrdktan sonra aldm.

Yukarda verilen koda dikkat ederseniz konsoldan bilgi okuma ilemi Read() metodu ile yaplmaktadr. Read() metodu konsoldan okuma yaparken girilen bilginin ilk karakterinin ASCII kodunu geriye gndermektedir. Bu program derlenip altrlp Hangi Yldayz : sorusuna A ile cevap verilirse ekrana 65 yazlr. nk A hafinin ASCII kodu 65dir.

24

Memik Yank - C#a Balang Kitab

Console snfnn ReadLine() metodu ise farkl bir ekilde almaktadr ve konsoldan yani DOS penceresinden okuduu bilginin String tipte olduunu varsaymaktadr. Bu nedenle yukarda verdiimde rnekte deiiklik yapp okuma ilemini Read() yerine ReadLine() metodu ile yapmaya altm. class Deneme { static void Main(string[] args) { int yil; System.Console.Write("Hangi Yldayz : "); yil = System.Console.ReadLine(); System.Console.Write("Girdiiniz Yl :"); System.Console.WriteLine(yil); } } Bu ekilde deitirdiimiz C# programn derlemek istersek derleyici hata rapor eder. nk Console snfnn ReadLine() metodu tarafndan okunup geriye gnderilen bilgi String tipte olmasna ramen burada int tipindeki deikene aktarmaya alyorum. Bu hatann nne gemek iin string tipte bir deiken tanmlayp kullandm.
class Deneme { static void Main() { string str; System.Console.Write("Hangi Yldayz : "); str = System.Console.ReadLine(); System.Console.Write("Girdiiniz Yl :"); System.Console.WriteLine(str); } }

Bu hali ile programmz istediimiz sonucu verir. Bu rnekte konsoldan girilen yl bilgisi matematiksel ilemlerde kullanlmad iin rakamlardan meydana gelse bile string yani karaktersel bilgi olarak deerlendirmenin bir sakncas olmaz.

Memik Yank - C#a Balang Kitab

25

Bu Blmn zeti
Not Defteri ile yazdmz ilk programda Class blouna yer verdik. Bildiiniz gibi C# programlarnda blok ba { ile ve blok sonu ise } ile iaret edilmektedir. C# programlar almaya Main() metodundan itibaren baladklar iin Classn snrlar iinde Main() metoduna yer verdim. Main() metodu iinde Console snfnn WriteLine() metodu ile konsola yani DOS penceresine bilgi yazmay denedik. Ayrca .NET Framework ile gelen C# derleyicisi ile yani CSC.EXE dosyas ile CS uzants ile kaydettiimiz C# programlarn derleyip EXE dosya hazrladk. Yukarda yazlanlar okurken kafanzda baz sorularn belirdiini tahmin etmek zor deildir. Programclk biraz da bisiklet srmeyi renmek gibidir: nceler sk sk bisikletten dersiniz, insanlarn 2 teker zerinde nasl dmeden gittiklerine hayret edersiniz. Sonra 50 metre dmeden gittiinizde birden bisiklet srmesini rendiinizi fark edersiniz. Birok kii programcla nereden balayaca konusunda tereddde dyor. Bu sorularn cevaplarn bu dersler boyunca birlikte aratracaz.

BLM 3 BAZI DEKEN TPLER ve NAMESPACE'ler


Bu yazlar neden mi kaleme almtm? Programclk kitaplarnn ilk sayfalarnda konular sfrdan ele alp adm adm anlatnca baz arkadalar kitabn anlatm dzeyine itiraz etmeye baladlar. Ben de zm olarak henz yolun banda olanlar gzeterek birka makale yazdm. Burada yer sonunu olmad iin en kk ayrntdan bile sz etmeye altm. imdi izninizle konunun biraz dna kacam:Tp doktorlar kendi aralarnda tp konutuklarnda tp kavramlarn ska kullanrlar ve kolayca anlarlar. Ne var ki doktorun birisi hastasyla konutuunda tp kavramlarn kullanmaz ve halk dili ile hastasyla diyalog kurmaya alr. Doktorumuz hastalaryla tp kavramlarn kullanmadan iyi diyalog kurabiliyorsa baarl doktor olur. Yllardr camiadan bir ok kii Memik Yank' hep giri dzeyi kitaplar yazmakla suladlar. Habu ki en zoru giri dzeyi kitaplar yazmaktr. Bakalm imdi de Memik Yank' giri dzeyi makaleler yazyor diye sulayacaklar mdr? tesi anl anl niversitelerimizin Profesr unvanna sahip hocalar bu metinde verdiim ksacak kodlarda tanmladm deikenlerin adn alma suunu ilediimi tekrar rapor edecekler midir?

Kaldmz Yerden Devam Edelim


Bir nceki blmde Not Defteri ile ksa bir C# program hazrlayp ilk.cs adyla kaydetmitik. Devamnda bu CS uzantl C# programn konsolda derleyip EXE dosya hazrlamtk. Hatta rneimizin son hali beklediimiz sonucu vermemiti. Bu blmde ilk olarak bir nceki derste yaptmz rnei dzelteceiz. Bir nceki blmde hazrladmz rnein son eklini aada verdim. class Deneme { static void Main(string[] args) { int yil; System.Console.Write("Hangi Yldayz : "); yil = System.Console.Read(); System.Console.WriteLine(); System.Console.Write("Girdiiniz Yl :"); System.Console.WriteLine(yil); } } Not: Bu ksack kodda "Yil" adnda ve int tipinde bir deiken tanmladm. Bildiiniz gibi sene bilgisini aktarmak zere deiken ad seimini yapan

Memik Yank - C#a Balang Kitab

27

programclarn aklna yil'n gelmesi yksek bir ihtimaldir. Asl demek istediim udur:Deiken ad olarak yil kendi nam hesabna kaydetmi yani register etmi birisi resmi belgeleri ibraz edip(!) beni uyarrsa burada "yil" adn verdiim deikene "yillar_yillar" veya "Kaybolan_yillar" gibi bir ad verebilirim(!). Bu koda dikkat ederseniz konsoldan bilgi okuma ilemi Read() metodu ile yaplmaktadr. Read() metodu konsoldan okuma yaparken girilen bilginin ilk karakterinin ASCII kodunu geriye gndermektedir. Bu rnek program altrlp Hangi Yldayz : sorusuna A ile cevap verilirse ekrana 65 yazlr. nk A harfinin ASCII kodu 65dir.

Console snfnn ReadLine() metodu ise farkl bir ekilde almaktadr ve konsoldan yani DOS penceresinden okuduu bilginin String tipte olduunu varsaymaktadr. Bu nedenle yukarda verdiimde rnekte deiiklik yapp okuma ilemini Read() yerine ReadLine() metodu ile yapmaya altm. class Deneme { static void Main(string[] args) { int yil; System.Console.Write("Hangi Yldayz : "); yil = System.Console.ReadLine(); System.Console.Write("Girdiiniz Yl :"); System.Console.WriteLine(yil); } } Bu ekilde deitirdiimiz C# programn derlemeye alrsak hata meydana gelir. nk ReadLine() metodu tarafndan okunup geriye gnderilen bilgi String tipte olmasna ramen burada int tipindeki deikene aktarmaya alyorum. Bu hatann nne gemek iin yil adn verdiim deiken yerine string tipte bir deiken tanmlayp kullandm. Daha nce az ok kod yazm olanlarn bilecei gibi aada verdiim kodun hi bir orijinal taraf yoktur. Buna ramen Prof. unvanl birisi "bu kodda

28

Memik Yank - C#a Balang Kitab

Memik Yank baka kaynaklardan alnt yapmtr" diye rapor tanzim ederse, ona "haklsn hocam sizden iyi bilecek deiliz" demekten elimizden baka bir ey gelmez. class Deneme { static void Main(string[] args) { string str; System.Console.Write("Hangi Yldayz : "); str = System.Console.ReadLine(); System.Console.Write("Girdiiniz Yl :"); System.Console.WriteLine(str); } } Bu hali ile programmz istediimiz sonucu verir. Bu rnekte konsoldan girilen yl bilgisi matematiksel ilemlerde kullanlmad iin rakamlardan meydana gelse bile string yani karaktersel bilgi olarak deerlendirmenin bir sakncas olmaz. imdi bu rnekte deiiklik yapp kullancdan 2 saysal bilgi isteyip bunlar birbirleri ile arptktan sonra sonucu ekrana yani konsola yazacam. Bu amala nce 2 string deiken tanmlayp Console snfnn ReadLine() metodu ile okunan bilgileri bu deikenlere aktardm.

Bu program bu hali ile kaydedilip altrlrsa konsoldan girilen bilgiler string deikenlere aktarlr. Bu rnekteki amacmz kullancnn saysal bilgi girmesini ve bu saylar birbiri ile arpp ekrana yazmak olduu iin matematiksel ilem ncesi String deikenlerin ieriini int tipindeki

Memik Yank - C#a Balang Kitab

29

deikenlere aktarmak gerekir. Bu amala bu C# programna ekleme yapp int tipinde 2 deiken tanmladm. Ardndan string deikenlerin ieriklerini dntrp int tipindeki bu deikenlere aktardm. class Deneme { static void Main(string[] args) { string str1; string str2; int sayi1; int sayi2; System.Console.Write("lk sayy girin : "); str1 = System.Console.ReadLine(); System.Console.Write("kinci sayy girin: "); str2 = System.Console.ReadLine(); sayi1 = System.Int16.Parse(str1); sayi2 = System.Int16.Parse(str2); } } Bu kodda sizin iin yeni olan System adl namespacede yer alan Int16 yapsdr. String bilgiyi int tipindeki deikene aktarrken bu yapnn Parse() metodunu kullandm. Baz kaynaklarda Int16 yapsndan Class diye sz edilmi olsa bile bunu sorun yapmamak gerekir. Bu dntrme ilemini yaparken Int16 yerine Int32 yapsnn Parse() metodunu kullanabilirdim. Merak edenlere duyurmak isterim: Memik Yank'n yllar nce yaynlanan Clipper kitabndan bu yana yazd btn kitaplarda integer tipindeki deikenlere ad ararken tercihini Sayi1 ve Sayi2'den yana kulland. Ne ki sayi1, sayi2'yi deiken ad olarak semesi onun hrsz olarak sulanmasna neden oldu? Bu kodda tanmlanan deikenlere Sayi1, Sayi2 gibi adlar vermenin mecburiyet olmadnn kantlamak iin bu kodu aadaki gibi dzenledim. Hi kayglanmayn bu deikenlere gavurca adlar seildiinde bile kod hatasz alyor. evrenizde "hayr bu kodun alabilmesi iin deiken adnn mutlaka sayi1, sayi2 olarak seilmesi arttr diyen retim yelerine, millete programclk reten kurs sahiplerine rastlarsanz "hocam haklsnz, C# derleyicisi C#n kurallarn sizden iyi mi bilecek?" deyiniz.
class Deneme { static void Main(string[] args) { string str1, str2;

30

Memik Yank - C#a Balang Kitab

int number1, numberi2; System.Console.Write("lk sayy girin : "); str1 = System.Console.ReadLine(); System.Console.Write("kinci sayy girin: "); str2 = System.Console.ReadLine(); number1 = System.Int16.Parse(str1); number2 = System.Int16.Parse(str2); } }

Hemen bir hatrlatmada bulunmak isterim:Her ne kadar bu rnekte kullancya "say girin" mesaj verilmi olunsa bile kullanc konsoldan saysal bilgi yerine karaktersel bilgi girerse Parse() metodu dntrme yapamayaca iin hata meydana gelir. Bu tip karlalmas muhtemel hatalarn nne gemek iin hata kontrol bloklar hazrlanabilir. Tabii bu blmde try-catch deyimlerinden sz etmeyeceiz. Merak edenler C# kitabmdan alp kiisel sitemde sizinle paylatm Hata Yakalamak ve Exception Snflar makalesine bakabilirler. Bu makaleyi okuyanlar sfra blme hatasn anlatmak iin gerekli deikenlere ad seerken baka Trke kaynaklardan alnt yapmann art olup olmadn renirler. Bu ekilde konsoldan girilen bilgileri Parse() metodu ile dntrp int tipindeki deikenlere aktardktan sonra matematiksel ilem yapabiliriz. Matematiksel ilem sonucu bulunacak deeri aktarmak zere int tipinde 3. bir deiken tanmladm.

Bu kodu dikkatice incelerseniz bir satrda ayn tipte birden fazla deikeni tanmlam olduumuzu grrsnz. Hemen hatrlatmak gerekirse; bu program derleyip altrp sonra 1. say ile 2. saynn arpm sonucu elde edilen saysal bilgi 2147.483.647den byk olursa hata meydana gelir.

Memik Yank - C#a Balang Kitab

31

Ayrca string bilgileri Int16 yapsnn Parse() metodu ile dntrdmz iin konsoldan girilen saylar 32767den byk olmamal. Int16 yapsnn Parse() metodu yerine Int32 yapsnn Parse() metodunu kullansaydm 1. veya 2. say 2147.483.647 gibi byk bir deer olabilirdi. arpma ilemi sonucu bulunan deeri Console snfnn WriteLine() metodu sayesinde direk konsola yazmak mmkn olmasna ramen amacm baz konular anlatmak olduu iin nc bir string deiken tanmlayp arpma ilemi sonucu bulunan deeri dntrp bu deikene aktardm. Bu ilemi nasl yaptm aada grebilirsiniz. class Deneme { static void Main(string[] args) { string str1,str2, sonuc_str; int sonuc, sayi1, sayi2; System.Console.Write("lk sayy girin : "); str1 = System.Console.ReadLine(); System.Console.Write("kinci sayy girin: "); str2 = System.Console.ReadLine(); sayi1 = System.Int32.Parse(str1); sayi2 = System.Int32.Parse(str2); sonuc = sayi1 * sayi2; sonuc_str = System.Convert.ToString(sonuc); } } Dikkat ederseniz burada int tipindeki deikenin ieriini string tipindeki deikene aktarabilmek iin Convert snfnn ToString() metodundan yararlandm. C# ile az ok uram olanlar bu ilemin daha ksa bir yolunun olduunu ileri srebilirler. Bu arkadalar hakldrlar; dntrme yaparken Convert snfnn ToString() metodu yerine Object snfnn ToString() metodunu kullanabilirsiniz. Object snfnn ToString() metodunun nasl kullanldn daha sonra anlatacam. ToString() metodu ile integer bilgiyi string bilgiye dntrdkten sonra WriteLine() metodu ile konsola yazdm. Tabii bu ksa aklamay yapmasaydm baz niversitelerin retim yeleri "Parse() metodunun nasl kullanldn Memik Yank'n bilmesine imkan yoktur. Mutlaka baka Trke kitaplardan alnt yapmtr" diyebilirlerdi.

32

Memik Yank - C#a Balang Kitab

class Deneme { static void Main(string[] args) { string str1,str2, sonuc_str; int sonuc, sayi1, sayi2; System.Console.Write("lk sayy girin : "); str1 = System.Console.ReadLine(); System.Console.Write("kinci sayy girin: "); str2 = System.Console.ReadLine(); sayi1 = System.Int32.Parse(str1); sayi2 = System.Int32.Parse(str2); sonuc = sayi1 * sayi2; sonuc_str = System.Convert.ToString(sonuc); System.Console.WriteLine("Saylarn arpm :"+ sonuc_str); System.Console.Write("Devam etmek iin bir tua basn"); System.Console.Readkey(); } }

Biraz da Namespacelerden sz edelim..


imdi yukarda uzun uzun anlatlan rnei bir tarafa brakp baka bir rnek hazrlayacam. C# programlarn yazarken Visual Studio veya C# iin hazrlanm Express Editiondan yararlanma yoluna henz gitmediimiz iin CS uzantl C# kodunu yine Not Defteri ile hazrlayacaz. Hazrladm basit C# programn aada verdim. DOS penceresinde derlenip DOS penceresinden bilgi al verii yapan C# programlarna konsol uygulamas ad verilmektedir. Class Sinif_1 { public static void Main() { System.Console.Write("Efes Pilsen Basketbol Takm"); System.Console.ReadLine(); } } Bu ekilde hazrlanan C# program DOS ortamnda derlenip altrlrsa belirtilen bilgi Write() metodu sayesinde DOS penceresine yani konsola yazlr. Bir sonraki satrda kullanlan ReadLine() metodu sayesinde enter tuuna baslncaya kadar program almaya devam eder. Bu rnekte ReadLine() yerine Read() metodu kullanlsayd deien bir ey olmazd. Tabii bu 3 satrlk kodda ReadLine() yerine ReadKey() metodunu kullanrsanz uygulamann almasn sona erdirmek iin herhangi bir tua baslabilir.

Memik Yank - C#a Balang Kitab

33

.NET Framework ad verilen snf kitapl ile gelen snflarn Namespace ad verilen yaplarda saklandn biliyorsunuz. C# programlarnda kullanmak istediiniz Class hangi Namespacein iinde yer alyorsa o namespace using deyimi ile programa dahil etmelisiniz veya yukarda yapld gibi ierdii snflar kullanmak istediiniz namespacein adn metodun nne her seferinde yazmalsnz. DOS penceresi ile ilgili Console snf System adl Namespacete yer ald iin Write() metodundan nce bu snfn yer ald Namespacein adn yazdm. Sz konusu Namespaceteki snflar programnzda ok kez kullanyorsanz her seferinde Namespacein adn bu ekilde yazmak yerine aada yapld gibi ilgili Namespacei using deyimi ile koda dhil edebilirsiniz. using deyimi ile olmayan bir namespacei C# programnza dahil etmek istemeniz yani olmayan bir namespace'in kaynaklarndan yararlanmak istemeniz halinde derleme srasnda hata meydana gelir. using System; Class sinif_1 { public static void Main() { Console.Write("Efes Pilsen Basketbol Takm"); Console.ReadLine(); } } C# programlarnzda .NET Framework ile gelen Namespacelerdeki hazr snflar kullanmann tesinde kendi hazrladnz classlar bir Namespacein iine koymanz gerekir. Yukarda bunu yapmam olmamza ramen herhangi bir hata meydana gelmedi. nk programc yazdklarn bir Namespacee yerletirmedii zaman C# derleyicisi kendiliinden bir Namespace hazrlamaktadr. imdi yukarda verdiim programdaki Sinif_1 adn verdiim Class bir Namespacee dahil edeceim. using System; namespace Tokmak { class sinif_1 { public static void Main() { Console.Write("Efes Pilsen Basketbol Takm"); Console.ReadLine(); } } }

34

Memik Yank - C#a Balang Kitab

Yukarda bold yaplan paragraf ve bu ksa C# kodunu; C++ veya Java gibi nesneye ynelik programlama dilleri hakknda az ok bilgi sahibi olan birisine gsterseniz arp bunda nemli olan nedir veya zerinde durulacak ne var ki? diye size soru yneltmesi yksek ihtimaldir. nk konuya kendi asndan bakacaktr. Bu dersleri C# veya nesneye ynelik programclk konusunda yeni olanlar dnerek kaleme aldm iin yukarda verdiim ksa kod ve kaln(bold) yaplan aklama karsnda duraklamanz normaldir. Bu dnce ile aada farkl renge boyanan paragraf kaleme aldm. C# veya Visual Basicin .NET uyumlu srm ile program yazanlarn kamakla kurtulamayacaklar 2 kavramdan birisi Class, dieri ise Namespacetir. Nesneye ynelik programcln temeli olan Class kavram hakknda bu derslerde henz doru drst bilgi verilmemi olmakla birlikte sanrm Class kavram hakknda kafanzda beliren sorularn zerinde durmamay imdilik baaryorsunuz Class bir yana bir de Namespaceten sz edilince kafanzdaki sorular nem kazanmaya balam olabilir.

Birden Fazla Main() Metodu


Uygulamanzda birden fazla Class varsa Main() metodunun hangi Classta olduunun nemi yoktur. nk C# derleyicisi Main() metodunun hangi Classta olduunu arayp buluyor. Uygulamadaki birden fazla snfta Main() metodu varsa hangisinin kullanlacann belirtilmesi gerekir. Bu konuda bilgi vermek iin aadaki gibi bir C# program hazrladm. using System; class sinif_1 { public static void Main() { Console.Write("Program lk snftaki Main ile balad"); Console.ReadLine(); } } class sinif_2 { public static void Main() { Console.Write("Program kinci snftaki Main ile balad"); Console.ReadLine(); } }

Memik Yank - C#a Balang Kitab

35

Bu rnee dikkat ederseniz Main() metodunun parametresiz olduunu veya parantezin iine herhangi bir deiken ad yazmadm grrsnz. Ayrca bu rnekte Namespace hazrlamadm fark etmi olmalsnz. Bu ekilde hazrlanan C# program bilinen ekilde derlendiinde hata meydana gelir. Derleme satrnda hangi snftaki Main() metodunun kullanlmak istendii belirtilmelidir. Bu program aadaki gibi derlenirse uygulama ilk snftaki Main() metodundan itibaren almaya balar.

Write ve WriteLine Metotlar


Yukarda verdiim rneklerde konsola yalnzca bir bilgi yazdm. imdi konunun anlalmasna katk olmas iin 4 bilgiyi yazacam. Bu amala aada verdiim C# programn hazrladm. Eer saygdeer bir yazarmz kitabnda Console snfnn Write() metodunu anlatrken benim gibi konsola Futbol takmlarnn adn yazmay tercih etmise yandm. nk o i ve j gibi deikenleri kullanmak, Selection Sort gibi btn programclar tarafndan bilinen sralama tekniini kullanmann su olduunu ileri sren Prof'larn olduu bir memlekette programclk zerine yazmak cesaret istiyor.
using System; namespace Tokmak { class sinif_1 { public static void Main() { Console.Write("Fenerbahe"); Console.Write("Galatasaray"); Console.Write("Beikta"); Console.Write("Trabzonspor"); Console.ReadLine(); } } }

Bu programda Write() metodu ile konsola 4 bilgi arka arkaya yazlmakta ve ReadLine() metodu ile programn iletimi askya alnmaktadr. Write() metodu ile konsola bilgi yazldktan sonra imle yazma ileminin

36

Memik Yank - C#a Balang Kitab

tamamland yerde bekleyecei iin bu program derlenip altrlrsa aadaki gibi bir sonu elde edilir.

Bu bilgilerin ayr satrlara yazlmasn salamak iin Write() yerine WriteLine() metodunu kullanabilirsiniz. WriteLine() metodu kendisine parametre olarak verilen bilgiyi belirtilen ortama(burada konsol) yazdktan sonra imleci bir sonraki satrn bana alr.
using System; namespace Tokmak { class sinif_1 { public static void Main() { Console.WriteLine("Fenerbahe"); Console.WriteLine("Galatasaray"); Console.WriteLine("Beikta"); Console.WriteLine("Trabzonspor"); Console.Read(); } } }

Write() metodu ile konsola yazlan metnin sonuna satr ba karakterini(\n) ekleyerek ayn sonucu alabilirsiniz. Satr ba karakterinin nasl kullanldn aada grebilirsiniz.
using System; class sinif_1 { public static void Main() { Console.Write("Fenerbahe\n"); Console.Write("Galatasaray \n"); Console.Write("Beikta \n"); Console.Write("Trabzonspor \n"); Console.Read(); } }

Memik Yank - C#a Balang Kitab

37

Ey programc olmak isteyen arkada: Burada anlatlanlar birok kitapta veya sitede grm olmalsnz. Hele hele Console snfnn ReadLine gibi metotlar hakknda bilgi ieren binlerce siteyi bulman mmkndr. Ltfen eri otursanz bile doru konuun; sizce bu metnin anlatm biiminden yani cmle eklinden baka orijinal bir yan var mdr? Bence yoktur. Buna ramen birileri kp "Memik Yank bu metni garanti benim kitaptan almtr veya eviritir" derse nasl bir tepki verirdiniz? Ltfen glmeyiniz, derler.. Hem de Prof unvanna sahip birileri bu iddiay onaylarlar. Bir sonraki derste C# iin hazrlanm Express Edition'dan sz edeceiz.

BLM 4 KONSOL UYGULAMALARI ve EXPRESS EDITION


C#la ilgili ilk derse sylemi olmama ramen tekrar edelim: Bu derslerin amac programclk ve C# renmek isteyenlere ilk renmeleri gereken konular anlatmaktr. C# ile almaya bu dersleri okuyarak balayanlarn C# renme sreleri ksalacaktr, C# kitaplarnda yazlanlar, C# derslerinde anlatlanlar anlamalar kolaylaacaktr. Bu nedenle elinizdeki C# konulu kitaplar okumadan, dokmanlar incelemeden nce bu dersleri okumanz neriyorum. Bildiiniz gibi Microsoft firmas 2002 ylndan bu yana .NET Framework ad verilen snf kitapln cretsiz olarak datmaktadr. Btn .NET Framework srmlerinde hazr snflardan baka Visual Basic, C# ve C++ derleyicileri de bulunmaktadr. Baka bir deyile herhangi bir .NET Framework srmnden yararlanp Visual Basic veya C# diliyle uygulamalar gelitirmek mmkndr. Ne ki Not Defteri veya baka bir editrle C# veya Visual Basic programlarn yazp DOS penceresinde derlemek zahmetli olup gnmz artlarnda ineyle kuyu kazmak gibidir. C#la ilgili 2. ve 3. derste Not Defteri ile konsol uygulamalar gelitirip C#a almaya almtk. zm ise Microsoft rn Visual Studio ad verilen program gelitirme aracndan yani IDEden yararlanmaktadr. Visual Studio paketi ile hem Web uygulamalar hem C# hem C++ hem de Visual Basic dilini kullanan uygulamalar gelitirmek mmkndr. Microsoft firmas 2004 ylndan itibaren dillere zel ve Visual Studionun kstl zelliklere sahip srmlerini hazrlayp cretsiz olarak datmaya balad. Bu srmlere Express Edition ad verildi. Visual Studio 2008 iin konumak gerekirse Visual Studio 2008 ile .NET Framework 3.5 destekli ve istenilen programlama dilinde uygulama gelitirmek mmkn iken Visual Basice zel Express Edition ile ancak Visual Basic uygulamas gelitirmek mmkndr. Bu sylenenlerden yola karak C# iin hazrlanm Express Edition hakknda unlar sylenebilir: Not Defteri ile uygulama gelitirmek istemeyenler ve Visual Studioyu pahal bulup edinemeyenler Express Editionla idare edebililer. Bu blmde C# iin hazrlanm Express Edition 2008in program gelitirme ortam hakknda ksaca bilgi verilecektir. Tekrar etmek gerekirse Express Edition ilgili programlama dilinin veya derleyicinin ad olmayp program gelitirme ortamnn veya yaygn bilinen adyla IDEnin addr. C# iin hazrlanan Express Edition yazdnz programlar derlerken .NET Framework

Memik Yank - C#a Balang Kitab

39

ile gelen C# derleyicisinden yararlanr. Visual Basic uygulamas gelitirmek isteyenlerin Visual Basic iin hazrlanm Express Edition, Web uygulamas gelitirmek isteyenlerin ise Visual Web Developer Express Editionla ilgilenmeleri gerekir. Bu arada bir isimlendirme yanlln vurgulayalm. Bu yanlln as kayna Microsoft firmasdr. rnein Microsoftun sitesine bakld zaman Visual Basicle ilgili Express Editionn ad Microsoft Visual Basic 2008 Express Edition. lk bakta bu adlandrmada 2008in Visual Basic derleyicisin srmn iaret ettiini sanabilirsiniz. Hal bu ki buradaki 2008 derleyicinin srm yerine IDEnin srm numarasdr. Express Editionlar piyasaya verildiinden bu yana bu yanlla defalarca iaret etmeme ramen bir ok kaynakta 2008in bir Visual Basic srm olduu yazlmaktadr.

Visual C# in Hazrlanm Express Edition Kurmak


C# iin hazrlanm Express Edition bilgisayarnza kurmadan nce bilgisayarnza .NET Framework 2.0 veya 3.5 srmn kurmalsnz. C# iin hazrlanm Express Editionn 2005 srmn kullanacaksanz .NET Framework 2.0 srm yeterli olmaktadr. Express Editionn 2008 srmn kullanmak istiyorsanz daha nceden .NET Framework 3.5 srmn kurmu olmalsnz. leri ki sayfalarda iaret edilecei zere .NET Framework 3.5 srmn bilgisayarnza kurmadan C# iin hazrlanm Express Editionn 2008 srmn kurmanz halinde Express Edition ile birlikte .NET Frameworkn 3.5 srm otomatik olarak Microsoftun sitesinden indirilip kurulur. C# ile program gelitirme konusunda henz yolun banda olanlar iin kullanlacak Express Edition srmnn 2005 veya 2008 olmasnn fazla bir nemi yoktur. imdi srada C# iin hazrlanan Express Edition kurmak var. Microsoft.comda arama yapp aada ekran grntsn verdiim sayfay buldum. Grdnz gibi bu sayfada deiik programlama dilleri iin hazrlanm olan Express srmlerin linkleri var. Baz Express srmlerin birden fazla dil iin hazrlanan kopyalar olduundan Select a Language balkl liste kutusunda dil semek gerekir.

40

Memik Yank - C#a Balang Kitab

Select a Language liste kutusunda ngilizce veya baka bir dili setiinizde veya Download linkini tkladnzda yaklak 2.5 MBlk vcssetup.exe dosyas indirilmek zere sizden izin istenir. C# yerine Visual Basic ile ilgileniyorsanz Visual Basicle ilgili Download linkini tklamalsnz.

Memik Yank - C#a Balang Kitab

41

Bu EXE dosyay indirip altrdnzda ilk olarak aada verdiim diyalog kutusu ekrana gelir. Welcome Setup balkl bu diyalog kutusundaki onay kutusunu setiinizde kurma ilemi srasnda yaadnz sorunlar Microsofta iletilir.

Welcome balkl bu diyalog kutusunda herhangi bir ilem yapmadan Next dmesini tklaynca bu kez ekrana lisans haklar ilgili pencere geldi. Kurma ilemine devam etmek zere lisans haklar ile ilgili penceredeki ilgili radyo dmesini seip Next dmesini tklarsanz ekrana aada verilen Installation Options diyalog kutusu gelir. Visual Studio ve C#la ilgili dokmanlarn indirilip kurulmasn istiyorsanz bu diyalog kutusundaki Microsoft Express MSDN... onay kutusunu semelisiniz.

42

Memik Yank - C#a Balang Kitab

Bu arada Microsoftun sitesinden SQL Servern Express Edition ad verilen cretsiz srmnn indirilip kurulmasn istiyorsanz SQL Serverla ilgili onay kutusunu semelisiniz. C# ile gelitireceim uygulamalarda veritaban olarak hep Access kullanacam demiyorsanz SQL Servern kurulmasn salamalsnz. Bu metni kaleme aldm gnlerde SQL Servern Express Editionn en son srm nosu 2005 iken u gnlerde 2008 srm kullanma sunuldu. Tabii SQL Serverla ilgili bu onay kutusunu semeden C# iin hazrlanan Express srm kuracak olursanz daha sonradan SQL Servera gerek duyduunuzda Microsoftun sitesinden indirip kurabilirsiniz. Daha nce SQL Servern Express srmn indirdiim iin tekrar indirilsin istemedim. Ayrca bu srada kullandm bilgisayarda SQL Servern Express srm kurulu olsayd bu seenek Installation Options diyalog kutusunda bulunmazd. Ekranda Installation Options diyalog kutusu varken Next dmesini tkladnzda Visual C# 2008 Express Editionn kurulaca src ve klasrn belirlendii Destination Folder balkl diyalog kutusu ekrana gelir. C# iin hazrlanm Express Editiona ait dosyalar \Program

Memik Yank - C#a Balang Kitab

43

Files\Microsoft Visual Studio 9.0 klasrnn altnda hazrlanan bir klasre yerletirilmektedir. Express Editiona ait dosyalarn baka bir klasre yerletirilmesini istiyorsanz bu diyalog kutusunda ayarlama yapabilirsiniz. Bana sorarsanz bu diyalog kutusunda herhangi bir deiiklik yapmayn ve C# iin hazrlanm Express Editionn 2008 srmn varsaylan klasre kurun. Merak edenlere hemen syleyelim: Kullanlan bilgisayarda hem Visual Studio hem de istenen Express Editionlar olabilmektedir. Yani Express Edition kuranlar sonradan Visual Studioyu kurabilirler.

Bu ekran grntsn aldm srada kullandm bilgisayara .NET Framework 3.5 kuruluydu. Bu nedenle kurulacak bileenlerin listelendii bu diyalog kutusunda .NET Framework 3.5 listelenmiyor. Bu srada kullandm bilgisayara .NET Framework kurulu olmasayd bu diyalog kutusunda kurulaca iaret edilen seenekler daha fazla olabilirdi. leme devam etmek zere Install dmesini tklarsanz kurma ilemi seilen bileenlere ve Internetin hazna bal olarak ksa srede tamamlanr. Kurma ilemi tamamlandnda ekrana aada verilen Setup Complete diyalog kutusu getirilir. Bu diyalog kutusundaki Windows

44

Memik Yank - C#a Balang Kitab

Update linkini tklayabilir veya Microsoftun paketlerini(varsa) daha sonra indirip kurabilirsiniz.

sitesinden

servis

Visual C# in Hazrlanm Express Editon Register Etmek Anlatlan ekilde kurulan Express Edition register etmeden 30 gn boyunca kullanabilirsiniz. rn cretsiz olduu iin register ilemini sorun yapmayn derim. nsanlar kurduklar program hemen kullanmak istiyorlar ve nasl olsa 30 gnm var deyip Register ilemini erteliyorlar. Ben de bu alkanla uyup Setup Complete diyalog kutusundaki Exit dmesini tklayp Register ilemi sonraya braktm. C# iin hazrlanm Express Edition altrdnzda aadaki gibi bir pencere ile karlarsnz.

Memik Yank - C#a Balang Kitab

45

Bu srada nasl proje hazrlanp nasl kod yazld ayr bir konudur. leriki sayfalarda bu konu ilenecektir. Eski Trk filmlerindeki gibi 30 gnn gz ap kapayncaya kadar getiini varsayp hemen Register etmeye alalm. Bu amala Help mensnden Register Product komutunu verelim. Help mensnden bu komutu verdiinizde ekrana aada verilen diyalog kutusu gelir. Bu diyalog kutusunda sizden register anahtar isteniyor.

46

Memik Yank - C#a Balang Kitab

Bu anahtar elimizde olmadna gre Microsofttan isteyeceiz. Microsofttan Registration anahtarn istemek iin bu diyalog kutusundaki Register now linkini tklamak gerekiyor. Bu linki tkladnzda karnza aada verdiim sayfa gelir ve mail adresinizle parolanz istenir.

Gerek olmamasna ramen bu ilem iin baka bir mail adresini kullanmak istiyorsanz veya mail adresiniz yoksa Sign up now dmesini tklayp Hotmailden yeni bir adres edinebilirsiniz. Mevcut mail adresinizi ve parolanz girip Sing in dmesini tkladnzda ekrana aada verilen sayfa getirilerek sizden baz ek bilgiler istenir.

Memik Yank - C#a Balang Kitab

47

stenen bilgileri girip sayfann alt ksmndaki Continue dmesini tklayp ileme devam ettiinizde aada verilen sayfa ekrana getirilerek sizin iin hazrlanan kayt anahtar sayfaya yazlr.

Bu anahtar kopyalayp Help mensndeki Register Product komutu ile ekrana getirilen diyalog kutusuna yaptrmak gerekiyor. Aada verilen ekran grntsn bu ilemi yaptktan sonra aldm.

48

Memik Yank - C#a Balang Kitab

Register anahtarn bu diyalog kutusuna yaptrp Complete Registration dmesini tkladnzda ilem tamamlanm olur. Anlatlan ekilde Express Edition register edip ondan sonra Help mensnden Register Product komutunu verdiinizde ekrana aadaki gibi bir diyalog kutusu getirilerek rnn zaten kaytl olduu iaret edilir. Visual C# 2008 Express Edition(bu adlandrma kafalar kartrd iin zaman zaman C# iin hazrlanan Express Edition deme gereini duyuyorum) kurup altrrsanz aadaki gibi Visual C# 2008 Express Edition penceresi ile karlarsnz. Bu ekran grntsn dikkatlice incelediinizde pencerenin sol tarafnda gizlenmi Toolbox penceresinin sa tarafnda ise ak durumda olan Solution Explorer penceresinin olduunu grrsnz.

Kurup altrdm Express Editionin 2005 srm olsayd aadaki gibi sonula karlardm. Bu derslerin ierii balamnda Express Editionn 2005 ile 2008 srm arasnda pek fark yoktur.

Memik Yank - C#a Balang Kitab

49

Visual C# 2005/2008 Express Edition altrldnda yeni proje hazrlayabilmeniz veya mevcut projeleri aabilmeniz iin Start Page ekrana getirilmektedir. Recent Projects kutusundaki Open ve Create seenekler ile mevcut projeleri aabilir ve yeni projeler hazrlayabilirsiniz. sterseniz Start Page sayfasn kapatabilirsiniz. Baz arkadalarmz C# ile alrken Express Edition yerine Visual Studioyu tercih edebilirler. Bu dersler balamnda Visual Studio ile Express Edition birbirinden pek farkl deildir.

50

Memik Yank - C#a Balang Kitab

Proje Hazrlamak
Daha nce alp kapatlan C# projeleri Start Page sayfasnda Recent Projects kutusunda listeleniyor. Mevcut projelerden birisini amak istiyorsanz Open seeneinin karsndaki Project linkini tklayabilir veya File mensnden komut verebilirsiniz. Yeni bir C# projesi hazrlamak zere Start Pagedeki Create seeneinin Project linkini tklarsanz ekrana New Project diyalog kutusu gelir. Bu diyalog kutusunda Visual C# iin hazrlanan Express Edition ile birlikte verilen ablonlar listelenmektedir.

Memik Yank - C#a Balang Kitab

51

Bu srada C# iin hazrlanm Express Edition yerine Visual Studio kullanyor olsaydm New Project diyalog kutusunda daha fazla seenek olurdu. nk Visual Studio ile C# uygulamalarndan baka Visual Basic, C++ ve Web uygulamalarn gelitirmek mmkndr. Madem daha nceki derslerde DOS penceresinde derlenip altrlan C# programlar hazrladk; kaldmz yerden devam etme niyetine bir konsol uygulamas hazrlayalm. Bu amala New Project diyalog kutusunda Console Application ablonunu seip Name kutusuna konsol uygulamasna vermek istediim ad yazdm. Bu ablonu seip OK dmesini tklarsanz aadaki gibi bir Express Edition penceresi ile karlarsnz.

Express Edition tarafndan hazrlanan bu kodu incelerseniz size yabanc gelen fazla bir eyin olmadn fark edersiniz. imdiye kadar anlattklarmza ek olarak using deyimiyle System.Collections.Generic, System.Linq ve System.Text adl namespacelerdeki snflardan yararlanlmak istendii iaret edilmitir. Zaten daha nce verdiimiz ksack rneklerde bu namespacelerdeki snflara gerek duymamtk. New Project diyalog kutusunda uygulamaya vermi olduum ad ayn zamanda Namespace ad olarak kullanlm. Devamnda Program adnda bir Class hazrlanm. Baka bir deyile Express Edition, kod dosyasnn adn ayn zamanda Class ad olarak kullanm. Tabii sizler bu Classa yani snfa baka

52

Memik Yank - C#a Balang Kitab

bir ad verebilirsiniz. Her C# uygulamasnda Main() metodunun olmas zorunlu olduu iin bu Classn snrlar iinde Main() metoduna yer verilmi. Bu artlarda Proje1 adn verdiim konsol uygulamas henz kaydedilmi deildir. imdi henz herhangi bir deiiklik yapmadmz bu konsol uygulamasn kaydedelim. Bu amala Express Editionn File mensnden Save All komutunu verebilir veya Standard ara ubuundaki Save All dmesini tklayabilirsiniz. File mensnden Save All komutunu verdiinizde ekrana aada verdiim Save Project diyalog kutusu gelir.

Her ne kadar projeyi veya konsol uygulamasn hazrlarken New Project diyalog kutusunda bir ad vermekle birlikte projeyi kaydederken bu ad deitirme imkanmz var. Projeye vermek istediiniz ad Name kutusuna, projenin kaydedilecei klasr ise Location klasrne yazmanz gerekir. Klasr adn dorudan yazmak yerine Browse dmesini tklayp mevcut klasrlerden birsini seebilirsiniz. Save Project diyalog kutusuna ayrca Solution Name balkl bir metin kutusu bulunmaktadr. C# iin hazrlanm Express Edition veya Visual Studio sayesinde hazrlanan bir veya birden fazla proje bir araya getirilerek Solution hazrlanmaktadr. Balangta proje ad ile proje grubu ilevi gren Solution adnn ayn olaca varsaylmaktadr. Projenin kayd srasnda hazrlanan dosya veya klasrleri sizlere gstermek iin Solutiona farkl bir ad verdim.

Express Edition veya Visual Studio ile hazrlanan projelerin geerli kullancya ait Belgelerim klasrnn altndaki Visual Studio 2008\Projects klasrne kaydedilmek istendii varsaylmaktadr. Bu konsol

Memik Yank - C#a Balang Kitab

53

uygulamas iin Express Edition tarafndan hazrlanan klasr ve dosyalara dikkatinizi ekmek iin Location metin kutusunda C:\Projeler yazdm. C# projesi hazrlanrken belirtilen klasrn altnda nce Solution ile ayn ada sahip bir klasr hazrlanyor. Ardndan Solutiona ait klasrn iinde proje iin ayr bir klasr hazrlanmaktadr. nk Solutionlar ok sayda projeye sahip olabilirler. Proje iin hazrlanan klasr ve dosyalar aada grebilirsiniz.

Bu ekran grntsn incelerseniz Solution iin hazrlanan klasrn iinde proje ile ayn ada sahip bir klasrn hazrlanp projeye ait dosyalarn bu klasre yerletirildiini grebilirsiniz. Solution birden fazla projeden meydana gelmeyecekse Solution ile projeye ait dosyalarn bir arada olmasn salayabilirsiniz. Solution iin ayr bir klasr hazrlanmasn istemiyorsanz Save Project diyalog kutusundaki Create directory for solution onay kutusunu pasif duruma getirmelisiniz. Bu onay kutusunu pasif duruma getirdiinizde Save Project diyalog kutusunda Solutiona ad veremezsiniz. Aada verilen ekran grntsn Create directory for solution onay kutusunu pasif duruma getirip Proje1 adnda bir konsol uygulamas hazrladktan sonra aldm.

54

Memik Yank - C#a Balang Kitab

Eminim ki bu dersleri izleyenlerin ounluu imdiye kadar bilgisayarlarna Express Edition kurdular ve bu metni okurken bir taraftan yukarda yaptm gibi kendileri de konsol uygulamas hazrladlar. Bu ekran grntsne veya kendi hazrladnz proje iin hazrlanan klasre bakarsanz Express Editionn konsol uygulamas iin ok sayda klasr ve dosyay hazrladn fark etmi olmalsnz. Beni dinlerseniz imdilik kafay bu dosyalarn ilevine takmayn. C# iin hazrlanm Express Edition ile yukarda anlatlan ekilde hazrlanan projeyi altrrsanz projenin almas ile almasnn sona ermesi bir olur. Projenin veya konsol uygulamasnn almasnn hemen sona ermesini engellemek iin Program.cs dosyasndaki Main() metoduna aadaki gibi 3 satr ekledim.
using System; using System.Collections.Generic; using System.Text; namespace Proje1 { class Program { static void Main(string[] args) { System.Console.WriteLine("www.memikyanik.com"); System.Console.Write("kmak iin bir tua basn"); System.Console.ReadKey(); } } }

Bu satrlar Express Edition penceresinde Main() metodu ile snrlanan bloa yazlp sonra da Debug mensnden Start Debugging komutu verilir veya Standard ara ubuundaki Start Debugging dmesi tklanrsa Express

Memik Yank - C#a Balang Kitab

55

Edition otomatik olarak derleme yapp EXE dosyay hazrlayp altrr. Aada verdiim ekran grntsn bu konsol uygulamasn Debug mensndeki Start Debugging komutu ile altrdktan sonra aldm.

Express Edition tarafndan hazrlanan EXE dosya projeye ait klasrn altndaki Bin klasr iinde yer alan Debug klasrne kaydedilir. Bu EXE dosyay alp .NET Framework kurulu baka bilgisayarda altrabilirsiniz.

Frsattan istifade hemen ksa bir reklam aras vereceim: Daha nce Visual Studio veya Express Edition temel alan programclk kitab incelemi olanlarn malumu olduu gibi dnyann hibir yerinde hi kimse Visual Studio veya Express Edition byle anlatmyor. Hele hele biraz sonra anlatacaklarm hibir kitabn balang sayfalarnda bulamazsnz. C# veya .NET uyumlu baka programlama dili hakknda kitap veya makale yazanlar burada anlattklarm bilmiyorlar m? Bilmez olurlar m? Mutlaka bilirler, belki de bazlar Memik YANIKtan daha iyi biliyorlardr. O zaman neden anlatmazlar bunlar? Nedeni ok basit: Onlarn Memik YANIK gibi ilk okumada anlalma gibi bir kayglar yoktur. Tabii Memik YANIK ilk okumada

56

Memik Yank - C#a Balang Kitab

mutlaka anlalacam dedii iin veya byle bir tercihi olduu iin baka yazarlarn 10 sayfada anlattklarn Memik YANIK en fazla 12 sayfada anlatr. Bu nedenledir ki bazlar her frsatta Memik YANIK kitaplarn ekran grntleri ile doldurup iiriyor diye beni sularlar. Bu derslerde yer ve sayfa sorunu olmad iin kitaplarda kullandmda ok daha fazla ekran grntsne yer verdim. Express Edition tarafndan hazrlanan SLN uzantl dosya Solution dosyasdr. Tekrar etmek gerekirse Solutionlar proje grubu gibi ilev grmekte ve birden fazla proje zerinde alld zaman kolaylklar salamaktadr. Bu rnekte konsol uygulamamz bir projeden meydana geldii iin SLN uzantl dosyay imdilik unutabiliriz. Buradaki csproj uzantl dosya ise proje dosyasdr. csproj uzantl proje dosyalarnda projedeki form ve classlar hakknda bilgi bulunmaktadr. Express Edition tarafndan hazrlanan proje dosyasnn ieriini size gstermek iin Not Defterinden yararlandm. XML formatndaki bu dosyaya ilgisiz kalabilirsiniz.

Konsol uygulamas iin Express Edition tarafndan hazrlanan SLN ve CSPROJ uzantl dosyalarla ilgimizi imdilik kopardktan sonra geriye bir tek program.cs dosyas kald. imdi Program.cs dosyasn Not Defteri ile ap ieriini size gstereceim.

Memik Yank - C#a Balang Kitab

57

Grdnz gibi bu satrlar Express Edition penceresinde yazdklarmzla ayndr. Daha nceki C# srmlerini ve Visual Studio 2003 kullananlar iin sylemek gerekirse; Microsoft firmas Visual Studio 2005 ve C# 2.0dan itibaren C# projelerinde Program.cs adnda bir dosya hazrlamaya balad. Konsol uygulamalarnda balangta kod ieren bir tek Program.cs dosyas olduu iin uygulama altrldnda iletilmesini istediiniz satrlar Main() metodunun iine yazabilirsiniz. imdi yle bir ayarlama yapacam ki bu uygulama altrld zaman ekrana bir pencerenin gelmesini salayacam.

58

Memik Yank - C#a Balang Kitab

Bu kodu dikkatlice incelerseniz using deyimiyle System.Windows.Forms adl Namespacedeki Classlardan yararlanlmak istendii belirtilmi. Ayn satr sizler yazmaya kalkrsanz hata meydana gelir. nk bu Namespace .NET Framework ile gelen System.Windows.Forms.dll adl DLL dosyasnda yer almaktadr. .NET Frameworke ait klasre baktnzda bu dosyay grebilirsiniz. Konsol uygulamalar dahilinde ekrana pencere getirmek iin bu DLL dosyasnn konsol uygulamasna dahil edilmesi gerekiyor. Baka bir deyile Express Editionn bu referans hakknda bilgilendirilmesi gerekir. Bunun iin Express Edition penceresi iinde yer alan Solution Explorer penceresinden yararlanp Add Reference diyalog kutusunu ekrana getirip System.Windows.Forms.dll referansn uygulamaya dahil etmelisiniz.

Aada verdiim ekran grntsn bu referans veya DLL dosyasn uygulamaya dahil ettikten sonra aldm. Her ne kadar burada referansn uygulamaya dahil edildiinden sz edilse bile gerek tam byle deildir. Yaplan, Express Editionn dolaysyla C# derleyicisinin bu referanstan yararlanlmak istendii konusunda haberdar edilmesinden ibarettir.

Memik Yank - C#a Balang Kitab

59

Bu konuda daha sonra bilgi verilecei iin bu rnei denemeyebilirsiniz. Konsol uygulamalar zerinde fazla durmayacam iin referans nedir gibi sorular atlyorum. Yukarda verdiim konsol uygulamas altrld zaman nce bir DOS penceresi alr. Ardndan yaptm hazrlktan dolay ekrana bir pencere gelir. Bu pencereyi kapattnzda konsol uygulamasnn almas sona erer ve DOS penceresi kapatlr.

Buna ramen yukarda verilen kodun zerinde biraz duralm. Main() metoduna yazdm bu satrlarn ilkinde Form1 adnda ve System.Windows.Forms adl Namespaceteki Form snf tipinde bir deiken tanmlanmaktadr. Devamnda new anahtar kelimesi ile Form snfnn rneini alp(yani nesne hazrlayp) referansn Form1 adn

60

Memik Yank - C#a Balang Kitab

verdiim deikene aktardm. En son olarak bu Form nesnesini Application snfnn Run() metoduna parametre olarak verdim. Dikkat ederseniz burada tanmladm deikene Form1 adn verdim. Yarn bir gn birisi kp bu deiken adn yani Form1i kendi nam hesabma Register ettim derse glp gein.

Windows Forms Uygulamalar


Daha nceki derslerde sylendii gibi konsol uygulamalarna ok az ihtiya duyacanz iin Express Edition ile hazrlanan konsol uygulamalar zerinde fazla durmaya gerek duymadan Windows Forms denilen normal uygulamalara odaklanacaz. Bu nedenle yukarda hazrladm konsol uygulamasn kapatp ekrana New Project diyalog kutusunu getirip Windows Application ablonunu setim.

C# iin hazrlanan Express Edition ile hazrlanan projelerde New Project diyalog kutusunda projeye verilen ad sonradan deitirilebilmektedir. Projeye vermek istediim ad Name kutusuna yazp OK dmesini tklaynca aadaki gibi bir Visual C# 2005 Express Edition penceresi ile karlatm.

Memik Yank - C#a Balang Kitab

61

Windows Application ablonu ile hazrlanan projeye bir form dahil edilmekte ve bu formun grsel yaps Express Edition penceresine gerilmektedir. Bu proje zerinde herhangi bir deiiklik yapmadan Debug mensndeki Start Debugging komutu ile altrrsanz karnza bu form veya pencere gelir.

Bu formun zerine hemen dmeler, TextBoxlar veya ListBoxlar yerletirmek yerine Windows Application ablonu ile hazrlanan projenin zelliklerine bakalm. Bu amala Solution Explorer penceresini atm.

62

Memik Yank - C#a Balang Kitab

Express Edition ile C# projesi hazrland zaman ok kullanlan baz referanslar veya namespace ve snflar ieren DLL dosyalar projeye dahil edilmektedir. Hatrlarsanz yukardaki sayfalarda konsol uygulamas dahilinde ekrana form veya pencere getirmek iin System.Windows.Formsdeki Form adl snftan yararlanmtk. zerinde allan projede .NET Framework ile gelen snflardan birisinden yararlanmak iin o snfn yer ald Namespacei ieren DLL dosyasnn veya referansn projeye dahil edilmesi gerektii iin Solution Explorer penceresinden yararlanp Add Reference diyalog kutusunu ekrana getirmitik. Benzer durum Express Edition ile hazrlanan Windows Forms uygulamalar iin de geerlidir. Visual C# 2008 Express Edition en ok gerek duyulan referanslar projelere kendisi dahil ettii iin bir sre referanslar ile ilgilenilmeyebilir. Express Edition ile hazrlanan projelere dahil edilen referanslar size gstermek iin Solution Explorer penceresinde References seeneine ait art(+) iaretini tkladm.

Memik Yank - C#a Balang Kitab

63

Grdnz gibi Express Edition tarafndan 6 referans veya DLL dosyas Windows Forms uygulamalarna otomatik olarak dahil edilmektedir. Yararlanmak istediiniz snf hangi DLL dosyas veya referansta yer alyorsa o referansn Solution Explorer penceresinden yararlanlarak projeye dahil edilmesi gerekir. .NET Framework ile gelen herhangi bir snftan yararlanabilmek iin referansn projeye dahil edilmesi yetmez ayrca ilgili Namespacein Imports deyimi ile koda dahil edilmesi gerekir.

Birok yerli yabanc kaynakta bu altn izdiim paragrafn benzerini bulma ihtimali yksektir. Bu paragrafta sylenenler yanl olmasa bile eksiktir ve okurun konuyu en bandan yanl kavramasna neden olmaktadr. Gelin bu paragraf yeniden yazalm. .NET Framework ile birlikte ok sayda DLL dosyas gelmektedir ve dosyalar Windowsun kurulu olduu klasrn altndaki Microsoft.NET\Framework klasrne yerletirilmektedir.

Daha nce sylendii gibi bu DLL dosyalarnda Namespaceler bulunmaktadr. rnein System.Windows.Forms.dll adl dosyada System.Windows.Forms adl namespace yer almaktadr. Namespacelerde

64

Memik Yank - C#a Balang Kitab

ise Classlar ve/veya yaplar bulunmaktadr. Uygulamanzda hangi Class kullanmak istiyorsanz o Classn yer ald namespacei ieren DLL dosyasn yani referans Solution Explorer penceresinde listelemeniz gerekiyor. Bir referans Solution Explorer penceresinde listelemek demek bir bakma Visual Studio veya Express Editiona bu referanstan yararlanmak istiyorum demektir. Yoksa uygulamaya dahil edilen bir ey yok. Sz konusu DLL dosyas yerinde duruyor. Yararlanmak istediiniz snfn yer ald Namespacei ieren DLL dosyasn Solution Explorer penceresinde listeledikten sonra aada verdiim kodda olduu gibi Class adndan nce Namespace adn yazarak sz konusu namespaceteki istediiniz gibi Classtan yararlanabilirsiniz.
static void Main(string[] args) { System.Windows.Forms.Form Form1; Form1 = new System.Windows.Forms.Form(); Form1.Text = "memikyanik.com"; System.Windows.Forms.Application.Run(Form1); }

Her seferinde Class adndan nce Namespace adn yazmak istemiyorsanz using deyimiyle sz konusu Namespaceteki Classlardan yararlanmak istediinizi Visual Studio veya Express Editiona belirtebilirsiniz. Buradaki using deyimi DOSun Path komutu ile benzer ileve sahiptir.
using System; using System.Windows.Forms; namespace Proje1 { class Program { static void Main(string[] args) { Form Form1; Form1 = new Form(); Form1.Text = "memikyanik.com"; Application.Run(Form1); } } }

zerinde allan proje hakknda bilgi edinilmek istendii zaman bavurulan Solution Explorer penceresini dikkatlice incelerseniz projedeki formla ilgili olarak 3 dosyann hazrlanm olduunu grrsnz. Burada dikkatinizi ncelikle Program.cs dosyasna ekmek istiyorum. Daha nceki derslerden bildiiniz gibi C# projelerinin balang noktas Main() metodudur. Express

Memik Yank - C#a Balang Kitab

65

Edition veya Visual Studio ile hazrlanan projelerde Main() metodu Program.cs adl kod dosyasnda bulunduu iin bu dosya nemlidir. Her ne kadar bu dosya nemlidir desem bile bu dosyaya kaytsz kalp usta ii programlar yazmak mmkndr. Ne ki iin geri plannn anlalmas iin bu dosyann zerinde biraz durmak bir zorunluluk. Solution Explorer penceresinde Program.cs dosyasn ift tklarsanz bu kod dosyasnn ierii grntlenir.

Express Edition tarafndan hazrlanan bu kodu dikkatlice incelerseniz System, System.Collections.Generic ve System.Windows.Forms adl 3 Namespacedeki snflarn kullanlmak istendii konusunda using deyimiyle ayarlama yaplm olduunu grebilirsiniz. Program.cs dosyasndaki dier satrlar hakknda imdi verilecek bilgilerin altyaps olmad iin zerinde fazla durmayacam. Buna ramen u satr dikkatinize sunmak istiyorum. Application.Run(new Form1()); Bu satr daha nce grm olanlar yle bir aklamay okumu olabilirler: Uygulama Run() metodu ile balatlmaktadr. Aslnda bu tek cmlelik

66

Memik Yank - C#a Balang Kitab

tanm yanl deildir. Ne ki bu tanm, bu satrla nelerin yapldn, geri planda nelerin gelitiini aklamaya yetmiyor. Konunun devamnda anlatlaca gibi Express Edition ile bir Windows Forms uygulamas hazrlandnda System.Windows.Forms adl Namespaceteki Form adl Classn mirass Form1 adnda bir Class hazrlanmaktadr. te bu satrda Form1 adl Classn rnei alnp Application nesnesinin Run() metoduna parametre olarak verilmektedir. Yeterince ak olmayan bu 2 cmlenin aklamasn bir sonraki derse brakyorum.

BLM 5 VISUAL STUDIO LE PROGRAM GELTRMEK


Bu derste Visual Studionun program gelitirme ortam hakknda ksaca bilgi verilecektir. Daha nce Visual Studionun herhangi bir srmn kullandysanz bu dersi atlamak isteyebilirsiniz. Bu derse en azndan gz gezdirmenizi nermek isterim. nk bu derste ileride ilenecek baz konulara temel oluturan birka ayrntdan sz edilmektedir. Aslnda C# programlama dilinden bamsz olarak Visual Studio hakknda yzlerce sayfa yazlabilir. Ne ki bu derslerde byle bir amacm yoktur. Bu derslerde ama C# programlama dilini ve .NET Framework ile gelen snflar hakknda balang dzeyi bilgi vermek olduu iin Visual Studio hakknda ksa bir zet yaplmakla yetinildi. Visual Studio 2008in kurulmas kolay ve sorunsuzdur. Visual Studio 2008 DVDsi srcye takldnda veya Setup.exe program altrldnda ekrana aada verilen pencere gelmektedir. Visual Studionun deiik srmleri bulunmaktadr. Professional srm iinizi grecektir. Visual Studionun deneme srmn microsoft.comdan indirebilirsiniz.

Bu penceredeki ilk seenek tklandnda size birka tandk soru yneltildikten sonra kurma ilemi tamamlanmaktadr. Bu tandk sorulardan birisi Visual Studioya ait dosyalarn kurulaca src ve klasrdr. Visual Studio varsaym olarak C:\Program Files\Microsoft Visual Studio 9.0\ klasrne kurulmaktadr.

68

Memik Yank - Visual C#a Balang Kitab

Bu pencerede kurma tipi olarak Custom seilirse Install dmesi yerini Next dmesine brakr. nce Custom radyo dmesini seip Next dmesini tkladnzda ekrana Visual Studionun kurulacak bileenlerinin seildii pencere gelir.

Blm 6: Windows Forms Uygulamalar

69

Bu pencereden yararlanp Visual Studionun kurulacak bileenlerini seebilirsiniz. rnein Visual Studio ile Visual Basic veya C++ dilinde uygulama gelitirmeyi dnmyorsanz bu dillerle ilgili bileenlerin kurulmalarn engelleyebilirsiniz. Visual Studio bilgisayara kurulduktan sonra Balat mensnde Microsoft Visual Studio 2008 adnda bir program grubu hazrlanmakta ve bu program grubuna Visual Studioya ait ksayollar dahil edilmektedir. Visual Studio kurulup balatldnda ekrana aada verilen diyalog kutusu getirilerek program gelitirme ortamnn dzenlenmesi konusunda seim yapmanz istenir. C# programlar gelitirmek istediim iin bu diyalog kutusunda Visual C# setim. Bu seim sayesinde Visual Studionun ortam C#n varsaylan seimlerine gre ayarlanr.

70

Memik Yank - Visual C#a Balang Kitab

Bu diyalog kutusunda Visual C# setiinizi varsayalm. Bir sre sonra Visual Basicin ayarlarna dnmek isterseniz Tools mensnden Import and Export komutu verildii zaman almaya balayan Wizardn ilk admn temsil eden diyalog kutusunda Reset all Settings radyo dmesini seip ortamn hangi dilin varsaylan ayarlarna gre dzenlenecei konusunda seim yaplan bu diyalog kutusunu ekrana getirebilirsiniz.

Blm 6: Windows Forms Uygulamalar

71

Bu diyalog kutusundaki Reset all settings radyo dmesini seip Next dmesiyle ileme devam ettiinizde Wizard ekrana Choose a Default Collection of Settings diyalog kutusunu getirir. Hangi dilin ayarlarnn geerli olmasn istiyorsanz o dili seebilirsiniz. rnein eski bir Visual Basic programcs iseniz C# uygulamalar gelitirirken Visual Basicin ayarlarnn geerli olmasn salayabilirsiniz.

72

Memik Yank - Visual C#a Balang Kitab

Visual Basicin varsaylan ayarlar ile Visual C#n ayarlar arasndaki nemli farklardan birisi udur: Visual Basic ayarlar geerli iken Visual Studio sizi hazrladnz projeyi hemen kaydetmek zorunda brakmyor. Tabii bu diyalog kutusunda hangi dilin varsaylan ayarlarn seerseniz sein sonradan Tools mensnden Options komutu ile ekrana getirilen diyalog kutusunda ortam ayarlarnda istediiniz deiiklii yapabilirsiniz. 2004 ylnda yaynlanan C# kitabmda Data Adapter Configuration Wizard ile DataAdapter nesnesinin zelliklerini ayarladm diye yarglandma gre yarn bir gn yerli yazarn birisi kp bu Import and Export Settings Wizard kullanmay ilk ben akl ettim derse sorumluluk kabul etmem. Ayrca bu memlekette Wizard tarafndan ekrana getirilen diyalog kutularnn birden fazla kitapta ayn srada olduunu rapor edecek ok sayda bilim adam(!) olduuna gre bu Wizarddan yararlanmak risk tekil edebilir. Visual Studio altrldnda yeni proje hazrlayabilmeniz veya mevcut projeleri aabilmeniz iin Start Page ekrana getirilmektedir. Bu sayfadaki Recent Projects kutusunda Open ad altnda gruplanan seenekler ile

Blm 6: Windows Forms Uygulamalar

73

mevcut projeleri aabilirsiniz. Create ad altnda gruplanan 2 seenekten yararlanp yeni proje hazrlayabilirsiniz. Mevcut projelerden birisini amak istiyorsanz Open ad altnda gruplanan seeneklerden Projecti tklamanz gerekir. Project seeneini tklarsanz geerli kullancya ait Belgelerim klasrnn altnda yer alan Visual Studio Projects klasrndeki projeler listelenir. Visual Studio ile hazrlanan her proje iin ayr bir klasr hazrlanmakta ve projeye ait dosyalar bu klasre kaydedilmektedir.

Visual Studio ile C# projesi hazrlamak zere Start Pagedeki Create ad altnda gruplanan 2 seenekten Projecti tklarsanz ekrana New Project diyalog kutusu gelir. Project types kutusunda listelenen seenekler Visual Studionun bilgisayara kurulan bileenlerine gre deimektedir. C# projesi hazrlamak istediim iin Project types kutusunda Visual C# ve Templates kutusunda Windows Foms Application ablonunu setim.

74

Memik Yank - Visual C#a Balang Kitab

Tam bu noktada bazen kafalarn karmasna neden olan Visual C# ile C# ayrmna deinmek gerekiyor. Visual C#, Microsoft firmasnn ticari markasdr. Madem C# programlama dilini Microsoft firmas gelitirdi ve bu kitapta Microsoft firmas tarafndan gelitirilen Visual Studiodan yararlanyoruz C# ile Visual C# ayn anlamda kullanlabilir. C# uygulamalarn gelitirirken Visual Studio yerine C# iin hazrlanm Express Edition kullanyor olsaydm New Project diyalog kutusunda daha az ablon listelenirdi. Aada verilen ekran grnts C# iin hazrlanm Express Editiona aittir.

Blm 6: Windows Forms Uygulamalar

75

Visual Studio 2003 veya 2005 ile C# projesi hazrlanmak istendii zaman ekrana getirilen New Project diyalog kutusunda .NET Framework srmn tercih etme imkan yoktu. Visual Studio 2003 ile .NET Framework 1.1 uyumlu projeler hazrlanabilirken Visual Studio 2005 ile .NET 2.0 uyumlu projeler hazrlanabiliniyordu. Visual Studio 2008de ise proje hazrlarken .NET Frameworkn 2.0, 3.0 veya 3.5 srmlerinden birisini seme imkann bulunmaktadr. New Project diyalog kutusunda seilen .NET Framework srmne gre Templates liste kutusunda listelenen ablonlar deimektedir. Balangta projeler iin(yani eitim amal projelerde) .NET Frameworkn 2.0 veya 3.5 srmn semenin bir nemi olmamasna ramen 3.5 srmn tercih ettim. New Project diyalog kutusunda .NET Frameworkn 2.0 srmn tercih ederseniz C# 3.0 ile ilgili baz yeniliklerden yararlanamazsnz. rnein LINQ teknolojisi ile sorgulama yapamazsnz. New Project diyalog kutusunun alt ksmnda Name seeneinden yararlanarak projenin adn girebilir ve Location seenei ile projenin kaydedilecei klasr belirleyebilirsiniz. Visual Studio ile hazrlanan C# projelerinin geerli kullancya ait Belgelerim klasrnn altnda bulunan Visual Studio Projects klasrne kaydedilecei varsaylmaktadr. Hazrlamak istediim projeyi C: srcsndeki \Projeler klasrne kaydetmek istediim iin Browse dmesini tklayp klasr seilen Project Location diyalog kutusunu ekrana getirip bu klasr setim.

76

Memik Yank - Visual C#a Balang Kitab

Yukarda anlatlan ekilde proje hazrladnzda Visual Studio ayrca bir Solution hazrlamaktadr. Solutionlar proje grubu gibi ilev grmektedir. Balangta projenin ad ayn zamanda Solution ad olarak kullanlmaktadr. Solutiona birden fazla proje dahil edeceksiniz farkl bir ad vermeniz nerilir. Proje hazrlanrken Visual Studio tarafndan oluturulan klasrleri gsterebilmek iin Solutiona farkl bir ad verdim. Bu ayarlamalardan sonra New Project diyalog kutusunu kapatrsanz Visual Studio projeyi hazrlar ve aadaki gibi bir Visual Studio penceresi ile karlarsnz.

Blm 6: Windows Forms Uygulamalar

77

Balangta Solution Explorer ve Properties pencereleri Visual Studio penceresinin sa tarafna yuvalanm durumdadr. Sol tarafta ise Toolbox gizlenmi durumdadr. Bu ekran grnts Visual Studio bilgisayara kurulduktan hemen sonra alnd iin sizin bilgisayarda Visual Studio ile ilgili pencerelerin yerleim ekli farkl olabilir. Proje hazrlanrken belirtilen klasrn altnda proje ile ayn ada sahip bir klasr hazrlanyor. Buna gre her Visual C# projesi iin ayr bir klasr hazrlanmaktadr. Proje iin hazrlanan klasr ve dosyalar aada grebilirsiniz.

Bu ekran grntsnde Solution iin hazrlanan klasrn iinde proje ile ayn ada sahip bir klasrn hazrlandn grebilirsiniz. Solution birden fazla projeden meydana gelmeyecekse Solution ile projeye ait dosyalarn bir arada olmasn tercih edebilirsiniz. Solution iin ayr bir klasrn hazrlanmasn istemiyorsanz New Project diyalog kutusundaki Create directory for solution onay kutusunu pasif duruma getirmelisiniz. Projeye ait klasre kaydedilen Form1.cs uzantl dosya projedeki formu temsil etmektedir. Formlarn grsel yaps ile ilgili bilgiler Designer.cs dosyalarnda tutulurken resx uzantl dosyalarda ise formla ilgili kaynaklar(resource) tutulmaktadr. Visual Studio tarafndan hazrlanan C# projesi dosyalarna csproj uzants verilmektedir. Visual Studio ile proje hazrladnzda ayn zamanda bir Solution hazrlanr ve Solutiona ait bilgiler sln dosyalarnda saklanmaktadr. Yukarda rnek olmas iin hazrladm C# projesine "Proje1" adn verdim. Bu proje adn yerli programclk kitab yazarlar daha nceden kendi

78

Memik Yank - Visual C#a Balang Kitab

adlarna register etmi olabilir. Bu nedenle kendinizi riske etmeyip Proje1 yerine projelere argo veya gavurca adlar vermeniz nerilir. rnein Proje1 yerine Project1 veya En_baba_proje gibi adlar tercih edebilirsiniz.

Solution Explorer Penceresi


zerinde altnz projeye hangi formlarn ve dosyalarn dahil edilmi olduunu grmek istiyorsanz Visual Studionun Solution Explorer penceresine bakabilirsiniz. Solution Explorer penceresinde bir bakma projeye ait klasrn ierii grntlenmektedir. Solution Explorer penceresinin balk ubuunu ift tklayp bamsz pencere olmasn salayabilirsiniz. Aada verilen ekran grntsn proje iin 2. bir form hazrladktan sonra aldm. Projeye 2. bir form dahil etmek demek gerekte .NET Framework ile gelen Form snfnn mirass 2. bir snf hazrlamak demektir. Tpk Form1 snfnda olduu gibi Form2 snfnn bir yars Form2.cs dosyasnda, dier yars ise Form2.Designer.cs dosyasnda yer almaktadr.

Solution ve proje hakknda bilgi ieren bu pencereyi View mensnden komut vererek veya Standard ara ubuundaki ilgili dmeyi tklayarak ekrana getirebilirsiniz. Bu ekran grntsn aldm srada Proje1 adn verdiim projede Form1 ve Form2 adnda 2 form vard. Visual Studio ile hazrlanan projelerde her form iin ikisi CS uzantl 3 dosya hazrlanmaktadr. Windows Forms Application ablonu ile hazrlanan projenin kaydedildii klasre bakldnda Bin ve Obj adnda 2 klasrn hazrland grlr. Visual Studio balangta bu 2 klasr Solution Explorer penceresinde listelemiyor. zerinde altnz proje ile ilgili btn dosya ve klasrlerin listelenmesini istiyorsanz Solution Explorer penceresindeki Show All Files dmesini tklamanz gerekir. Bu dmenin ilevini aada grebilirsiniz.

Blm 6: Windows Forms Uygulamalar

79

C# projesine dahil edilmi referanslar grmek istiyorsanz Solution Explorer penceresinde References seeneini tklamalsnz. Visual Studio 2008 ile hazrlanan C# projelerine 8 referans otomatik olarak dahil edilmektedir. Ek bir ilem yapmaya gerek kalmadan bu referanslarda bulunan namespacelerdeki snflar kullanabilirsiniz. DLL dosyalar veya buradaki adyla referanslar doalar gerei gerek duyulduunda bellee yklenirler.

.NET Framework ile gelen veya kendi hazrladnz referanslardan birisindeki snflardan yararlanacaksanz References seeneine ait ksayol mensnden Add Reference komutunu vermelisiniz. Her ne kadar burada referans eklemeden sz edilse bile eklenen herhangi bir ey yoktur. Yaplan udur: Yararlanlmak istenen referanslar hakknda Visual Studio bilgilendirilmektedir. Yoksa referanslar yani DLL dosyalar ilgili klasrde durmaktadr.

80

Memik Yank - Visual C#a Balang Kitab

Bu komutu verirseniz ekrana Add Reference diyalog kutusu gelir. Projede kullanmak istediiniz bileen veya referans seip OK dmesini tklamanz yeterlidir.

Bu pencerede .NET sekmesinde listelenen her seenek veya referans gerekte .NET Framework ile gelen birer DLL dosyasdr. Kendiniz Visual

Blm 6: Windows Forms Uygulamalar

81

Studio ile gelen Class Library ablonu ile kolayca DLL dosyalar hazrlayp .NET Framework ile gelenlerde oluu gibi bu DLL dosyalarndan yararlanabilirsiniz.

Form Designer ve Code Editor Pencereleri


imdiye kadar verilen ekran grntlerinden tespit olabileceiniz gibi yeni bir proje hazrlandnzda projeye otomatik olarak dahil edilen formun grsel yaps Visual Studio penceresinin Form Designer ad verilen orta ksmda grntlenmektedir. Aada verdiim ekran grntsn aldm srada projedeki ilk formun grsel yaps grntleniyordu.

Ak olan her form veya kod dosyas iin Windows Form Designer penceresinin st ksmnda bir sekme hazrlanmaktadr. Bu srada Solution Explorer penceresinde Form2.csnin zerinde ift tklama yaparsanz bu kod dosyas dahilinde hazrlanan Classn yani Form2nin grsel yaps grntlenir. Ak olan formlardan birisine ait kodlar grmek istiyorsanz o formu seip View mensnden Code komutunu vermelisiniz. Form2 aktif form iken View mensnden Code komutu verilirse bu formu oluturan kodlar grntlenir. Aada verilen ekran grntsn almadan nce Solution Explorer ve Properties pencerelerini gizledim. Bu kodu yakndan incelediinizde Form2 adnda ve .NET Framework ile gelen Form snfnn mirass bir Classn hazrlandn grrsnz.

82

Memik Yank - Visual C#a Balang Kitab

Projedeki 2. formu temsil eden Form2 snfna ait kodlarn bir ksm bu dosyada iken dier yars Form2.Designer.cs dosyasnda bulunmaktadr. Projedeki mevcut kod dosyalarn amak iin Solution Explorer penceresine bavurmak yerine File mensnden Open-File komutunu verebilirsiniz. Kod yaps grntlenen formun grsel yapsn grmek istiyorsanz View mensnden Designer komutunu vermelisiniz. Projedeki formlara ait kodlar veya grsel yaplarn grntlerken Solution Explorer penceresinden yararlanabilirsiniz. Sz konusu forma ait ksayol mensnden View Designer komutunu verirseniz formun grsel yaps, View Code komutunu verirseniz forma ait kodlar grntlenir.

ToolBox Penceresi
Visual Studio bilgisayara kurulup balatldnda ekrana getirilen bir dier pencere Toolbox penceresidir. Toolboxta formlarn zerine yerletirebileceiniz kontroller yani .NET Framework ile gelen hazr snflar listelenmektedir. Visual Studio penceresinin sol tarafnda Toolboxtan baka ayrca Server Explorer penceresini temsil eden bir dme bulunmaktadr.

Blm 6: Windows Forms Uygulamalar

83

Bu ekran grntsn aldm srada Server Explorer penceresi ak olmasna ramen gizlenmiti. Bu pencereden veritaban ilemleri yaplrken yararlanlmaktadr. Bu derslerde veritaban ilemlerinden sz edilmedii iin Server Explorer penceresini kapattm.

Toolboxn otomatik gizlenme zelliini iptal etmek istiyorsanz Auto Hide dmesini tklamalsnz. Auto Hide zellii devrede deilken Toolbox penceresinin balk ubuunda ift tklama yapp bamsz pencere olmasn salayabilirsiniz.

84

Memik Yank - Visual C#a Balang Kitab

.NET Framework ile birlikte Toolboxta birer dme ile temsil edilenlerden

ok daha fazla kontrol verilmektedir. zerinde altnz forma yerletirmek istediiniz kontrol Toolboxta yer almyorsa Tools mensnden Choose Toolbox Items veya Toolboxa ait ksayol mensnden Choose Items komutunu verebilirsiniz. rnein SQL Server veya Access veritabanlarna balanrken kullanlan SqlConnection ve OleDbConnection kontrolleri balangta Toolboxta yer almyor. Bu kontrollere gerek duyanlarn Toolboxa ait ksayol mensnden komut verip ekrana gelen Choose Toolbox Items diyalog kutusunda ayarlama yapmalar gerekir.

Toolboxta listelenen kontrollerin birisini seip forma yerletirmek demek gerekte sz konusu kontroln yani Classn rneini almak olarak dnmek gerek. Forma yerletirilen kontrol sz konusu Classn yani formun bir yesi olur. Tabii Button veya TextBox gibi snflarn rneklerini alrken yani nesne hazrlarken Visual Studiodan yararlanmak yerine bu ilemi kod yazarak yapabilirsiniz.

Form ve Kod Pencerelerinin Organizasyonu


imdiye kadar verilen ekran grntlerinden tespit etmi olabileceiniz Properties, Toolbox, Solution Explorer ve Server Explorer gibi pencerelerin

Blm 6: Windows Forms Uygulamalar

85

dnda ak olan her form iin Visual Studio penceresinin orta ksmnda bir sekme hazrlanmaktadr. Programc ak olan hangi formla ilgileniyorsa o formu temsil eden sekmeyi tklar. Aada verilen ekran grntsn aldm srada ak durumda olan 3 form vard ve Form2nin grsel yaps grntleniyordu.

Programc bu srada Form1 veya Form2ye ait sekmeyi tklayp bu formlar grntleyebilir. Baka bir deyile bu artlarda form pencerelerini simge durumuna kltmek mmkn deildir. Ak olan her formun ayr bir pencereye sahip olmasn istiyorsanz Tools mensndeki Options komutu ile ekrana getirilen diyalog kutusunda ayarlama yapmalsnz.

86

Memik Yank - Visual C#a Balang Kitab

Options diyalog kutusunda General ad altnda gruplanan seeneklerden Multiple documents radyo dmesini seerseniz ak olan her form ayr bir pencereye sahip olur ve bu pencereleri simge durumuna kltebilirsiniz. Aada verilen ekran grntsn Multiple documents radyo dmesini setikten sonra aldm.

Blm 6: Windows Forms Uygulamalar

87

Bu ekran grntsn aldm srada 3 form akt. Bu pencerelerinin boyutlarn ve Visual Studio penceresi iindeki konumlarn istediiniz gibi ayarlayabilirsiniz. Bu metni kaleme alrken ekran grntlerini istediim gibi ayarlayabilmek iin Options diyalog kutusunda Multiple documents radyo dmesini seip formlarn bamsz pencere olmalarn saladm.

Projelerinin Bileenleri
Visual Studio ile gelitirilen uygulamalara Solution ad verilmekte ve Solutionlarda projeler bulunmaktadr. zerinde altnz Solution hakknda bilgi edinmek istiyorsanz Solution Explorer penceresine bakabilirsiniz. Madem C# uygulamalarn gelitirirken Visual Studio veya Express Edition kullanyoruz Visual Studionun hazrlad projeler hakknda bilgi edinmek gerekir. Visual Studio ile hazrlanan C# projelerinde formlardan ve formlar temsil eden kod dosyalarndan baka Program.cs adnda bir kod dosyas bulunmaktadr. Visual Studio veya Express Edition ile hazrlanan C# projeleri almaya bu dosyadan balamaktadr. nk C# projelerinin balang noktas olan Main() metodu bu kod dosyasnda bulunmaktadr. Program.cs dosyas Visual Studio 2003te yoktu. Bu dosyann en nemli ilevi Main() metodunu iermesidir. Main() metodunu alp baka bir kod dosyasna yerletirirseniz Program.cs dosyasna gerek kalmaz. Madem Visual Studio kullanyoruz bence Program.cs dosyasn ayn ekilde brakmakta fayda vardr.

88

Memik Yank - Visual C#a Balang Kitab

C# projeleri Main() metoduna sahip olmak zorundadr. nk C# projeleri tpk C ve C++ projelerinde olduu gibi Main() metodundan itibaren almaya balarlar. Ayrca Main() metodu public ve static olmaldr. Bu rnekte Main() metodu geriye bir deer gndermedii iin void olduu iaret edildi. C# projelerinin ikinci nemli bileenleri formlar ve formlarla ilgili kod dosyalardr. Visual Studio, projelere dahil edilen her form iin 3 ayr dosya hazrlamaktadr. Asl kod dosyalar yani programcnn yazd kodlar form ile ayn ada sahip CS uzantl dosyada saklanmaktadr. Formun grsel yaps ile ilgili bilgiler ise Designer.cs dosyasnda tutulmaktadr. Designer.cs dosyasnn ierii genellikle Visual Studio tarafndan oluturulduu iin programclar pek ilgilenmezler.

Visual Studio, formlara ait Designer.cs dosyasndaki kodlar bir bakma tasarm annda yorumlayp sz konusu form alma annda ekrana geldiinde nasl bir grnme sahip olaca konusunda programcy nceden yani tasarm annda bilgilendirmektedir. Formun zerine nesne yerletirilmesi veya formun zelliklerinde deiiklik yaplmas halinde Visual Studio tarafndan geri planda Designer.cs dosyasnda deiiklik yaplr. Baka bir deyile formlarn ve formalara yerletirilen nesnelerin grsel zellikleriyle ilgili satrlar FormAd.Designer.cs dosyasnda bulunmaktadr. Tabii bu C# derleyicisi iin art deildir. nk bu ayrm Visual Studionun tercihidir. Projelerdeki her form iin cs ve resx uzantl 3 dosya hazrlanmaktadr. Not Defteri ile CS uzantl dosyalar ap inceleyebilir veya deitirebilirsiniz. Aada verilen ekran grntsn Form1e ait CS dosyasn Not Defteri ile atktan sonra aldm.

Blm 6: Windows Forms Uygulamalar

89

.NET Framework ile gelen Form snfnn mirass snflar kendiniz kod yazarak hazrlayabilirsiniz ancak bu durumda Visual Studio penceresi iinde formlarn grsel yapsnn grntlenmesinde sorunlar yaanr. C# projeleri hard diske csproj uzants ile kaydedilmektedir. csproj uzantl proje dosyalarnda projedeki form ve classlar hakknda bilgi bulunmaktadr. csproj uzantl dosyann ieriine bakp projede ka form ve classn olduunu renebilirsiniz.

90

Memik Yank - Visual C#a Balang Kitab

leri ki sayfalarda deinilecei gibi Visual Studio ile yeni bir proje hazrland zaman ayrca sln uzantl bir Solution dosyas hazrlanyor. Visual Studio ile hazrlanan C# projelerinde yukarda sz edilen dosyalara ek olarak Properties ad altnda gruplanan 5 dosya daha bulunmaktadr. Bu 5 dosya sayesinde projenin zellikleri ayarlanmaktadr. rnein uygulama dahilinde kullanlan resim dosyalar Resources.resx dosyasna dahil edilebilmektedir. Bu 5 dosya projeye ait klasrn iinde Properties klasrnde saklanmaktadr.

zerinde altnz projenin baka bilgisayarlarda kullanlmak veya altrlmak zere alnan/gtrlen dosyalarn hepsine birden Assembly denilmektedir. Assembly tek exe dosyadan meydana gelebilecei gibi ok sayda resim, text vb. dosyasndan da oluabilir. Assembly hakkndaki bilgiler Properties klasrnde tutulan AssemblyInfo.cs dosyasnda tutulmaktadr. Bu dosyann ierii Project Properties penceresinden ulalan Assembly Information diyalog kutusunda yaplan ayarlardan etkilenmektedir. Bana sorarsanz henz yolun banda olanlarn Assembly nedir ne ie yarar gibi sorularla ilgilenmelerine gerek yoktur. Yukardaki sayfalarda ekran grnts verilen New Project diyalog kutusunda deiik amalar iin kullanabileceiniz ok sayda ablon listelenmektedir. Bu kitapta bu ablonlarn birkandan sz edilecektir. rnein Empty Project ablonu herhangi bir forma ve Program.cs dosyasna sahip olmayan bir proje hazrlamaktadr. Visual Studio veya Express Edition ile hazrlanan projeler hakknda bilgi sahibi olmanz iin New Project diyalog kutusunu ekrana getirip Empty Project ablonu ile bir proje hazrlayp kaydettim. Aada verilen ekran grntsnden tespit edeceiniz gibi Solution Explorer penceresinde herhangi bir klasr veya dosya listelenmiyor.

Blm 6: Windows Forms Uygulamalar

91

Bu artlarda projenin kaydedildii klasre bakacak olursanz sadece solution ve proje dosyalarnn hazrlandn grebilirsiniz. Daha sonra bu proje iin Main() metodunu ieren "Program.cs" dosyasn ve balang formunu hazrlayabilirsiniz.

Solution Hazrlamak
Yukardaki sayfalarda Solution Explorer penceresiyle ilgili olarak verilen baz ekran grntlerinde Solution varken bazlarnda yoktu. zerinde altnz Solution tek projeden meydana geliyorsa Solution Explorer penceresinde Solution adnn yer almasna gerek duymayabilirsiniz. Bu durumda Tools mensndeki Options komutu ile ekrana getirilen diyalog kutusunda Project and Solutions seenek grubunda ayarlama yapmalsnz. Bu diyalog kutusunda Always show solution onay kutusunu pasif duruma getirirseniz Solution Explorer penceresinde Solution ad listelenmez.

92

Memik Yank - Visual C#a Balang Kitab

Yukarda belirtildii gibi Visual Studio ile yeni bir proje hazrladnzda ayrca bir Solution hazrlanmaktadr. Bu konuda adm adm bilgi vermek iin Visual Studionun File mensnden komut verip New Project diyalog kutusunu ekrana getirdim.

Visual Studio, projeye verilen ad ayn zamanda Solution ad olarak kullanmaktadr. Karklk olmasn diye proje ad ile Solution adnn farkl olmasn saladm. Bu artlarda OK dmesi tklanrsa kullandm bilgisayardaki C:\Projeler klasrnde Solution1 adnda bir klasr hazrlanp solutiona ait SLN uzantl dosya bu klasre konulur. Ayrca bu klasrn iinde proje iin WindowsApplication1 adnda bir klasr hazrlanp projeye ait dosya ve dier klasrler bu klasrn iine konulur. Bildiiniz gibi New Project diyalog kutusundaki Create directory for solution onay kutusu seili deilken solution iin ayr bir klasr hazrlanmayp proje ve solution dosyalar bir arada tutulmaktadr. Tekrar etmek gerekirse Visual Studio ile bir C# projesi hazrladnzda otomatik olarak SLN uzantl bir solution dosyas hazrlanmaktadr. Solutionlar projeleri gruplamaya yaradklar iin gelitirdiiniz uygulama birden fazla projeden meydana gelmeyecekse SLN uzantl Solution dosyasn unutabilirsiniz.

Blm 6: Windows Forms Uygulamalar

93

Otomatik olarak hazrlanan Solutionu grmek istiyorsanz Solution Explorer penceresine bakabilirsiniz. Birden fazla proje sz konusu olmad srece otomatik olarak hazrlanan Solution ilevsel deildir. Baka bir deyile ayn anda birden fazla projeyi amay dnmyorsanz Solutionlarla ilgilenmenize gerek yoktur. Visual Studio tarafndan hazrlanan Solutiona ait ksayol mensndeki New Project komutu ile yeni bir projeyi veya Existing Project komutu ile mevcut projelerden birisini Solutiona dahil edebilirsiniz. Ksayol mensnden New Project komutunu verirseniz ekrana Add New Project diyalog kutusu gelir. Tahmin edebileceiniz gibi Solutionlarda .Net destekli ve Microsoft rn herhangi bir programlama dili ile hazrlanm baka projeler olabilmektedir. Konumuz C# olduu iin Project Types kutusunda Visual C# Projects ve Templates liste kutusunda ise Windows Applicationi seip OK dmesini tklaynca Solution Explorer penceresi aada verilen ekle dnt.

94

Memik Yank - Visual C#a Balang Kitab

Solutionda birden fazla proje varken bu projelerden birisi aktif projedir. Aktif projenin ad Solution Explorer penceresinde kaln olarak yazlmaktadr. Yanda verilen ekran grntsn aldm srada WindowsApplication1 adl proje aktifti. Dier projeyi aktif proje yapmak istiyorsanz o projeye ait ksayol mensnden Set as StartUp Project komutunu vermelisiniz. Solutiondaki projelerden birisini karmak istiyorsanz o projeye ait ksayol mensnden Remove komutunu verebilirsiniz. Yukarda otomatik olarak hazrlanan Solutiona sonradan 2. bir projeyi dahil ettim. Ancak ie bo bir Solution hazrlamakla balayabilirsiniz. erii bo solution hazrlamak istiyorsanz New Project diyalog kutusundaki Blank Solution ablonundan yararlanabilirsiniz. Herhangi bir proje iermeyen yeni bir Solution hazrlamak iin Project Types liste kutusunda Visual Studio Solutions ve Templates kutusunda ise Blank Solution ablonunu seip solution iin klasr seip OK dmesini tklarsanz aadaki gibi Visual Studio penceresi ile karlarsnz. Bu srada Solutiona dahil edilmi olan herhangi bir proje olmad iin Solution Explorer penceresinde yalnzca Solution ad listelenir.

Bu srada mevcut projelerden birisini Solutiona dahil edebilir veya Solution iin yeni bir proje hazrlayabilirsiniz. Bu ilemler iin Solution Explorer penceresinde Solutiona ait ksayol mensnden New Project veya Existing Project komutlarndan birisini verebilirsiniz. Herhangi bir zamanda SLN uzantl Solution dosyasn amanz halinde Solutiona dahil edilmi olan btn projeler alr.

Projeleri altrmak Ve Derlemek


imdi srada yukardaki sayfalarda anlatlan ekilde hazrlanan projeleri altrmak, test etmek ve derlemek var. Bu dnce ile New Project diyalog kutusunu ekrana getirip Windows Forms Application ablonu ile

Blm 6: Windows Forms Uygulamalar

95

Proje1 adnda bir proje hazrlayp bu projeyi C: srcsnde \Proje1 klasrne kaydettim. Projeyi kaydettiim klasr zellikle iaret ettim. nk proje altrldnda veya derlendiinde geri planda Visual Studio tarafndan hazrlanan dosyalardan sz etmek istiyorum. Ayrca New Project diyalog kutusunda Create directory for solution onay kutusu pasif duruma getirip proje hazrlanrken otomatik olarak hazrlanan Solutionla ilgili dosyann ayr bir klasre konulmasn engelledim. Program gelitirme arac yani IDE olarak Visual Studio yerine C# iin hazrlanm Express Edition kullananlar iin unu sylemek isterim: Projeleri altrmak balamnda Visual Studio ile Express Edition birbirinden pek farkl deildir. imdi hazrladm projede herhangi bir deiiklik yapmadan, balang formuna kontrol yerletirmeden ve baka bir Class hazrlamadan altracam. Projeleri altrmak, baka bir deyile projeyi test edip hata ierip iermediini kontrol etmek iin genellikle Debug mensndeki Start Debugging komutu kullanlmaktadr. Genellikle dedim; nk projeleri altrmann baka yntemleri de vardr.

alr durumdaki projeye ait ilk formu Kapat dmesi ile kapatp projenin almasn sona erdirip tasarm moduna geebilirsiniz. Projenin almasn sona erdirip Design moduna geilirse Visual Studionun Toolbox ve Properties gibi pencereler tekrar grntlenir. Visual Studio ile hazrlanan C# projeleri Debug mensnden komut verilerek altrldklar, baka bir deyile test edildikleri zaman Visual Studio tarafndan otomatik olarak EXE dosya hazrlanmaktadr. Proje

96

Memik Yank - Visual C#a Balang Kitab

altrldnda hazrlanan EXE dosyann yerini aada grebilirsiniz. Bu EXE dosya ancak proje hazrlanrken tercih edilen .NET Framework srmnn(2.0, 3.0 veya 3.5) kurulu olduu bilgisayarda alabilir. Aada ekran grnts verilen dosya listesindeki pdb uzantl dosyaya dikkatinizi ekmek istiyorum. Kodun debug edilmesi yani hatalardan ayklanmas ilemiyle ilgili bilgiler bu dosyaya yazlmaktadr. Tabii bu blmde hata ayklama ilemleri zerinde durmayacamz iin pdb uzantl dosyann ilevinden sz edilmeyecektir.

Yukarda sylendii gibi Visual Studio ile hazrladnz C# projesini altrp test etmek iin Debug mensnden Start Debugging komutunu verebilir veya direk F5 tuuna basabilirsiniz. Aslnda Debug mensnden bu komutu vermekle Visual Studioya bir bakma hazrladm projeyi entegre hata ayklaycnn nezaretinde test etmek istiyorum ve varsa hatalarndan ayklamak istiyorum demi oluyorsunuz. zerinde altnz projeyi Ctrl+F5 tular ile altrrsanz projeyi entegre Debuggerdan bamsz altrm olursunuz. En banda belirtmek gerekir ki Start Debugging komutu verildii zaman proje iin otomatik olarak hazrlanan EXE dosya bakalarna verilecek, bala bir deyile projeden yararlanacaklara verilecek EXE kopya deildir. Elbette Start Debugging komutu sayesinde otomatik olarak hazrlanp projeye ait klasrn iinde yer alan \Bin\Debug klasrne yerletirilen EXE dosyay alp baka bilgisayarda altrmak mmkndr. Ancak debug modunda iken hazrlanan EXE dosyann datlmas nerilmiyor. imdi gelelim u Debug moduna. Programclar genelde uygulamalarn gelitirmeyi ve test etmeyi Debug modunda yaparlar. Ne zaman ki uygulama tamamlanp testlerden geer o zaman Release srm hazrlayp kullanclara yle verirler. Yukardaki sayfalarda iaret edildii gibi Visual Studio ile yeni C# projesi hazrlanp kaydedildii zaman projeye ait klasrn iinde Bin ve Obj adnda 2 klasr hazrlanmaktadr.

Blm 6: Windows Forms Uygulamalar

97

Derleme srasnda hazrlanan geici dosyalar Obj klasrne konulmaktadr. Obj klasrnn altnda Debug ve Release adnda 2 klasr hazrlanmaktadr. Ayn ekilde Bin klasrnn iinde yine Debug ve Release adnda 2 klasr hazrlanmaktadr. Uygulamann Debug srm Bin klasrnn iinde bulunan \Bin\Debug klasrne konulurken Release srm \Bin\Release klasrne yerletirilmektedir. Yukarda belirtildii gibi Visual Studio ile bir Windows Forms Application hazrlayp bu uygulamay kaydedip sonrada Debug mensnden Start Debugging komutunu verdiinizde Visual Studio sz konusu uygulamay nce derlemektedir. Tabi Visual Studio bu ilemi yaparken .NET Framework ile gelen C# derleyicisini kullanmaktadr. Derleme ilemi srasnda hazrlanan dosyalar \uygulama\obj\Debug klasrne yerletirilmektedir.

Start Debugging komutu verildii zaman Visual Studio derleme yapp bu dosyalar hazrladktan sonra ayrca uygulama\Bin\Debug klasrne kodun EXEsini ve birka dosya daha yerletirilip bu EXE dosya altrlmaktadr. Hazrladnz proje veya Solution altrp test etmek yerine derlemek istiyorsanz Build mensndeki komutlardan yararlanmanz gerekir. Build mensnde gerekte aada verilen ekran grntsndekinden daha fazla komut bulunmaktadr. Balangta Solutionlarn derlemesiyle ilgili komutlar Build mensnde yer almyor. Eer birden fazla projeyi bir Solutionda topluyorsanz Tools mensnden komut verip ekrana Options diyalog kutusunu getirip Project And Solutions sekmesinde ayarlama yapabilirsiniz.

98

Memik Yank - Visual C#a Balang Kitab

Bu mendeki komutlarn adlarna zerinde allan projenin ad eklenmektedir. Bu srada zerinde altm projenin Proje1di. zerinde altnz projeyi derlemek zere Build mensnden Build komutunu verirseniz Visual Studio projenizi derler. Derleme srasnda nce Uygulama ad\obj\Debug klasrne baz dosyalar yerletirilir. Derleme ileminin ikinci aamasnda birisi EXE olmak zere birka dosya hazrlanp Uygulama ad\Bin\Debug klasrne yerletirilir. EXE dosyay ift tklayp veya Balat mensnden altr komutunu verip projenizi altrabilirsiniz. Tabii profesyonel programclar projeleri iin kurma CDsi hazrlayp uygulamalarn yle datrlar. Kurma CDsini Visual Studio ile gelen Setup Wizarddan yararlanarak hazrlayabilirsiniz. Derleme sonucu hazrlanp \Obj\Debug ve \Bin\Debug klasrlerine yerletirilen dosyalar silmek istiyorsanz Build mensnden Clean komutunu vermelisiniz. Daha nce derlediiniz projeyi Build komutu ile tekrar derlediinizde projenin yalnzca deien ksmlar gzetilir. Rebuild komutu ise projeyi sanki ilk kez derleniyormu gibi yeni batan derler. Debug modundan Release moduna gemek istiyorsanz Visual Studionun Debug mensnden komut verip Cunfiguration Manager diyalog kutusunu ekrana getirmelisiniz. Balangta bu komut Debug mensnde yer almyor ve bu nedenle Tools mensndeki Options komutu ile ekrana getirilen diyalog kutusunda ayarlama yapmak gerekmektedir.

Blm 6: Windows Forms Uygulamalar

99

Options diyalog kutusunda Project and Solution seenek grubundaki Show advanced build configurations onay kutusunu semelisiniz. Bu ayarlamay yapp Debug mensnde Cunfiguration Manager komutunun yer almasn salayp bu komutu verdiinizde akrana aada verilen diyalog kutusu gelir.

100

Memik Yank - Visual C#a Balang Kitab

Bu ekran grntsn aldm srada zerinde altm projenin dahil olduu Solution bir tek projeye sahipti. Bu srada Solutionda birden fazla proje olsayd bu projeler de listelenirdi. Bu diyalog kutusundaki Active Solution configuration ve Active solution platform liste kutularnda yaplan seimlerden btn projeler etkilenmektedir. Active Solution configuration liste kutusunu ap Releasei seerseniz Debug modundan Release moduna gemi olursunuz. Bu andan itibaren Debug mensnden Start Debugging komutunu verip projeyi altrrsanz EXE kodun Release srm hazrlanr ve bu EXE dosya \Bin\Release klasrne yerletirilir. Bu srada yani Release modunda iken Build mensnden Clean komutunu verirseniz \Obj\Release ve \Bin\Release klasrlerine yerletirilmi dosyalar silinir. Debug modunda iken Build mensnden Build veya Rebuild komutu verilerek derleme yapldnda derleme sonucu hazrlanan dosyalar yine \Obj\Release ve \Bin\Release klasrlerine yerletirilmektedir. Hangi modda olduunuzu renirken Project Properties penceresinden yararlanabilirsiniz.

Bu dersi batan sonra inceleyenlerin tespit etmi olabilecei gibi baz kk ayrntlar hari burada anlatlan ilemlerin hemen hepsini baka kaynaklarda bulmak mmkndr. Hatta daha nce eski Visual Basic ve Delphi IDEsini az ok kullanm olanlarn kaynak kartrmalarna bile gerek kalmadan bu metinde anlatlanlar kendilerinin zaten biliyor olmalar uzak bir ihtimal deildir. Buna ramen yarn bir gn srf bu metni kaleme aldm diye yarglanmamak, sank pozisyonunda hakim karsna kmamak iin ek aklama yapma gereini duyuyorum: Ey yetkililer, ey yerli programclk kitab yazarlar; 1994 ylndan bu yana Microsoftun IDElerini kullanan programlama dilleri zerine ok sayda kitap yazm birisi olarak yukardaki sayfalarda yazdklarm gidip bozuk cmlelerle dolu yerli programclk kitaplarndan renmemin bir mant var mdr? Yani yukarda verilen bilgilerin daha nce yaynlana baz programclk kitaplarnda yer alyor

Blm 6: Windows Forms Uygulamalar

101

olmas bence Visual Studionun suudur. Keke Visual Studio at sahibine gre kiner ataszn kendisine rehber edip yazarna ve programcsna gre alsa, yazarna gre ilem yapsa

BLM 6 WINDOWS FORMS UYGULAMALARI


Daha nceki derslerde nde C# iin hazrlanm Express Edition sonra da Visual Studio hakknda n bilgi verdik. Bu derste ise Express Edition ile Windows Forms hazrlayacaz. Bu derste yazlanlar itibar ile Express Edition kullanmak ile Visual Studio kullanmak arasnda pek bir fark yoktur. Baka bir deyile bilgisayarlarna Visual Studio kurmu olanlar bu derste yazlanlar zorluk ekmeden uygulayabilirler. lk derslerinde konsol uygulamas hazrlamamzn nedeni C# uygulamalar hakknda adm adm bilgi vermekti. Yoksa konsol uygulamalarna ok zel durumlarda ihtiya duyulmaktadr. Bu nedenle bundan sonra Windows Forms denilen normal uygulamalara odaklanacaz. Bu nedenle Express Edition balatp File mensnden komut verip New Project diyalog kutusunu ekrana getirip Windows Application ablonunu setim.

C# iin hazrlanan Express Edition ile hazrlanan projelerde New Project diyalog kutusunda projeye verilen ad sonradan deitirilebilmektedir. Projeye vermek istediim ad Name kutusuna yazp OK dmesini tklaynca aadaki gibi bir Visual C# 2008 Express Edition penceresi ile karlatm.

Blm 6: Windows Forms Uygulamalar

103

Windows Application ablonu ile hazrlanan projeye bir form dahil edilmekte ve bu formun grsel yaps Express Edition penceresine getirilmektedir. Bu formun zerine hemen dmeler, TextBoxlar ve ListBoxlar yerletirmek yerine Windows Forms Application ablonu ile hazrlanan projenin zelliklerine bir bakalm. Bu amala Solution Explorer penceresini atm.

Express Edition ile C# projesi hazrland zaman ok kullanlan baz snflar ieren referanslar yani DLL dosyalar projeye dahil edilmektedir. Daha dorusu Express Editiona baz referanslardaki snflardan yararlanlmak istendii sylenmektedir. Hatrlarsanz yukardaki sayfalarda konsol uygulamas dahilinde ekrana form veya pencere getirmek iin System.Windows.Formsdeki Form adl snftan yararlanmtk.

104

Memik Yank - Visual C#a Balang Kitab

zerinde allan projede .NET Framework ile gelen snflardan birisinden yararlanmak iin o snfn yer ald namespacei ieren DLL dosyasnn veya referansn Solution Explorer penceresinde listelenmesi gerektii iin Solution Explorer penceresinden yararlanp Add Reference diyalog kutusunu ekrana getirmitik. Benzer durum Express Edition ile hazrlanan Windows Forms uygulamalar iin de geerlidir. Express Edition en ok gerek duyulan referanslar kendiliinden Solution Explorer penceresinde listelemektedir. zerinde allan proje hakknda bilgi edinilmek istendii zaman bavurulan Solution Explorer penceresine dikkatlice bakarsanz projedeki formla ilgili olarak 3 dosyann hazrlanm olduunu grrsnz. Burada dikkatinizi ncelikle Program.cs dosyasna ekmek istiyorum. Yukardaki sayfalarda iaret edildii C# projelerinin balang noktas Main() metodudur. Express Edition veya Visual Studio ile hazrlanan projelerde Main() metodu Program.cs adl kod dosyasna konulduu iin bu dosya nemlidir. Solution Explorer penceresinde Program.cs dosyasn ift tklarsanz bu kod dosyasnn ierii grntlenir. Hemen belirtmek gerekir ki Main() metodunun Program.cs dosyasnda olmas art deildir. Microsoft firmas Main() metodunun Program.cs dosyasnda olmasn tercih ettii iin bu tercihe bal kalmanz nerilir.

Express Edition tarafndan hazrlanan bu kodu dikkatlice incelerseniz System, System.Collections.Generic, System.Windows.Forms gibi

Blm 6: Windows Forms Uygulamalar

105

namespacelerdeki snflar direk kullanabilmeniz, yani snf adndan nce namespace adn yazmak zorunda kalmamanz iin using deyimi ile ayarlama yaplm olduunu grrsnz. Program.cs dosyasndaki Main() metodundaki son satr yukardaki sayfalarda grmtk. Application.Run(new Form1()); Windows Forms uygulamalarnda System.Windows.Formsdeki snflar direk kullanabilmeniz iin Express Edition tarafndan using deyimi ile ayarlama yapld iin snf adndan nce namespace ad yazlmam. Bu satr daha nce grm olanlar yle bir aklamay okumu olabilirler: Uygulama Run() metodu ile balatlmaktadr. Aslnda bu tek cmlelik tanm yanl deildir. Ne var ki bu tanm bu satrla nelerin yapldn, geri planda nelerin gelitiini aklamaya yetmiyor. Konunun devamnda anlatlaca gibi Express Edition ile Windows Forms uygulamas hazrlandnda System.Windows.Forms adl namespaceteki Form adl Classn mirass Form1 adnda bir Class hazrlanmaktadr. te bu satrda Form1 adl Classn rnei alnp Application snfnn Run() metoduna parametre olarak verilmektedir. Konu zerinde dnmenizi salamak iin Windows Forms uygulamasnn Program.cs dosyasndaki Main() metodunu aadaki gibi dzenledim.
static void Main() { string mesaj = "Proje balatld, Form1 ekrana getirilecek"; MessageBox.Show(mesaj); Application.Run(new Form1()); }

Express Edition tarafndan hazrlanan Main() metodundan sildiim 2 satr mutlaka gerekli olan satrlar deildir. Kod ksalsn diye sildim. Main() metodunun bu halinde nce string tipte bir deiken tanmlayp bilgi aktardm. Deiken tanmlama ile tanmlanan deikene bilgi aktarma ilemini ayr satrlarda yapabilirdim. leri de yerli bir yazarn Memik Yank deikenimizin adn alm sulamasndan kendimi kurtarmak iin bu kodu bir de aadaki gibi dzenledim.
static void Main() { string msg = "Proje balatld, Form1 ekrana getirilecek"; MessageBox.Show(msg); Application.Run(new Form1()); }

106

Memik Yank - Visual C#a Balang Kitab

Bu ekilde String tipteki deikeni tanmlayp bilgi aktardktan sonra .NET Framework ile gelen MessageBox snfnn Show() metodu ile bu deikenin ieriini bir diyalog kutusu iinde ekrana getirdim. Dolaysyla Main() metodu bu ekilde dzenlenen proje altrld zaman ekrana nce aadaki gibi bir diyalog kutusu gelir.

Bu diyalog kutusu kapatldnda ise sra Application snfnn Run() metodunun kullanld satra gelir ve ekrana projenin formu gelir. Run() metodunun kullanld satr incelerseniz Form1 snfnn rneinin new anahtar kelimesi kullanlarak parantezlerin iine alndn grrsnz. Bir snfn rneini alma yani nesne hazrlama ileminin anlalmasna katk olmas iin bu projenin Main() metodunu aadaki gibi dzenledim.
static void Main() { string msg = "Proje balatld, Form1 ekrana getirilecek"; MessageBox.Show(msg); Form1 Baslangic_formu; Baslangic_formu = new Form1(); Baslangic_formu.Text = "lk Form"; Application.Run(Baslangic_formu); }

imdi gelin bu 6 satrlk kodu yorumlayalm. Express Edition veya Visual Studio ile Windows Forms uygulamas hazrland zaman .NET Framework ile gelen ve System.Windows.Formsde yer alan Form snfnn mirass Form1 adnda bir snf hazrlanmakta ve bu snfla ilgili Form1.cs ve Form1.Designer.cs adnda 2 kod dosyas hazrlanmaktadr. Burada yani bu Main() metodunda yaptm, nce Express Edition tarafndan Windows Forms uygulamas iin otomatik olarak hazrlanan Form1 tipinde(snf) bir deiken tanmlamak, sonra bu snfn rneini new anahtar kelimesi ile hazrlayp(nesne hazrlamak) tanmladm deikene aktarmaktr. En son satrda ise Form1 tipindeki nesneyi Application snfnn Run() metoduna parametre olarak verdim. Ne zaman ki Application snfnn Run() metoduna parametre olarak verilen form kapatlr o zaman projenin almas sona ermi olur.

Blm 6: Windows Forms Uygulamalar

107

Formlar in Hazrlanan Kodlar


Express Edition veya Visual Studio ile yeni bir proje hazrlandnda projeye Form1 adnda bir formun dahil edildiini biliyorsunuz. Formu oluturan kodlar grntlemek iin Solution Explorer penceresinde sz konusu form seili iken View mensnden Code komutunu verebilirsiniz. Aadaki ekran grntsn incelediinizde projedeki her form iin hazrlanan CS dosyalarnn ilkinde en bata kullanlmas muhtemel snflarn yer ald namespaceler iaret edilmektedir. Ardndan form ile ayn ada sahip bir Class hazrlanmaktadr.

Bu class System.Windows.Forms adl namespaceteki Form adl Classn mirass olduu iin ok sayda zellik ve metoda sahip olur. Bu koda dikkat ederseniz nce namespace blou bulunmaktadr ve projenin ad namespace ad olarak kullanlmaktadr. Devamnda public ve partial olarak iaret edilen class blou gelmektedir. Hazrlanan Classa Form1 ad verilmi. Hazrlanmak istenen Classn adndan sonra miras(bu snfa baz programclar ana snf-base class diyorlar) pozisyonundaki Form snfnn ad yazlm. Hazrlanmak istenen Class ile miras Classn adn birbirinden ayrmak iin : kullanlmaktadr. Form snf System.Windows.Formsde yer ald ve bu namespace using blounda iaret edildii iin Form snfnn adnn nne namespace ad yazlmaya gerek duyulmam. Devamnda Form1 snfnn yapc metoduna yer verilmi. Class ile ayn ada sahip metotlara yapc veya constructor metot ad verilmektedir. Form1 ad verilen Classn yapc metodunda yalnzca InitializeComponent() metodu iletilmektedir. Form1 snfyla ilgili

108

Memik Yank - Visual C#a Balang Kitab

InitializeComponent metodu dosyasnda yer almaktadr.

Form1.Designer.cs

adl

ikinci

kod

Formlarn ve formlarn zerine yerletirilen nesnelerin zellikleri Form1.Designer.cs dosyasnda ayarlanmaktadr. Designer.cs dosyasnda da Form1 adnda bir Class bulunmaktadr. Baka bir deyile Form1 adl Classn bir ksm Form1.csde dier ksm Form1.Designer.cs dosyasnda bulunmaktadr.

7 Classlarn birden fazla kod dosyas veya para eklinde dzenlenmesine Partial Class denilmektedir. Bu nedenle Form1.cs veya Form1.Designer.cs dosyalarndaki partial anahtar kelimeleri silinirse hata meydana gelir. Form1 adl Class iin Visual Studio tarafndan hazrlanan Form1.Designer.cs dosyasna bakarsanz Dispose() adnda bir metodun olduunu grrsnz. Bu metot, snfla ilgili olarak hazrlanan nesnelerin zaman gelince bellekten silmesiyle ilgilidir. imdi Form1 iin Visual Studio tarafndan hazrlanan satrlar ve bu satrlarda kullanlan metot ve anahtar kelimelerin bazlarndan sz edeceim. Visual Studio her form iin Form1.Designer.cs dosyasnda yukarda verilen satrlardan daha fazlasn hazrlamaktadr. Tasarm annda Properties penceresinde yaplan deiiklilere programc dorudan mdahale etmeyi tercih etmeyecei iin bu satrlar Windows Form Designer generated code adl altnda gruplanp gizlenmektedir. Aada verilen kodda bu blgeye yazlan satrlar grebilirsiniz.

Blm 6: Windows Forms Uygulamalar

109

namespace Project1 { partial class Form1 { private System.ComponentModel.IContainer components=null; protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Text = "Form1"; } } }

IntializeComponent() metodundaki satrlar Toolboxtan yararlanlarak formun zerine yerletirilen nesnelere gre artabilmektedir. Bu srada Toolboxtan yararlanp forma nesne yerletirir veya Properties penceresinden yararlanp formun zelliklerini deitirseniz Windows Form Designer generated code blgesine yeni satrlar eklenir veya mevcut satrlarda deiiklik meydana gelir.

Formlara Nesne Yerletirmek


Yukardaki sayfalarda Express Edition veya Visual Studio ile hazrlanan C# projeleri hakknda biraz bilgi sahibi olduktan sonra imdi srada forma button nesnesi yani dme yerletirmek var. Tabii bazlarnz hemen bunu bilmeyecek ne var diye sorabilirler. Siz yine de okumaya devam edin. Formlara nesne yerletirip bunlar iin kod yazabilmek iin yeni bir proje hazrladm ve projenin ilk(ayn zamanda balang) formuna button nesnesi yerletirebilmek iin Toolbox atm.

110

Memik Yank - Visual C#a Balang Kitab

Toolboxta listelenen seeneklere Component ad verilmektedir. Bu seeneklere kontrol da denilebilir. Bu kontroller gerekte .NET Framework ile birlikte gelen birer Classtr. Express Edition formlara yerletirilebilinen classlarn rneklerini alp kullanmanz konusunda size yardmc olmaktadr. Daha ak bir anlatmla Toolboxtan Button adl kontrol seip formu tklarsanz Button snfndan yola kp button1 adnda bir nesne hazrlam olursunuz.

Forma bu ekilde button1 adnda bir Button nesnesi yerletirince Express Edition bizim iin gidip bu formun Form1.Designer.cs adl kod dosyasna baz satrlar ekledi. Bu satrlarn sayesinde button1 nesnesi formun zerinde grnmeye balad. Baka bir anlatmla, forma Button nesnesi yerletirmekle biz gerekte Express Editiona diyoruz ki formun zerinde u zelliklere sahip bir dmenin olmas iin git Form1.Designer.cs dosyasnda baz ayarlamalar yap, button nesnesi hazrlayan satrlar ekle. imdi gidip bakalm Express Edition bizim iin projedeki ilk formun Form1.Designer.cs dosyasna neler yazm? Form1.Designer.cs dosyasnda aada verilen ekran grntsnde grlenlerden daha fazla satr olmasna ramen ekran grnts kk olsun diye yalnzca button1 nesnesiyle ilgili satrlarn grnmesine izin verdim.

Blm 6: Windows Forms Uygulamalar

111

Toolboxtan yararlanp forma button nesnesi yerletirildii zaman Express Edition(ayn eyler Visual Studio iinde sylenebilir) ilk olarak button1 adnda ve System.Windows.Forms.Button tipinde bir deiken tanmlyor. Bu srada forma 2. bir button nesnesi yerletirmeniz halinde Express Edition buna button2 adn verir. Tabi forma yerletirmi olduunuz nesnelere sonradan istediiniz ad verebilirsiniz. Siz siz olun bu nesnelere aktar gibi yerli yazarlar tarafndan sk kullanlan adlar vermeyin. Bakarsnz yarn bir gn yerli yazarn birisi dme adm almsnz diye sizden ikayeti olur. Bu nedenle dmelere argo isimler vermeniz nerilir. Express Edition veya Visual Studio, System.Windows.Forms.Button tipindeki deikeni tanmladktan sonra form iin daha nce hazrlanan InitializeComponent() adl metotta nce new anahtar kelimesi ile button nesnesi hazrlyor. Devamnda bu nesnenin Name, Location, Size, Text gibi birka zelliini ayarlyor. Bu srada Form1.Designer.cs dosyasndan button nesnesi ile ilgili satrlar silerseniz button nesnesini formun zerinden kaldrm olursunuz. nk formun zerinde button nesnesinin olmasna neden olan satrlar bunlardr. Bu satrlarla oynayp button nesnesinin zelliklerinde deiiklik yapabilirsiniz. Formlarn ve forma yerletirilen nesnelerin zelliklerini fare ile ayarlamak daha kolay olduu iin programclar ok gerekmedike nesnelerin zelliklerini ayarlamak iin Designer.cs dosyasna bavurmazlar. Forma dme yerletirmenin geri plannda nelerin olduu konusunda biraz bilgi sahibi olduktan sonra imdi button1 adl dmenin balk metnini yani Text zelliini deitireceim. Bu amala Form1.cs(Design) sekmesini tklayp Express Edition penceresi iinde Form1.Designer.cs adl kod dosyas yerine Form1in grsel yapsnn grntlenmesini saladm.

112

Memik Yank - Visual C#a Balang Kitab

Formlarn ve forma yerletirilen nesnelerin zelliklerini ayarlarken Properties penceresinden yararlanlmaktadr. Properties penceresini grntlemek iin View mensnden komut vermek gerekmektedir. Aada verdiim ekran grntsn button1 nesnesinin Text zelliini deitirdikten sonra aldm. Aslnda button1 adl nesnenin Text zelliini bu ekilde deitirmekle risk alm oldum. nk yarn bir gn yerli bir yazar ortaya kp Gsteri benim kitaptan almsn diye beni dava edebilir.

Properties penceresinde button1 adl nesnenin Text zelliinde deiiklik yaplrsa Express Edition bu deiiklii annda Form1.Designer.cs dosyasna yanstr. Bu button nesnesinin adn deitirmek istemi olsaydm Properties penceresinde Name zelliinde deiiklik yapardm. imdi yle bir ayarlama yapacam ki kullanc alma annda Form1deki dmeyi tklad zaman bir diyalog kutusu iinde kullancya mesaj verilmesini salayacam. Bu ilem iin yerli yabanc dier kitaplarn aksine size hemen button1in zerinde ift tklama yapn sonra da u satr yazn demeyeceim. in zn anlatmak iin Form1in grsel yaps grntlenirken View mensnden Code komutunu verip Form1e ait Form1.cs adl kod dosyasnn grntlenmesini saladm. Ekran grnts kk olsun diye using bloundan u anda gerekli olmayan baz satrlar sildim.

Blm 6: Windows Forms Uygulamalar

113

Kafanzn karmamas iin batan alaym: Express Edition veya Visual Studio ile Windows Forms uygulamas hazrlanp uygulamaya dahil edilen her form iin 2 kod dosyas hazrlanmaktadr. Form1.cs dosyasnda programcnn yazd kodlar yer alrken formun grsel yaps ile ilgili satrlar Form1.Designer.cs dosyasnda yer olmaktadr. Derleme srasnda bu 2 dosya bir araya getirilmektedir. Bu ekilde bir snfa ait kodlarn birden fazla kod dosyas arasnda paylalmasna Partial Class(paral snf) denilmektedir. Form1.cs dosyasna dikkatli baktnzda InitializeComponent() metodunun iletildiini grebilirsiniz. Bu metodun yani InitializeComponent metodunun Form1.Designer.cs dosyasnda olduunu biliyorsunuz. imdi Form1.cs dosyasndaki Form1 snfnn snrlar iinde button1 nesnesi tklandnda iletilmek zere bir metot hazrlayacam. Hazrladm metot Object ve EventArgs tipinde 2 parametreye sahiptir. nk herhangi bir button nesnesinin Click olayn ancak Object ve EventArgs tipinde 2 parametreye sahip metotlar temsil edebilmektedir.
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void ilk_button_Click(object sender, EventArgs e) { MessageBox.Show(Dmeyi tkladnz); } }

114

Memik Yank - Visual C#a Balang Kitab

Kendi hazrladm metoda ilk_button_Click() adn verdim. Dorusu, metoda, ilgili nesnenin adn artracak bir adn verilmesidir. alma annda projenin formundaki dme tklansa bile bu metot iletilmez. Bizim yapmamz gereken button1 nesnesinin Click olay ile, bu metodu ilikilendirmek olmaldr. Bu ilikilendirmeyi yapmaya en uygun yer Form1.Designer.cs dosyasndaki InitializeComponent() metodudur. Bu metodun iine yazdm satr aada grebilirsiniz.

Bu satrda eitliin sol tarafndaki button1 dmenin addr. Eitliin sol tarafndaki Click ise button1 nesnesinin tklama olayn iaret etmektedir. Tabii bu satrdaki this gznzden kamamtr: this, kendisi iin metot yazlan Form1 snfn temsil etmektedir. Eitliin sa tarafnda ise parantezin iine yazlann Form1.cs adl kod dosyasnda hazrladm metodun ad olduunu sylemekle yetineceim. Bu ayarlamadan sonra alma annda ne zaman Form1deki dme tklanrsa Form1.csdeki ilk_button_Click() metodu iletilir. Dikkat ettiyseniz yukarda Form1deki dme iin metot hazrlama ve bu metodu Click olay ile ilikilendirme konusunda Express Editiondan yararlanmadm. imdi hem Form1.cs dosyasndaki metodu hem de Form1.Designer.cs dosyasna yazp yukarda iaret ettiim satr sileceim. Ardndan metot hazrlama ve bu metodu Click olay ile ilikilendirme ilemini yaparken Express Editiondan yararlanacam. Tasarm annda forma yerletirdiiniz button nesnesini ift tklamanz halinde Express Edition sizin iin hem bir metot hazrlar hem de yukarda verilen satrn benzerini hazrlayp Form1.Designer.cs dosyasndaki InitializeComponent() metoduna ekler. Aada verdiim ekran grntsn yukarda kendi hazrladm metodu silip tasarm annda button1 nesnesini ift tkladktan sonra aldm.

Blm 6: Windows Forms Uygulamalar

115

Bu metot button1 nesnesinin Click olayn temsil etmesi iin hazrland iin Express Edition metoda ad seerken nesnenin ve olayn adn kulland. Tabii bu art deildir. Anlatlan ekilde hazrladnz metoda istediiniz ad verebilirsiniz. Bu andan itibaren alma annda Form1e yerletirdiim dme alma annda tklandnda bu metot iletilir. Tabi bu metot henz iletilebilir herhangi bir satr iermedii iin alma annda dme tklanp Click olaynn meydana gelmesi salansa bile tepki vermez. Tahmin edeceiniz gibi tasarm annda formdaki dme ift tklandnda bu metodun hazrlanmasndan baka Form1.Designer.cs dosyasnda bulunan InitializeComponent() metoduna yukarda verdiim satr eklenerek bu metot ile button1 nesnesinin Click olay ilikilendirildi. Forma yerletirilen button ve dier nesnelerin ilgili olayyla metotlarn ilikisi istenirse Properties penceresinde kurulabilir. Aada verdiim ekran grntsn aldm srada Properties penceresinde button1 nesnesinin zellikleri listeleniyordu.

116

Memik Yank - Visual C#a Balang Kitab

Properties penceresi 2 amaca ynelik olarak ilev grmektedir. Birincisi, form ve Toolboxtan yararlanlarak formlara yerletirilen nesnelerin zellikleri hakknda bilgi edinmek ve gerekirse bu zelliklerde deiiklik yapmaktr. Bu penceredeki Events dmesi tklandnda ise o srada seili durumdaki nesneye kaynaklk eden Classn olaylar listelenmektedir. Aada verilen ekran grntsn button1 nesnesinin zellikleri listelenirken Events dmesini tkladktan sonra aldm.

Bu button nesnesinin Click olay Express Edition(veya Visual Studio) tarafndan daha nceden Form1.cs dosyasndaki button1_Click() metoduyla ilikilendirildii iin Click olaynn karsnda bu metodun ad yazldr. Bu srada Click olaynn karsndaki metodun adn silerseniz Express Edition gider Form1.Desing.cs dosyadaki metot ile olay ilikilendiren satr siler. Konu zerinde dnmenizi salamak iin forma button2 adnda 2. bir dme yerletirip Properties penceresinden yararlanp bu dmenin Click olayna button1_Click adn vermi olduum metodun adn aktardm.

Bu artlarda alma annda formdaki 2. dme tklandnda Express Editionden yararlanp button1 iin hazrlayp button1_Click() adn verdiim metot iletilir. Bu artlarda button1_Click() metodu ile, hem button1in hem de button2nin Click olay ilikilendirildii iin alma annda ister button1 ister button2 tklansn ayn metot iletilir. Hem button1 hem de button2 iin Properties penceresinde Click olay iin ayn metodu semenin etkisiyle Form1.Designer.cs dosyasna aada verdiim 2 satr eklenir.
this.button1.Click += new System.EventHandler(this.button1_Click); this.button2.Click += new System.EventHandler(this.button1_Click);

Blm 6: Windows Forms Uygulamalar

117

imdi ise forma bir TextBox yerletireceim. ncelikle forma daha nce yerletirdiim button1 ve button2 adl dmeleri sileceim. Forma yerletirdiiniz dmeleri seip Delete tuuna basarsanz Express Edition gider Form1.Designer.cs dosyasnda bu dmelerle ilgili ne var ne yok her eyi siler. Ancak tasarm annda dmeyi ift tklayarak veya kendi hazrladnz bir metot varsa Form1.cs dosyasndan silinmez. Sz konusu metoda gerek duymuyorsanz kendiniz silebilirsiniz.

Forma yerletirmi olduunuz TextBox tasarm annda ift tklarsanz Express Edition TextBoxn TextChanged olay iin metot hazrlamak istediinizi varsaymaktadr. Bu nedenle TextBox ift tklarsanz hem Form1.cs dosyasnn ierii grntlenir hem de aadaki gibi bir metot hazrlanr.
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void textBox1_TextChanged(object sender, EventArgs e) { } }

Bu metot alma annda TextBoxn ierii deitirildike otomatik olarak iletilir. Ancak kendim bu TextBoxn TextChanged olay iin deil KeyPress olay iin metot hazrlamak istiyorum. imdi bir tekrar yapalm: Tasarm annda formu ift tklarsanz Express Edition ve Visual Studio sizin formun Load olay iin bir metot hazrlamak istediinizi, Button nesnesini ift tkladnzda button nesnenin Click olay iin metot hazrlamak istediinizi ve TextBox ift tkladnzda ise TextChanged olayn temsil edecek bir metot hazrlamak istediinizi varsaymaktadr. Madem forma yerletirdiim TextBoxn KeyPress olayn temsil edecek bir metot hazrlamak istiyorum o halde sz konusu TextBox seili iken Properties penceresinde TextBoxa ait olaylarnn listelenmesini salamalym.

118

Memik Yank - Visual C#a Balang Kitab

Bu TextBoxla ilgili olarak KeyPress olay meydana geldiinde(yani imle TextBoxn iinde iken kullanc klavyenin herhangi bir tuuna bastnda) iletilmek zere daha nce hazrladnz bir metot varsa bu olaya ait liste kutusunu ap bu metodu KeyPress olayyla ilikilendirebilirsiniz. Bu amala kullanabileceimiz herhangi bir metodumuz olmad iin KeyPress olaynn zerinde ift tklama yapmalyz. KeyPress olayn ift tkladnzda Express Edition hem bir metot hazrlar hem de Form1.Designer.cs dosyasna mdahale edip bu metot ile KeyPress olayn ilikilendirir.
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { } }

Express Edition tarafndan hazrlanan bu metotta, metot adndan sonra parantezlerin iinde (object sender, KeyPressEventArgs e) bilgisi var. Baka bir deyile TextBox1in KeyPress olayn temsil etmek zere hazrlanan bu metot Object ve KeyPressEventArgs tipinde 2 parametreye sahiptir. Baslan tuu temsil eden bilgi metoda KeyPressEventArgs tipindeki e adndaki parametre ile gnderilir. TextBoxn iinde iken Enter tuuna basld zaman TextBoxa girilmi bilgileri bir diyalog kutusu iinde ekrana getirmek iin bu metodu aadaki gibi dzenledim.
private void textBox1_KeyPress(object sender,KeyPressEventArgs e) { if (e.KeyChar == 13) MessageBox.Show(textBox1.Text); }

Bu metotta if deyimi ile en son baslan tuun ASCII kodu 13 olan Enter olup olmad aratrlyor. En son baslan tuun kodu 13 ise MessageBox

Blm 6: Windows Forms Uygulamalar

119

snfnn Show() metodu ile TextBoxn Text zelliinin ierii ekrana getiriliyor. En son baslan tuun kodu 13 deilse imle TextBoxn iinde bilgi girii iin beklemeye devam eder. Forma yerletirilen TextBox ve Button gibi nesnelerin deiik olaylarn temsil etmek zere metot hazrlama ileminin kavranmasna katk olmas iin TextBoxlarn Enter ve Leave olaylarndan sz edeceim. Formdaki herhangi bir nesneden TextBoxn zerine gittiinizde veya imlecin TextBoxa yerlemesine neden olduunuzda Enter olay meydana gelir. Bu olayn nasl kullanldna rnek olmas iin forma birden fazla TextBox yerletirip ilk TextBoxn Enter olayn temsil etmek zere aada verdiim metodu hazrladm. Tabii yarn bir gn yerli yazarn birisi ortaya kp TextBoxlarn Enter olayn temsilen metot hazrlamay ilk ben akl ettim, dolaysyla fikri haklarma tecavz ettiniz buyurun mahkemeye derse hi armamak gerekir. Zira bu memlekette bu byle bir iddiay onaylayacak ok sayda bilim eri vardr.
private void textBox1_Enter(object sender, EventArgs e) { textBox1.BackColor = Color.GreenYellow; }

Bu metoda yazlan satr sayesinde textBox1in zerine gidildiinde zemin rengi deiiklii olur. Kullanc TextBoxa bilgi girip baka bir kontroln yani nesnenin zerine gittiinde ise zemin rengini eski halinde evirmek istiyorsanz ayn TextBoxn Leave olayn temsil eden(yani Leave olay meydana geldiinde iletilen) metodu aadaki gibi dzenleyebilirsiniz.
private void textBox1_Leave(object sender, EventArgs e) { textBox1.BackColor = Color.White; }

Bazen istenen miktarda bilgi girmedii iin kullancnn TextBoxtan ayrlmasna izin verilmek istenmez. Bu gibi durumlarda Validated olayndan yararlanlr. Kullanc TextBox bo gemek istediinde buna izin vermemek iin TextBoxn Validated olayn temsil eden metodu aadaki gibi dzenledim. Bu metotta kullanlan Focus() metodu ile formdaki istenen nesnenin zerine gidilebilmektedir.
private void textBox1_Validated(object sender, EventArgs e) { if (textBox1.Text == "") { MessageBox.Show("Bu alan bo geemezsiniz"); textBox1.Focus(); } }

120

Memik Yank - Visual C#a Balang Kitab

Projeler in 2. Form Hazrlamak


Yukardaki sayfalarda iaret edildii gibi Express Edition ile gelen Windows Forms Application ablonu ile hazrlanan projeler Form1 adnda bir forma sahip olmakta ve bu form projenin balang formu olmaktadr. Projenizde 2. bir formun olmasn istiyorsanz Express Editionnn Project mensnden Add Windows Form komutunu verip ekrana aada verilen Add New Item diyalog kutusu getirmelisiniz.

Bu diyalog kutusunda zerinde altnz projeye kod dosyalar, formlar vs eklerken kullanabileceiniz ablonlar listelenmektedir. Projeye normal bir form eklemek istediim iin Windows Form ablonunu setim. Bu diyalog kutusunda kod dosyasna vereceiniz ad ayn zamanda hazrlanacak snfn yani formun ad olarak kullanlmaktadr. zerinde altm projeye Form2 adnda ikinci bir form ekleyince Express Edition penceresi aada verilen ekle dnt.

Blm 6: Windows Forms Uygulamalar

121

Add New Item diyalog kutusundaki Windows Form ablonundan yararlanp zerinde altm projeye Form2 adnda 2. form dahil edince bu formu temsilen ikisi kod dosyas olmak zere toplam 3 dosya hazrland. Form2.Designer.cs dosyasnda formun grsel yaps ile ilgili kodlar bulunurken Form2.cs dosyasnda ise programcnn yazd satrlar olmaktadr. imdi projedeki 2. formu balang formu olarak ayarlayacam. Baka bir deyile proje altrld zaman ekrana 2. formun gelmesini salayacam. Bu amala Program.cs dosyasndaki Main() metodunda Applicaiton snfnn Run() metoduna parametre olarak Form1 snfnn rnei yerine Form2nin rneini parametre olarak verdim.
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form2()); }

Projeki 2. Formu Ekrana Getirmek


Projenizdeki ikinci formu yani balang formu olarak kullanlmayan formu ekrana getirmek istiyorsanz baz hazrlklar yapmanz gerekir. zerinde altm projedeki 2. formu ekrana getirirken kullanmak zere ilk forma bir dme yerletirdim ve bu dmenin Click olayn temsil etmek zere aada verdiim metodu hazrladm. Bu metoda yazdm satr ile Form2 snfndan yola klarak ikinci_Form adnda bir nesne hazrlanmaktadr. Bakmayn siz baka kitaplarda bu ileme yavru(m) deiken tanmlama demelerine burada Form2 snfnn rnei hazrlanmaktadr, yani nesne hazrlanmaktadr.
private void button1_Click(object sender, EventArgs e) { Form2 ikinci_form = new Form2(); }

Yukardaki sayfalarda belirtildii gibi herhangi bir Classn(burada Form2) rnei hazrlanrken new anahtar kelimesi kullanlmaktadr. new anahtar kelimesinden sonra ilgili snfn yapc yani constructor metodunu kullanmak gerekiyor. Yukardaki sayfalarda belirtildii gibi snflarn yapc metoduna snfn ad verilmektedir. Buna gre Form2 snfnn yapc metodunun ad Form2() olmaktadr. C# programlama dilinde metotlar kullanlrken metot adna () eklenmektedir. Baz yazarlar bir snfn rneini almaya yavru deiken tanmlama diyorlar. Tabii bazlarnzn aklna yavru deiken olduuna gre torun

122

Memik Yank - Visual C#a Balang Kitab

deiken nasl tanmlanr sorusu gelmi olabilir. Size bir tiyo: Dnyann en zor ilerinden birisi nesneye ynelik programclk kavramlarna sahip olmadan C# gibi %100 nesneye ynelik programlama dilini anlatmaya soyunmaktr. Bu metoda yazdm satrda gerekte 2 ilem yaplmaktadr. lk ilemde Form2 tipinde deiken tanmlanmaktadr. 2. ilemde ise new anahtar kelimesi ile Form2 snfnn yapc metodu iletilip bu metodun geriye gnderdii nesne rnei(daha dorusu nesnenin referans) tanmlanan deikene aktarlmaktadr. Bu ekilde hazrlanan Form2 tipindeki nesne Show() metodu ile ekrana getirilir. Form snfnn Show() metodunun nasl kullanldn aada grebilirsiniz. 2 form ieren proje balatldnda projenin ilk formunun kendiliinden ekrana geldiini biliyorsunuz.
private void button1_Click(object sender, EventArgs e) { Form2 ikinci_form = new Form2(); ikinci_form.Show(); }

Bu kodda Form2 snfnn rneinin referansn tutacak deikene ikinci_form adn verdim. Olur ya yerli yazarn birisi de kitabnda ikinci_form adnda bir deiken tanmlamtr. Tedbir almazsam deiken ad almakla sulanabilirim. deiken ad alm m sorusuna cevap aramak amacyla bu metni okuyacaklara rehber olmas bakmndan yukarda verdiim kodu bir de aadaki gibi dzenledim. Yani bylece deikenlere ad seerken aresiz kalp baka kitaplardan deiken ad almay tercih etmediimi bilgisayar tahsili yapm retim yelerine, bilen kiilere ve yerli yazarlara kantlam oluyorum.
private void button1_Click(object sender, EventArgs e) { Form2 ikinci_kazma = new Form2(); ikinci_kazma.Show(); }

Bylece deikenlere ad bulabildiimi kantladktan sonra konumuza devam edebiliriz. Ekranda 2. form varken yukarda verilen kod iletildiinde, yani formdaki dme tekrar tklandnda ayn formun 2. veya 3. kopyas ekrana getirilir. Projedeki 2. formun 2. ve 3. kopyasnn ayn anda ekrana gelmesini engellemek iin kullanlabilinecek deiik teknikler olmakla birlikte ilk aklma geleni yazacam. Bu amala yukarda hazrladm kodu deitirip Show() metodu yerine ShowDialog() metodunu kullandm.

Blm 6: Windows Forms Uygulamalar

123

private void button1_Click(object sender, EventArgs e) { Form2 ikinci_form = new Form2(); ikinci_form.ShowDialog(); }

ShowDialog() metodu ile ekrana getirilen form kapatlmadan projenin ana formuna geilemez. Formlar ShowDialog() metodu ile ekrana getirmenin bir dier zellii ise udur: ShowDialog() metodu ile ekrana getirilen form normal bir ekilde yani Kapat dmesi tklanarak kapatldnda bellekten yok edilmeyip gizlenmektedir. Bu sorunun nne gemek, baka bir deyile hem 2. formu Show() metodu ile ekrana getirmek hem de ekranda ayn anda 2. kopyasnn olmasn engellemek iin deiken tanmlama satr dmeye ait Click() metodunun dna alnabilinir. Aada verilen kodda bu ilemi nasl yaptm grebilirsiniz. Yukarda verdiim kodda ikinci_form adndaki deikeni button1_Click() metodu snrlar iinde tanmladm iin bu deiken yani nesne ancak bu metodun snrlar iinde yaar. Aada verdiim kodda ise bu deikeni metodun snrlar dna, baka bir Class blouna aldm iin bu nesne bu Classn her yerinde yaar.
Form2 ikinci_form = new Form2(); private void button1_Click(object sender, EventArgs e) { ikinci_form.Show(); }

Bu artlarda formdaki dmeyi tekrar tklasanz bile projedeki 2. form tekrar ekrana getirilmez. Ancak bu ekilde ekrana getirdiiniz 2. formu kapattktan sonra Show() metodu ile tekrar ekrana getirmek istemeniz halinde hata meydana gelir. nk bu ekilde hazrlanp Show() metodu ile ekrana getirilen form normal bir ekilde kapatldnda otomatik olarak bellekten silinir. Dolaysyla yok edilen form tekrar ekrana getirilemez. Projedeki 2. formun ekrana getirilmesi srasnda yaanan btn sorunlarn nne gemek iin formu oluturan ve Show() metodu ile ekrana getiren satrlar ayn metoda yazdm ama form nesnesini new anahtar kelimesi ile tekrar olutururken mevcut olup olmadn aratrdm. Sz konusu form henz oluturulmadysa null olmaktadr.

124

Memik Yank - Visual C#a Balang Kitab

Form2 ikinci_form; private void button1_Click(object sender, EventArgs e) { if (ikinci_form == null || ikinci_form.IsDisposed) { ikinci_form = new Form2(); ikinci_form.Show(); } }

Yukardaki sayfalarda yazlanlara gre projede ka form olursa olsun Program.cs dosyasnda bu formlardan birisinin rnei new anahtar kelimesi ile hazrlanp Application nesnesinin Run() metoduna parametre olarak verilmektedir. Program.cs dosyasnda new anahtar kelimesini birden fazla kez kullanp farkl sonular elde edebilirsiniz. Bu konuda bilgi vermek iin 2 forma sahip yeni bir proje hazrladm ve Program.cs dosyasndaki Main() metodunu aadaki gibi dzenledim.
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); Application.Run(new Form2()); }

Bu artlarda proje altrlrsa Run() metodunun kullanld ilk satrda projenin ilk formu ekrana getirilir. lk form kapatldnda Run() metodunun 2. kez kullanld satr iletilir ve 2. form ekrana getirilir. Bu artlarda Form2 kapatldktan sonra projenin almas sona erer.

Formlar Kapatmak ve Projelerin almasn Sona Erdirmek


Projenizin balang formunu kapattnzda ister o srada ak olan baka form olsun ister olmasn projenin almas sona erer. ster projenin balang formu ister dier formlar kapatlmak istensin kapatlma ncesi FormClosing olay meydana gelmektedir. Bu olay meydana geldii zaman iletilecek bir metot hazrlayarak kullancy uyarabilir veya formun kapatlmasn engelleyebilirsiniz. Bu amala Properties penceresinde projenin ilk formunun zellikleri listelenirken Events sekmesine getim ve FormClosing olayn ift tklayp Express Editionnn aadaki gibi bir metot hazrlamasn saladm.
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { }

Blm 6: Windows Forms Uygulamalar

125

Metodun yaps incelendiinde birisi object tipinde dieri FormClosingEventArgs tipinde 2 parametreye sahip olduu grlr. Kullanc formu kapatmak isteyip FormClosing olaynn meydana gelmesine neden olduunda metotta e ad verilen FormClosingEventArgs tipindeki parametreden yararlanp formun kapatlmasn kullancnn onayna balayabilirsiniz. Bu ilemin nasl yapldn anlatmak iin bu metodu aadaki gibi dzenledim.
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { DialogResult Sonuc; Sonuc=MessageBox.Show("Pencere kapatlsn m?", Kapatma", MessageBoxButtons.YesNoCancel); if (Sonuc == DialogResult.No || Sonuc == DialogResult.Cancel) { e.Cancel = true; } }

Bu kodda nce DialogResult tipinde bir deiken tanmladm. nk kullancdan onay alnrken kullanlan MessageBox snfnn Show() metodu geriye DialogResult tipinde bilgi gndermektedir. Bu metotta MessageBox snfnn Show() metodunun 3 parametreli srmn kullandm. 3. parametre olarak MessageBoxButtons.YesNoCancel kullanarak ekrana getirilecek diyalog kutusunda Evet, Hayr ve ptal dmelerinin olmasn saladm. MessageBox snfnn Show() metodu ile ekrana getirmek istediim diyalog kutusunda Durdur, Yeniden Dene ve Yoksay dmelerinin olmasn istemi olsaydm 3. parametre olarak MessageBoxButtons.AbortRetryIgnore sabitini kullanrdm. MessageBox snfnn Show() metodu, tklanan dmeye bal olarak geriye DialogResult tipinde bir deer gndermektedir. Geriye gnderilen bilgiyi renmek iin Sonuc deikenin ieriini kontrol edip kullanc hayr veya iptal dmesini tkladysa metodun FormClosingEventArgs tipindeki 2. parametresinin Cancel zelliini True yapp formun kapatlmasn engelledim. Kullanc MessageBox snfnn Show() metodu ile ekrana getirilen diyalog kutusunda Evet dmesini tklarsa if deyimi ile yaplan karlatrma doru deerini vermeyecei iin e adl parametrenin Cancel zellii false olarak kalmaya devam edecei iin formun kapatlmasnn nne geilmemi olunur. Yukarda iaret edildii gibi projenizin balang formunu kapatmanz halinde projenin almas sona ermektedir. Varsayalm ki karnzda projenizin balang formu yok ve siz projenin almasn sona erdirmek istiyorsunuz. Bu durumda nce balang formunu aktif form yapp sonra

126

Memik Yank - Visual C#a Balang Kitab

kapatrsnz. Projenizin almasn sona erdirirken Application snfnn Exit() metodundan yararlanabilirsiniz. Bu metodun nasl kullanldn anlatmak iin forma Cikis adnda bir dme yerletirip bu dmenin Click olayn temsil eden metodu aadaki gibi dzenledim.
private void Cikis_Click(object sender, EventArgs e) { DialogResult onay; onay = MessageBox.Show("Projeden klsn m?", "Onay Kutusu", MessageBoxButtons.YesNo); if (onay == DialogResult.Yes) { Application.Exit(); } }

Bu metotta nce DialogResult tipinde bir deiken tanmladm. Ardndan kullancdan programdan klp klmayaca konusunda MessageBox snfnn Show() metodu sayesinde onay alnmaktadr. Show metodu bu ekilde kullanldnda ekrana getirilecek diyalog kutusunda Evet veya Hayr dmeleri olur.

Kullanc bu diyalog kutusundaki Evet dmesini tklarsa onay deikenine DialogResult.Yes bilgisi, Hayr dmesini tkladnda ise DialogResult.No bilgisi aktarlr. onay adn verdiim deikenine "DialogResult.Yes" sabiti aktarlmsa if deyimine parametre olarak verilen karlatrmann sonucu doru olur ve { ile } iaretleri arasnda bulunan satr iletilir ve Application.Exit(); satr ile projenin iletimi sona erdirilir

PictureBox Konrol
.NET Framework ile gelip Visual Studio ve Express Editionnn Toolboxnda yer alan ok sayda kontrol bulunmaktadr. Gerekte birer snf olan bu kontrollerin her birisinin farkl ilevleri vardr. Bu kitapkta ancak birka kontrolden sz edebildik. Programcla henz adm atanlarn ilgisini eken kontrollerden birisi PictureBox olduu iin ksaca PictureBoxtan sz edeceiz. Bu amala Toolboxtan yararlanp zerinde altm projenin formuna PictureBox nesnesi yerletirdim.

Blm 6: Windows Forms Uygulamalar

127

Forma PictureBox nesnesini yerletirdikten sonra PictureBox tarafndan snrlanan alanda istediiniz resim dosyasnn ieriini grntleyebilirsiniz. Bu ilemi Properties penceresinde yapmak yerine kod yazarak yapacam. Bu amala forma Button nesnesi yerletirip bu dmenin Click olay ile ilikilendirdiim metodu aadaki gibi dzenledim.
private void resim_sec_Click(object sender, EventArgs e) { pictureBox1.Image= System.Drawing.Bitmap.FromFile("C:\\jazz.jpg"); }

Bu metoda yazdm satrda System.Drawingde bulunan Bitmap snfnn FromFile() metodu ile ilgilendiim jpg dosyasn okuyup PictureBox nesnesinin Image zelliine aktardm. Express Edition ve Visual Studio ile hazrlanan projelerde System.Drawing adl namespace kod dosyasnn banda using deyimi ile kullanlacak snflarn aranaca listeye dahil edildii iin Bitmap snfndan nce namespace adn yazmayabilirdim. Burada dikkat edilmesi gereken bir nokta var: C#ta \ karakteri zel bir karakter olduu iin ift \\ kullanmak gerekiyor. PictureBoxta grntlenecek dosyay alma annda seebilmek iin forma ayrca bir OpenFileDialog nesnesi yerletirdim. OpenFileDialog nesnesi alma annda formun zerinde grnmedii, baka bir deyile grsel bir kontrol olmad iin formun altnda hazrlanan panele yerletirilmektedir.

128

Memik Yank - Visual C#a Balang Kitab

alma annda kullanc formdaki dmeyi tkladnda ekrana dosya seimi yaplan diyalog kutusunu getirmek ve seilen dosyay PictureBoxta grntlemek iin yukarda verdiim kodu aadaki gibi dzenledim.
private void resim_sec_Click(object sender, EventArgs e) { System.Windows.Forms.DialogResult Sonuc; openFileDialog1.Filter = "Resim Dosyalar |*.JPG;*.BMP;*.GIF"; Sonuc = openFileDialog1.ShowDialog(); if (Convert.ToString(Sonuc) == "OK") { string Dosya = openFileDialog1.FileName; pictureBox1.Image = System.Drawing.Bitmap.FromFile(Dosya); } }

Bu kodda tanmladm deiken ve nesnelere verdiim adlar(resim_sec, Sonuc ve Dosya) herkesin aklna gelebilecek birer deiken ad olduu iin deiken ad hrsz olarak anlmam an meselesidir. Bu nedenle yani bu kodda tanmlanan deikenlere baka adlar verilse bile kodun alacan kantlamak iin bu kodu bir de aadaki gibi dzenledim.
private void adam_sec_Click(object sender, EventArgs e) { System.Windows.Forms.DialogResult hatice_netice; openFileDialog1.Filter = "Resim Dosyalar |*.JPG;*.BMP;*.GIF"; hatice_netice = openFileDialog1.ShowDialog(); if (Convert.ToString(hatice_netice) == "OK") { string kutuk_oglu_kutuk = openFileDialog1.FileName; pictureBox1.Image=System.Drawing.Bitmap.FromFile(kutuk_oglu_kutuk); } }

Bu metotta nce System.Windows.Forms.DialogResult tipinde bir deiken tanmladm. Bu deikenden dosya seilen diyalog kutusunu kullancnn hangi dme ile kapattn renirken yararlanacam. Devamnda OpenFileDialog nesnesinin Filter zelliini ayarladm. Bu ayarlama sayesinde OpenFileDialog nesnesi ile ekrana getirilecek diyalog kutusunda yalnzca geerli klasrdeki JPG, BMP ve GIF uzantl dosyalarn listelenmesini saladm. FromFile() metodunun ilevi zerinde dnmenizi salamak iin nce bir Bitmap tipinde bir deiken tanmladm. Devamnda FromFile() metodu ile okuduum resim dosyasn Bitmap nesnesine, oradan da PictureBoxa aktarmaya altm.

Blm 6: Windows Forms Uygulamalar

129

private void resim_sec_Click(object sender, EventArgs e) { Bitmap resim; resim = Bitmap.FromFile("C:\\jazz.jpg"); pictureBox1.Image = resim; }

lk bakta bu 3 satrlk koddan sonu alnabilecei sanlabilir. Gerekte bu kod hataya neden olur. nk Bitmap snfnn FromFile() metodu geriye Image tipinde nesne gndermesine ramen Bitmap tipindeki deikene aktarmaya altk. Yukarda FromFile() metodunun geriye gnderdii nesneyi direk PictureBoxn Image tipindeki Image zelliine aktardmz iin sorun yaamamtk. Bu 3 satrlk kod aadaki gibi dzenlenirse hata meydana gelmez.
private void resim_sec_Click(object sender, EventArgs e) { Image resim; resim = Image.FromFile("C:\\jazz.jpg"); pictureBox1.Image = resim; }

Programclarn en ok gerek duyduklar ilemlerden birisi tipler arasnda dntrme yapmaktr. Image tipindeki nesneyi Bitmap tipindeki nesneye aktarmak iin bu kodu deitirip Bitmap tipinde deiken tanmlayp FromFile() metodunun geriye gnderdii Image tipindeki nesneyi dntrp Bitmap tipindeki deikene aktardm.
private void resim_sec_Click(object sender, EventArgs e) { Bitmap resim; resim = (Bitmap)Bitmap.FromFile("C:\\jazz.jpg"); pictureBox1.Image = resim; }

Burada 2. satrdaki (Bitmap) ile sz konusu bilgi Bitmap tipine dntrlmektedir. lgilenilen nesne hangi tipe dntrlmek isteniyorsa o tip parantezlerin iinde dntrlmek istenen nesnenin nne yazlmaldr. Burada kafalarn karmasna neden, Bitmap snfnn FromFile() metodunun geriye Bitmap yerine Image tipinde bilgi gndermesidir. Bitmap snfnn FromFile() metodu yerine Image snfnn FromFile() metodunu kullansaydm dntrme yapmaya gerek kalmazd.
private void resim_sec_Click(object sender, EventArgs e) { Image resim; resim = Image.FromFile("C:\\jazz.jpg"); pictureBox1.Image = resim; }

130

Memik Yank - Visual C#a Balang Kitab

Dntrme ileminin anlalmasna katk olmas iin imdi de ICO uzantl bir dosyay PictureBoxta grntleyeceim. Bu amala hazrladm kodu aada grebilirsiniz. System.Drawingde yer alan Icon snfnn Bitmap ve Image snflarnda olduu gibi FromFile() gibi bir metodu olmad iin ilgilendiim ico uzantl dosyay Icon snfnn yapc metoduna parametre olarak verdim.
private void resim_sec_Click(object sender, EventArgs e) { Icon ikon = new Icon("C:\\kapat.ico"); pictureBox1.Image = (Image)ikon ; }

lk bakta bu kodun hatasz alp Icon tipindeki nesnenin Image tipine dntrlp PictureBoxta grntlenecei sanlabilir. Ne ki burada yapld gibi icon tipindeki nesneyi Image nesnesine dntrmek mmkn olmad iin Icon snfnn ToBitmap() metodundan yararlanmak gerekiyor. Bu metodun nasl kullanldn aada grebilirsiniz.
private void resim_sec_Click(object sender, EventArgs e) { Icon ikon = new Icon("C:\\kapat.ico"); pictureBox1.Image = ikon.ToBitmap() ; }

Blm 6: Windows Forms Uygulamalar

131

C# 3.0 Kitabm Hakknda


Aslnda bu kitap zerine konumadan nce yaynlanm baka C# kitaplarn incelemi olsaydm bu kitabn farkn daha rahat ortaya koyabilirdim. Ne var ki i, j, ayi1, sayi2 gibi deikenleri almakla sulanp dava edildiim gnden bu yana Trk yazarlar tarafndan kaleme alnm kitaplara mmkn mertebe bakmyorum. Tabi bazlarnz hemen beni uyaracaklardr: Trk yazarlar tarafndan kaleme alnm kitaplar incelemeden "deiken ad benzerlii" kabahatinden kendini nasl korursun? Valla keeyi bir kez suya attk ve deiken almakla sulanp hakim karsna ktma gre cesur olmaktan baka are yoktur. Eklemem gerek: Deiken ad almakla sulanmama neden olan sizlersiniz. Eer beni dava eden ve ahane kitaplar yazan saygdeer yazarlarn programclk kitaplarn er beer satn alsaydnz u anda mahkemelerde srnmezdim. Size nerim Memik Yank'n hepsiburada.com'dan veya kitapyurdu.com'da bulacanz kitab yerine Memik Yank' deiken almakla sulayp dava eden yazarlarn ahane C# kitaplarn en azndan ikier adet satn almanzdr. Biliyorsunuz C# 3.0 kitabm biraz gecikmeyle bir sre nce yaynland. Bilmeyenler iin hatrlatmak gerekirse gecikme nedeni kitapta deiken ad tadilatna(!) gitmi olmamdr. Madem kitapta verdiim ksa ksa kodlarda deiken ad ve nesne ad benzerlii kabahatini ilememek iin kitab yeni batan dzenlemek gerekti. Ben de kitaba birka yeni blm ekleyip baz konulara ayrlan sayfalarn saysn azalttm. Bununla da yetinmedim; artlar zorlayp kenar boluklarn azaltp kitapta daha ok konuya yer vermeye altm. C# 3.0 zerine yazdm bu kitabn nasl bir kitap olduunu, nasl bir anlatm biimine sahip olduunu merak edenler bu kitaptan alp kiisel web sitemde daha nce yaynladm Hata Yakalamak ve Exception Snflar ile C# Uygulamalarnda Wordden Yararlanmak adl makalelerime bakabilirler. Tabii C# konusunda henz yolun banda olanlarn bu makalelere bakp kitap hakknda deerlendirme yapmalar zor olaca iin kitap hakknda biraz konuacam.

132

Memik Yank - Visual C#a Balang Kitab

Merakllara nerim udur: Btn web sitelerini gezin, sizde veya arkadalarnzdaki btn C# konulu kitaplar elinize aln ve C# uygulamalar dahilinde Word'den nasl yararlanldn anlatan metinlere bir bakn. Sonra da yukarda verdiim linkte bu kitabn ilgili blmne yle bir gz gezdirin. Memik Yank'n anlatmnda bir fark gremiyorsanz "Ne de olsa bu adam i, j, sayi1, sayi2, deger gibi deikenlerin adn alm birisi" deyip bu kitaptan uzak durun. Kitabn bir blmne bakp deerlendirme yapmak yanltc olabilir diyorsanz bir de Hata Yakalamak ve Exception Snflar adl blme bakn. Yok hayr ngilizcesi yeterli olmayan Memik Yank eviri yapmtr diyorsanz u linkteki Programclar in Yazarlk Dersleri adl e-book'u biraz inceleyin derim. Bu e-book'tan bilgisayar ve programclk zerine yazmay dnen arkadalarnza sz etmeyi unutmayn. Bu kitab yazarken arlkl olarak Visual Studio kullanm olsam bile Visual Studio yerine C# iin hazrlanm olan Express Edition kullananlar herhangi bir zorluk ekmezler. tesi baz yksek okullarda verilen C#

Blm 6: Windows Forms Uygulamalar

133

derslerinde balangta konsol uygulamalar tercih ediliyor. Bu nedenle baz arkadalarmz gidip C# anlatlrken yalnzca konsol uygulamalarnn kullanld kitaplar tercih ediyorlar. En bata belirtmeliyim ki bu kitapta konsol uygulamalar hakknda yeterince bilgi vardr. En kapsaml Trke C# kitab iddias ile hazrladm bu kitapta baz konularda ayrntya giremedim. rnein Generic snflar kabul edilebilir bir ayrntda anlatabilmem iin kitaba en az 50 sayfa daha eklemem gerekirdi. Kitapta giri dzeyinde bilgi verilen bir dier konu LINQ teknolojisidir. Yurtdnda yalnzca LINQ hakknda bilgi ieren ok sayda kitabn yaynlandn sylersem ne demek istediim sanrm anlalr. Ksaca anlatmak gerekirse; C# renmeye bu kitapla balayanlar veya C# konusunda kendini gelitirmek isteyenleri temelden alarak C# ve .NET programcl uzmanlk dzeyine karmay hedefledim. Bu kitabn fark nedir diye soracaklara vereceim cevap udur: Bu kitapta btn konular ilk okumada anlalacak yalnlktadr. Hayr hayr bu yalnlk yalnzca deiken tanmlama, Integer bilgiyi String bilgiye dntrmenin nasl anlatld sayfalarla snrl deildir. rnein bu kitapta Windows Mesajlar adl blmde anlatlanlar da ilk okumada anlalacak yalnlktadr. Benzer eyler Garbage Collector hakknda yazlanlar iin de geerlidir. Kolay okunmann, hemen anlalmann forml nedir diye merak edenler Yazarlk Dersleri adn verip sizlerle paylatm e-booka bakabilirler. Bu kitab edinmek isteyenler seckin.com.tr'den, hepsiburada.com'dan veya kitapyurdu.com'dan talep edebilirler. Bu kitabn fiyat hakknda deerlendirme yapmak isteyenlere kitabn fiyatn toplam sayfa saysna blp sayfa bana ne dediklerini renmelerini nermek isterim. Kitap fiyatlar konusunda bir cmle daha : Satn aldnz kitaba(yaynlanmasnn zerinden yllar gememise) dediiniz ile, kitabn kapak fiyat arasnda uurumlar yani %30, %40 gibi farklar varsa kitabn kapak fiyat pazarlama taktii olarak yksek seilmitir denilebilir. Bir kitap sat sitesi kitabn kapak fiyat zerinde %15-20 indirim yapmas son derece normaldir.

134

Memik Yank - Visual C#a Balang Kitab

C# 3.0 Kitabm Anlattm


Bu yaznn amac bu kitabn satn arttrmak deildir. Bu yaznn amac olsa olsa byle bir kitaba ihtiyac olmayanlarn bu kitab satn alp para ve zaman kaybetmelerinin nne gemek olabilir. Her ne kadar bu kitap .NET 3.5 destekli C# 3.0 anlatmak kaygs ile kaleme alnm olsa bile C# 3.0 piyasaya verileli az olmad. Bu bilgiyi unun iin yazdm: Mevcut bir iletim sisteminin veya bir programlama dilinin yeni srm ktnda zellikle yurt dnda sca scanda yeni srmle gelen yeniliklere odaklanan kitaplar yazlp yaynlanmaktadr. Byle kitaplar eski srm hakknda bilgisi olup yeni srmle gelen yeni zellikler hakknda hemen bilgi edinmek isteyenlere uygundur. En bata sylemeliyim ki bu kitap C# 3.0 ve .NET 3.5la gelen yenilikleri anlatmak kaygs ile kaleme alnan bir kitap deildir. Baka bir deyile bu kitabn hedef okuru programclk nedir az ok bilip C# ve nesneye ynelik programclkta uzman olmay kafasna koyanlardr. Bu nedenledir ki bu kitapta konular temelden ele alnarak 1100 sayfa boyunca C# anlatld. C# anlatlrken .NET Framework 3.5 ile gelen C# 3.0 derleyicisi ve Visual Studio 2008 kullanld. Bu yazda asl bu kitapta C# nasl anlattm sorusuna cevap aramaya alacam. Elbette C# uygulamalar gelitirmek iin kullanlan bilgisayara .NET Framework kurulup Not Defteri program ile istenen programlar yazmak mmkn olsa bile bu zahmetlidir. Bu nedenle C# veya .NET uyumlu baka bir programla diliyle uygulama gelitirmek isteyenler Visual Studioyu veya C# iin hazrlanm Express Edition kullanmay tercih ediyorlar. Bu nedenledir ki bu kitabn banda 18 sayfa boyunca Visual Studio ile hazrlanan C# uygulamalarnn temel zellikleri ve bu uygulamalarn nasl derlenip altrld ve nasl debug edildiinden ksaca sz edildi. te bu kitabn ilk blmyle ilgili olarak kitaptan alnm bir paragraf : Bu blmde ileride ilenecek baz konulara temel oluturan birka ayrntdan sz edilmektedir. Aslnda C# programlama dilinden bamsz olarak Visual Studio hakknda yzlerce sayfa yazlabilir. Ne ki bu kitabn byle amac yoktur. Kitabn iindekiler sayfasna bakp bu kitabn 18 sayfas ekran grntleriyle doldurulmu diye eletireceklere unu sylemek isterim: lk blmde Visual Studionun yardmyla uygulama gelitirilirken karlalan en nemli kavramlardan birisi olan Debug ve Release modlarndan sz edilmektedir. Bu kitabn C# ile Programcla Giri adl 2. blmnde C# ve nesneye ynelik programclk hakknda kubak bilgi verilmektedir. Bu sayede okurun C# ve nesneye ynelik programclk hakknda temel bilgilere sahip olmas hedeflendi. Bu kitab incelemeden eletirmeyi kafalarna koymu olanlara unu sylemek isterim:Memik Yankn C# 3.0 kitabnn 36 sayfadan meydana gelen Programcla Giri adl 2. blmn okuyanlar metotlarla olaylar kartrmazlar, Application snfnn ilevinden bi haber

Blm 6: Windows Forms Uygulamalar

135

olmazlar, formlarn nasl hazrlanp ekrana getirildiini bilirler. Aada verdiim paragraf kitaptan olduu gibi buraya aldm: Daha nce az ok kod yazm olanlar bir sonraki blme yle bir baktklarnda btn yazlanlarn bildikleri konular olduklarn sanabilirler. Sanabilirler diyorum nk bir sonraki blmde C# ile program yazlrken gerek duyulan pek ok kavram hakknda teknik aklamalar yaplmaktadr. Bu nedenle bu kitab eline alan herkesin bir sonraki yani 2. blm dikkatli okumasn neriyorum. Tabii bu neri kitapda veya herhangi bir yerde bu kitab satn almayacaklar nceden belli olup ta meraktan bu kitab yle bir gzden geirenleri veya C# hakknda yeterince bilgisi olanlar kapsamyor. Byle bir kitaba ihtiyalar olmayanlarn bir sonraki blmde yazlanlara yabanc olmamalar normaldir. Bir sonraki blmn gerek ierik gerekse de konularn ileyii bakmndan btn yerli yabanc kaynaklardan ayrldn syleyebilirim. Elbette bu kitabn 2. blmnde yazlanlarn bir ksmnn baka kaynaklarda bulunma ihtimali yksektir. Programclk kitaplarnda bilim yapmadmza gre bu kitapta anlatlan her konunun baka kaynaklar bulunmas son derece normaldir. Kitaplarn arasndaki en nemli fark konularn anlatm biimi ve hikye edilme tarzdr. Gelelim bu kitabn Konsol Uygulamalar adl 2. blmne. Bir sonraki blm bir bakma Programcla Giri adl 2. blmn devam gibidir. nk Konsol Uygulamalar adn verdiim 3. blmde C# kodu yazlmak istendii zaman ilk gerek duyulacak kavramlar ve en ok kullanlan .NET snflarn anlatmaya altm. Her ne kadar konsol uygulamas gelitirip bakasna verme ihtimaliniz dk olsa bile bir sonraki blmde C# ile program yazmann geri plan zerinde biraz durulmaktadr. Tabii bununla da yetinilmeyip Konsol Uygulamalar dahilinde Windows Formlarnn nasl ekrana getirilebilecei anlatlarak referans ve namespace kavramlar hakknda n bilgi verilmeye allmaktadr. Yine baz arkadalar madem Windows formuna gerek duyuyorsun da neden konsol uygulamas hazrladn diye sorabilirler. Bu soruyu soran arkadalara aada verilen 2 Main() metodunu incelemelerini nermek isterim.
static void Main(string[] args) { Form1 F1 = new Form1(); F1.ShowDialog(); Console.ReadKey(); } static void Main(string[] args) { Form1 F1 = new Form1(); F1.Show(); Application.Run(); Console.ReadKey(); }

136

Memik Yank - Visual C#a Balang Kitab

Sizce Memik Yank konsol uygulamasnn Main() metodunu bu ekilde dzenlemekle neyi hedeflemektedir? Sizce hangi kaynakta(yerli yabanc fark etmez) Form nesnesi Application snfndan yararlanlmadan Show() metodu ile ekrana getirilmeye allmtr? Hayr hayr Memik Yank Amerikay yeniden kefetmiyor; Memik Yankn burada yapt okurun dikkatini Application snfnn ilevine ekmektir. Sizce Application snf hakknda yeterince bilgi edinmemi birisi Windows mesajlarn hakkyla anlayabilir mi? Gelelim bu kitabn 4. blmde anlatlan u Namespace kavramna. Her ne kadar bu kitabn 2. ve 3. blmlerinde referans ve namespacelerden sz edilmi olsa bile .NET programclnda henz yolun banda olan birisi iin Namespace kavram hakkyla renmesi gereken kavramlardan birisidir. Tabi henz yolun banda olan birisine namespace kavramn en bata anlatacam deyip kafasn kartrmamak gerekir. Bu dnce ile namespaceler hakknda bilgi vermeye kstl bir konsol uygulamas hazrlayarak baladm. nk C# derleyicisinin derleme yaparken neyin snf neyin namespace olduuna karar verirken nasl bir yntemi kullandnn bilinmesi gerekiyor. Bu nedenle Memik Yankn kitabnda derleme hakknda bilgi verirken System.dll ve System.core.dll adl referanslardan sz etti. Namespace adl blmn ileri ki sayfalarnda .NET Framework ile gelen Namespacelerdeki snflar kullanmaktan te programclarn kendi snflarn nasl namespace olarak dzenleyebileceklerinden sz edildi. Tabii ki C# konulu kitaplarn hemen hepsinde nasl namespace hazrlandndan sz edilmektedir. Memik Yankn C# kitabnn 5. blmnde 36 sayfa boyunca deikenler hakknda bilgi verilmektedir. Baz okurlara gre deikenlere bu kadar sayfa ayrmann gerekesi nedir diye sorabilirler. Elbette daha nce C# hakknda az ok bilgi edinmi olanlar gz nne alrsak deikenlere daha az sayfa ayrmak gerekirdi. rnein daha nce C# konulu kaynaklar okumu olanlar deikenlerin nasl tanmlanp nasl ilk deer aktarldn bilirler. Her ne kadar bu blmde Nullable tiplerden, Parse() metodundan, Convert snfndan sz edilse bile bu kitab bu blm balamnda deerlendirecek olursam unlar syleyebilirim: Bu kitabn bu blm balamnda bir arts varsa deikenlerin btn ynleri ile ele alnm olmasdr. Bu nedenle deikenler konusunu bu kitaptan okuyan birisi deikenlerle ilgili olarak baka kaynaklara bakma gereini duymaz. Benzer eyler bu kitabn 6. blm iin de sylenebilir. nk kitabn 6. blmnde 18 sayfa boyunca dizi deikenler ve Array snf her ynyle en ince ayrntsna kadar anlatlmaktadr. Belki bu kitap Deikenler adl blm balamnda yle eletirilebilir: Bu metni biraz kesip, baz metot ve ilemlerden sz etmeyip birka sayfa tasarruf edebilirdiniz. Ancak ben tercihimi dizi deikenleri her ynyle anlatmak ynnde yaptm. Yani istedim ki bu kitab edinenler C#la ilgili temel konular renirken baka kaynaklara bavurma gereini duymasn.

Blm 6: Windows Forms Uygulamalar

137

imdi srada bu kitapta toplam 8 sayfa yer tutan Operatrler adl blm var. Tabi hemen baz arkadalar 8 sayfa boyunca art(+), eksi(-), blme(/) vs.. operatrlerinden sz etmi olduumu dnebilirler. Bu blmde bu operatrlere ksaca deinilmi olsa bile asl arlk Kaydrma Operatrleri ile as ve is operatrlerine verildi. nk as ve is operatrleri ok sk kullanlmaktadr. Devamnda 3 sayfa boyunca bit dzeyinde ilem yaplrken kullanlan operatrlerden sz edildi. Matematiksel ilemlerde kullanlan operatrler hakknda bu kitapta yazlanlar karlsa bile sayfa says deimiyordu. Bit dzeyinde ilem yaplrken kullanlan operatrlerden yararlanmak son derece teknik bir ilem olmasna ramen konular yle hikaye edildi ki ilk okumada mutlaka anlalacak yalnlktadr. Bu kitabn Blok Kontrol adl blmnde 10 sayfa boyunca if, while, for, foreachten sz edildi. Bu kitabn bu blm balamnda dier kitaplara bir arts pek yoktur. Ancak balangta zor anlalan foreach dngsn daha nce hi duymam olanlar bile bu kitabn ilgili sayfalarn okuduklarnda foreach dnglerine hemen hakim olabilirler. Bu kitabn 9. blmnde 26 sayfa boyunca string ilemlerinden ve Math snfndaki metotlardan sz edilmektedir. Neden mi bu konuyu nemsedim? nk kod yazlrken en ok yaplan ilemlerin banda string ilemleri gelmektedir. Elbette String ve Math snflarnn baz metotlarn gz ard edip bu blmn sayfa saysn 22ye drmek mmknd. Bu durumda C# ile programclkta yeni olan okurlarn baka kaynaklara bavurma ihtiyac olurdu. Akas istedim ki bu kitab her kim edinirse String ve Math snfnn metotlar konusunda eksiksiz bilgiye sahip olsun. rnein String snfnn Splip metodunu ayrntl bir ekilde anlattm. Bu kitabn 14 sayfalk 10. blm bir bakma String lemleri adl 9. blmn devam gibidir. nk 10. blmde StringBuilder snfndan ve Dzenli fadelerden sz edilmektedir. Tam bu noktada bu kitabn boyutlarndan ksaca sz etmek istiyorum. Bu kitabn yaz alann genilii tam tamna 13 cmdir. sim vermeye gerek yok ayn genilie sahip(16 cm) birok kitapta yaz alan genilii en fazla 11.5 cmdir. Asl demek istediim udur: Toplam 1074 sayfa olan bu kitap baka yaynevlerinin lleri ile baslsayd sayfa says en az 1200 olurdu. Yani anlayacanz bu kitabn sayfa saysn azaltmak srekli aba harcadm. 11. blmde 16 sayfa boyunca tarih ve zaman bilgileri btn ayrntlar ile anlatlmaktadr. Baka bir deyile bu kitab okuyan birisi iin tarih ve zaman bilgileri zerinde yaplan ilemler balamnda bilmedii hibir ayrnt kalmaz. Ayrca bu blm okuyanlar Ticks zellii ve TimeSpan yaps hakknda bilgi sahibi olurlar. Baz arkadalar yine itiraz edip Tarih ve zaman bilgileri zerinde yaplan ilemleri anlatmak iin 16 sayfa fazla deil mi? Bir gre gre evet. artlar zorlayp bu blmn sayfa saysn 12 veya 14e indirmek mmknd. tesi birok kitapta bu konuya ayrlan sayfa says betir. Buna ramen neden mi bu konuyu btn ayrntlar ile anlattm. nk

138

Memik Yank - Visual C#a Balang Kitab

izlediim forumlarda zaman ve tarihsel bilgiler zerinde yaplan ilemlerle ilgili ok sayda soru sorulmaktadr. Baka bir deyile her C# programcsnn bu ilemlere ihtiyac olduundan herkesin bu ilemler hakknda bilgi sahibi olmas gerekiyor. Bu kitabn 12. blmnde toplam 12 sayfa boyunca Pointer deikenlerden sz edilmektedir. Son derece teknik bir konu olan Pointer deikenler hakknda bu kitapta yazlanlar ilk okumada anlalacak yalnlktadr. tesi bu blmde IntPtr tipi deikenlerden sz edilmektedir. Trkiyede IntPtr tipi Pointer deikenlerden ilk sz edenin Memik Yank olduunu dikkatinize sunmak isterim. IntPtr tipi Pointer deikenler ok mu nemlidir? Windowsun API ad verilen fonksiyonlarn kullanmay dnyorsanz IntPtr tipi Pointer deikenler hakknda az da olsa bilgi sahibi olmak durumundasnz. Her ne kadar bu kitabn Programcla Giri ve Konsol Uygulamalar adl 2. ve 3. blmlerinde Class kavramndan az ok sz edilmi olsa bile konunun ayrntlar 13. blmden itibaren anlatlmaktadr. Birok yerli yabanc kitapta Classlardan sz edilirken memeli hayvanlardan, arabalardan vs. sz edilir. Baka bir deyile Class kavramnn zor anlalmas iin herkes gr birliine varm gibi. Memik Yank nesneye ynelik programclk udur, u ilkeleri vardr vs demeden direk kod zerinde Class kavramndan sz eder. rnein Memik Yank bu kitabn ta ilk sayfalarnda yle bir cmle kurdu: C# programlarn Class olarak dzenlemek zorunluluu vardr. Bu nedenle aadaki gibi bir Class blou hazrladm. Bu kadar basit. Henz yolun banda olan ve programclkla ilgili temel kavramlardan bile bi haber olan birisine memelilerden, arabalardan vs sz etmek kafalar kartrmaktan te bir ie yaramaz. tesi C#la ilgili kaynaklarda deikenalan ayrmndan hi sz edilmez. Tamam kitabn banda eski alkanlklara uyup alanlara deiken denilmesi belki anlatm kolayl salyor ama Classlar ve nesneye ynelik programclk anlatlrken deikenlerin gerekte alan olduundan hi sz edilmez. Daha nce az ok program yazm ve nesne nedir Class nedir sorularna verecek cevab olan birisi Memik Yankn kitabndaki Classlar ve Nesneye Ynelik Programclk adl 38 sayfalk blme yle baktna kesin burun kvracaktr. Sanki Memik Yank bu blm C# uzmanlar iin yazm ta uzmanlarn bu metinden renecei yeni bir ey yokmu. Sanki Memik Yank bu blm herkesin iine yarayacak Class rnekleri hazrlamak iin kaleme alm. Bu blmn amac Classlar ve Classlarn yelerinden sz etmektir, yapc ve yok edici metotlarn nasl hazrlandn okura gstermektir, statik yapc metotlarn ilevinden sz etmektir. Eer okurun birisi bu blm okuyup Classlar hakknda genel bilgiye sahip oluyorsa bu blm ilevini yerine getirmitir. Her ne kadar bu kitabn Classlar ve Nesneye Ynelik Programclk adl blmde Classlarn en nemli yesi metotlardan sz edilmi olsa bile metotlar ayr bir blmde ayrntl bir

Blm 6: Windows Forms Uygulamalar

139

ekilde incelendi. Baka bir deyile Memik Yankn C# 3.0 kitabnn 16 sayfalk 14. blmn okuyanlar metotlarla ilgili her tr bilgiye sahip olurlar. Bu kitabn 15. ve 16. blmlerinde ndeksleyiciler ve Interfacelerden sz edildi. Nesneye ynelik programclkta indeksleyiciler zor anlalan konulardan birisidir. Memik Yank 10 sayfalk bu blm yle bir kaleme ald ki hayatnda daha nce indeksleyici kavramn hi duymam olanlar bile ilk okumada yazlan her eyi anlayabilirler. Benzer eyler 12 sayfa boyunca Interfaceler hakknda bilgi verilen blm iin de sylenebilir. Gelelim nesneye ynelik programcln hem nemli hem de zor anlalan 2 konusuna: Delegate ve Olaylar. Sizce Delegateler ve Olaylar neden zor ve genellikle yanl anlalan 2 konudur. Tabi baz arkadalar yle bir yorum getirecekler: Forma bir Button nesnesi yerletirirsin sonra tasarm annda bu button nesnesini ift tklarsn vs.. Zaten Delegate ve Olaylarn zor ve yanl anlalmasnn temelleri Button nesnesinden ve tasarm annda Button nesnesi ift tklandnda hazrlanan kodun anlatl eklinde yaplmaktadr. Hal bu ki gerek bakadr: Tasarm annda formdaki Button nesnesi ift tklandnda Visual Studio programcnn sz konusu Button nesnesinin Click olayn temsil edecek bir metot hazrlamak istediini varsayp Click olaynn yapsna uygun bir metodu hazrlayp Click olayyla ilikilendirmektedir. Tabii kullanc alma annda button nesnesini tkladnda Button nesnesiyle ilgili olarak Click olaynn nasl tetiklendiinden sz edilmedii iin konu havada kalyor. Memik Yank bu dnceyle 20 sayfa boyunca delegate ve olaylardan sz etti. Bu kitabn 16 sayfalk Stuct ve Enum Tipleri adl blmn okuyanlar Structlarn ne olduu, hangi amalarla kullanld, snflarla structlar arasnda ne gibi farklarn olduunu ksa srede renirler. Devamnda Enum tipleri hakknda ayrntl bilgiye sahip olduu gibi Enumlarla ilgili olarak baka kaynaklara bavurma ihtiyac kalmaz. Gelelim bu kitabn 12 sayfalk Object Snf adl blmne. Btn C# kitaplarnda dakka 1 gol 1 misali daha ilk sayfadan Object snfndan sz edilir. Okur kitabn sonuna kadar gelir ama hala Object snf hakknda derli toplu bilgiye rastlamaz. Object snf hakknda yeterli bilgiye sahip olmayan okur ToString() metoduyla ilgili olarak anlatlanlar kavramakta zorlanr. Memik Yank ne mi yapt? Kitabnn ortalarna bile gelmeden Object snfnn nemli grd zelliklerini ve metotlarn anlalr bir dille anlatt. Bu kitabn mevcut yerli yabanc C# kitaplarna fark atlan blmlerden bir dieri Koleksiyon Snflar adl 20. blmdr. Bu blmde 48 sayfa boyunca .NET Framework ile koleksiyon snflar ve bu snflarla ilgili btn Interfaceler ayrntl bir ekilde anlatlmaktadr. Bu blmn tmn okuyan birisi kendisini koleksiyon uzman olarak ilan edebilir. Koleksiyonlar konusu olduka kapsaml olduu iin BitArray, BitConverter, Buffer, StringCollection ve StringDictionary snflarn ayr bir blm olarak

140

Memik Yank - Visual C#a Balang Kitab

dzenledim. Tabi hemen aklnza Generic koleksiyonlar ne yaptnz Sorusu gelmi olabilir. Bu kitabn 22. blmnde 26 sayfa boyunca nce .NET Framework ile gelen Generic koleksiyon snflarndan, devamnda Generic snflarndan sz ettim. Yurt dnda yalnzca Generic snflardan sz edilen bamsz kitaplar yazldna gre bu kitabmda Generic koleksiyonlar ve snflar btn ynleriyle anlatmadm tahmin etmi olmalsnz. imdi szn edeceim 3 blm gerek ierik gerekse de anlatm ekli bakmndan mevcut(tabi bu deerlendirme benim grebildiim kitaplarla snrldr) kitaplara fark atmaktadr. Her ne kadar Hata Ayklamak ve Debug lemleri adl 18 sayfalk blmn ilk 7 sayfasnda anlatlan konular hemen her kaynakta bulmak mmkn olsa bile bu blmn dier sayfalarnda Debug, Trace, TextWriterTraceListener ve EventLogTraceListener snflar hakknda ayrntl bilgi verilmektedir. 27. blmde ise hata yakalanrken kullanlan Exception snflar anlatlmaktadr. Tabii ki baka kaynaklarda da Exception snflar hakknda bilgi bulabilirsiniz. Gelelim u Application snfna. Dier kaynaklarda Application snfnn baz zellikleri ve metotlar hakknda bilgi veriliyor olsa bile hibir kaynakta 14 sayfa boyunca yalnzca Application snfndan sz edilmemektedir. Bu kitabn iindekiler sayfasna bakan birisi Form Snfnn zellikleri, Olaylar ve Metotlar adl blmde 18 sayfa boyunca klasik olarak formlarn herkes tarafndan bilinen zelliklerinden sz edildiini sanabilir. te size bu blmden alnma 3 satrlk kod.
protected override void OnCreateControl() { base.OnCreateControl(); }

Tabii ki burada bu 3 satrlk kodun ilevinden sz etmeyeceim, demek istediim udur: Bu koda baka basl kaynaklarda rastlama ihtimaliniz son derece dktr. Baka bir deyile blmn ad Form Snfnn zellikleri olsa bile son derece teknik bilgiler iermektedir. Bu kitabn dier basl kaynaklar balamnda en sradan blm Sk Kullanlan Kontroller adl blmdr. Bu blmde sk kullanlan 20ye yakn kontrol 36 sayfa boyunca anlatlmaktadr. Bu kontroller anlatlrken daha nce az ok kod yazm herkesin ilk bakta tahmin edecei zellik ve metotlardan sz edilmedi. Bu kitabn Dosya ve Klasr lemleri adl 36. blmnde 28 sayfa boyunca C# kodu yazan birisinin gerek duymas muhtemel btn bilgiler verilmektedir. Baka bir deyile bu blm okuyanlar dosya ve klasr ilemleri balamnda baka kaynaklara bavurma ihtiyacn duymazlar.

Blm 6: Windows Forms Uygulamalar

141

Kapsam bir yana Memik Yankn kitabnn bu blmn yorulmazlar, anlatlanlar izlemekte zorluk ekmezler.

okuyanlar

imdi bu kitabn mevcut basl kitaplar balamnda bence ak ara nde olduu 3 blmden ksaca sz edeceim. Birok kaynakta C# uygulamalar dahilinde Word ve Excelden nasl yararlanld ksaca anlatlrken Memik Yankn kitabnda bu konu 32 sayfa boyunca ayrntl bir ekilde anlatlmtr. Ayrca bu anlatma yle bir anlatmadr ki ilk okumada anlalmayacak bir tek cmle bile yoktur. Benzer ekilde Api Fonksiyonlar adl blmde Memik Yank programclarn en ok gerek duyduunu sand API fonksiyonlarn 32 sayfa boyunca anlatmtr. Windows Mesajlar adl blmde ise Memik Yank 32 sayfa boyunca son derece teknik bir konuyu ilk okumada anlalacak yalnlkta anlatmtr. Bu kitabn hepsi ileri dzey konular olan dier blmlerinden sz etmeye gerek duymadm. nk ileri dzey konulara gerek duyanlar zaten neyi aradklarn biliyorlar. Buraya kadar C# kitabmm yarsndan biraz fazlasndan sz ettim. Kitabn dier blmlerini de anlatp bu yaznn sayfa saysn iki katna karrsam tamamn okuyanlarn oran drecei iin bu kitabm zerine konumay burada kesiyorum.

142

Memik Yank - Visual C#a Balang Kitab

C# 3.0 Kitabmn nsz...


2004 ylnda yaynlanan ilk C# kitabm 950 sayfayd ve yeni balayanlarn ncelikle renmek isteyeceklerini sandm konular ieriyordu. Baka bir deyile konular btn ayrntlaryla anlatmak yerine 950 sayfaya mmkn mertebe ok sayda konuyu sdrmay hedeflenitim. Bu nedenle ilk C# kitabmda hem temel konulara yer vermi hem de veritaban yani ADO.NET konular yeterli arlkta ilenmiti. Tabii 950 sayfada hem balang hem de veritaban konularna yer verince ileri dzey denilen baz konular kitapta kendilerine yer bulamamt. Sonra Visual Studio 2005i temel alan C# 2.0 kitabm zerinde almaya balamtm. 2005 yl banda yazmaya baladm bu kitabmn hem sayfa saysn biraz artrp hem de balang dzeyi diye bilinen konulara ayrlan sayfalar azaltma yoluna gidip kitabn ieriinin daha doyurucu olmasn hedeflemitim. Ne var ki blmleri kaleme aldka sayfa says tahminlerimin zerine kmt. 1200 sayfalk bir C# kitabn tercih etmediim iin 2 cilt olarak dzenlemeye karar vermitim. C# 2.0 kitabmn ilk cildi yaklak 730 sayfa iken yalnzca ADO.NETle ilgili konular ieren 2. cilt 420 sayfayd. Baka bir deyile C# 2.0 kitabm toplam 1150 sayfa olmasna ramen ileri dzey diye adlandrlan baz konular iermiyordu. rnein Assembyler, Attributeler ve Reflection snflar hakknda bilgi verme imkanm olmamt.
Gelelim bu kitaba. ADO.NET hakknda bilgi iermeyen bu kitap 1070 sayfa olmasna ramen, ileri dzey diye anlan bir ok konuda ayrntl bilgi iermesine ramen kaleme alp bu kitapta kullanmadm elimde yaklak 300 sayfalk metin bulunmaktadr. Baka bir anlatmla 2005 yl sonunda yaynlanan ve C# 2.0 anlatmak kaygs ile kaleme aldm kitabmn 1. cildinin zerine 300 sayfay ekleyince bu kitap kt. Tabii bunu yaparken blmleri yeniden kaleme alp C# 3.0 ile gelen yeni zelliklerden sz ettim. Bu kitaba nsz yazarken C# kitabmn 1. cildi iin hazrladm nszn bir ksmn buraya alacam: Bir programlama dilini anlatma kaygs ile yazlan kitaplarla ilgili olarak Balang Dzeyi ile Balang Konular kavramlar bazen birbirine kartrlyor. rneklemek gerekirse; balang dzeyi bir kitapta deikenler hakknda bilgi ieren sayfalarda Pointer deikenlerden sz edilmez. tesi balang dzeyi kitaplarda deikenler hakknda bilgi verilirken ayrntlara inilmez. Dzeyi balang olmayan kitaplar ise balang konularn ierebilir. Bu adan bir deerlendirme yapmak gerekirse, bu kitap ister istemez baz balang konularn iermektedir. Ancak bu kitapta ileri dzey diye deerlendirilen kitaplardaki birok konu hakknda ayrntl bilgi bulunmaktadr. rnein usta bir programcnn deikenler hakknda ne bilmesi gerekiyorsa hepsi bu kitapta bulunmaktadr. Buna ramen bu kitapta her konu balang dzeyi kitaplarnn basitliinde anlatld. Yine rneklemek gerekirse bu kitapta Pointer deikenler ve Attributeler hakknda bilgi ieren sayfalar ilk okumada anlalacak yalnlktadr. Bu kitab kaleme alrken beni en ok zorlayan alma, kitapta hangi konulara yer yerip, kitap iin setiim konulara ayrlacak sayfalarn saysn tespit etmek oldu. rnein Assembyller hakknda mutlaka bilgi vermek gerekiyordu. tesi Assembly kavram hakknda bilgi sahibi olmayan birisine mevcut assemblylerden sz etmenin zorluu ortadadr. te asl zorluk burada balyor:nk Assembly ok geni bir

Blm 6: Windows Forms Uygulamalar

143

konudur. Kitapta hi sz edilmemesi baka sorun, btn ynleri ile anlatldnda baka sorunlara neden olmaktadr. Benim tercihim orta yolu bulmak eklinde oldu. Yani Assemblyleri btn ynleri ve ayrntlar ile anlatmak yerine temel zelliklerinden sz etmekle yetindim. Benzer orta yol tercihini Attributeler, Generic snflar, Windows Mesajlar, Reflection iin de yaptm. Gelelim bu kitapta torpil getiim konulara: 2004 ylnda yazdm C# kitabn kaleme alrken baka bir C# kitabndan alnt yapmakla sulandm. Sulamalarn asl dayanak noktas deiken ad benzerliiydi. Deiken ad benzerliine sfra blme hatasnn, Selection Sort ileminin ve Word belgeleri zerinde nasl ilem yapldnn anlatld sayfalarda vs. rastlanmt. Her ne kadar benzer olduu sylenen deikenlerin adlarnn bir ounu 1994 ylnda yaynlanan Clipper kitabmda yllar nce kullanm olsam bile alnt yapmakla sulandm konulara bu kitapta torpil geip daha ayrntl bir ekilde ele aldm. Belki bu ekilde bu konular bildiime bir ka kiiyi inandrm olurum. tesi deiken ad benzerliinden dolay tekrar sulanmamak iin Osmanlca bir szlk edinip baz deikenlere Osmanlca adlar verdim.

144

Memik Yank - Visual C#a Balang Kitab

Memik Yank ve Programclk


Programclk zerinde youn bir ekilde almaya 1989 ylnda baladm. O gnlerde iletim sistemi olarak DOSun 3.30 srm yaygnd. Programclk denilince akla GW Basic, Pascal ve C gelirdi. Tabii o gnlerde yaygn olarak kullanlan dBASE III Plus unutmamak gerek. dBASE III+ yorumlayc bir ortam sunduu iin programclar dBASE derleyicisi arayna sevk ediyordu. Bu arada dBASEden daha iyi bir dBASE iddias ile Fox firmas tarafndan hazrlanp piyasaya verilen FoxProyu unutmamak gerekir. Konu program yazmak olduunda FoxPro her zaman dBASEden iyi olmutur. Tam bu gnlerde dBASE kodu yazmak isteyenlerin imdadna bir dBASE derleyicisi olan Clipper yetiti. Clipper ne mi yapyordu? dBASE III+n tekstine bal kalnarak(%100 deil) yazlan kodu derleyip kendi bana alan EXE yapyordu. Bununla da yetinmeyip dBASEe kolayca ekler yaplmasnn nn ayordu. O gnlerde yzlerce yazlm firmas Clipper iin Libraryler hazrlamt(Funcky Libi unutmamak gerek). En yaygn kullanlan Clipper srm Summer 97 idi. Bir sre sonra dBASEin o gnlerdeki sahibi A. Tate firmas byk grltlerle dBASE IV kard. Clipper ise dBASE IV uyumlu olmay brakp Clipper 5.0 ile kendi yoluna devam etti. Clipper ile veritaban ilemleri son derece kolay olduu iin binlerce yerli yazlm firmas uygulamalarn Clipper ile gelitiriyordu. Clipper ile almay sevince bir sre sonra Clipper zerine yazlar yazmaya baladm. 1992 ylnda o zamann bilgisayar dergilerinde Clipper konulu ok sayda yazm yaynland. O gnlerde Clipper konulu bir tek Trke kitap vard. Bu kitap ise Ankara merkezli Ekonomist yaynevinden kan eviri bir kitapt. Yani anlayacanz Clipper konulu Trke kaynak yok gibiydi. Bu nedenle Clipper konulu kitap yazmaya karar verdim. u aralar Memik Yank deikenlerini almakla itham edenler belki o gnlerde yalar itibar ile bilgisayarla henz tanmamt. stelik Memik Yank bugnlerde almakla itham edildii deikenlerin adlarn Clipper kitabnda kullanmt. Tekrar etmek gerekirse; Clipper kitabn kaleme alrken yl 1993, internet yok, Trke yaynlanm bir tek Clipper kitab var. Ki bu kitap kapsaml deildi. Bu artlarda son derece kstl ngilizcesi ile Memik Yank tarafl tarafsz herkes tarafndan beenilip ok satan Clipper 5.2 kitabn yazp yaynlyor. stelik bugnlerde deiken almakla itham edilen Memik Yank bu kitabnda verdii kodlarda i, j, sayi, dosya vs adnda deikenler tanmlayp kullanyor(!). Bir Allahn kulu kp Memik Yank bu kitab yani Clipper kitabn evirmitir demiyor. Diyemezlerdi nk kitabn ieriinin bir ksmn daha nce dergilerde yaynlamtm. Neyse uzatmayaym; Memik Yank 1993 ylnda Internetin olmad gnlerde bir tek Trke kaynan olduu gnlerde Clipper 5.2 adnda sper bir programclk kitab yazd m? Yazd. Bu kitap sayesinde binlerce kii programc oldu mu? Cevap net:Oldu. Bu yllarda insanlar Clipper ile harl harl program yazarken hibir niversite ve yksek okulda Clipper dersleri verilmiyordu. Programclar dBASE IV yerine Clippera ynelince A.Tate firmas(o gnlerde Borland tarafndan satn alnmt) dBASE derleyicisi arayna girmiti. Derken Borland firmas u anda adn hatrlamadm bir firmann dBASE derleyicisini satn alp dBASE IV Compiler adyla piyasaya verdi. Elimde bir tek Help metinleri varken

Blm 6: Windows Forms Uygulamalar

145

1995 ylnca gece gndz alp dBASE IV Compiler adnda bir kitap hazrladm. O gnlerde dBASE IV Compiler hakknda brakn Trke kayna yabanc kaynak bulmak bile Trkiye artlarnda imkansz gibiydi. Yabanc kaynak olsa bile benim iin deien bir ey olmazd. nk Clipper ve dBASE IV Compiler kitaplarn kaleme alrken programclarn ihtiyalarn gzetiyordum. Clipper ile program gelitiren birisi ne biliyorsa, neleri kullanyorsa kitaplarda o konulara yer veriyordum. Bir sre sonra Windows uyumlu programclk yaygnlamaya balaynca Borland firmas dBASEin Windows uyumlu srmn kard ama fazla tutulmad. nk bu srada Microsoft firmas Accessi piyasaya vermiti. Ksaca zetlemek gerekirse dBASE Compiler zerine yazdm kitap alannda tek kald. Yani dBASE IV Compiler kitab dolaysyla Memik Yankn dava edilmesi mmkn deildi. dBASE IV Compiler kitabn tamamladktan sonra FoxPro 2.6 zerinde almaya baladm. FoxPro 2.6nn hem DOS hem de Windows 3.1 uyumlu srm vard. Amacm Windows programcln anlatmak olduu iin Windows srmn tercih etmitim. Daha nce Clipper ve dBASE Compiler konulu kitaplar yazm olmam benim iin avantajd. Sizleri hemen uyarmak isterim o gnlerde FoxPronun Windows srmn kendisine konu edinen baka kitap olmadndan bugn ki gibi Memik Yank kitaplarndan deiken almakla veya Selection Sort sralama algoritmasn almakla sulayacak kimse yoktu. Dolaysyla Memik Yank FoxPro 2.6 kitabnda bakalarna ait deikenleri alma sulamasn onaylamak Prof unvanl kimseye nasip olamad. Sanrm FoxPro 2.6 kitabm ok iyi olmutu ki o zamann Microsoft genel mdr beni telefonla arayp teekkr etmiti. zin verin 2 cmle daha ekleyeyim: Yani daha nce hakknda kitab brakn makale bile yazlmam bir konuda Memik Yank kitap yazyor, hem de o gnn artlarna gre ok iyi bir kitap yazyor. Sonra aradan tam 10 yl geiyor birileri kyor Memik Yank sfra blme hatasn anlatmak zere yazd 3 satrlk kodun kendi kitaplarndan alnt olduunu iddia ediyor. Kant ise bu 3 satrlk kodda kullanlan sayi1, sayi2 ad verilen deikenlermi. Yani Memik Yank snfa blme hatasn anlatmak iin yazd kodda tanmlad deikenlere sayi1, sayi2 yerine number1, number2 adlarn vermi olsayd kitabnda verdii 3 kod deerinden ok ey kaybedecekti(!). Gelelim Visual Basic 3.0 kitabna. Microsoft firmas daha nce Visual Basicnin 2 srmn karm olsa bile ilgi 3.0 srm ile geldi. Visual Basic 3.0 piyasaya verildikten sonra bir sre sonra Microsoft Press tarafndan yaynlanm kitap Trke olarak yaynland. Son derece kstl bir ierii sahip bu kitab grnce Visual Basic konulu kitap yazmaya karar verdim. Uzun uralar sonucu Visual Basic 3.0 kitabm kt. Bu kitap ok beenildi. nk Visual Basic konusu ilk kitabm o gnn artlarna gre ok sayda ileri dzey konu ieriyordu. rnein kod yazarak alma annda Access veritabannn nasl hazrlandn adm adm ilk anlatan Memik Yanktr. Bilmeyenlere hatrlatmak isterim: Visual Basic 3.0 Windowsun 3.1 srmne gerek duyuyordu. tesi Visual Basic 3.0 piyasaya verildii gnlerde insanlar Windowsu yeni yeni kullanmaya balamlard. Dolaysyla programcla ok sonra balayp uzman programc olan baz arkadalar Memik Yankn 1995 ylnda yazd Visual Basic kitabn bugnn artlarna gre deerlendirip yorum yapyorlar. Bu arkadalar son birka yl iinde yaynlanan ADO.NET, Delphi 2007, C# 3.0 ve Visual Basic 9.0 kitaplarm artk 5-6 yl sonra gncelliklerini kaybettiklerinde zahmet edip deerlendirirler.

146

Memik Yank - Visual C#a Balang Kitab

C# 3.0 Kitabmdan Alnma rnek Blm

C# UYGULAMALARINDA WORDden YARARLANMAK


Bu uzun makaleyi yaknda zamanda yazmn tamamladm C# 3.0 kitabmdan aldm. Kitaptan aldm bu metne baz eklemeler yapp kk deiiklikler yaptm. Son yllarda yaynlanan programclk kitaplarnn bir blm okurlar kitap hakknda fikir sahibi olsunlar diye nette yaynlanmaktadr. Ne var ki C# 3.0 kitabmn bu blmn burada sizinle paylayor olmamn nedeni baka. nk szn ettiim kitabn hata yakalamakla ilgili uzunca blmn daha nce sizlerle zaten paylamtm. Baka bir deyile bu blm yaynlama nedenim kitabn ierii ve anlatm ekli konusunda sizleri bilgilendirmek deildir. Ksaca aklayaym: 2004 yaynlanan C# kitabmda toplam 8 sayfada C# uygulamalarnda Word ve Excelden nasl yaralanldn ayrntya girmeden kendimce anlatmtm. Tabii C# uygulamalarnda Word belgeleri ve Excel tablolar zerinde nasl ilem yaplabildiini annemim karnnda iken renmemitim. Bu konuda bilgi edinmek iin MSDNe ve birka programclk sitesine bakmtm. Doal olarak Word belgeleri zerinde ilem yaplrken kullanmam gereken snflarn hangileri olduklarn renmitim. tesi bu snflarn hangi referans ve namespacelerde olduunu renip ona gre nasl bir hazrlamak yapmak gerektiini aratrmtm. C# 1.0 kitabm kaleme aldm gnlerde birka yerli web sitesinde yukarda szn ettiim sorularn cevaplar zaten vard. Buna ramen birileri kp Memik Yank kitabnda Word ve Excelle ilgili olarak yazdklarn bizim kitaplar okumadan renmi olamaz dediler. Sanki sz konusu olan bir pop mzik sanats ile yaplm zel bir syleiymi, sanki ikinci bir kaynan olabilme ihtimalinin sfr olduu zel bir aratrmaym sz konusu olan. Hal bu ki Microsoft gibi derleyici reten firmalar derleyicileri hakknda en kk ayrntlar bile derleyiciyi piyasaya vermeden ok nce aklyorlar. Yoksa insanlar nasl program yazarlard, yazarlar nasl programclk kitaplar yazarlard? Yaynlanp piyasada satlan bir programclk kitabn edinip bir konuyu renmek doal olmasna ramen C# kitabmn Word ve Excelle ilgili blmn yazarken yerli web sitelerindeki 2 yazy ve MSDNde birka metodun orijinal yapsna bakmakla yetinmitim. C# uygulamalar dahilinde Word belgeleri ve Excel tablolar zerinde ilem yaparken tanmlamam gereken deikenlere ad verebildiimi ve kullanlmas gereken metotlarn yapsn ve parametrelerini yerli kaynaklara bakmadan renebildiimi kantlamak iin C# 3.0 kitabmda Word ve Excel uygulamalar zerinde nasl ilem yapld blmdeki sayfa saysn biraz arttrp bugn kadar bu konuda kaleme alnm en uzun ve ayrntl metni hazrladm. Belki bu sayede Memik Yank eviri yapyor diyenler, Memik Yank deiken alyor diyenler ellerini vicdanlarna gtrme gereini

Blm 6: Windows Forms Uygulamalar

147

duyarlar. Ksa bir sre sonra bu metni nasl kaleme aldm adm adm akladm bir makale hazrlayp Programclar in Yazarlk Dersleri 4 adyla yaynlayacam. C# projelerinde Word ve Excelin kaynaklarndan kolaylkla yararlanabilirsiniz. Bu sayede kullancnn bilgi girmesi gerektii zaman karsna Word penceresini veya tablo hazrlamas gerektii zaman Excel penceresini getirebilirsiniz. Bu makalede C# uygulamalar dahilinde Word ve Excel ile yaplabilineceklerin ancak bir zetine yer verebildim. Kitabmn bu blmn ilk kaleme aldmda uzunluu 10 sayfayd. Ne ki zel nedenlerden dolay bu blme biraz torpil geip sayfa saysn arttrdm. Bu sayede bu konuda en ayrntl Trke metni kaleme alm oldum. Madem imdiye kadar hibir Trke kaynakta bu konu bu kadar ayrntl anlatlmad o halde yerli kaynaklardan izinsiz alnt yapm olma ve deiken ad alma ihtimalim azalm oluyor(!). Her ne kadar bu blmde yalnzca Word ve Excelden sz edilmi olunsa bile C# uygulamalar dahilinde dier Office programlarndan da yararlanmak mmkndr. C# projesi dahilinde Wordden yararlanmak istiyorsanz ilk olarak Solution Explorer penceresinde References seeneine ait ksayol mensnden komut verip Add Reference diyalog kutusunu ekrana getirip COM sekmesindeki Microsoft Office 11 Object Library adl bileeni seip uygulamaya dahil etmelisiniz. Daha dorusu C# uygulamasn bu referanstan haberdar etmelisiniz.

148

Memik Yank - Visual C#a Balang Kitab

Bu ekran grntsn aldm srada kullandm bilgisayarda Word 2003 yklyd. Kullanlan bilgisayara Wordn XP srm yklyse bu bileenin ad Microsoft Office 10 Object Library olur. 2003 iinde ilk C# kitabm kaleme alrken Add Reference diyalog kutusunda aratrmaya kp acaba Word belgeleri zerinde ilem yaparken hangi referans kullanmak gerekiyordur sorusuna kendimce cevap arasaydm bulmak zor olmazd. Ancak ok daha nce birka yerli web sitesinde bu konu zerine yazlm makaleler ilk yaynlandklarnda okuduum iin Word belgeleri zerinde ilem yaparken gerek duyulacak snflarn hangi namespacelerde, bu namespacelerin ise hangi referanslarda yer aldn biliyordum. Visual Studio 2005 ile hazrlanan projelerde bu bileen seilip OK dmesi tklandnda projeye 3 referans eklenirdi. Visual Studio 2008de yukarda yaplan ilem projeye yalnzca Microsoft.Office.Core referansnn eklenmesine neden olmaktadr. Bu nedenle Add Reference diyalog kutusunu tekrar ekrana getirip .NET sekmesinde ayrca Microsoft.Office.Interop.Word referansn projeye eklemek gerekmektedir.

Proje bu 2 referans hakknda bilgilendirildikten sonra kodun en stne aada verdiim 2 satr yazarak ilgili namespacelerdeki Classlardan yararlanmak istediinizi iaret etmelisiniz. Balangta

Blm 6: Windows Forms Uygulamalar

149

Microsoft.Office.Coredeki snflardan yararlanmayacamz iin using blounda bu namespacein adn iaret etmeyebilirsiniz.
using Microsoft.Office.Core; using Microsoft.Office.Interop.Word;

Gerekli referanslar projeye dahil edip(baka bir deyile bu referanslardan derleyiciyi haberdar ettikten) bu namespacelerdeki classlardan yararlanacam using deyimiyle iaret ettikten sonra forma yerletirdiim dmenin Click olayn temsil eden metodu aadaki gibi dzenledim.
private void Word_penceresi_Click(object sender, EventArgs e) { Microsoft.Office.Interop.Word.ApplicationClass Word_uygulamasi; Word_uygulamasi= new Microsoft.Office.Interop.Word.ApplicationClass(); }

imdi burada biraz duralm. Bu 2 satrlk kodda rneini aldm snfn ad Word.ApplicationClass. Bu snftan yola kp hazrlanacak nesneye Word_uygulamasi gibi Trke bir ad verilirsek(yani bu snfa Trke bir karlk ararsak) baka Trke kaynaklarla benzer deiken adn kullanma tehlikesi ile kar karya gelebiliriz. Baka bir deyile baka yazarlarn kymetli deikenlerinin adn almakla sulanabiliriz. Bunun nne gemek iin, baka bir deyile 2 satrlk bu kodda tanmlanan deikene programclar ad seerken baka kaynaklardan deiken avna kmalarnn mecburi olmadn kantlamak iin bu kodu aadaki gibi dzenledim. Yani balangta Word_uygulamasi adn verdiim deikenin adn Word_nesnesi olarak deitirdim.
private void Word_penceresi_Click(object sender, EventArgs e) { Microsoft.Office.Interop.Word.ApplicationClass Word_nesnesi; Word_nesnesi = new Microsoft.Office.Interop.Word.ApplicationClass(); }

Tabii programclarn yazacaklar kodlarn bakalar tarafndan grlmesi dk ihtimal olduu iin deikenlere ad seerken kendilerini birden deiken hrsz olarak grmeleri zordur. Bu nedenle bu kodu aadaki gibi deitirip kendinizi iyice salama alabilirsiniz.
private void Word_penceresi_Click(object sender, EventArgs e) { Microsoft.Office.Interop.Word.ApplicationClass Word_tokmagi; Word_tokmagi = new Microsoft.Office.Interop.Word.ApplicationClass(); }

150

Memik Yank - Visual C#a Balang Kitab

Bu metotta Word.ApplicationClass nesnesini hazrlama ilemini 2 satrda gerekletirdim ve sz konusu Classn yer ald namespacei iaret ettim. Daha nceden bu namespacedeki snflardan yararlanmak istediimi using deyimi ile belirttiim iin bu kodun satrlarn ksaltmak mmkndr. Bu metoda yazlan ilk 2 satr sayesinde Word program balatlr ama ekranda grnmez. Word penceresinin ekranda grnmesi iin Word.ApplicationClasstan yararlanarak hazrladnz nesnesinin Visible zelliini true yapmalsnz. Bu nedenle yukarda verdiim metoda 3. bir satr ekledim.
private void Word_penceresi_Click(object sender, EventArgs e) { ApplicationClass Word_nesnesi; Word_nesnesi = new ApplicationClass(); Word_nesnesi.Visible = true; }

Projeyi altrp bu metodu iletince aadaki gibi bir sonu elde ettim. Bu ekilde alan Word penceresinde herhangi bir belge olmaz. Bu srada komut verip Word penceresinde yeni belge hazrlayabilir veya mevcut belgeleri aabilirsiniz. Daha ak bir anlatmla yukarda hazrladmz ApplicationClass nesnesi Balat mensnden komut vererek ekrana getirdiimiz Word penceresini temsil ediyor.

imdi yukarda verdiim kodda deiiklik yapp Word penceresi ekrana getirildii zaman bo bir belgenin hazrlanmasn salayacam. Yukarda hazrladmz ApplicationClass nesnesinin Documents adnda bir koleksiyonu bulunmakta ve alan(ya da hazrlanan) Word belgeleri bu koleksiyonda saklanmaktadr. Baka bir deyile hazrlanacak belgenin veya Document nesnesinin bu koleksiyona eklenmesi gerekiyor. Yukarda verdiim ekran grntsn aldm srada Word penceresi iinde grntlenen herhangi bir belge olmad iin Documents koleksiyonu

Blm 6: Windows Forms Uygulamalar

151

herhangi bir elemana sahip deildir. Document nesneleri DocumentClass snfnn Add() metodundan yararlanlarak hazrlanmaktadr. Bu amala Document nesnesi hazrlayp bu nesneyi Add() metodu ile ApplicationClass nesnesine ekleyeceim. Baka bir deyile Document nesnesi klasik yntemle new anahtar kelimesiyle snftan yola klarak hazrlanp sonra da ilgili koleksiyona eklenmiyor. Add() metodu, hem nesne hazrlama hem de koleksiyona ekleme ilemini bir seferde yapmaktadr. Ltfen uzatmama izin verin: ncelikle Microsoftun sitesine yani MSDNde burada szn ettiim Add() metodu ile ilgili olarak verilen rnei size sunacam. Aada verdiim kod eski srme gre hazrlanm. Bu kitapta C# hakknda bilgi verirken Visual Studio 2008 ve C# 3.0 kullandm iin kk farkllklar olabilir.
object missing = System.Reflection.Missing.Value; object template = @"C:\Test\SampleTemplate.dot"; this.Application.Documents.Add(ref template, ref missing, ref missing, ref missing);

Burada dikkatinize sunmak istediim asl konu Add() metodunun 4 parametreye sahip olmasdr. Parametrelerden ilkinde hazrlanmak istenen Word belgesine temel oluturacak DOT uzantl ablon dosyas verilmektedir. Zaten ilk parametrenin yararlanlmak istenen ablon olmas gerektii MSDNden aldm 2 satrlk kodda iaret ediliyor. Baka bir deyile 1. parametrede sorun yok ve ablon olarak kullanmak istediimiz DOT uzantl dosyay ve yolunu belirteceiz. Word balatlp ierii bo bir belge hazrlandnda normal.dot adl ablon dosyasnn kullanldn biliyorsunuz. Yllar nce Word konulu kitap yazm birisi olduum iin umarm birileri kp DOT uzantl dosya hakknda yukarda yazdm cmleyi baka kaynaktan izin alnt yaptm ileri srmezler. Add() metodunun 2., 3. ve 4. parametreleri ise System.Reflection.Missing.Value tipindedir. Microsoftun programclar tarafndan Add() metodunu rneklemek iin yazlan bu 3 satrlk kodda 2., 3. ve 4. parametre iin nceden missing adnda deiken tanmlamlar. Her ne kadar bu rnek kodda Add() metodunun 2., 3. ve 4. parametreleri ayn tipte olsa bile farkl ilevleri vardr. Bu parametrelerin ilevlerini ileriki sayfalarda srasyla anlatacam. Gerekte Add() metodunun son 3 parametresiyle ilgilenmeyebilirsiniz. Madem C# uygulamas dahilinde yeni bir Word belgesi hazrlayacaz Add() metodunu yukardaki gibi kullanmaktan baka aremiz yoktur. Belki de vardr ama bu konuda bilgim ne yazk ki yoktur. Belki birileri kp yukarda yapsn verdiim Add() metodunu kullanmadan nasl Word belgesi hazrlandn anlatrlar. Biz de o teknii kullanrken mucitlerini anarz, kendilerine her seferinde teekkr ederiz.

152

Memik Yank - Visual C#a Balang Kitab

imdilik Add() metodunu kullanmak dnda baka teknik olmadna gre ilk olarak kullandm bilgisayarda arama yapp Normal.dot adl dosyay bulup C: srcsnn kk klasrne kopyaladm. dot uzantl bu ablon dosyasnn adn ise sablon adn verdiim bir deikene aktardm. Sonra da Microsoftun programclarnn yapt gibi System.Reflection.Missing.Value tipinde bir deiken tanmladm. Madem bu deiken Value tipindedir ben de akl evvellik yapp yani btn imkanlarm seferber edip bu deikene orijinal bir ad bulamaynca bu deikene Trkesi olan deger adn verdim. Bu 2 hazrlktan sonra yukarda verdiim kod aada verilen ekle dnt.
private void Word_penceresi_Click(object sender, EventArgs e) { object sablon = "C:\\Normal.dot"; object deger = System.Reflection.Missing.Value; ApplicationClass Word_nesnesi; Word_nesnesi = new ApplicationClass(); Word_nesnesi.Visible = true; }

Her ne kadar Value tipindeki deikene ad verirken Trke karln kullanm olsam bile deger birok programc ve yazar tarafndan kullanlan bir deiken ad olduu iin riske girmeye cesaret edemeyip bu deikene ad verirken MSDNden deiken ad alma yolunu tercih ettim. nk elin gavurlar deikenlerinin adlar konusunda hak talep etmiyorlar. Szn ettiim 2 deikeni tanmladktan sonra hazrlanacak belgenin aktarlaca bir DocumentClass nesnesi hazrladm. DocumentClass nesnesine gnl rahatl ile Belge1 adn verdim. nk Word belgelere Belge1, Belge2 gibi adlar veriyor. Microsoft firmas beni deiken adlarn almakla sulamayacana gre tehlike yoktur.
private void Word_penceresi_Click(object sender, EventArgs e) { object sablon = "C:\\Normal.dot"; object missing = System.Reflection.Missing.Value; ApplicationClass Word_nesnesi; Word_nesnesi = new ApplicationClass(); Word_nesnesi.Visible = true; Microsoft.Office.Interop.Word.Document Belge1 = new DocumentClass(); }

Bu hazrlklardan sonra imdi srada Add() metodunu kullanp Word belgesini hazrlamak var. Bu amala bu koda ekleme yaptm. Aada verilen kod iletildiinde tpk Word balatlp balangta Belge1 gibi ada sahip bir belge hazrland gibi C# uygulamas dahilinde Word balatlp

Blm 6: Windows Forms Uygulamalar

153

Belge1 adnda bir belge hazrlanm olunur. Bu belgeye istenildii gibi bilgi girilip kaydedilebilir.
private void Word_penceresi_Click(object sender, EventArgs e) { object sablon = "C:\\Normal.dot"; object missing = System.Reflection.Missing.Value; ApplicationClass Word_nesnesi; Word_nesnesi = new ApplicationClass(); Word_nesnesi.Visible = true; Microsoft.Office.Interop.Word.Document Belge1 = new DocumentClass(); Belge1 = Word_nesnesi.Documents.Add(ref sablon, ref missing, ref missing, ref missing); }

Bundan 4 yl nce yaynlanan ilk C# kitabmda konuyu uzatmak istemediim iin bu kodu bir seferde vermitim. Bu kez ayrntlara girmek istediim iin adm adm anlatmaya alyorum. Bu kodu dikkatle incelerseniz 2., 3. ve 4. parametrelerin ayn olduklarn fark ederseniz. nk bu 3 parametrenin System.Reflection.Missing.Value tipinde olmas salanrsa varsaylan deerler kullanlr. Bunu bir de yle aklamak gerek: Her ne kadar Add() metodu 4 parametreye sahip olsa bile bunlardan ilki hari dier n belirtme gereini duymuyorum. Buradaki karmaann geri plannda Word kaynakl snflarn ynetilen(managed) kod olmamalarnda yatyor. Tabi System.Reflection.Missing.Value tipindeki deiken Trke bir ad verilseydi kod belki biraz daha okunur olurda ama deiken ad alm olma ihtimali artard. lk C# kitabm iin Add() metodu hakknda gnlerce aratrma yapmama ramen Add() metodunun son 3 parametresi hakknda net bilgilere ulaamamtm. leriki sayfalarda hakknda bilgi verilecek Open() metodunun 3. parametresinin ilevi alacak belgeye ReadOnly zelliini veriyor olmas beni yanltmt. C# 1.0 kitabm yazarken Add() metodunun 2. parametresinden ise hi sz etmemitim. imdi gelelim 2. parametrenin asl ilevine. C# uygulamas dahilinde Word belgesi hazrlama amacnz yeni bir ablon hazrlamak ise 2. parametreden yararlanabilirsiniz. Bu parametrenin ilevini gstermek iin object tipinde bir deiken tanmlayp true yaptm.
ApplicationClass Word_nesnesi = new ApplicationClass(); Document Belge1 = new DocumentClass(); private void Word_penceresi_Click(object sender, EventArgs e) { object sablon = "C:\\Normal.dot"; object missing = System.Reflection.Missing.Value; object yeni_sablon = true;

154

Memik Yank - Visual C#a Balang Kitab

Word_nesnesi.Visible = true; Belge1 = Word_nesnesi.Documents.Add(ref sablon, ref yeni_sablon, ref missing, ref missing); }

Bu ekilde dzenlenen kod ile C# uygulamas dahilinde hazrlanan Word belgesi hazrlanp sonra da kaydedilmek istendiinde varsaylan kayt tipi DOT uzantl ablon olur. Tabii Farkl Kaydet diyalog kutusundaki Kayt Tr liste kutusunda kayt tr olarak Word Belgesi veya baka bir format seilebilir. C# uygulamas dahilinde DOT uzantl ablon dosyas hazrlamak istemiyorsanz Add() metodunun 2. parametresi ile ilgilenmeyip bu parametrenin System.Reflection.Missing.Value tipinde bir deiken olmasn salayabilirsiniz. Word uygulamasn temsil eden ApplicationClass nesnesi iin yeni belge hazrlanrken kullanlan Add() metodunun 3. parametresinin ad DocumentType. Toplam 5 farkl deer alabilen bu parametre kullanlmadnda, baka bir deyile bu parametrenin yerine System.Reflection.Missing.Value tipinde bir deiken kullanldnda bo bir belge hazrlanmak istendii varsaylr. 3. parametrenin nasl kullanldn aada grebilirsiniz.
ApplicationClass Word_nesnesi = new ApplicationClass(); Document Belge1 = new DocumentClass(); private void Word_penceresi_Click(object sender, EventArgs e) { object sablon = "C:\\Normal.dot"; object missing = System.Reflection.Missing.Value; object yeni_sablon = false; object belge_tipi = WdNewDocumentType.wdNewBlankDocument; Word_nesnesi.Visible = true; Belge1 = Word_nesnesi.Documents.Add(ref sablon, ref yeni_sablon, ref belge_tipi, ref missing); }

Bu koda dikkat ederseniz WdNewDocumentType adnda bir Enumun olduunu fark ederseniz. C# uygulamas dahilinde hazrlamak istediim Word belgesini web sayfas olarak deerlendirmek gibi bir amacm olsayd Add() metodunun 3. parametresini aadaki gibi dzenlerdim object belge_tipi = WdNewDocumentType.wdNewWebPage; Microsoft.Office.Interop.Wordde yer alan WdNewDocumentType adl enum tipinin yelerinin ilevlerini aada tablo halinde verdim. Ek aklama yapmak gerekirse Wordn gncel srmleri ile istenen tipte ve ierikte belgeler hazrlamak mmkndr.

Blm 6: Windows Forms Uygulamalar

155

ye ad wdNewBlankDocument wdNewEmailMessage wdNewFrameset wdNewWebPage wdNewXMLDocument

levi Bol belge E-mail Frameset Web sayfas XML belgesi

imdi gelelim hazrlanan belgenin Word penceresinde grnmesini salayan veya engelleyen 4. parametresine. 4. parametre yerine System.Reflection.Missing.Value tipinde bilgi ieren Object tipinde bir deiken kullanldnda hazrlanan belge ekranda grnmektedir. Yukarda anlatlan ekilde hazrladnz belgenin grnmesini istemiyorsanz bu parametre iin object tipinde bir deiken tanmlayp false aktarmalsnz. Bu ilemin nasl yapldn aada grebilirsiniz.
ApplicationClass Word_nesnesi = new ApplicationClass(); Document Belge1 = new DocumentClass(); private void Word_penceresi_Click(object sender, EventArgs e) { object sablon = "C:\\Normal.dot"; object missing = System.Reflection.Missing.Value; object yeni_sablon = false; object gorunme = true; object belge_tipi = WdNewDocumentType.wdNewBlankDocument; Word_nesnesi.Visible = true; Belge1 = Word_nesnesi.Documents.Add(ref sablon, ref yeni_sablon, ref belge_tipi, ref gorunme); }

Bu ekilde dzenlenen kod iletilirse Word balatlp ierii bo(tabii Normal.dotn orijinal olduunu varsayyorum. Yani Microsofttan geldii ekli ile..) bir Word belgesi hazrlanp ekrana getirilir. Gerekte baka yazarlar veya programclar tarafndan daha nce kullanlma ihtimali yksek olan gorunme adl deiken yerine Microsoftun verdii ksa rneklerde kulland visible deiken ad olarak kullanmanz nerilir. Hazrlayp Word penceresine getirdiiniz belgenin grntlenmesini istemiyorsanz 4. parametreyi false yapmalsnz. Aada verilen kod iletildiinde Word penceresi ekrana gelir ama Add() metodu ile hazrlanan belge grntlenmez.

156

Memik Yank - Visual C#a Balang Kitab

ApplicationClass Word_nesnesi = new ApplicationClass(); Document Belge1 = new DocumentClass(); private void Word_penceresi_Click(object sender, EventArgs e) { object sablon = "C:\\Normal.dot"; object missing = System.Reflection.Missing.Value; object yeni_sablon = false; object visible = false; object belge_tipi = WdNewDocumentType.wdNewBlankDocument; Word_nesnesi.Visible = true; Belge1 = Word_nesnesi.Documents.Add(ref sablon, ref yeni_sablon, ref belge_tipi, ref visible); }

Hazrlayp geri planda kod yazarak bilgi aktarp sonra kaydetmek istediiniz Word belgesinin ekranda grnmesini istemeyebilirsiniz. Tabii ApplicationClass nesnesinin Visible zelliini false yapp Word penceresini grnmesini engellediyseniz Add() metodunun 4. parametresinin false ya da true olmasnn bir nemi olmuyor. Bildiiniz Word belge hazrlarken DOT uzantl ablon dosyalarndan yararlanmaktadr ve Normal.dot ablonu varsaylan ablondur. Konu kolay anlalsn diye bu ablonu C: srcsnn kk klasrne kopyaladm. Yukarda anlatlan ekilde dzenlenen Add() metodu iletilirse ekrana aadaki gibi bir Word penceresi gelir. Bu srada Word belgesine istediiniz gibi bilgi girebilir ve yeni belgeler hazrlayabilirsiniz.

Yine Word ile alrken arka arkaya birden fazla belgeyi hazrlayp birden fazla belge zerinde almak mmkndr. imdi yukarda verdiim koda ekleme yapp arka arkaya 2 Word belgesi hazrlayacam.

Blm 6: Windows Forms Uygulamalar

157

ApplicationClass Word_nesnesi = new ApplicationClass(); Document Belge1 = new DocumentClass(); Document Belge2 = new DocumentClass(); private void Word_penceresi_Click(object sender, EventArgs e) { object sablon = "C:\\Normal.dot"; object missing = System.Reflection.Missing.Value; object yeni_sablon = false; object visible = true; object belge_tipi = WdNewDocumentType.wdNewBlankDocument; Word_nesnesi.Visible = true; Belge1 = Word_nesnesi.Documents.Add(ref sablon, ref yeni_sablon, ref belge_tipi, ref visible); Belge2 = Word_nesnesi.Documents.Add(ref sablon, ref yeni_sablon, ref belge_tipi, ref visible); Belge1.Activate(); }

Tahmin edeceiniz C# uygulamas dahilinde hazrlanan belgelerin birisi aktif belgedir. Aktif belge normal artlarda son hazrlanan veya alan belgedir. Hangi belgeyi aktif belge yapmak istiyorsanz Active() metodunu o belgeyi temsil eden nesneye uygulamanz yeterlidir. Bu metodun nasl kullanldn yukarda grebilirsiniz. Mevcut belgelerin nasl ald anlatldktan sonra ak belgelerin arasnda nasl dolald konularnda bilgi verilecektir. Word Belgelerine Bilgi Girmek Yukarda anlatlan ekilde hazrlanan Word belgesine dorudan bilgi girebileceiniz gibi kod yazarak bilgi aktarabilirisiniz. Dorudan bilgi girdiiniz Word belgesini C# uygulamas dahilinde kaydedebilir, kapatabilir veya ieriini yazdrabilirsiniz. Baka bir deyile Word program ile normal artlarda yaplan her ilemi C# uygulamas dahilinde kod yazarak yapabilirsiniz. lk olarak yukarda anlatlan ekilde hazrladm Word belgesine kod yazarak bilgi girmeyi deneyeceim. Belgelere bilgi girilirken Range nesnesinin InsertAfter() veya InsertBefore() metotlarndan yararlanabilirsiniz. InsertAfter() metodunun nasl kullanldn anlatmak iin Document tipindeki deiken tanmlandm satr metodun dna alp Form1 snfnn btn metotlarnda yaayabilmesine imkan saladm. Ardndan forma bir dme yerletirip aada verdiim kodu yazdm. Forma yerletirdiim bu dmeye ekle adn vermek yerine Osmanlca karlk aradm uygun dme ad aklma gelmedi. nk ekle tehlikeli bir dme veya deiken addr, bakarsnz ekleyi birileri register etmitir, kullanm hakkn 50 yllna satn almtr.

158

Memik Yank - Visual C#a Balang Kitab

private void ekle_Click(object sender, EventArgs e) { object missing = System.Reflection.Missing.Value; Belge1.Range(ref missing, ref missing).InsertAfter("Fenerbahe"); }

Word penceresini ap ekrana getirmek amacyla hazrladm metoda eklediim bu satr sayesinde ekleme noktasnn bulunduu yere InsertAfter() metoduna parametre olarak verilen bilgi yazlr. Proje altrlp bu kod iletildiinde aadaki gibi bir sonu alnr.

Bildiiniz gibi yeni bir Word belgesi hazrland zaman belge ierii bo bir paragrafa sahip olmakta ve Enter tuuna her baslta yeni bir paragraf hazrlanmaktadr. Bu artlarda yani C# uygulamas dahilinde ierii bo bir belge hazrlanp imle belgenin balang noktasnda iken InsertAfter() yerine InsertBefore() metodu kullanlm olunsayd ayn sonu alnrd. imdi bu Word belgesine kod yazarak bir paragraf ekleyip tekrar bilgi gireceim. Belgeye paragraf ekleme ilemi, yani Paragraphs koleksiyonuna eleman ekleme ilemi Add() metodu ile yaplmaktadr. Bu metodun nasl kullanldn aada grebilirsiniz. Document nesnesinin Paragraphs koleksiyonundan yararlanp her trl paragraf ilemlerini yapmak mmkndr.
private void ekle_Click(object sender, EventArgs e) { object missing = System.Reflection.Missing.Value; Belge1.Range(ref missing, ref missing).InsertAfter("Fenerbahe"); Belge1.Paragraphs.Add(ref missing); Belge1.Range(ref missing, ref missing).InsertAfter("Beikta"); }

Bu ekilde dzenlenen kod iletilirse aadaki gibi bir sonu alnr. Bu srada Word belgesi 2 paragrafa sahiptir. Ayn ekilde Word belgesine istediiniz gibi bilgi girebilirsiniz.

Blm 6: Windows Forms Uygulamalar

159

imdi rnek olmas iin Word belgesine mevcut bir ListBoxn elemanlarn aktaracam. Bu ilemi yapmak zere hazrladm kodu aada verdim. Benzer mantkla veritabanndan okunan kaytlarn her birisi Word belgesine ayr bir satr olarak aktarlabilinir.
private void naklet_Click(object sender, EventArgs e) { object missing = System.Reflection.Missing.Value; int sayi = listBox1.Items.Count; for (int i = 0; i < sayi; i++) { string satir = listBox1.Items[i].ToString() ; Belge1.Range(ref missing, ref missing).InsertAfter(satir); Belge1.Paragraphs.Add(ref missing); } }

Yukarda anlatlan ekilde C# uygulamas dahilinde hazrlanan Word belgesine bilgi aktarma ilemi asl Selection nesnesinin TypeText() metodu ile yaplmaktadr. Bu metodun nasl kullanldn aada grebilirsiniz.
private void ekle_Click(object sender, EventArgs e) { Word_nesnesi.Selection.TypeText("Fenerbahe"); }

Bu metot aktif Word belgesinde imle nerede bulunuyorsa imlecin sonuna kendisine parametre olarak verilen bilgiyi yazar. Baka bir deyile sz konusu belgede seili bir ksm yoksa bunun imlecin bulunduu yer olduu varsaylr. imdi yukarda verdiim rnei deitirip ListBoxn ieriini Word belgesine aktarrken Selection nesnesinin TypeText() metodundan yararlanacam.

160

Memik Yank - Visual C#a Balang Kitab

Deiken ad benzerliinden sulanmamak iin bu ilemi yapacak dmeye Aktar yerine naklet adn verdim.
private void naklet_Click(object sender, EventArgs e) { object missing = System.Reflection.Missing.Value; int sayi = listBox1.Items.Count; for (int i = 0; i < sayi; i++) { string satir = listBox1.Items[i].ToString() ; Word_nesnesi.Selection.TypeText(satir); Word_nesnesi.Selection.TypeText("\n"); } }

C# uygulamasnn formundaki bir TextBoxa yazdnz her karakterin annda Word belgesine aktarlmasn istiyorsanz sz konusu TextBoxn KeyPress olayn temsil eden metodu aadaki gibi dzenleyebilirsiniz. TextBox aracl ile Word belgesine aktarmak istediiniz metin birden fazla satrdan meydana gelecekse MultiLine zelliini True yapmanz gerekir. private void textBox1_KeyPress(object sender,KeyPressEventArgs e) { char kar = e.KeyChar; Word_nesnesi.Selection.TypeText(kar.ToString()); } Bu 2 satrlk kod ile Word belgesine TextBox aracl ile bilgi aktarrken TextBoxn MutliLine zellii True iken Enter tuuna baslp bir alt satra inildiinde Word belgesinde yeni bir paragrafa geilmi olunur. Aktif Word belgesine paragraf eklerken Selection snfnn TypeParagraph() metodunu kullanabilirsiniz. private void Parag_ekle_Click(object sender, EventArgs e) { Word_nesnesi.Selection.TypeParagraph(); } Nasl ki ListBoxlarn Items koleksiyonlar varsa C# uygulamalar dahilinden hazrlanan Word belgelerinin yani Document nesnelerinin Characters, Words, Sentences, Paragraphs ve Sections koleksiyonlar vardr. Bu koleksiyonlardan yararlanarak belge hakknda bilgi edinebilir veya belge zerinde baz ilemleri yapabilirsiniz. imdi C# projesi dahilinde hazrladm Word belgesinin ieriini forma yerletirdiim RichTextBoxa aktaracam. Bu ilem iin Range nesnesini aadaki gibi kullandm.

Blm 6: Windows Forms Uygulamalar

161

private void naklet_Click(object sender, EventArgs e) { object missing = System.Reflection.Missing.Value; richTextBox1.Text=Belge1.Range(ref missing, ref missing ).Text; } Yukarda Word penceresine yazlanlar RichTextBoxa aktarrken Range() nesnesine parametre olarak System.Reflection.Missing.Value sabitini ieren object tipindeki missing adn verdiim deikeni kullandm. Word penceresine yazlanlarn hepsini deil de belli saydaki karakterini aktarmak istiyorsanz alnacak ilk ve son karakterin sra numarasn Range() nesnesine aadaki gibi parametre olarak vermelisiniz. private void Aktar_Click(object sender, EventArgs e) { object Baslama = 0; object Bitis = 500; richTextBox1.Text =Belge1.Range(ref Baslama, ref Bitis).Text; } imdi ise C# uygulamas dahilinde atm Word belgesinin ieriini okumaya alacam. Word belgesindeki ilk kelimeyi okumak istemi olsaydm aadaki gibi bir satr yazardm. Bu kodda kullandm Word_nesnesi C# uygulamas dahilinde hazrladm Word penceresini, ActiveDocument ise o srada aktif olan belgeyi temsil etmektedir. Ak olan her hangi bir belge yokken bu satr iletilirse hata meydana gelir. textBox1.Text = Word_nesnesi.ActiveDocument.Words[1].Text; Tekrar uyarmak gerekirse, konu C# uygulamas dahilinde alan Word belgesi olduunda Words gibi koleksiyonlarn ilk elemann sra numaras 0 olmayp 1dir. Belgedeki btn kelimeleri yani btn ieriini okumak istemi olsaydm aadaki gibi kod yazardm. int sayi = Word_nesnesi.ActiveDocument.Words.Count; for (int i = 1; i <= sayi; i++) { richTextBox1.Text = richTextBox1.Text + Word_nesnesi.ActiveDocument.Words[i].Text; } Yukarda belirtildii gibi ActiveDocument nesnesinin Wordsden baka Characters koleksiyonu bulunmaktadr. Bu koleksiyondan yararlanp Word belgesinden istenen karakterler okunabilir. imdi Word belgesinin 2. cmlesini okuyup RichTextBoxa aktaracam. Word program cmleleri birbirinden ayrrken nokta ve ardndan gelen boluktan yararlanmaktadr.

162

Memik Yank - Visual C#a Balang Kitab

Baka bir deyile cmle sonunu iaret etmek zere yazlan noktadan sonra bolua yer verilmezse Word cmlenin devam ettiini sanyor. richTextBox1.Text = Word_nesnesi.ActiveDocument.Sentences[2].Text; C# uygulamas dahilinde atm veya hazrlayp bilgi aktardm Word belgesinden paragraf baznda okuma yapmak isteseydim aadaki gibi kod yazardm. Aada verilen satr sayesinde belginin ilk paragraf RichTextBoxa aktarlr.
richTextBox1.Text= Word_nesnesi.ActiveDocument.Paragraphs[1].Range.Text;

Aktif belgenin btn ieriini okumak istemi olsaydm aadaki gibi kod yazardm.
object missing = System.Reflection.Missing.Value; int sayi = Word_nesnesi.ActiveDocument.Paragraphs.Count; for (int i = 1; i <= sayi; i++) { richTextBox1.Text= richTextBox1.Text+Word_nesnesi.ActiveDocument.Paragraphs[i].Range.Text; }

Word Belgesi eriini Biimlemek Bildiiniz gibi Word ile alrken imlecin bulunduu noktann biim zellikleri naslsa yeni girilen karakterler de ayn biim zelliklerine sahip olmaktadr. Bu nedenle kullanclar ounlukla metnin genellinde kullanacaklar biim zelliklerini ayarlayp yle bilgi girerler. Benzer ekilde C# uygulamas dahilinde hazrladnz Word belgesine kod yazarak aktarmak istediiniz metin iin nceden biim zelliklerini ayarlayabilirsiniz. Bu ilemin nasl yapldn aada grebilirsiniz.
ApplicationClass Word_nesnesi = new ApplicationClass(); Document Belge1 = new DocumentClass(); private void Word_penceresi_Click(object sender, EventArgs e) { object sablon = "C:\\Normal.dot"; object missing = System.Reflection.Missing.Value; object visible = true; object belge_tipi = WdNewDocumentType.wdNewBlankDocument; Word_nesnesi.Visible = true; Belge1 = Word_nesnesi.Documents.Add(ref sablon, ref missing, ref belge_tipi, ref visible); Word_nesnesi.Selection.Font.Name = "Tahoma"; Word_nesnesi.Selection.Font.Size = 11; Word_nesnesi.Selection.Font.Bold = 1; }

Blm 6: Windows Forms Uygulamalar

163

Selection.Font.Bold zellii Integer tipinde olduu iin 0 veya 1 deerini aktarmak gerekmektedir. O normali temsil ederken 1 veya daha byk deerler Boldu temsil etmektedir. imdi ise C# uygulamas dahilinde hazrlanan Word belgesinin mevcut ieriinin seili durumda olan ksmnn alt izili olmasn salayacam. Bu amala forma bir dme yerletirip aada verdiim kodu yazdm.
private void alti_cizili_Click(object sender, EventArgs e) { Word_nesnesi.Selection.Font.Underline=WdUnderline.wdUnderlineSingle; }

Word belgesinin seili durumda olan ksmn alt izili yapacak kodu button nesnesinin Click olayn temsil eden metoda yazmak yerine CheckBox nesnesinin CheckedChanged olayn temsil eden metoda aadaki gibi yazabilirsiniz.
private void alt_ciz_CheckedChanged(object sender, EventArgs e) { if (alt_ciz.Checked == true) Word_nesnesi.Selection.Font.Underline=WdUnderline.wdUnderlineSingle; else Word_nesnesi.Selection.Font.Underline =WdUnderline.wdUnderlineNone; }

Word ile normal artlarda yaplabilinen btn biimleme ilemleri C# uygulamas dahilinde hazrlanan Word belgesine kolaylkla uygulanabilmektedir. Bu kitap bir Word kitab olmad iin ancak birka biimleme ileminden sz edeceim. imdi ise C# uygulamas dahilinde hazrlanan Word belgesindeki geerli veya seili durumdaki paragrafn hizalama zelliklerini ayarlamak zere forma bir CheckBox yerletirip aada verilen kodu yazdm. Bu kod sayesinde zerinde bulunulan paragraf veya seili durumdaki paragraflar saa doru hizalanr.
private void saga_hizali_CheckedChanged(object sender, EventArgs e) { Word_nesnesi.Selection.Paragraphs.Alignment = WdParagraphAlignment.wdAlignParagraphRight; }

Word Belgesi zerinde Hareket Etmek C# uygulamas dahilinde hazrladnz Word belgesinde imlecin yerini kod yazarak kolayca deitirebilirsiniz. Bu konuda bilgi vermek iin forma bir dme yerletirdim ve aada verdiim kodu yazdm.

164

Memik Yank - Visual C#a Balang Kitab

private void Basa_git_Click(object sender, EventArgs e) { object missing = System.Reflection.Missing.Value; object unit = Microsoft.Office.Interop.Word.WdUnits.wdStory ; Word_nesnesi.Selection.HomeKey(ref unit, ref missing); } Bu kodda ilk olarak object tipinde 2 deiken tanmladm. Bu deikenlere Microsoftun programclarnn alkanlna uyarak missing ve unit adlarn verdim. Sizler bu deikenlere istediiniz ad verebilirsiniz. unit adn verdiim deikene Microsoft.Office.Interop.Wordde yer alan WdUnits adl enumun wsStory elemann aktardm. Devamnda Word uygulamasnn Selection nesnesine HomeKey() metodunu uyguladm. Bu kod iletildiinde imle aktif belgenin bana gider. Eer belgenin sonuna gitmek istemi olsaydm bu kodu aadaki gibi dzenlerdim. Bu 2 kod arasnda tek fark HomeKey() yerine EndKey() metodunun kullanlm olmasdr. private void sona_git_Click(object sender, EventArgs e) { object missing = System.Reflection.Missing.Value; object unit = Microsoft.Office.Interop.Word.WdUnits.wdStory; Word_nesnesi.Selection.EndKey(ref unit, ref missing); } zerinde bulunulan satrn sonuna gidilmek istendiinde ise aadaki gibi kod yazlmaldr. Bu kodun belgenin bana veya sonuna gidilirken kullanlan koddan fark unit adn verdiim deikene aktarlan sabit bilgidedir. Belgenin bana giderken yararlandm unit adl deikene WdUnits.wdStory sabitini aktarrken satr zerinde hareket etmek zere tanmladm bu deikene WdUnits.wdLine aktardm. Selection nesnesine uygulanan EndKey() yerine HomeKey() metodunu yazsaydm bu kod zerinde bulunulan satrn bana gidilmesine neden olurdu. Burada unit adn verdiim object tipindeki deikene WdUnits.wdLine aktardm iin ilemler satr baznda yaplr. object missing = System.Reflection.Missing.Value; object unit = Microsoft.Office.Interop.Word.WdUnits.wdLine; Word_nesnesi.Selection.EndKey(ref unit, ref missing); imdi ise belgenin ierii zerinde hareket etmeyi paragraf baznda yapacam. Aada verdiim kod iletildiin imlecin yatay konumu deimeden bir sonraki paragrafn zerine gedilir.
object missing = System.Reflection.Missing.Value;

Blm 6: Windows Forms Uygulamalar

165

object unit = Microsoft.Office.Interop.Word.WdUnits.wdParagraph; Word_nesnesi.Selection.MoveDown(ref unit, ref missing,ref missing);

Sanki aa ok tuuna baslm gibi bir imlecin yatay konumu deimeden bir sonraki satrn zerine gitmek istiyorsanz aadaki gibi kod yazabilirsiniz.
object missing = System.Reflection.Missing.Value; object unit = Microsoft.Office.Interop.Word.WdUnits.wdLine; Word_nesnesi.Selection.MoveDown(ref unit,ref missing, ref missing);

mlecin zerinde bulunulan satrdaki bir sonraki kelimenin bana veya bir nceki kelimenin sonuna gitmesini istiyorsanz bu kodda unit adn verdiimiz object tipindeki deikene WdUnits.wdWord sabitini aktardktan sonra Word uygulamasn temsil eden nesneye MoveLeft() veya MoveRight() metodunu uygulamanz gerekir. Bu metotlarn nasl kullanldn aada grebilirsiniz.
object missing = System.Reflection.Missing.Value; object unit = Microsoft.Office.Interop.Word.WdUnits.wdWord; Word_nesnesi.Selection.MoveLeft(ref unit,ref missing, ref missing);

Seim lemleri ve Range Nesnesi Word belgesinin btn ieriini semek istiyorsanz Select() metodundan yararlanabilirsiniz. Bu metodun nasl kullanldn anlatmak iin forma Tmn Se balkl bir dme yerletirip bu dmenin Click olay ile ilikilendirdiim metodunu aadaki gibi dzenledim.
private void Tumunu_sec_Click(object sender, EventArgs e) { Belge1.Select(); }

Select() metodunu burada yapld gibi Document nesnesine uygulamak yerine ApplicationClass nesnesinin ActiveDocument nesnesine aadaki gibi uygulayabilirsiniz. Word_nesnesi.ActiveDocument.Select(); Word belgesinin btn ieriini seerken Range nesnesinden yararlanabilirsiniz. Aada verdiim kodda nce sz konusu belgedeki karakter saysn rendim. nk DocumentClass nesnelerinin Characters adnda bir koleksiyonu bulunmaktadr.

166

Memik Yank - Visual C#a Balang Kitab

private void Tumunu_sec_Click(object sender, EventArgs e) { object baslangic = 0; object bitis = Belge1.Characters.Count; Belge1.Range(ref baslangic, ref bitis).Select(); }

Yukardaki sayfalarda yaplan baz ilemlerin Range nesnelerine uygulandn fark etmi olmalsnz. Biimleme ve dier ilemler iin nceden Range nesnesi hazrlayp ilemleri Range nesnesine uygulayabilirsiniz. Range nesnesini nasl hazrladm aada grebilirsiniz. Tahmin edeceiniz gibi bu satrlar bir metoda yazlp iletilirse Belge1 adl Document nesnesinin btn ierii Bold yaplr. object ilk = 0; object son = Belge1.Characters.Count; Range erim = Belge1.Range(ref ilk, ref son); erim.Bold = 1; Bu kodda Belge1 adl Document nesnesinin btn ieriini Range nesnesi olarak deerlendirdim. Range nesnesini hazrlarken ApplicationClass snfnn ActiveDocument zelliinden yararlanabilirsiniz. Bu nedenle aada verilen kod iletildiinde aktif belgenin btn ierii ayn ekilde bold yaplr.
object ilk = 0; object son = Word_nesnesi.ActiveDocument.Characters.Count; Range erim =Word_nesnesi.ActiveDocument.Range(ref ilk, ref son); erim.Bold = 1;

imdi ise aktif belgenin ilk paragrafn Range nesnesi olarak deerlendireceim. Baka bir deyile aktif belgenin ilk paragrafnn bir Range nesnesi tarafndan temsil edilmesini salayacam. Tahmin edeceiniz gibi aada verilen kod iletildiinde C# uygulamas dahilinde alan Word uygulamasnn aktif belgesinin ilk paragraf panoya kopyalanr.
private void Kopyala_Click(object sender, EventArgs e) { Range erim = Word_nesnesi.ActiveDocument.Paragraphs[1].Range; erim.Copy(); }

imdi ise Word_nesnesi adn verdiim Word uygulamasnn aktif belgesinin seili durumdaki ksmn Range nesnesi olarak deerlendireceim. Aktif belgenin seili durumda olan herhangi bir ksm yoksa bu kodun bir ilevi olmaz.

Blm 6: Windows Forms Uygulamalar

167

private void alti_cizili_Click(object sender, EventArgs e) { Range erim = Word_nesnesi.Selection.Range; erim.Underline = WdUnderline.wdUnderlineSingle; } Word belgesinin seilen ksm Word uygulamasnn Selection nesnesine aktarlmaktadr. Copy() veya Cut() metodu ile Selection nesnesinin ieriini panoya veya baka bir nesneye aktarabilirsiniz. C# projesi dahilinde Word belgesi ap kullancya Word aracl ile ilem yapmas pek istenmez. Aada verilen kod iletildiinde aktif belgenin seili durumdaki ksm kesilip panoya alnr. Range erim = Word_nesnesi.Selection.Range; erim.Cut(); imdi ise aktif belgede imlecin mevcut konumunun sandaki ilk 10 karakteri seeceim. Tabi seme ilemine balamadan yukardaki sayfalarda anlatlan ekilde istenen yere konumlandrlmas gerekir. private void Sec_Click(object sender, EventArgs e) { object son = 10; object unit = Microsoft.Office.Interop.Word.WdUnits.wdCharacter; Word_nesnesi.Selection.MoveEnd(ref unit, ref son); } Bu koda dikkat ederseniz MoveEnd() metoduna 1. parametre olarak verilen unit adl deikene WdUnits.wdCharacter aktarld iin imle 2. parametre kadar saa gider. Baka bir anlatmla imlecin ilk bulunduu yerden balamak zere 10 karakter seilir. MoveEnd() metodu aadaki gibi kullanlrsa imlecin sandaki 2 kelime seilmi olur. Bu belgenin seili durumda olan ksm varsa seili ksm 2 kelime artm olur. private void Sec_Click(object sender, EventArgs e) { object son = 2; object unit = Microsoft.Office.Interop.Word.WdUnits.wdWord; Word_nesnesi.Selection.MoveEnd(ref unit, ref son); } Benzer ekilde bu kodda unit adn verdiim deikenin ieriinde deiiklik yapp seme ileminin satr, paragraf veya sayfa baznda yaplmasn salayabilirsiniz. Seim ilemi btn satr veya paragraf semek eklinde olmayp o srada imlecin bulunduu noktadan sonras

168

Memik Yank - Visual C#a Balang Kitab

zerinde etkili olur. rnein imle belgenin bir satrn orta ksmnda iken aada verilen kod iletilirse 1.5 satr kadar seimi yaplm olunur. private void Sec_Click(object sender, EventArgs e) { object son = 2; object unit = Microsoft.Office.Interop.Word.WdUnits.wdLine; Word_nesnesi.Selection.MoveEnd(ref unit, ref son); } Word Belgesinde Arama lemleri C# uygulamas dahilinde hazrladnz Word belgelerinde arama yapacaksanz belgenin aramaya konu etmek istediiniz ksmn Range ya da Selection nesnesi ile belirtebilirsiniz. Range nesnesi ile yaplan arama tekniine ncelik verdiim iin forma bir dme ve TextBox yerletirip aada verdiim kodu hazrladm. private void Ara_Click(object sender, EventArgs e) { object aranan_str = textBox1.Text; object ilk = 0; object kar_sayi = Word_nesnesi.ActiveDocument.Characters.Count; Range erim = Word_nesnesi.ActiveDocument.Range(ref ilk,ref kar_sayi); } Bu kod sayesinde kullanc Word belgesinde aramak istedii metni TextBoxa girip bu dmeyi tkladnda belgenin tmn kapsayacak Range nesnesi hazrlam olur. Sizler aramay belgenin tm yerine istediiniz ksm ile snrlayabilirsiniz. Belgenin aramaya konu edilecek ksm bu ekilde tespit edildikten sonra sra arama yaplrken kullanlan ve Microsoft.Office.Interop.Wordde yer alan Find arayznn rneini almaya gelir. Find nesnesini nasl hazrladm aada grebilirsiniz.
private void Ara_Click(object sender, EventArgs e) { object aranan_str = textBox1.Text; object ilk = 0; object kar_sayi = Word_nesnesi.ActiveDocument.Characters.Count; Range erim=Word_nesnesi.ActiveDocument.Range(ref ilk, ref kar_sayi); Microsoft.Office.Interop.Word.Find arama_nesnesi; arama_nesnesi = erim.Find; }

Blm 6: Windows Forms Uygulamalar

169

Arama yapmak zere hazrladm bu kodda Range nesnesinin Find zelliini Find tipindeki deikene aktararak Find nesnesi hazrlam oldum. Sra geldi Execute() metodu ile arama yapmaya. Wordde normalde arama yaplrken ekrana getirilen diyalog kutusunda nasl ok sayda seenek bulunuyorsa Execute() metodu da ok sayda parametreye sahiptir. Biz aranacak metni 1. parametre olarak vermekle yetineceiz ve dier btn parametrelerin yerine System.Reflection.Missing.Value ieriine sahip Object tipinde bir deikeni kullanacaz. Object tipindeki bu deikene deger gibi Trke bir ad verip kendimi tehlikeye atmadm.
private void Ara_Click(object sender, EventArgs e) { object aranan_str = textBox1.Text; object ilk = 0; object kar_sayi = Word_nesnesi.ActiveDocument.Characters.Count; Range erim=Word_nesnesi.ActiveDocument.Range(ref ilk,ref kar_sayi); Microsoft.Office.Interop.Word.Find arama_nesnesi; arama_nesnesi = erim.Find; object missing = System.Reflection.Missing.Value; arama_nesnesi.Execute(ref aranan_str, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); if (arama_nesnesi.Found == true) MessageBox.Show("Aranan Bilgi Bulundu"); }

Grdnz gibi Execute() metodu toplam 15 parametreye sahiptir. Kendisine 1. parametre olarak verilen bilgi sz konusu belgenin Range nesnesi ile iaret edilen ksmnda varsa Find nesnesinin Found zellii true olmaktadr. Arama ileminin seyri hakknda bilgi edinirken Find nesnesinin Found zelliine bakmak yerine Execute() metodunun geriye gnderdii bool bilgiye bakabilirsiniz. Aranan bilgi bulunduunda Execute() metodu geriye true gndermektedir. Yukarda sylendii gibi arama ilemi belgenin Range nesnesi ile iaret edilen ksmnda yaplabildii gibi Selection nesnesinden yararlanlabilir. Selection nesnesinden yararlanlarak nasl arama yapldn aada grebilirsiniz. Bu kitab Word kitabna evirmemek iin Execute() metodunun parametreleri hakknda bilgi vermedim.
private void Ara_Click(object sender, EventArgs e) { object aranan_str = textBox1.Text; object missing = System.Reflection.Missing.Value; object unit = Microsoft.Office.Interop.Word.WdUnits.wdStory; Word_nesnesi.Selection.HomeKey(ref unit, ref missing);

170

Memik Yank - Visual C#a Balang Kitab

Microsoft.Office.Interop.Word.Find arama_nesnesi; arama_nesnesi = Word_nesnesi.Selection.Find; bool sonuc = arama_nesnesi.Execute(ref aranan_str, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); if (sonuc) MessageBox.Show("Aranan Bilgi Bulundu"); }

Word Belgesini Kaydetmek Yukardaki sayfalarda C# uygulamas dahilinde yeni Word belgesi hazrlayp bilgi girmitik. imdi srada kod yazarak hazrlayp bilgi girdiimiz belgeyi kaydetme var. in merakllarn dnerek bu ilem iin kullanlan SaveAs() metodunun orijinal yapsn verecein. Bu metodun yaps incelendiinde tam tamna 16 parametreye sahip olduu grlr. Ancak rkmenize gerek yok bu 16 parametreden ilki hari dierlerini kullanmak istee baldr.
public virtual void SaveAs( [In, Optional] ref object [In, Optional] ref object [In, Optional] ref object [In, Optional] ref object [In, Optional] ref object [In, Optional] ref object [In, Optional] ref object [In, Optional] ref object [In, Optional] ref object [In, Optional] ref object [In, Optional] ref object [In, Optional] ref object [In, Optional] ref object [In, Optional] ref object [In, Optional] ref object [In, Optional] ref object );

FileName, FileFormat, LockComments, Password, AddToRecentFiles, WritePassword, ReadOnlyRecommended, EmbedTrueTypeFonts, SaveNativePictureFormat, SaveFormsData, SaveAsAOCELetter, Encoding, InsertLineBreaks, AllowSubstitutions, LineEnding, AddBiDiMarks

Bu blme ayrlan sayfa saysn fazla arttrmamak iin btn parametrelerden sz etmeyeceim. Yukarda Add() metodu hakknda bilgi verilen sayfalardan bildiiniz Word belgelerini, aarken, hazrlarken ve kaydederken varsaylan deerlere bal kalnmak istenen parametrelerin yerine System.Reflection.Missing.Value sabiti aktarlm Object tipindeki bir deikeni kullanmak mmkndr.

Blm 6: Windows Forms Uygulamalar

171

C# projesi dahilinde hazrlanan Word belgesinin nasl kaydedildiini anlatmak iin forma bir SaveFileDialog nesnesi ve Kaydet adnda bir dme yerletirip aada verdiim kodu hazrladm. Kaydetmek istediim belge yukarda hazrlayp ve Belge1 adn verdiim DocumentClass nesnesidir. Karklk olmasn diye DocumentClass ve ApplicationClass nesnelerini hazrladm satrlar Kaydet dmesi iin hazrladm metodun yaknna tadm. Ayrca kaydetme ilemi srasnda hazrlanacak DOC uzantl dosyann adn kullancdan istemek iin forma bir SaveFileDialog nesnesi yerletirdim.
ApplicationClass Word_nesnesi = new ApplicationClass(); Document Belge1 = new DocumentClass(); private void Kaydet_Click(object sender, EventArgs e) { object missing = System.Reflection.Missing.Value; saveFileDialog1.ShowDialog(); object Dosya = saveFileDialog1.FileName; Belge1.SaveAs(ref Dosya, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); }

O srada C# uygulamas dahilinde hazrlanan Word belgesini kaydetmek zere bu kod iletildiinde kullancdan nce dosya ad istenir. Adn girdiiniz dosyaya DOC uzantsn vermeniz nerilir. nk bu srada kaydedilmek istenen DocumentClass nesnesi hazrlanrken belge tipinin DOC uzants verilen normal belge olduunu varsayyoruz. Ayrca kayt srasnda kayt tr konusunda bir ayarlama yapmadk. Bu kod iletilip kullancnn girdii belge ad o srada ak Word penceresinin balna yazlr. Word az ok kullanm olanlarn bildii gibi Word belgeleri kaydedilirken Farkl Kaydet diyalog kutusunda istenen kayt tr seilebilmektedir. Benzer seimi C# uygulamas dahilinde hazrladnz belgeleri kaydederken yapabilirsiniz. imdi yukarda hazrladm Word belgesini bu kez RTF formatnda kaydedeceim. Bunu yaparken kayt trn SaveAs() metodunun 2. parametresinde belirteceim.
ApplicationClass Word_nesnesi = new ApplicationClass(); Document Belge1 = new DocumentClass(); private void Kaydet_Click(object sender, EventArgs e) { object missing = System.Reflection.Missing.Value; saveFileDialog1.ShowDialog();

172

Memik Yank - Visual C#a Balang Kitab

object Dosya = saveFileDialog1.FileName; object kayit_turu = WdSaveFormat.wdFormatRTF; Belge1.SaveAs(ref Dosya, ref kayit_turu, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); }

Bu kodda yukardakinden farkl olarak object tipinde bir deiken tanmlayp Microsoft.Office.Interop.Word de yer alan WdSaveFormat adl enumun wdFormatRTF yesini bu deikene aktardm. Devamnda kayit_turu adn verdiim deikeni SaveAs() metoduna 2. parametre olarak verdim. Word Belgelerini Kapatmak imdi ise C# uygulamas dahilinde hazrlayp sonra da SaveAs() metodu ile kaydettiim Word belgesini kapatacam. Bu amala forma Kapat adnda(Close m deseydim, belki Kapat birileri register etmitir) bir dme yerletirip aada verdiim kodu hazrladm. private void Kapat_Click(object sender, EventArgs e) { object missing = System.Reflection.Missing.Value; Belge1.Close(ref missing, ref missing, ref missing); } aret edilen belgeyi kapatmak amacyla kullanlan Close() metodu 3 parametreye sahiptir. Bu metodu varsaylan deerlere gre iletmek istiyorsanz yine object tipinde bir deiken tanmlayp bu deikene System.Reflection.Missing.Value aktarp her 3 parametrenin yerine kullanmalsnz. Bu durumda son hali kaydedilmemi bir belge Close() metodu ile kapatlmak istenirse otomatik olarak ekrana Farkl Kaydet diyalog kutusu gelir. Kapatlmak istenen belgede yaplan deiikliklerin kaydedilmesi konusunda size uyar bulunulmasn istemiyorsanz Close() metodunun 1. parametresini aadaki gibi dzenleyebilirsiniz. private void Kapat_Click(object sender, EventArgs e) { object missing = System.Reflection.Missing.Value; object degisikleri_kaydet = WdSaveOptions.wdDoNotSaveChanges; Belge1.Close(ref degisikleri_kaydet, ref missing, ref missing); }

Blm 6: Windows Forms Uygulamalar

173

Word belgesi yerine C# uygulamas dahilinde atnz Word penceresini kapatmak veya Wordn almasn sona erdirmek istiyorsanz ApplicationClass snfnn Quit() metodunu kullanabilirsiniz. Bu metodun nasl kullanldn aada grebilirsiniz. private void Cikis_Click(object sender, EventArgs e) { object missing = System.Reflection.Missing.Value; Word_nesnesi.Quit(ref missing, ref missing, ref missing); } C# uygulamas dahilinde atnz Word penceresini kapatrken ak olan belgelerle ilgili olarak ekrana Farkl Kaydet diyalog kutusu getirilir. Bu diyalog kutusunun gelmesini istemiyorsanz Quit() metodunun ilk parametresi ile aadaki gibi ayarlama yapmalsnz. private void Cikis_Click(object sender, EventArgs e) { object missing = System.Reflection.Missing.Value; object uyari = WdSaveOptions.wdDoNotSaveChanges; Word_nesnesi.Quit(ref uyari, ref missing, ref missing); } Yukardaki sayfalarda iaret edildii gibi Word uygulamasn temsil eden ApplicationClass snfnn Documents adnda bir koleksiyonu bulunmaktadr. O srada C# uygulamas dahilinde alan veya hazrlanan her belge bu koleksiyonun yesi yaplmaktadr. Ak olan belgelerin saysn renmek Count zelliine bakabilirsiniz. int sayi = Word_nesnesi.Documents.Count; Documents koleksiyonundaki mevcut belgelerden birisini elde etmek istiyorsanz Documents koleksiyonun get_item() metodundan yararlanabilirsiniz. Bu metodun nasl kullanldn aada grebilirsiniz. Burada dikkat edilmesi gereken ince nokta Documents koleksiyonun ilk elemann sra numarasnn 1 olmasdr. Document Belgem = new DocumentClass(); object sira = 1; Belgem = Word_nesnesi.Documents.get_Item(ref sira); Mevcut Word Belgelerini Amak Yukardaki sayfalarda nce Word balattk. Sonra Add() metodu ile yeni belge hazrlayp Word penceresine getirip bilgi girip biimlendirdik. Ardndan bu belgeleri kaydetmeyi denedik. imdi srada mevcut Word belgelerini

174

Memik Yank - Visual C#a Balang Kitab

amak var. Tabi Word ile mevcut belgelerini aabilmek iin daha nceden ApplicationClass snf ile Word balatm olmak gerekir. Yukardaki sayfalarda Wordn varsaylan ayarlarna bal kalp Word balatld zaman ekrana ierii bo bir belge getirdik. Word balatldnda otomatik olarak hazrlanan Word belgesine bilgi girilmeden mevcut belgelerden birisi aldnda Word otomatik olarak hazrlad belgeyi kapatmaktadr. C# uygulamalar dahilinde mevcut belgeler DocumentClass snfnn Open() metodu ile almaktadr. ok sayda parametreye sahip bu metodun yapsn aada grebilirsiniz.
Document Open( [In] ref object FileName, [In, Optional] ref object ConfirmConversions, [In, Optional] ref object ReadOnly, [In, Optional] ref object AddToRecentFiles, [In, Optional] ref object PasswordDocument, [In, Optional] ref object PasswordTemplate, [In, Optional] ref object Revert, [In, Optional] ref object WritePasswordDocument, [In, Optional] ref object WritePasswordTemplate, [In, Optional] ref object Format, [In, Optional] ref object Encoding, [In, Optional] ref object Visible, [In, Optional] ref object OpenAndRepair, [In, Optional] ref object DocumentDirection, [In, Optional] ref object NoEncodingDialog, [In, Optional] ref object XMLTransform);

Grdnz gibi Open() metodu da tpk SaveAs() metodu gibi ok sayda parametreye sahiptir. Alacak dosyann iaret edildii ilk parametre hari dierlerini hazrlayp kullanmak zorunda deilsiniz. Baka bir deyile ilk parametre hari dierlerinin yerine kullanmak zere object tipinde bir deiken tanmlayp bu deikene System.Reflection.Missing.Value sabitini aktarp kullanabilirsiniz. Mevcut Word belgelerinden birisini Open() metodu ile nasl aabileceinizi anlatmak iin karklk olmasn diye yeni bir proje hazrladm ve forma OpenFileDialog nesnesi yerletirip aada verdiim kodu hazrladm. nk amacmz DocumentClass snfnn Open() metodunu yakndan incelemektir. Deiken ad benzerlii kabahatini ileme olasln azaltmak iin dme adnn bir ksmn ngilizce bir ksmn Trke yaptm.
ApplicationClass Word_nesnesi; Document Belge1; private void Dosya_open_Click(object sender, EventArgs e) { Belge1 = new DocumentClass();

Blm 6: Windows Forms Uygulamalar

175

Word_nesnesi = new ApplicationClass(); Word_nesnesi.Visible = true; openFileDialog1.ShowDialog(); object kutuk = openFileDialog1.FileName; object missing = System.Reflection.Missing.Value; Belge1 = Word_nesnesi.Documents.Open(ref kutuk, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); }

Grdnz gibi ilk parametre hari dier 15 parametre olarak System.Reflection.Missing.Value aktardm object tipindeki deikeni kullandm. Bu kod iletildiinde ekrana gelecek Open diyalog kutusunda seilecek dosya alp Word penceresine gelir. Tabii kullanc dosya seimi yaplan diyalog kutusunda dosya semez veya uygun olmayan bir dosyay seerse hata meydana gelir. Konuyu uzatmamak ve kodun ksa olmasn salamak iin hata kontrol ilemlerini yapmadm. Anlatlan ekilde DocumentClass snfnn Open() metodu ile ap Word penceresine getirdiiniz belgenin ieriinde deiiklik yaplmasn(yani dosyann deitirilmesini) istemiyorsanz Open metoduna 3. parametre olarak System.Reflection.Missing.Value sabitini aktardnz Object tipindeki deiken yerine object tipinde baka bir deiken tanmlayp true aktarp kullanmanz gerekir. Bu ilemi nasl yaptm aada grebilirsiniz.
ApplicationClass Word_nesnesi; Document Belge1; private void Dosya_open_Click(object sender, EventArgs e) { Belge1 = new DocumentClass(); Word_nesnesi = new ApplicationClass(); Word_nesnesi.Visible = true; openFileDialog1.ShowDialog(); object kutuk = openFileDialog1.FileName; object missing = System.Reflection.Missing.Value; object yalniz_read = true; Belge1 = Word_nesnesi.Documents.Open(ref kutuk, ref missing, ref yalniz_read, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); }

176

Memik Yank - Visual C#a Balang Kitab

Bu ekilde dzenlenen Open() metodu ile alan Word belgesinde deiiklik yaplabilir ancak deiiklikler alan dosyaya yanstlamaz. sterseniz belgenin yeni halini baka bir dosya ad altnda kaydedebilirsiniz. Open metodu ile amak istediiniz dosya DOC uzantl deilse ve dntrme ncesi kullancdan onay alnsn istiyorsanz Open() metoduna 2. parametre olarak true ierie sahip object tipindeki bir deikeni kullanmalsnz.
ApplicationClass Word_nesnesi; Document Belge1; private void Dosya_open_Click(object sender, EventArgs e) { Belge1 = new DocumentClass(); Word_nesnesi = new ApplicationClass(); openFileDialog1.ShowDialog(); object kutuk = openFileDialog1.FileName; Word_nesnesi.Visible = true; object missing = System.Reflection.Missing.Value; object izin_iste = true; object yalniz_read = false; Belge1 = Word_nesnesi.Documents.Open(ref kutuk, ref izin_iste, ref yalniz_read, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); }

Kitabn sayfa saysn arttrmamak iin Open() metodunun burada sz edilmeyen dier 13 parametresinin her birisinin ilevlerini aratrmay size brakyorum. Word Belgelerini Yazdrmak C# projesi dahilinde hazrladnz veya atnz Word belgesini yazdrmak istiyorsanz ApplicationClass snfnn Printout() metodundan yararlanmanz gerekir. Bu metot tpk SaveAs() ve Open() metotlar gibi ok sayda parametreye sahip olduu iin kullanlmas biraz zahmetlidir.
public virtual void PrintOut( [In, Optional] ref object Background, [In, Optional] ref object Append, [In, Optional] ref object Range, [In, Optional] ref object OutputFileName, [In, Optional] ref object From, [In, Optional] ref object To, [In, Optional] ref object Item, [In, Optional] ref object Copies, [In, Optional] ref object Pages,

Blm 6: Windows Forms Uygulamalar

177

[In, [In, [In, [In, [In, [In, [In, [In, [In,

Optional] Optional] Optional] Optional] Optional] Optional] Optional] Optional] Optional]

ref ref ref ref ref ref ref ref ref

object object object object object object object object object

PageType, PrintToFile, Collate, ActivePrinterMacGX, ManualDuplexPrint, PrintZoomColumn, PrintZoomRow, PrintZoomPaperWidth, PrintZoomPaperHeight);

Bu metodun nasl kullanldn anlatmak iin mevcut Word belgelerinin nasl aldn anlatmak zere hazrladm projenin formuna Yazdir adnda bir dme yerletirdim. Ardndan bu dmenin Click olayn temsil eden metodu aadaki gibi dzenledim.
private void Yazdir_Click(object sender, EventArgs e) { object missing = System.Reflection.Missing.Value; Word_nesnesi.PrintOut(ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); }

Verilen koddan fark etmi olabileceiniz gibi PrintOut() metodunun btn parametrelerinde System.Reflection.Missing.Value sabiti aktarlm object tipindeki deikeni kullanmak mmkndr. Bu ekilde dzenlenen PrintOut() metodu aktif belgenin tmn yazcya gnderir. Geerli belgenin tm yerine seili durumdaki ksmn yazcya gndermek istiyorsanz PrintOut() metodunun 3. parametresini aadaki gibi ayarlamalsnz.
private void Yazdir_Click(object sender, EventArgs e) { object secim = WdPrintOutRange.wdPrintSelection; object missing = System.Reflection.Missing.Value; Word_nesnesi.PrintOut(ref missing, ref missing, ref secim, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); }

Aktif belgenin seili ksm yerine geerli sayfay yani belgenin o srada zerinde olunan sayfasn yazdrmak istemi olsaydm secim adn vermi olduum deikenin ieriini aadaki gibi ayarlardm. object secim = WdPrintOutRange.wdPrintCurrentPage;

178

Memik Yank - Visual C#a Balang Kitab

ApplicationClass nesnesi sayesinde ekrana getirilen Word penceresinde DocumentClass nesnesi sayesinde ierii grntlenen Word belgesinin belli numaraya sahip sayfalarn yazdrmak istiyorsanz bu sayfalar PrintOut() metodunun 5. ve 6. parametreleri ile iaret etmeniz gerekir. Tabi bu durumda 3. parametrenin ayrca ayarlanmas gerekir. PrintOut() metodu aadaki gibi dzenlenirse aktif belgenin 2. ve 3. sayfalar yazdrlr.
private void Yazdir_Click(object sender, EventArgs e) { object secim = WdPrintOutRange.wdPrintFromTo; object first_sayfa = "2"; object last_sayfa = "3"; object missing = System.Reflection.Missing.Value; Word_nesnesi.PrintOut(ref missing, ref missing, ref secim, ref missing, ref first_sayfa, ref last_sayfa, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); }

Konuyu uzatmamak iin PrintOut() metodunun dier parametrelerinin ilevini size brakyorum. Aktif belgeyi hemen yazdrmak yerine nizleme(Preview) modunda incelemek istiyorsanz ApplicationClass nesnesinin PrintPreview zelliini true yapabilirsiniz. Bu zelliin nasl kullanldn anlatmak iin forma bir dme yerletirip aada verdiim satr yazdm. Bu metot iletirse sanki Word penceresine geip Dosya mensnden nizleme komutu verilmi gibi nizleme moduna geilir.
private void on_izle_Click(object sender, EventArgs e) { Word_nesnesi.PrintPreview = true; }

Blm 6: Windows Forms Uygulamalar

179

ADO.NET KTABIMIN NSZ


Bu kitab birka cmle ile bize anlat denmi olsayd cevabm u olurdu: Bu kitapta 420 sayfa boyunca ADO.NET anlattm. Bunu yaparken okurlarn C# hakknda temel bilgilere sahip olduunu varsaydm. Bu kitaptan biraz zahmetli de olsa Visual Basic .NET kullanclar da yararlanabilirler. nk her 2 programlama dili de .NET Framework ile gelen ayn snflar kullanyor. Bu kitap SQL Server konulu bir kitap olmamasna ramen daha nce SQL Server hi kullanmam olanlarn kitaptan yararlanmasn salamak iin yer yer SQL Serverdan sz ettim. Hemen soranlar olacaktr: Bu kitapta ADO.NET hakknda her konuda bilgi var m? Bu soruya vereceim elbette hayrdr. Tam 420 sayfa boyunca ADO.NET anlattm. Bu kitap 300 sayfa olsayd baz konular kitapta yer almazd. Kitab 420 yerine 500 sayfa olarak dzenlemi olsaydm kitaba baka konular ekler, mevcut konulardan bazlarn ise daha ayrntl anlatrdm. rnein C# uygulamas dahilinde C# kodu yazarak SQL Server iin Store Procedure veya kullanc tanml fonksiyon hazrlama gibi konular daha ayrntl anlatrdm, ClickOnce iin ayrlan sayfalarn says iki katna kard. Yakn bir zamana kadar kitaplarmda kullandm 3-5 satrlk kodlar bazen ekran grnts olarak kitap metni iinde kullanrdm. Bu sayede kodu incelemek daha kolay oluyordu. Bazlar bu ekran grntlerini kitap iirme olarak deerlendirip Memik YANIKn kitaplarn eletiriyorlard. Hal bu ki kitap metni iinde direk kod yerine, kodun olduu ekran grntsn kullanmann kitabn sayfa says zerinde etkisi ok snrlyd. Bunu kantlamak iin oturup alp bir yaz hazrlayp kiisel sistemde yaynladm. Bu kitapta kod ieren ekran grntlerinden mmkn mertebe kandm. Tabii ki bu demek deildir ki bu kitapta hi ekran grnts yoktur. Zaten ekran grnts kullanmadan baz konular anlatmak mmkn deildir. rnein Setup Wizard anlatrken ekran grnts kullanmak zorundasnz. Bu kitapta yazlanlar anlamak iin tekrar tekrar okumak zorunda kalmazsnz. nk Memik YANIKn kaleminden kan kitaplar klasik programlama kitaplar gibi deildir, Memik YANIKn tarafndan yazlan kitaplarda Help tad yoktur, Memik YANIKn cmleleri eviri kokmaz. Bu nedenledir ki bu kitap kolay okunur, bu kitapta yazlanlar anlamak iin akla karay semezsiniz. Yaknda bir zamanda Microsoft firmas Visual Studio 2008i piyasaya verecektir. Bu arada birok kii Visual Studio 2005i kullanmaya devam edecektir. Ayrca 2008 yl iin SQL Servern yeni srm piyasaya verilebilir. Bu kitapta veritaban olarak genellikle SQL Servern 2005 srmn kullandm. Hemen belirtmek gerekirse, bu kitap program

180

Memik Yank - Visual C#a Balang Kitab

gelitirme arac olarak ister Visual Studio 2005 ister Visual Studio 2008 kullanlsn herhangi bir uyum sorunu yaanmaya ihtimali dktr. Benzer ekilde bu kitabn ierii bakmndan veritabann SQL Server 2005 veya SQL Server 2008 olmasnn nemli bir etkisi yoktur. www.memikyanik.comdan mail ve MSN adresimi alp her trl sorununuzu yazabilir veya direk benimle balant kurabilirsiniz.

Blm 6: Windows Forms Uygulamalar

181

Delphi 2007 Kitabm Nasl Bir Kitaptr?


Biraz tarih: 1995 ylnn sonlar; daha nce Visual Basic hakknda kitap yazm birisi olarak grsel programlamaya yatkndm ve grsel program gelitirme aralarn anlatma konusunda hazrlm vard. nk Visual Basicin TextBox ile Delphinin Editi benzer ilev ve zelliklere sahip olduklar iin fazla yabanclk ekmeyeceimi dnmtm. tesi, o gnlerde Pascal uzman olmasam bile Pascal diline yabanc deilim. Neyse uzatmayalm; 7-8 aylk youn bir almann sonucu Delphi kitabn hazrladm. Daha sonra bu Delphi kitabna eklemeler yaptm. En son Ezel Balkan adyla yaynladm Delphi 7 kitab 920 sayfa olup potansiyel okurlarn beklentilerinin byk bir ksmn karlayacak bir ierie sahipti. Aka belirtmek gerekirse 2006 yl ortalarnda elimde okurlardan ilgi grd iin 3 bask yapan 920 sayfalk kitap varken tam 10 ay boyunca Delphi zerinde alp Delphi 2007 for Win32 kitabn yazdm. Bundan u sonucu karabilirsiniz: Ezel Balkan adyla yaynladm 920 sayfalk Delphi kitabmla burada szn ettiim kitap arasnda dalar kadar fark var.

182

Memik Yank - Visual C#a Balang Kitab

Delphi 2007 kitabn ilk yazmaya baladm srada normal alma tempomla 3 aylk bir srenin yeterli olacan dnyordum. Ak yazmak gerekirse, elimde 920 sayfalk Delphi 7 kitab vard; dzey ykseltme adna baz konular kitaptan karacaktm. Bylece Delphi 2007 kitab yaklak 950 sayfa olacakt. Son Delphi kitabma 100 sayfa eklersem eksikliklerini byk oranda azaltm olacaktm ve bu kitap en kapsaml Trke Delphi kitab olabilecekti. Baka bir deyile ilgi gren son Delphi kitabmdan 70 sayfa karp yerine 100 sayfa ekleyecektim. Baz sayfalar madem karacaktn da neden 3 yl nce bu sayfalar kitaba ekledin diye soranlar olabilir? Bu soruya Delphi.NET kitabmdan rnek vererek anlatacam: Delphi.NET kitabmda Transactionlar hakknda bilgi verirken nce SQL Server 2000 ile gelen Interprise Managerdan yararlanp 2 basit Stored Procedure hazrlayp ilettim. Sonra bunlar Transaction blouna alp ilettim. stedim ki SQL Server dahilinde Transactionleri kullanmam olanlar konuya kolayca adapte olsunlar. Bu durumda SQL Server ve Transactionlar hakknda ortalama dzeyde bilgisi olanlar iin kitabn sayfa says 3 sayfa bouna artm oldu. Ancak SQL

Blm 6: Windows Forms Uygulamalar

183

Server konusunda ortalama dzeyde bilgisi olmayanlarn Delphi projesi dahilinde Transationlerin nasl kullanldn anlamalarn garanti etmi oldum. te kitabn sayfa saysn azaltma bu gibi konularda oluyor. rnein potansiyel okurlarn ounluunun artk Paradox veritabanlar hakknda bilgiye ihtiyac yoktur deyip kitabn Paradox veritabanlar hakknda bilgi ieren sayfalarn azaltrsnz. Neyse konudan uzaklamayaym: Balangta 920 sayfalk Delphi 7 kitabnn 850 sayfasn yeni kitabmda kullanmay dnrken Memik YANIK hep balang dzeyi kitaplar yazar, yeni baladysan nerebilirim, ancak Memik YANIK kitaplar yeterli deildir eklindeki yaygn eletiriden sanrm etkilendim ki elimdeki kitabn 850 sayfasn yeni kitapta kullanmay dnrken bir de baktm kitabn dzeyini ykseltme adna neredeyse her eyi yeni batan yazmm. imdi yukarda ksaca zetlediim Memik YANIK kitaplarnn yeni balayanlar iin uygun olduu eklindeki genel inana biraz deinmek istiyorum. Konumuz Delphi olsun: Delphiyi renip program yazmaya karar verdiniz. Yani yolun bandasnz. Bu durumda edindiiniz kitabn en nemli ilevi sizi cesaretlendirmesi ve hevesinizi krmamasdr. nk renme istei ve alma azmi kimsede sonsuz deildir. Bu nedenle metni yle kaleme almalym ki okur okumakta zorlanmamal, yazdm anlamas iin baka kaynaklara bavurma ihtiyacn duymamaldr. rnein birka gn nce C# kitabm yazarken Access veritabanlarnda kullanclar iin parola tanmlama ve mevcut kullancnn parolasn C# uygulamas dahilinde isteme gibi konulara rnek verirken yazdklarmn havada kaldn fark ettim. nk bu konulara programclk kitaplarnda yer verilmezken Access kitaplarnda ise olaya programc gz ile baklmyordu. Bunu fark edince bendeki mevcut kitaplara baktm. Birisi Microsoft Pressten km 1000 sayfalk kapsaml kitap olmakla birlikte dier 3 kitapta yazlanlar yanl olmamakla birlikte hi birisi Access veritaban kullanan programcnn gvenlikle ilgili olarak gerek duyaca bilgileri iermiyordu. Ayrca yazlanlar anlamak kolay deildi. Kitabn birisinde yazar aklama yapmadan okuru ikna etmeden direk Wizard hakknda bilgi veriyordu. Ben ne mi yaptm? nce okuru karlaaca muhtemel sorunlar hakknda bilgilendirdim. Devamnda onu ikna ettim. Sra Wizarda geldiinden okur ne yapacan zaten biliyordu. imdi soraym: ne yazd belli olmayan kolay okunmayan kitap ileri dzey oluyordu da konunun ilk okumada anlalmas iin baka yazarlarn 3 sayfada anlattklarn 4 sayfada anlatan Memik Yankn kitab neden balang dzeyi oluyor? Kiisel grme gre bir kitapta yazlanlar zor anlalyorsa ya okur yanl bir kitap semitir ya da kitap kt kaleme alnmtr. Programclkta belli bir noktaya gelmi olanlar kitaplar hakknda konutuklarnda ister istemez kendi pencerelerinden bakarak deerlendirme

184

Memik Yank - Visual C#a Balang Kitab

yapyorlar. Hal bu ki kendisinin programclk kitabndan renecei ok az ey kalmtr. Olur ya zamannda gerek duymad iin ilgilenmedii bir konuyu sonradan merak ettiinde elindeki kitaba bakar. Baka bir deyile artk neyin ne olduunu, neyin ne ie yaradn biliyordur. Kitaptan arad olsa olsa bilmedii veya unuttuu ilemin nasl yaplacadr. Hal bu ki yeni balayan veya o programlama dilinden henz ekmeini karmayan kii neyin ne ie yaradn bilmiyordur. Bu nedenle ona konular adm adm anlatmak gerekiyor. Tabii konular adm adm anlatlnca ister istemez sayfa says artyor. Bu gre bir de rnek verelim: Konu Delphide interfaceler olsun. Usta programcmz interfacelerin ne olduunu ne ie yaradklarn biliyordur da belki gerek duymad iin Delphide nasl hazrlandn bilmiyordur veya unutmutur. Usta programcmz kitaptan bu konuyu renmek istediinde iin hikaye ksmndan hakl olarak hemen sklr. nk interfacelerin ne olduunu ne ie yaradn zaten biliyordur. Ne var ki bir yazar olarak interfaceleri anlatmaya balamadan n bilgi vermeyi tercih ederim. n bilgi verilmeden hemen asl konuya geilirse Interfacelerin nasl hazrlanp kullanld renilse bile temeli bilinmedii iin ksa srede unutulur. Bu adan Delphi 2007 kitabma baktmda hibir konunun zerinin rtlp ezbere anlatlmadn, her konunun nedenleri ile derinlemesine incelendiini rahatlkla syleyebilirim. ok sayda forum sitesinde Delphi ile ilgili olarak daha nce sorulmu ve cevaplanm binlerce soru vardr, yaynlanm yzlerce makale vardr. Bu artlarda kalkp Memik Yankn 1100 sayfalk Delphi kitabna 49 YTL demek caiz midir? Delphiye merak sarsaydnz bu kitaba 49 YTL der miydiniz? Baz arkadalar bu soruya hayr diye cevap vereceklerdir. nk merak ettii konular forumlara soracan, Delphi hakknda sitelerde yzlerce makalenin olduunu, hatta yerli yabanc ok sayda E-Book bile bulabileceini syleyeceklerdir. ok zamannz varsa, snrsz renme isteiniz varsa; tesi hi aceleniz yoksa, bir iki yl iinde Delphi ile program yazmay dnmyorsanz, renciyseniz ve yakn bir zamanda gemeniz gereken bir Delphi dersi yoksa masraf yapp Memik YANIKn Delphi kitabn almanza gerek yoktur. tesi ben evirmenlerin kurduu cmleleri iki kez okumaktan sklmam, eviri kitaplarda yazlanlar anlayamazsam suu kitabn yazar-evirmeni yerine kendimde ararm diyorsanz 49 YTL verip Memik Yankn Delphi kitabn almanza gerek yoktur. Tecrbe asndan orta dzeydeki bir programcnn Delphi ile ilgili olarak imdiye kadar merak edip cevabn arayp bulduu 100 sorunun olduunu varsayalm. Delphi ile program yazmaya karar veren birisinin bu sorularn hepsini bir veya birden fazla kitapta cevap bulmas, bu sorularn hepsinin cevabn okuldaki veya kurstaki hocasndan almas veya gece gndz

Blm 6: Windows Forms Uygulamalar

185

forumlarda zaman harcayarak cevap bulmas mmkn deildir. Kiisel grme gre Delphi ile ilgili olarak karlamanz muhtemel olan ilk 25 sorunun cevabn kitaptan almaz veya gittiiniz kurstan bu sorulara cevap verilmezse geriye kalan 75 soruya forumlardan makalelerden cevap bulmak yllarnz alr. O zamana kadar da o programlama dili gncelliini kaybeder. Memik YANIK bu kitabnda Delphi ile program yazmak isteyenlerin karlamas muhtemel olan sorularn hepsine cevap vermeyi hedeflemedi. Hedefledii udur: Bu kitab okuyanlar Delphi ilgili her konuyu renebilecek potansiyele sahip olurlar. Forumlarda Delphi veya baka programlama dili konusunda henz yolun banda olanlar sk sk Delphide ustalamak, program yazmak istediini yazp nasl bir yol izlemesi gerektiini sorar ve kitap nerin derler. Ne var ki bazen Delphi konusunda belli bir dzeye gelmi arkadalarn bazlar byle sorulara kitaba gerek yok, e-booklara bak, sitelerdeki makaleleri oku, merak ettiin konu olduunda cevabn bulamadn sorular olduunda forumlara yaz derler. Aslnda syledikleri, nerdikleri tmden yararsz ve geersiz eyler deildir. Memik Yankn Delphi kitabn okuyan kii temel konulara vakf olduu iin soru sormasn biliyordur, verilen cevaplar anlyordur. Forum yneticileri foruma soru yazanlarn dertlerini net olarak yazamadklarndan, sorularn ak olmadndan srekli dert yanarlar. Sorularn(Delphi konusundaki sorularn diyelim) anlalmaz olmasnn nedeni o kiinin Memik YANIKn Delphi kitabn okumam olmas ve o programla dili ile ilgili temel kavramlara sahip olmamasdr. Hele hele bazlar e-book meraklsdr. Gerekli gereksiz yzlerce konular ieren e-booklar bulup biriktirirler. Sanki snrsz zamanlar var, sanki tarayclar gibi 3-5 saniyede bir sayfay okuyup bir daha unutmamak zere belleklerine kaydediyorlar. Arkadalar e-booklar yararszdr demem ama daha nceden Memik YANIK kitab okumadysanz e-booklarn size katklar snrl olacaktr. Son olarak Delphi 2007 kitabm hakknda unlar syleyebilirim: Kitabn sayfa saysn azaltmak iin youn abalar gstermeme ramen, yaklak 1100 sayfa olmasna ramen bu kitapta Delphi ilgili her konuya yer verebildiimi syleyemem. Gerekli grdm baz eksiklikleri kaleme alp kiisel Web sitemde yaynlayacam. Tekrar etmek gerekirse bu kitabmn dzeyini gerei kadar ykseltmi olmama ve ta en bandan Nesneye Ynelik Programclk penceresinden bakarak konular kaleme alm olmama ramen bu kitapta yine ilk okumada anlalmayacak hibir konu yoktur. Bu kitapta yalnzca bir veritabanna bal kalmadm. Eski Paradox bata olmak zere Interbase, FireBird, Access, SQL Server ve MySQL veritabanlarn Delphi projeleri dahilinde kullanmay denedim. Ne var ki

186

Memik Yank - Visual C#a Balang Kitab

MySQLe yeterince yer verdiimi syleyemem. Bu kitap bir Delphi kitab olduu iin Delphi projeleri dahilinde eriim salanan her veritabann yeteri ayrntda anlatmak zaten imkan dyd. Belki bu kitap tekrar basldnda MySQLe yeterince arlk verme imkanm olur. Memik YANIKn programclk kitaplarnn ayrt edici zelliklerinden birisi okurun hevesini krmamasdr. nk Memik YANIK teknik konular nasl anlatldnda, nasl cmleler kurulduunda okurun ilgisi dalmaz, anlatlanlar kavrar? Sorularna verilecek cevaplar vardr. Eer programclk kitabnn yazar dnp yazd metne bakp okurlar tarafndan nasl alglanaca konusunda kafa yormazsa ve bu konuda fikri hazrl yoksa yazdklar doru olsa bile zor anlalr. Her ne kadar bu kitabn kapanda srayla Delphi 20007 for Win32, Turbo Delphi ve Delphi 2006 olmakla birlikte Delphi 7 ve Delphi 2005 kullanclar da bu kitaptan yararlanabilir. Bu kitabn ieriinin byk bir ksm Delphi 7 iin de geerlidir. Bir dier konu udur: Borlandn C++ Builder derleyicisini kullanarak C++ hakknda bilgi sahibi olduysanz C++ Builder ile gelen grsel kitaplk ve kontroller hakknda(zellikle veritaban ilemleri) bilgi edinmek isteyenler bu kitaptan belli oranda yararlanabilirler. Bu metni niye mi kaleme aldm: nk Trkiyede kimse zahmet edip programclk kitaplar zerine bir ey yazmyor. Bu nedenle i baa dt ve kendi kitabm hakknda yazmak istedim. Kitabn hakknda yazarken objektif olabildin mi? diye soranlara elbette diye cevap veririm.

You might also like