You are on page 1of 186

C#a Balang Kitab

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

Mart 2009
2 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.
4 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 5

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
6 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 7

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.
8 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 9

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 sitesinden servis


paketlerini(varsa) daha sonra indirip kurabilirsiniz.

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 Form1.Designer.cs adl ikinci kod


dosyasnda yer almaktadr.

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 deiken-
alan 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 okuyanlar


yorulmazlar, anlatlanlar izlemekte zorluk ekmezler.

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 levi

wdNewBlankDocument Bol belge

wdNewEmailMessage E-mail

wdNewFrameset Frameset

wdNewWebPage Web sayfas

wdNewXMLDocument 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 FileName,
[In, Optional] ref object FileFormat,
[In, Optional] ref object LockComments,
[In, Optional] ref object Password,
[In, Optional] ref object AddToRecentFiles,
[In, Optional] ref object WritePassword,
[In, Optional] ref object ReadOnlyRecommended,
[In, Optional] ref object EmbedTrueTypeFonts,
[In, Optional] ref object SaveNativePictureFormat,
[In, Optional] ref object SaveFormsData,
[In, Optional] ref object SaveAsAOCELetter,
[In, Optional] ref object Encoding,
[In, Optional] ref object InsertLineBreaks,
[In, Optional] ref object AllowSubstitutions,
[In, Optional] ref object LineEnding,
[In, Optional] ref object 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, Optional] ref object PageType,


[In, Optional] ref object PrintToFile,
[In, Optional] ref object Collate,
[In, Optional] ref object ActivePrinterMacGX,
[In, Optional] ref object ManualDuplexPrint,
[In, Optional] ref object PrintZoomColumn,
[In, Optional] ref object PrintZoomRow,
[In, Optional] ref object PrintZoomPaperWidth,
[In, Optional] ref object 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