You are on page 1of 186

C#’a Başlangıç Kitabı

Memik Yanık
memiky@superonline.com
memikyanik@hotmail.com
www.memikyanik.com

Mart 2009
2 Memik Yanık - C#’a Başlangıç Kitabı

Önsöz

Son yazdığım C# kitabımda başlangıç düzeyi konuların ağırlığını azaltmayı


tercih ettiğim için C# konusunda henüz yolun başında olanlar zorluk
çekmesin diye birkaç makale hazırlayıp kişisel sitemde yayınladım. Sonra bu
makaleleri elden geçirip e-book haline getirdim. E-book’larda sayfa
sınırlaması olmadığı için metni az sayfaya sığdırma gibi bir kaygım olmadı.
Başka bir deyişle bu e-book’u, yakın zamanda çıkan C# 3.0 kitabıma
yardımcı veya hazırlayıcı bir kitap olarak değerlendirmek mümkündür.

Bu e-book’u inceleyenlerin fark edeceklerini sandığım bir diğer konu ise C#


gibi bir programlama dilinin nasıl kolay anlatıldığını görmeleri olacaktır.
Başka bir deyişle bu metin için rahatlıkla “dünyanın e kolay okunan C#
kitabı” denilebilir. Yıllardır Memik Yanık’ı hep başlangıç düzeyi kitaplar
yazmakla suçlayanlar bakalım bu e-book’u gördüklerinde neler
söyleyecekler?

Yıllardır kendisini bilen bilmeyen birçok kişi Memik Yanık’ı çeviri yapmakla
suçluyor. Memik Yanık’ın Đngilizcesinin çeviri yapmaya yetmediği gerçeğini
bir tarafa bırakalım ve şu soruyu sorayım: Madem Memik Yanık Türkçeye bu
kadar hakim ve yazdıkları kolay okunuyor hangi akla hizmet yabancı bir
yazarın kitabında çeviri yapar? Hem Memik Yanık Đngilizceyi anadili gibi bilse
bile hangi mantıkla kendine özel cümle kurmak yerine gidip başka bir
yazarın cümlelerini alır?

Bu e-book’ta kenar boşlukları normal basılı kitaplara göre daha azdır, fontu
ise daha büyüktür. Dolayısıyla bu metni normal kitap olarak değerlendirmek
istemiş olsaydım sayfa sayısı aşağı yukarı aynı olurdu. E-book’un sonunda
C# 3.0 kitabım hakkında yazdığım bir yazı ve C# 3.0 kitabımdan alınma bir
bölüm bulunmaktadır.
BÖLÜM 1
C# ĐLE PROGRAMCILIK
Bundan yaklaşık 1.5 yıl önce(Aralık 2007) kişisel web sitemde yayınlamak
üzere C#, Visual Basic ve Delphi hakkında başlangıç düzeyi bilgi içeren ve
ders şeklinde düzenlediğim makaleler hazırladım. Bu makaleleri ilk yazmaya
başladığımda her programlama dili için 5 yazı düşünmüştüm. C# ve Visual
Basic için hazırladığım derslerin sayısı 4’te kalırken Delphi için yazdığım
yazıların sayısı üçte kalmıştı. Dersleri tam gaz kaleme alırken değişken adı
benzerliği davası yazma hevesimi kırmıştı. Çünkü programcılık öğrenmek
isteyenlere tecrübelerimi aktarırken değişken adı çalma suçlaması ile
kendimi sanık pozisyonunda hakim karşısında bulmuştum.

2008 yılının son aylarında bir yıl önce yarım bıraktığım dersleri tamamlamak
üzere yeninden çalışmaya başladım. Dersleri ilk kaleme aldığım zaman C#,
Visual Basic ve Delphi dersleri birbirine paralel gidiyordu. Yani önce bir C#
dersi, birkaç gün sonra benzer konuları Visual Basic için kaleme alıyordum.
Ancak bu kez öyle yapmadım. Öncelikle C# derslerini bitirmeye çalıştım. C#
derslerini tamamladıktan sonra bu kez Visual Basic derslerini yeniden
hazırlayıp yayınlamaya karar vermiştim. C# ilgili dersleri kaleme alırken bir
yıl önce kaleme aldığım dersleri gözden geçirip eklemeler yapacağım.
Doğrusu geçen yıl(2007 sonu) bu programcılık derslerini okuyup sonra da az
çok programcılıkla uğraşanlara bu derslerin yeni halinin fazla bir katkısı
olmayacaktır. Çünkü bu derslerin hedef okur grubu C#, Visual Basic veya
Delphi ile programcılığına yeni başlayanlar olacaktır. Başka bir deyişle bu
dersleri, geçen yıl yayınlanan derslerin genişletilmiş baskısı olarak
değerlendirebilirsiniz. Aradan biraz zaman geçip C# derslerini tamamlayınca
tekrar gözden geçirip e-book olarak C# öğrenmek isteyenlere sunmaya
karar verdim. Böylece dersleri okumak kolaylaşmış olacaktır.

Bir makale veya kitap kaleme alınırken bir okur grubu hedeflenir ve ona
göre bir anlatım düzeyi seçilip konular ulaşılmak istenen hedef okur
grubunun "tahmini" beklentilerine göre sıralanır. Bu e-book’un hedef okur
grubu daha önce C# programlama dilliyle “uğraşmamış” olanlardır. Ya da
C#’la ilgili derslerde hocalarını izlemekte zorluk çeken öğrencilerdir, aldıkları
kitabı okuyup anlamakta zorlananlardır, her hangi bir sitede rastladıkları
makalede kullanılan kavramlara uzak olanlardır.

Öğretim üyeleri veya programcılık dersini veren hocalar öğrencilere ders


anlatırken ne fazla bilgili öğrencileri ne de o programlama diliyle daha önce
hiç yakınlığı olmayanları referans alırlar. Dersleri veren hoca sınıfın
ortalamasına göre bir anlatım düzeyi tutturmaya çalışır. Tekrar etmek
gerekirse bu e-book oluşturan dersleri C# veya sözü edilen diğer
programlama dilleri hakkında henüz bilgisi olmayanlar için kaleme aldım.
4 Memik Yanık - C#’a Başlangıç Kitabı

Bu dersleri kaleme alırken gerçekte klasik anlamda bir amacım yoktu:


Programcılık üzerine yazmayı seviyorum. Programcılık üzerine yazdıklarımı
önceleri(yani bundan 17 yıl kadar önce) bilgisayar dergilerinde yayınlayarak,
kitap şeklinde düzenleyerek sizlere ulaştırdım. Eskisi kadar olmasa bile kitap
yazmayı sürdürüyorum. Her ne kadar birçok insan sırf Memik Yanık
programcılık konulu kitaplar yazmasın diye seferber olmuş olsa bile yine de
yazmayı sürdürüyorum.

Yıllardır bilgisayar ve programcılık üzerine yazarken temel ilkem veya ön


şartım yazdıklarımın ilk okumada anlaşılmasını sağlamaktı. Bundan
vazgeçmiş değilim. Daha önce herhangi bir şekilde herhangi bir dilde 2 satır
kod yazdıysanız ve programcılığa merakınız varsa burada yazılanları ilk
okumada mutlaka anlarsınız. Bu nedenlerdir ki bu derslerin ayırt edici
özelliği kolay okunmasıdır. Yoksa bu derslerde verilen bilgileri başka
sitelerde ve programcılık kitaplarında bulabilirsiniz. Bu derslerin asıl işlevi
programcılık öğrenmeye karar vermiş olanların veya programcılık derslerini
zevkle izlemek isteyenlerin önünü açmaktır, öğrenme sürelerini kısaltmaktır.

Çevrenizde C#, VB, Delphi veya C++ programlama dilini bilenlere gıpta mı
ediyorsunuz veya C#’ı, Delphi'yi nasıl öğrenirim diye kara kara düşünüyor,
okulunuzda gördüğünüz C#, C++, Visual Basic derslerinden nasıl geçerim
diye kaygılanıyorsanız ilk olarak bu olumsuz düşünceleri bir tarafa bırakın
derim. Yıllarca kitaplarımın arkasında büyük puntolarla “Memik YANIK
tarafından yazılan kitaplarda ilk okumada anlaşılmayan hiçbir konu
yoktur” yazdırdım. Bu cümle birçok insanın bana saldırıp hakaretler edip
küfürler savurmasına neden olsa bile bu iddiadan vazgeçmiş değilim. Hatta
birileri hızını alamayıp “Memik Yanık kitaplarında verdiği 3–5 satırlık kısacık
kodlarda kullandığı değişkenlere ad seçerken benim kitaptan yararlanıp
değişkenlerimin adını çalmıştır” diye suçladı.

Birçok forumda her gün ismi cismi belli olmayan çok sayıda kişinin Memik
Yanık’a hakaretler düzmesinin tek nedeni yazdıklarımın ilk okumada
mutlaka anlaşılıyor olması değildir elbette. Tepki çekmemin 2. bir nedeni
değişik konularda kitaplar yazmamdır. Bir çok kişi “Bir kişi nasıl olurda
hem Visual Basic, hem Delphi hem de Clipper hakkında kitaplar
yazabilir? Olsa olsa başkasına yazdırıyordur veya çeviri yapıyordur”
şeklinde görüşler ileri sürdüler. Sanki bir gün Clipper kitabını, birkaç gün
sonra ise Visual Basic kitabını yazıp yayınlamışım gibi suçlanıyorum. Hal bu
ki bütün bu kitapları tam 17 yılda yazdım. Bazı kitaplarımın arkasına "bu
kitap telif bir kitaptır yabancı yazarların kitaplarından araklanmadı" diye
yazmış olmama rağmen inandırıcı olamadım.

Gerçekte programcılık kitaplarında kimse bilim yapmıyor, kimse yeni bir şey
üretmiyor. Yapılan tek şey; bütün özellikleri ortada olan programlama dilini
Memik Yanık - C#’a Başlangıç Kitabı 5

kendi anlayışıyla kendi cümleleri ile anlatmaktır. Örneğin yüz yıllardır aşk
üzerine yazılmış on binlerce roman vardır, aşk konulu binlerce film vardır.
Aynı şekilde C# üzerinde yazılmış yüzlerce kitap vardır. Bütün yazarlar aynı
konuları anlatıp, aynı metotlardan, aynı sınıflardan söz ediyorlar. O zaman
C# konulu kitapların arasındaki fark nedir diye soranlara verilecek cevap
şudur: Fark anlatım şeklindedir. Elinize aldığınız kitapta yazarın anlatım
şekli, cümleleri, konuları sıralayış vs size uygunsa o kitap sizin için iyidir.

Bu dersleri izleyen okurları bir konuda uyarmak istiyorum: Siz siz olun
yazdığınız kodlarda tanımlayıp kullandığınız değişkenlere ad seçerken
dikkatli olmalısınız. Olur ya boş bulunup daha önce register(!) edilmiş veya
kullanım hakları kapatılmış i, j, sayi, dosya gibi adlara sahip değişkenler
tanımlarsanız ve bu tespit edilirse başınız belaya girebilir. Bu uyarıya
rağmen şu açıklamayı yapmayı gerekli görmekteyim: Bu derslerde
kullandığım değişken adlarının mevcut Türkçe programcılık kitaplarındaki
değişken adları ile benzerlik göstermesi tesadüf eseridir.

C# Programcısı Đçin Gerekli Araçlar

Daha önce herhangi bir programlama dili ile az çok kod yazdıysanız “off
şimdi bu C#’ı kim öğrenecek, Microsoft firması bu programlama dilini keşke
hazırlamasaydı, bir sürü Class, yeni bir dil” diyorsanız bu düşüncenizden sizi
uzaklaştırmaya yüz binlerce kişiye programcılık öğretmiş Memik YANIK
olarak talibim. Daha önce Visual Basic 6 ile az çok program yazdıysanız C#
yerine Visual Basic’in .NET uyumlu sürümünü tercih edebilirsiniz. Ötesi, C#
ile Visual Basic’in .NET sürümünün yeteneklerini karşılaştırdığımızda
aralarında önemli bir fark yoktur. Kişisel görüşüme göre C#’ı öğrenmek,
.NET uyumlu Visual Basic’i öğrenmekten daha zor değildir. Daha açık bir
anlatımla Visual Basic’in NET sürümünü tercih etme nedeniniz C#’ın daha
zor öğrenilen bir dil olacağını sanma düşüncesi olmasın.

Daha önce C ile az çok uğraştıysanız C#’ın söz dizimine çabuk alışacaksınız.
Nesneye yönelik programcılık kavramları hakkında bilgi sahibiyseniz, başka
bir deyişle C++ üzerinde az çok çalıştıysanız C#’ı öğrenmek sizin için daha
kolay olacaktır. Benzer şekilde daha önce JAVA hakkında bilgi edinmiş
olanların C#’ı öğrenmeleri kolay olmaktadır.

Birileri bu dersleri 2 cümle ile anlatın derlerse söyleyeceklerim şunlardır:


“Bu dersler bir programla dili nasıl öğrenilir sorusuna cevap verme
uğraşısıdır” diyebilirim. Bu derslerin sonuna gelindiğinde C# hakkında temel
bilgilere sahip olacak ve bu derslerde sözü edilmeyen .NET sınıflarını kolayca
öğrenebileceğinizi biliyor olacaksınız, C# programcısı olma yolunda en zor
engeli aşmış olacaksınız. Başka bir anlatımla bu dersleri sonuna kadar
izleyen kişilerde programlama dili öğrenme korkusu olmayacaktır. Tabii bu
6 Memik Yanık - C#’a Başlangıç Kitabı

dersleri okuyan bazı arkadaşlar 200 sayfalık başlangıç düzeyi C# kitaplarına


dönüp bakma ihtiyaçları kalmayacaktır.

Her ne kadar bu başlıkta C# ile program yazmak için gereken araçları bir bir
sayıp anlatacak olsam bile mutlaka gerekli olan öğrenme isteğidir. C#’ı
öğrenmek sizin için önem arz ediyorsa ister bu dersleri izlemiş olun ister
izlememiş, bir şekilde C#’ı öğrenirsiniz. Zaten kısa sürede C#’ı öğrenmeleri
zorunluluk olanlar gidip kitap alacaklar veya programcılık eğitimi veren bir
kuruma başvuracaklardır.

Orada burada Memik YANIK ve kitapları aleyhine konuşan, yazan birilerini


görürseniz(ki görmeniz yüksek bir ihtimaldir) onlara hemen inanmayın
derim. Öncelikle bu sayfalarda yazılanları okuyun derim. Bu arada kişisel
sitemde bilgisayar kitapları hakkında yazdıklarıma biraz göz atmanızı
öneririm(www.memikyanik.com/kitaplar/kitaplarim.htm). Tabii ki yazdığım
kitaplarda hiç hata yoktur hepsi eksiksizdir diyecek değilim. Benim itirazım
kitaplarımın incelenmeden, okunmadan karalanmasıdır. Bazı arkadaşlar ise
yıllar önce yayınlanan, çoktandır satıştan kalkan kitaplarımı bugünün
şartlarına göre değerlendiriyorlar. Örneğin 2007 yılında yayınlanan Delphi
2007 kitabım dururken kalkıp 2000 yılında yayınlanan Delphi kitabım
üzerine konuşuyorlar, 2000 yılında yayınlanan programcılık kitabını 2008
yılının ihtiyaçlarına, şartlarına göre değerlendiriyorlar.

C# programlama dili ile ilgili bu dersleri izleyebilmek için başlangıçta


bilgisayarınızda .NET Framework’ün 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 için size

• .NET Framework
• Not Defteri

gereklidir. Buna göre Not Defteri ile C# programınızı yazıp CS uzantısı ile
kaydedersiniz. Sonra DOS penceresine geçip .NET Framework ile gelen C#
derleyicisi(CSC.EXE) sayesinde derleme yapıp EXE dosyayı hazırlarsınız. Hiç
meraklanmayın bu işlemin ayrıntılarını bir sonraki C# konulu derste
anlatacağım. Hemen eklemek gerekirse; .NET Framework’ü Microsoft
ücretsiz dağıtmaktadır ve Windows Vista ile birlikte gelmektedir. Bu nedenle
işletim sistemi olarak Vista kullanıyorsanız microsoft.com’dan indirip
kurmanız gerekmez.

Kullandığınız bilgisayarda Windows XP kuruluysa .NET Framework'ü


Microsoft’un sitesinden indirip kurabilirsiniz. Birkaç yıl önce .NET Framework
1.1 vardı. Sonra 2005 yılının başında .NET Framework 2.0 hazırlanıp
Memik Yanık - C#’a Başlangıç Kitabı 7

dağıtıldı. Yakın bir zamanda ise .NET Framework’ün 3.0/3.5 sürümleri


piyasaya verildi. Microsoft firması önceleri .NET Framework 2.0’a bazı yeni
sınıflar ve yardımcı araçlar ekleyip buna .NET Framework 3.0 dedi.
Sonrasında ise .NET Framework 3.5 hazırlandı.

Bu dersler boyunca anlatılanları izleyip küçük örnekleri deneyebilmeniz için


size .NET Framework 2.0 yeterli olacaktır. Tabii kurmuşken en son sürüm
olsun diyenler bilgisayarlarına .NET Framework’ün 3.5 kurabilirler. .NET
Framework 1.0 ve 1.1 ile C# derleyicisinin sürüm nosu 1.0 iken .NET
Framework 2.0 ile gelenin sürümü nosu 2.0'dır. .NET Framework 3.5 ile
gelen C# derleyicisinin sürüm nosu 3.0'dır. orada burada C# 2005 veya C#
2008 adında kitaplar görürseniz bilin ki bu kitapların adları yanlıştır.

Visual Studio

Bu derslerin sizin için verimli olması için daha sonra sözü edilecek Visual
Studio 2005 veya 2008’i edinip bilgisayarınıza kurmanız veya C# için
hazırlanmış ücretsiz Express Edition’ı Microsoft’un sitesinden indirip
kurmanız gerekir. Express sürümü edinmek kolay olduğu için bu derslerde
Express sürüme ağırlık vereceğim. Tabii bilgisayarlarına Visual Studio’yu
kurmuş olanları da gözeteceğim. Bu dersleri izlerken Visual Studio’nun 2005
veya 2008 sürümü kullanılabilir.
8 Memik Yanık - C#’a Başlangıç Kitabı

Bu paragrafı yukarıda .NET Framework’ün sürümlerimden söz edilen


paragraf ile birlikte okuyanların bir kısmı bu Visual Studio’da ne oluyor diye
sorabilirler. Hemen açıklayayım. Gerçekte C# veya .NET Framework uyumlu
herhangi bir programlama dili ile program yazmak için .NET Framework ve
Not Defteri gibi bir editör programı yeterli olmaktadır.

Ne var ki çok sayıda dosyadan meydana gelebilen C# uygulamalarını Not


Defteri gibi kısıtlı özelliklere sahip bir editörle yazmak sonra da DOS
penceresinde derlemek imkansız olmasa bile zahmetlidir. Bu nedenle konu
.NET Framework uyumlu programlama dilleri olduğunda Microsoft ancak bu
dillerde program yazma ve derleme işlemini kolaylaştıran Visual Studio’yu
satarak para kazabilmektedir. Đleri ki konularda derleyici nedir, IDE nedir
gibi sorular sizin için bilinmez olmayacaktır.

Son 2 paragraftan kafası karışanlar için ek açıklama: Microsoft firma .NET


Framework adı verilen bir sınıf kitaplığını hazırladı. Bu sınıf kitaplığında
program yazarken gerek duyabileceğiniz çok sayıda sınıf bulunmaktadır.
Örneğin yazdığınız programda bir düğmeye gerek duyduğunuzda .NET
Framework ile gelen Button sınıfından, TextBox’a gerek duyduğunuzda
TextBox sınıfından yararlanabilirsiniz. Bu sınıf kitaplıkları C#, Visual Basic
ve C++ gibi .NET uyumlu programlama dilleri ile kullanılabildiği için
Microsoft firması bu 3 programlama dilinin derleyicilerini .NET Framework ile
birlikte ücretsiz dağıtmaktadır. Başka bir deyişle kullandığınız bilgisayara
.NET Framework’ü kurmanız halinde elinizde hem Visual Basic hem de C#
derleyicisi olmuş oluyor.

Express Edition

Visual Studio son derece gelişmiş ve program yazmayı kolaylaştırdığı gibi


yüksek fiyatla satılan bir program geliştirme aracıdır, yani bir IDE’dir.
Microsoft firması korsan kullanımı azaltmak, C# ve .NET uyumlu diğer
programlama dillerini henüz öğrenenleri düşünerek Express Edition adı
verilen Visual Studio’ya göre kısıtlı özelliklere sahip IDE’ler hazırlayıp
dağıtmaya başladı.
Memik Yanık - C#’a Başlangıç Kitabı 9

Visual Studio ile C#, Visual Basic, C++ ve ASP.NET uygulamaları geliştirmek
mümkün iken Express Edition’lar "dile" özeldir. Yani .NET uyumlu hangi
programlama dili kullanılacaksa o dil için hazırlanmış Express Edition adı
verilen IDE’yi yani program geliştirme aracını Microsoft’un sitesinden indirip
kurmak gerekiyor. Hemen eklemek gerekir ki C# için hazırlanmış olan
Express Edition bir programlama dili olmayıp C# uygulamalarını kolayca
hazırlayabilmeniz için Microsoft tarafından hazırlanıp ücretsiz olarak dağıtılın
bir IDE’dir, yani bir yardımcı programdır.

Karışıklık olmasın diye bir konuyu tekrarlayalım:C# derleyicisi .NET


Framework ile birlikte dağıtılmaktadır. .NET Framework 1.0 ve 1.1 ile
birlikte C# derleyicisinin 1.0 sürümü verilirken .NET Framework 2.0 ile
birlikte C# derleyicisinin 2.0 sürümü gelmektedir. Geçen yıl kullanıma
sunulan .NET Framework 3.5 ile birlikte ise C# derleyicisinin 3.0 sürümü
gelmektedir. C# derleyicisinde 1.0’dan 2.0 sürümüne gelindiğinde önemli
gelişmeler olmuştu. C# derleyicisinin 3.0 sürümünde çok sayıda yenilik
olmasına rağmen hepsi dile yapılan birer ektir. Başka bir deyişle C# 2.0 için
yazılan kodlar C# 3.0 ile sorunsuzca derlenebilmektedir.

Kısaca anlatmak gerekirse Visual C# için hazırlanmış Express Edition,


Visual Studio’yu edinemeyip ancak programlarını Not Defteri ile hazırlamak
10 Memik Yanık - C#’a Başlangıç Kitabı

istemeyenlere uygundur. Bana sorarsanız C#’ı öğrenirken Express Edition


size yeterli olacaktır. Visual Studio’yu edinme imkanınız varsa Express
Edition’a kayıtsız kalabilirsiniz. Bu derslerde C# 3.0 ile gelen yeniliklerden
söz edilmeyeceği için Express Edition’ın 2005 sürümü kullanılabilir. Tabi en
son sürüm olsun diyenler 2008 yılında kullanıma sunulan sürümü indirip
bilgisayarlarına kurabilirler. Daha sonra C# için hazırlanan Express Edition’ın
nasıl kurulduğu anlatılacaktır.
BÖLÜM 2
C# PROGRAMI YAZMAYA BAŞLIYORUZ
Bir önceki bölümde C# programlama diline başlama konusunda biraz sohbet
etmiştik. Bu bölümde ise kod yazmaya başlayacağız. C# konulu hangi kitabı
alırsanız alın, C# konulu hangi kursa gidiyorsanız gidin, C# programlama
diliyle ilgili dersleri hangi fakültede alıyorsanız alın C#’la çalışmaya bu
dersleri okumakla başlamanızı öneriyoruz. Bu sayede C#’a ayırmanız
gereken zaman büyük oranda azalacaktır.

Yıllardır konu programcılık üzerine yazmak olduğunda asıl olanın anlatma


şekli olduğunu savunuyorum. Yoksa söz konusu programlama diliyle ilgili
olarak hemen her şey kısa sürede söylenmekte, hemen her sorunun çözümü
bir şekilde anlatılmaktadır. Yoksa programcılık üzerine yazan birisinin
okurları ile paylaştığı bir yenilikten söz etmesi uzak bir ihtimaldir. Bu
durumda programcılık üzerine yazanlar ancak anlatma biçimleri ile
övünebilirler, ancak kurdukları cümlelerin düzgünlüğü ile fark yaratabilirler.
Yoksa bu bölümde anlattığım her şeyi C#’la az çok uğraşmış herkes
biliyordur. Yani bu makalede yeni bir şey söylemem ihtimal dışıdır. Bu
nedenle anlı şanlı bir Üniversitemizin Prof unvanlı öğretim üyesinin birisi bu
metnin çalıntı olduğunu orada burada yazarsa gülüp geçin.

.NET Framework’ü Kurmak

Herhangi bir programlama dili ile çalışılıp uygulama geliştirilmek


istendiğinde ilk yapılması gereken derleyici edinmektedir. Ancak konu .NET
Framework uyumlu programlama dilleri olduğunda derleyici aramak zorunda
kalmıyorsunuz. Çünkü C#, Visual Basic ve C++ derleyicileri .NET
Framework ile birlikte ücretsiz olarak dağıtılmaktadır. Buna göre C#
programları yazabilmek için bilgisayarımıza .NET Framework’ün kurulu
olması yeterlidir. Kullandığınız bilgisayarda Windows Vista kurulu ise ayrıca
.NET Framework kurmanız gerekmiyor. Çünkü .NET Framework Vista ile
birlikte geliyor. Kullandığınız bilgisayara Windows XP kurulu ise
microsoft.com’dan istediğiniz .NET Framework’ü indirip kurmanız gerekir.

Şu günlerde kullanıma sunulan .NET Framework’ün en son sürümünün


numarası 3.5. Daha önce işaret edildiği gibi bu derslerde örnek olması için
verilen küçük programları yazıp deneyebilmeniz için .NET Framework’ün 2.0
sürümü yeterlidir. Bilgisayarınıza .NET Framework’ün yüklü olup olmadığını
veya yüklü ise hangi sürümün yüklü olduğunu öğrenmek için Windows’un
Program Ekle veya Kaldır penceresine bakabilirsiniz.

Kullandığınız bilgisayara .NET Framework kurulu ise hemen C# programları


yazabilirsiniz. Not Defteri ile C# kodu yazıp CS uzantısı ile herhangi bir
klasöre kaydedip sonra da .NET Framework ile gelen C# derleyicisi(yani
12 Memik Yanık - C#’a Başlangıç Kitabı

csc.exe dosyası) sayesinde derleme yapıp EXE dosya hazırlayabilirsiniz. Bu


derste öncelikle C# programlarını Not Defteri ile yazıp derleyeceğiz.
Devamında C# için hazırlanmış Express Edition’dan yararlanacağız.

Şimdi microsoft.com’a uğrayıp .NET Framework 3.5’ı indireceğim. Bu amaçla


microsoft.com’da arama yapıp indirebileceğim linki buldum. Bulduğum linki
tıklayınca ekrana aşağıda verdiğim diyalog kutusu geldi.

Yaklaşık 3 Mb’lık bu dosyayı indirip bilgisayarıma kaydettikten sonra


çalıştırdım. .NET Framework 3.5 gerçekte 72 MB olduğu için indirdiğiniz
dosyayı çalıştırıp kurmaya başladığınızda geri kalanı Microsoft’un sitesinden
indiriliyor. Başka bir deyişle nete bağlı değilken bu 3 Mb’lık dosya ile kurma
işlemi yapılamıyor. Bu metni kaleme aldığım sırada .NET Framework 3.5 için
SP1 çıkmıştı.microsoft.com’da SP1’i indirip kurmanız önerilir.

Program Yazmaya Başlıyoruz.

Konu .NET uyumlu programlama dilleri ve özellikle C# olduğunda ilk


karşılaşmamız gereken kavram Class kavramıdır. C# programları Class
şeklinde düzenlendiği için en başından Class kavramından söz etmek
gerekmektedir. Programları Class’lar halinde düzenlemenin sayısız yararları
vardır. Ancak bunları burada anlatmayacağım. Class’lar hakkında bilgi sahibi
olmadan Visual Basic 6 ve Delphi gibi programlama dilleri ile program
geliştirmek mümkün iken C++, C# ve Java gibi diller Class’lar hakkında
bilgi sahibi olmanızı zorunlu kılmaktadır. Kaygılanmanıza gerek yok; bu
dersi sonuna kadar okuduğunuzda bir de bakarsınız ki Class'lar hakkında
temel bilgilere sahip olmuşsunuz. Yoksa diğer kitaplarda yapıldığı gibi sizlere
Class’lar hakkında teorik bilgi vermeyi düşünmüyorum.

Quick Basic, Pascal ve C gibi klasik programlama dillerinde kod dosyaları


içinde fonksiyonlar ve procedure’ler bulunuyordu. Hatta C’de fonksiyon
Memik Yanık - C#’a Başlangıç Kitabı 13

procedure ayrımı da yoktur. Başka bir deyişle programcılar yapmak


istedikleri işlemlere uygun fonksiyonlar yazıp gerek duydukça bunları
çağırırlardı.

Zamanla programlar büyüyüp karmaşıklaştıkça paketlenmesi ihtiyacı doğdu.


Fonksiyon ve metotların Class’lar halinde paketlenmesi ile birlikte Class
içinde bulunan fonksiyonların kullanılması, organize edilmesi ihtiyacı doğdu.
Günümüzde yaygın olarak kullanılan programlama dillerinde Class’lar
metotlardan başka Interface’leri, Olayları, Özellikleri, Delegate’leri ve Yapıcı
metotları içerebilmektedir. Lütfen olay nedir özellik nedir ki diye sormayın.
Zamanı gelince bu konular hakkında bilgi verilecektir.

Yerli yabancı ayrımı yapmadan bugüne kadar hangi kaynağa baktıysam


konu nesneye yönelik programcılık olduğunda ilk birkaç sayfada biyolojiden,
memelilerden, ütülerden arabalardan vs. söz edilmektedir. Her yazar
nesneye yönelik programcılığın 3 temel kavramını kendince anlatmaktadır.
Uzatmadan belirtmek isterim ki anlayış öğrenmeyi zorlaştırmaktadır.

Đstediğiniz ayrıntıda polimorfizm’den söz edin, istediğiniz kadar biyolojiden


memelilerden örnek verin bu kavramların kod karşılığı görülmeden verilen
bilgiler havada kalıyor. Bu nedenledir ki bu bölümde nesneye yönelik
programcılığın temel kavramlarından söz etmeden bu konuyu anlatmak
istiyorum. Esasında burada bilim yapmıyoruz, olsa olsa sizlere C#
programlama dili ile nasıl program yazabileceğinizi anlatmak istiyoruz.
Amacımız en basit şekilde programcılık tecrübesi olmayanları programcılığa
alıştırmaktır, onları C# programlama dillini öğrenebileceklerine
inandırmaktır.

Aşağıda en basit veya en kısıtlı, en az satıra sahip bir C# programı


bulunmaktadır. Bu kodu Not Defteri penceresine yazıp CS uzantısı ile
kaydedip .NET Framework ile gelen C# derleyicisi ile derleyip EXE
yapabilirsiniz. Bu işlemin nasıl yapıldığı ileriki sayfalarda anlatılacaktır. Ey
Üniversite hocaları ey programcılık üzerine yazanlar başka bir kaynakta
"Deneme" adında bir Class görürseniz bilin ki bu isim benzerliği tesadüfüdür.
Yoksa bu Class'a deneme yerine "tecrube" ya da "deneyimsiz" gibi bir ad
vermek marifete tabi değildir.
14 Memik Yanık - C#’a Başlangıç Kitabı

Buna göre C# kodu yazmak istiyorsanız önce mutlaka bir Class bloğu
hazırlamanız gerekmektedir. C# programlarının başlangıç noktası Main()
metodu olduğundan Main() metoduna yer vermek zorundasınız. Bu C# kodu
CS uzantılı bir dosyaya yazılıp kaydedilip derlenip hazırlanan EXE dosya
çalıştırılırsa herhangi bir hata ile karşılaşılmaz. Ancak bu program bu hali ile
herhangi bir işlem yapmaz.

En az satıra sahip bu C# programındaki Main() metodunun hem static hem


de void olduğunu işaret ettim. C# programlarının başlangıç noktası olan
Main() metodu(C programlama dilinde Main’den fonksiyon diye söz edilir)
statik olmak zorundadır ama void olması zorunlu değildir. Metot geriye bir
değer göndermeyecekse metot adından önce void yazılır. Daha sonra
metotların geriye nasıl değer gönderdikleri konusunda bilgi verilecektir.

Bu kısacak programda bile Class’tan söz ettik, metottan söz ettik. Size
önerim başlangıçta verdiğim kısacak kodlarda kullanıp ancak sözünü
etmediğim deyimlere veya metotlara kayıtsız kalmanızdır. Örneğin bu
kısacak örnekte bile sözünü etmediğim, dikkatinizden kaçırmak istediğim bir
şeyler var. Dikkat ederseniz Main() metodunun adından sonra parantezlerin
arasına “string[] args” yazdım. Bu parantezin içine yazdıklarım gerçekte
dizi değişken tanımlamaktan başka bir şey değildir Ancak şu anda bundan
söz etmeyeceğim. Bu nedenle bu derslerden azami verimi almak istiyorsanız
anlatılmayanlara değil anlatılanlara odaklanmalısınız. Main metodu içinde
tanımlanan dizi değişkene "args" adını vermek C# programcılarının bir
alışkanlığıdır. Tabi benzer alışkanlık sayısal bilgileri saklamak amacıyla
tanımlanan değişkenlere ad seçerken de vardır ve "i" ve "j" sık kullanılan
değişken adlarıdır. Her ne kadar i ve j’nin değişken adı olarak kullanılması
bütün dünyanın bir alışkanlığı olsa bile Türkiye’de bazı öğretim üyelerine
göre i ve j adında değişkenler tanımlamak suçtur.

Şimdi yukarıda verdiğim C# programının başlangıç noktası olan Main()


metodu içinde bir değişkene yer vereceğim. Bu değişkeni Main() metodu
içinde tanımladım. Değişkeni Main() metodu tarafından sınırlanan kod bloğu
yerine Class bloğu içinde tanımlayabilirdim.

class Deneme
{
static void Main(string[] args)
{
int yil;
}
}

Gördüğünüz gibi C# programlarında değişken tanımlanırken önce


değişkenin tipi sonra adı yazılmaktadır. Buradaki int bu değişkenin integer
yani tamsayı tipindeki bilgileri saklayabileceğini işaret etmektedir.
Memik Yanık - C#’a Başlangıç Kitabı 15

Programcılıkta değişken tanımlamayı günlük hayatta telefon edip bir otelde


yer ayırmaya benzetmek mümkündür. Bu değişkeni tanımlamakla
derleyiciye demiş oluyorum ki, programın ileriki safhalarında integer bilgileri
bellekte tutma gereğini duyabilirim. Bu nedenle bana bellekte bu amaçla
kullanacağım bir yer ayırt.

Bu kısacak kodu iki cümle ile yorumlamak gerekirse şunlar söylenebilir: Bu


programdaki “Deneme” adlı Class’ın Main() adında bir metodu
bulunmaktadır. Main() metodu içinde yaşayabilecek “yil” adında ve Integer
tipindeki bilgilerin aktarılabileceği bir değişken tanımlanmıştır. Bu değişkeni
Main() metodu içinde tanımladığım için yalnızca Main() metodunun sınırları
içinde yaşar. Fark etmiş olabileceğiniz gibi C# programlarında Class ve
metot başlatılan satırlar hariç her satırın sonuna “;” konulmaktadır.

Bu kodu NET uyumlu Visual Basic için yazsaydım biraz farklı olurdu. Ancak
temel mantıkta pek farklılık yoktur. .NET uyumlu Visual Basic'te de zorunlu
olmamakla birlikte uygulamalar Class halinde düzenlenmekte ve Class’ların
içinde metotlar, alanlar(yani değişkenler), özellikler, olaylar, Interface’ler
olabilmektedir. Lütfen olay nedir, özellik nedir, Interface nedir gibi sorularla
şimdilik meşgul olmayın.

Şimdiye kadar incelediğim bütün kaynaklarda, bütün kitaplarda değişkenler


adında bir bölüm mutlaka vardı. Kitaplarda değişkenler adlı bölümün olması
doğal olmasına doğal da değişkenler sanki C, Basic ve Pascal programlama
dillerindeki değişken kullanımı gözetilerek anlatılmaktadır. Bu derslerde
değişkenler Class bağlamında kısaca anlatılacaktır.

Yukarıda belirtildiği gibi Class’lar metotları barındırabilmektedir. Ayrıca C#


programlarında Main() metodunun bulunması zorunludur. Yukarıda verdiğim
en kısıtlı C# programı içinde hazırladığım Class’ta değişiklik yapıp 2. bir
metoda yer verdim. Herhangi bir satır içermeyen bu metot bu hali ile
herhangi bir işlem yapmaz. Bu metodu da hem static hem de void olarak
işaret ettiğimi fark etmiş olmalısınız. Yarın bir gün metot adı benzerliği
suçlanmak istemeyenler bu metoda Türkçe yerine gavurca bir ad
verebilirler. Mesaj’ın Türkçe bir kelime olmadığı gerçeğine rağmen…

class Deneme
{
static void Main(string[] args)
{
int yil;
}
static void Mesaj()
{
}
}
16 Memik Yanık - C#’a Başlangıç Kitabı

Daha önce C#, C++, Delphi gibi bir programlama dili ile program geliştirmiş
iseniz yani az çok kod yazdıysanız bu derste anlatılanlar size basit
gelecektir. Programcılıkta tecrübeli arkadaşlara bir önerim var; sizler bu
yazıda ne anlatıldığı ile değil, nasıl anlatıldığı ile ilgilenebilirsiniz. Belki bir
üniversitenin öğretim görevlisisiniz, belki de bir Microsoft eğitim merkezinde
eğitmensiniz. Bu yazıdaki amacım C# gibi bir programlama dilinin nasıl
kolay öğrenilebileceği konusunda deneme yapmaktır.

Şimdi yukarıda verdiğim basit C# kod dosyası içinde Mesaj() adını verdiğim
metodu Main() metodunun içinden işleteceğim. Hazırladığım metot aynı
sınıfın içinde olduğu için herhangi bir hazırlık yapmadan direk adıyla çağırıp
işletmek mümkündür.

class Deneme
{
static void Main(string[] args)
{
int yil;
Mesaj();
}
static void Mesaj()
{
}
}

Bu hali ile bu C# programı veya CS uzantılı kod dosyası DOS penceresinde


derlenip EXE hazırlanıp çalıştırılırsa Main() metodu otomatik olarak işletilir.
Çünkü yukarıda söylendiği gibi C# programları Main() metodundan itibaren
çalışmaya başlarlar.

Bu programı aşağıdaki gibi düzenlemiş olsaydım değişen bir şey olmazdı.


Çünkü C# derleyicisi Main() metodunu bulup programın başlangıç noktası
yapar. Bu kısa örnekte “yil” adını verdiğim değişkeni hiç kullanmadığım için
C# derleyicisi derleme sırasında uyarı mesajı verir.

class Deneme
{
static void Mesaj()
{
}
static void Main(string[] args)
{
int yil;
Mesaj();
}
}
Memik Yanık - C#’a Başlangıç Kitabı 17

Şimdi bu Mesaj() adını verdiğim metoda müdahale edip işletildiği zaman


ekrana bilgi yazılmasını sağlayacağım. Konsolda yani DOS penceresinde
çalışan C# projelerinde ekrana bilgi yazma işlemleri .NET Framework ile
gelen Console sınıfında tanımlı olan Write() veya WriteLine() metotları ile
yapılmaktadır.

Tam bu noktada elime fırsat geçmişken biraz kendimi savunmak istiyorum.


Yıllardır Memik YANIK aleyhine konuşanların en genel geçer suçlaması
şuydu: “Memik YANIK kitaplarını ekran görüntüleri ile doldurup şişiriyor”.
Gördüğünüz gibi yukarıda Not Defteri ile hazırladığım toplam 12 satırdan
meydana gelen kodun kendisini vermek yerine kodu yazmış olduğum Not
Defteri penceresinin ekran görüntüsünü verdim. Bu metni kitap için yazmış
olsaydım ekran görüntüsünü belli bir oranda küçültüp kitapta daha az yer
kalmasını sağlardım.

Aşağıda ise bu ekran görüntüsünü verdiğim Not Defteri penceresine yazmış


olduğum kodun kendisi var. Sizce kitap metni içinde hangisi çok yer kaplar,
ekran görüntüsü mü yoksa kodun kendisi mi? Seçilen puntoya bağlı olarak
değişse bile aralarında önemsenecek bir farkın olmadığını söyleyebilirim. Ne
ki ekran görüntüsü halinde verilen kısa kodları incelemek bazen daha
kolaydır. Neden mi bazen? Çünkü kitap metni içinde kullanılmak istenen kod
15-20 satır kadarsa kodun kendisi yerine kodu yazıldığı ekran görüntüsü
verilebilir. Ancak kod uzunsa ekran görüntüsü yerine kodun kendisini
vermek gerekir.

class Deneme
{
static void Main(string[] args)
{
int yil;
Mesaj();
}
18 Memik Yanık - C#’a Başlangıç Kitabı

static void Mesaj()


{
System.Console.WriteLine("Fenerbahçe");
}
}

Bu şekilde düzenlenen C# uygulaması DOS penceresinde derlenip


çalıştırıldığında ekrana “Fenerbahçe” yazdırıldıktan sonra programın
çalışması sona erer. Çünkü C# ile geliştirilmiş programların çalışması Main()
metodunun sonuna gelindiğinde biter.

Mesaj() metoduna yazdığım satır hakkında biraz konuşmak gerekirse;


“System.Console.WriteLine("Fenerbahçe");” satırındaki System bir
namespace’tir. Şimdi diyeceksiniz Namespace nedir? Cevabım hazır:
Lütfen merakınızı sonraya saklayın; halk dili ile söylemek gerekirse “üzümü
ye bağını sorma”.

Kısaca anlatmak gerekirse Class’lar Namespace’lerin içine


yerleştirilmektedir. System adlı Namespace .NET Framework ile gelen en
önemli Namespace’tir ve çok sayıda Class’ı barındırmaktadır. DOS
penceresine veya konsola bilgi yazmak üzere hazırladığım satırdaki Console
bir Class’tır. Çok sayıda metoda sahip olan bu Class’ın sayesinde konsol yani
DOS penceresi ile ilgili istenen işlemler yapılabilmektedir. Bu satırdaki
WriteLine() ise Console sınıfının bir metodudur.

Bu konuyu bir okulda, bir dershanede veya seminerde anlatıyor olsaydım


C# hakkında biraz bilgisi olanlar “Memik bey WriteLine() static bir metot
değil mi?” diye sorabilirlerdi. Soruyu soranlara cevabım “evet, WriteLine()
metodu statik bir metottur”. Tabii dersi veya semineri izleyenlerin bazıları
“statik olanla olmayan metot arasında ne fark vardır” diye soru soracaklardı,
bazıları ise keşke bu konuşulanları anlasaydım diye iç geçireceklerdi. Fırsat
bu fırsat deyip hemen statik olan ve olmayan metotlar hakkında uzun
açıklamalar yapmayacağım. Arkadaşlar lütfen biraz sabır.

Programları Derlemek

Bazılarınız bu kısacak örneği bile hemen denemek, bu CS uzantılı dosyayı


derleyip EXE dosya hazırlamak istiyor olabilir. Bu isteğe uyup CS uzantılı
kod dosyasını derleyip EXE yapma üzerinde duracağım. Not Defteri ile
hazırlayacağınız kod dosyalarını yerleştirmek üzere ayrı bir klasör
hazırlamanızı öneririm. Bu klasör “C:” sürücüsünün kök klasöründe olursa
ulaşılması kolay olur.
Memik Yanık - C#’a Başlangıç Kitabı 19

C#’ın kurallarına uyarak yazdığınız programları derleyip EXE dosya


hazırlayacak program dosyası(CSC.EXE) Windows’un kurulu olduğu klasörün
altında “Microsoft.NET\Framework” klasöründe yer almaktadır.

.NET Framework’ün başka sürümünden yararlanıyorsanız bu klasörün adı


farklı olabilir.

Hazırlayacağınız CS uzantılı dosyaları bu CSC.EXE dosyasının bulunduğu


klasöre kaydetmeli veya Denetim Masasındaki Sistem seçeneği ile ekrana
getirilen Sistem Özellikleri diyalog kutusunda Gelişmiş sekmesindeki
Sistem Değişkenleri seçeneğinden yararlanmalısınız. Path seçeneğinin
20 Memik Yanık - C#’a Başlangıç Kitabı

içeriğine aşağıda verdiğim satırlardan birisini ekleyip bilgisayarı yeniden


başlatırsanız istediğiniz yerden CS uzantılı kod dosyalarını derleyebilirsiniz.

“C:\WINDOWS\Microsoft.NET\Framework\v3.5;”
"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;"

Kullandığınız bilgisayara Visual Studio 2008'i kurulu ise Başlat menüsünden


Visual Studio 2008 Command Prompt komutu verilerek açılan DOS
penceresinde yukarıda anlatılan şekilde Path ayarlaması yapılmasa bile C#
programlarını istediğiniz yerde derleyebilirsiniz.

C# derleyicisinin kullanım şekli ve parametreleri hakkında bilgi edinmek


istiyorsanız DOS penceresinde “CSC /?” yazıp enter tuşuna basabilirsiniz.

Şimdi sıra geldi bu programı derlemeye. Bu amaçla bir DOS penceresi açıp
komut satırına “CSC ILK.CS” yazıp Enter tuşuna basınca C# programı
derlenmeye başlandı. Yazdığım programda herhangi bir hata olmadığı için
EXE dosya hazırlandı.

Yazdığım C# programında Main() metodu içinde “yil” adında ve int tipinde


bir değişken tanımlamış olmama rağmen bu değişkeni hiç kullanmadığım
için derleyici uyarıda bulundu. Bu uyarı ILK.CS dosyasından yola çıkılıp
ILK.EXE dosyasının hazırlanmasına engel değildir. Derleyici uyarı yerine hata
mesajı vermek zorunda kalsaydı EXE dosya hazırlanmazdı.
Memik Yanık - C#’a Başlangıç Kitabı 21

Tekrarlamak gerekirse yukarıdaki gibi yapılan derleme sonucu CS uzantılı


C# programı ile aynı ada sahip bir EXE dosyası hazırlanır. Aşağıda verdiğim
ekran görüntüsünü bu EXE dosyayı çalıştırdıktan sonra aldım. Derleme
sonucu hazırlanan EXE dosya ancak .NET Framework kurulu bilgisayarda
çalışır. Bu EXE dosyayı alıp .NET Framework 2.0 kurulu olmayan(çünkü
yukarıda derleme işlemini .NET Framework 2.0 ile gelen C# derleyicisi ile
yaptım) başka bir bilgisayara götürdüğünüzde çalışmaz. Aşağıda verdiğim
ekran görüntüsünü hazırladığım EXE dosyayı çalıştırdıktan sonra aldım.

Hazırlayıp derlediğim C# programı ekrana bu bilgiyi yazdıktan sonra yani


Main() metodunun sonuna gelindiğinde çalışması otomatik olarak sona
erer. Şimdi bu örmekte öyle bir ayarlama yapalım ki programın veya EXE
dosyanın çalışması Enter tuşuna basıncaya kadar devam etsin. Programın
çalışmasının Enter tuşuna basıncaya kadar devam etmesini sağlamak üzere
Deneme adını verdiğim Class'ın Main() metoduna bazı eklemeler yaptım.

class Deneme
{
static void Main(string[] args)
{
int yil;
Mesaj();
System.Console.WriteLine();
System.Console.Write("Çıkmak için Enter Tuşuna Basın");
System.Console.Read();
}
static void Mesaj()
{
System.Console.WriteLine("Şampiyon Fenerbahçe");
}
}
Gördüğünüz gibi Console sınıfının WriteLine() metodunu Mesaj() adını
verdiğim metodun içinden başka bir deyişle Main() metodunun içinde
kullandım. Bu örnekte Main() metodu içinde önce Mesaj() adını verdiğim
metot çağrıldığı için ekrana önce “Şampiyon Fenerbahçe” yazılır. Mesaj()
metodunun çağrıldığı satırdan sonra yine WriteLine() metodu
kullanılmaktadır. Bu kez WriteLine() metoduna ekrana yazılmak üzere bilgi
parametre olarak verilmediği için ekranın o satırı boş kalır. Bir sonraki
satırda ise WriteLine() yerine Write() metodunu kullandım.
22 Memik Yanık - C#’a Başlangıç Kitabı

WriteLine() metodu kendisine parametre olarak verilen bilgiyi ekrana yani


DOS penceresine yazdıktan sonra imleci bir sonraki satırın başına alır.
Write() metodu ise WriteLine() metodundan farklı olarak imleci bir sonraki
satırın başına almaz. Burada programın çalışmasının kendiliğinden sona
ermesini engelleyen metot ise Read(). Bu şekilde düzenlenen C# programı
derlenip çalıştırıldığında aşağıdaki gibi bir sonuç alınır.

Console sınıfının Read() metodu gerçekte kullanıcının gireceği bilgileri


programa veya bir değişkene aktarılırken işlevsel olmaktadır. Bu örnekte
kullanıcının bilgi girmesini istemediğim için Console sınıfının Read()
metodundan önce herhangi bir değişken adı yazmadım. Diğer yandan
yukarıda verdiğim örnekte asıl anlatmak istediğim şuydu: C# programları
Class’lar şeklinde hazırlanmakta ve Class’larda işlem yapan kod blokları
metot şeklinde düzenlenmektedir.

Bu düşünce ile hazırladığım kısacık örnekte Main() metodundan başka


Mesaj() adında bir metot hazırlayıp Main() metodu dahilinde işlettim. Şimdi
bu örnekte değişiklik yapıp Mesaj() adını verdiğim metodu silip çalışma
anında “yil” adını verdiğim değişkene bilgi aktarmaya çalışacağım.

class Deneme
{
static void Main(string[] args)
{
int yil;
System.Console.Write("Hangi Yıldayız : ");
yil = System.Console.Read();
}
}

Bu şekilde değiştirdiğim C# programında önce Console sınıfının Write()


metodu ile kullanıcıya mesaj verdikten sonra bir sonraki satırda Read()
metodu sayesinde kullanıcıdan istenen bilgiyi “yil” adını verdiğim değişkene
aktardım. Aşağıda verdiğim ekran görüntüsünü bu kısa programı derleyip
çalıştırdıktan sonra aldım.
Memik Yanık - C#’a Başlangıç Kitabı 23

Ekrana mesaj yazarken Write() yerine WriteLine() metodunu kullansaydım


imleç bilgi girişi için bir sonraki satırda beklerdi. Şimdi bu C# programına
ekleme yapıp kullanıcıdan istenip “yıl” adını verdiğim değişkenine aktarılan
bilgiyi WriteLine() metodu ile tekrar ekrana yazacağım.

class Deneme
{
static void Main(string[] args)
{
int yil;
System.Console.Write("Hangi Yıldayız : ");
yil = System.Console.Read();
System.Console.WriteLine();
System.Console.Write("Girdiğiniz Yıl :");
System.Console.WriteLine(yil);
}
}

Bu şekilde düzenlenen örnek derlenirken hata vermediği gibi çalıştırıldığında


da hata vermez ama girilen yıl bilgisi ile sonradan WriteLine() metodu ile
ekrana yazılan yıl bilgisi birbirinden farklı olur. Aşağıda verdiğim ekran
görüntüsünü bu C# programını derleyip çalıştırdıktan sonra aldım.

Yukarıda verilen koda dikkat ederseniz konsoldan bilgi okuma işlemi Read()
metodu ile yapılmaktadır. Read() metodu konsoldan okuma yaparken
girilen bilginin ilk karakterinin ASCII kodunu geriye göndermektedir. Bu
program derlenip çalıştırılıp “Hangi Yıldayız :” sorusuna “A” ile cevap
verilirse ekrana 65 yazılır. Çünkü “A” hafinin ASCII kodu 65’dir.
24 Memik Yanık - C#’a Başlangıç Kitabı

Console sınıfının ReadLine() metodu ise farklı bir şekilde çalışmaktadır ve


konsoldan yani DOS penceresinden okuduğu bilginin String tipte olduğunu
varsaymaktadır. Bu nedenle yukarıda verdiğimde örnekte değişiklik yapıp
okuma işlemini Read() yerine ReadLine() metodu ile yapmaya çalıştım.
class Deneme
{
static void Main(string[] args)
{
int yil;
System.Console.Write("Hangi Yıldayız : ");
yil = System.Console.ReadLine();
System.Console.Write("Girdiğiniz Yıl :");
System.Console.WriteLine(yil);
}
}

Bu şekilde değiştirdiğimiz C# programını derlemek istersek derleyici hata


rapor eder. Çünkü Console sınıfının ReadLine() metodu tarafından okunup
geriye gönderilen bilgi String tipte olmasına rağmen burada int tipindeki
değişkene aktarmaya çalışıyorum. Bu hatanın önüne geçmek için string tipte
bir değişken tanımlayıp kullandım.

class Deneme
{
static void Main()
{
string str;
System.Console.Write("Hangi Yıldayız : ");
str = System.Console.ReadLine();
System.Console.Write("Girdiğiniz Yıl :");
System.Console.WriteLine(str);
}
}

Bu hali ile programımız istediğimiz sonucu verir. Bu örnekte konsoldan


girilen “yıl” bilgisi matematiksel işlemlerde kullanılmadığı için rakamlardan
meydana gelse bile string yani karaktersel bilgi olarak değerlendirmenin bir
sakıncası olmaz.
Memik Yanık - C#’a Başlangıç Kitabı 25

Bu Bölümün Özeti

Not Defteri ile yazdığımız ilk programda Class bloğuna yer verdik. Bildiğiniz
gibi C# programlarında blok başı “{“ ile ve blok sonu ise “}” ile işaret
edilmektedir. C# programları çalışmaya Main() metodundan itibaren
başladıkları için Class’ın sınırları içinde Main() metoduna yer verdim. Main()
metodu içinde Console sınıfının WriteLine() metodu ile konsola yani DOS
penceresine bilgi yazmayı denedik. Ayrıca .NET Framework ile gelen C#
derleyicisi ile yani CSC.EXE dosyası ile CS uzantısı ile kaydettiğimiz C#
programlarını derleyip EXE dosya hazırladık.

Yukarıda yazılanları okurken kafanızda bazı soruların belirdiğini tahmin


etmek zor değildir. Programcılık biraz da bisiklet sürmeyi öğrenmek gibidir:
Önceler sık sık bisikletten düşersiniz, insanların 2 teker üzerinde nasıl
düşmeden gittiklerine hayret edersiniz. Sonra 50 metre düşmeden
gittiğinizde birden bisiklet sürmesini öğrendiğinizi fark edersiniz. Birçok kişi
programcılığa nereden başlayacağı konusunda tereddüde düşüyor. Bu
soruların cevaplarını bu dersler boyunca birlikte araştıracağız.
BÖLÜM 3
BAZI DEĞŞKEN TĐPLERĐ ve NAMESPACE'ler
Bu yazıları neden mi kaleme almıştım? Programcılık kitaplarının ilk
sayfalarında konuları sıfırdan ele alıp adım adım anlatınca bazı arkadaşlar
kitabın anlatım düzeyine itiraz etmeye başladılar. Ben de çözüm olarak
henüz yolun başında olanları gözeterek birkaç makale yazdım. Burada yer
sonunu olmadığı için en küçük ayrıntıdan bile söz etmeye çalıştım.

Şimdi izninizle konunun biraz dışına çıkacağım:Tıp doktorları kendi


aralarında tıp konuştuklarında tıp kavramlarını sıkça kullanırlar ve kolayca
anlaşırlar. Ne var ki doktorun birisi hastasıyla konuştuğunda tıp kavramlarını
kullanmaz ve halk dili ile hastasıyla diyalog kurmaya çalışır. Doktorumuz
hastalarıyla tıp kavramlarını kullanmadan iyi diyalog kurabiliyorsa başarılı
doktor olur. Yıllardır camiadan bir çok kişi Memik Yanık'ı hep giriş düzeyi
kitaplar yazmakla suçladılar. Habu ki en zoru giriş düzeyi kitaplar yazmaktır.
Bakalım şimdi de Memik Yanık'ı giriş düzeyi makaleler yazıyor diye
suçlayacaklar mıdır? Ötesi anlı şanlı üniversitelerimizin Profesör unvanına
sahip hocaları bu metinde verdiğim kısacak kodlarda tanımladığım
değişkenlerin adını çalma suçunu işlediğimi tekrar rapor edecekler midir?

Kaldığımız Yerden Devam Edelim

Bir önceki bölümde Not Defteri ile kısa bir C# programı hazırlayıp “ilk.cs”
adıyla kaydetmiştik. Devamında bu CS uzantılı C# programını konsolda
derleyip EXE dosya hazırlamıştık. Hatta örneğimizin son hali beklediğimiz
sonucu vermemişti. Bu bölümde ilk olarak bir önceki derste yaptığımız
örneği düzelteceğiz. Bir önceki bölümde hazırladığımız örneğin son şeklini
aşağıda verdim.

class Deneme
{
static void Main(string[] args)
{
int yil;
System.Console.Write("Hangi Yıldayız : ");
yil = System.Console.Read();
System.Console.WriteLine();
System.Console.Write("Girdiğiniz Yıl :");
System.Console.WriteLine(yil);
}
}

Not: Bu kısacık kodda "Yil" adında ve int tipinde bir değişken tanımladım.
Bildiğiniz gibi sene bilgisini aktarmak üzere değişken adı seçimini yapan
Memik Yanık - C#’a Başlangıç Kitabı 27

programcıların aklına yil'ın gelmesi yüksek bir ihtimaldir. Asıl demek


istediğim şudur:Değişken adı olarak yil’ı kendi namı hesabına kaydetmiş
yani register etmiş birisi resmi belgeleri ibraz edip(!) beni uyarırsa burada
"yil" adını verdiğim değişkene "yillar_yillar" veya "Kaybolan_yillar" gibi bir
ad verebilirim(!).

Bu koda dikkat ederseniz konsoldan bilgi okuma işlemi Read() metodu ile
yapılmaktadır. Read() metodu konsoldan okuma yaparken girilen bilginin ilk
karakterinin ASCII kodunu geriye göndermektedir. Bu örnek program
çalıştırılıp “Hangi Yıldayız :” sorusuna “A” ile cevap verilirse ekrana 65
yazılır. Çünkü “A” harfinin ASCII kodu 65’dir.

Console sınıfının ReadLine() metodu ise farklı bir şekilde çalışmaktadır ve


konsoldan yani DOS penceresinden okuduğu bilginin String tipte olduğunu
varsaymaktadır. Bu nedenle yukarıda verdiğimde örnekte değişiklik yapıp
okuma işlemini Read() yerine ReadLine() metodu ile yapmaya çalıştım.

class Deneme
{
static void Main(string[] args)
{
int yil;
System.Console.Write("Hangi Yıldayız : ");
yil = System.Console.ReadLine();
System.Console.Write("Girdiğiniz Yıl :");
System.Console.WriteLine(yil);
}
}

Bu şekilde değiştirdiğimiz C# programını derlemeye çalışırsak hata meydana


gelir. Çünkü ReadLine() metodu tarafından okunup geriye gönderilen bilgi
String tipte olmasına rağmen burada int tipindeki değişkene aktarmaya
çalışıyorum. Bu hatanın önüne geçmek için “yil” adını verdiğim değişken
yerine string tipte bir değişken tanımlayıp kullandım.

Daha önce az çok kod yazmış olanların bileceği gibi aşağıda verdiğim kodun
hiç bir orijinal tarafı yoktur. Buna rağmen Prof. unvanlı birisi "bu kodda
28 Memik Yanık - C#’a Başlangıç Kitabı

Memik Yanık başka kaynaklardan çalıntı yapmıştır" diye rapor tanzim


ederse, ona "haklısın hocam sizden iyi bilecek değiliz" demekten elimizden
başka bir şey gelmez.

class Deneme
{
static void Main(string[] args)
{
string str;
System.Console.Write("Hangi Yıldayız : ");
str = System.Console.ReadLine();
System.Console.Write("Girdiğiniz Yıl :");
System.Console.WriteLine(str);
}
}

Bu hali ile programımız istediğimiz sonucu verir. Bu örnekte konsoldan


girilen “yıl” bilgisi matematiksel işlemlerde kullanılmadığı için rakamlardan
meydana gelse bile string yani karaktersel bilgi olarak değerlendirmenin bir
sakıncası olmaz.

Şimdi bu örnekte değişiklik yapıp kullanıcıdan 2 sayısal bilgi isteyip bunları


birbirleri ile çarptıktan sonra sonucu ekrana yani konsola yazacağım. Bu
amaçla önce 2 string değişken tanımlayıp Console sınıfının ReadLine()
metodu ile okunan bilgileri bu değişkenlere aktardım.

Bu program bu hali ile kaydedilip çalıştırılırsa konsoldan girilen bilgiler string


değişkenlere aktarılır. Bu örnekteki amacımız kullanıcının sayısal bilgi
girmesini ve bu sayıları birbiri ile çarpıp ekrana yazmak olduğu için
matematiksel işlem öncesi String değişkenlerin içeriğini int tipindeki
Memik Yanık - C#’a Başlangıç Kitabı 29

değişkenlere aktarmak gerekir. Bu amaçla bu C# programına ekleme yapıp


int tipinde 2 değişken tanımladım. Ardından string değişkenlerin içeriklerini
dönüştürüp int tipindeki bu değişkenlere aktardım.

class Deneme
{
static void Main(string[] args)
{
string str1;
string str2;
int sayi1;
int sayi2;
System.Console.Write("Đlk sayıyı girin : ");
str1 = System.Console.ReadLine();
System.Console.Write("Đkinci sayıyı girin: ");
str2 = System.Console.ReadLine();
sayi1 = System.Int16.Parse(str1);
sayi2 = System.Int16.Parse(str2);
}
}

Bu kodda sizin için yeni olan System adlı namespace’de yer alan Int16
yapısıdır. String bilgiyi int tipindeki değişkene aktarırken bu yapının Parse()
metodunu kullandım. Bazı kaynaklarda Int16 yapısından Class diye söz
edilmiş olsa bile bunu sorun yapmamak gerekir. Bu dönüştürme işlemini
yaparken Int16 yerine Int32 yapısının Parse() metodunu kullanabilirdim.

Merak edenlere duyurmak isterim: Memik Yanık'ın yıllar önce yayınlanan


Clipper kitabından bu yana yazdığı bütün kitaplarda integer tipindeki
değişkenlere ad ararken tercihini Sayi1 ve Sayi2'den yana kullandı. Ne ki
sayi1, sayi2'yi değişken adı olarak seçmesi onun hırsız olarak suçlanmasına
neden oldu? Bu kodda tanımlanan değişkenlere Sayi1, Sayi2 gibi adlar
vermenin mecburiyet olmadığının kanıtlamak için bu kodu aşağıdaki gibi
düzenledim.

Hiç kaygılanmayın bu değişkenlere gavurca adlar seçildiğinde bile kod


hatasız çalışıyor. Çevrenizde "hayır bu kodun çalışabilmesi için değişken
adının mutlaka sayi1, sayi2 olarak seçilmesi şarttır diyen öğretim üyelerine,
millete programcılık öğreten kurs sahiplerine rastlarsanız "hocam haklısınız,
C# derleyicisi C#’ın kurallarını sizden iyi mi bilecek?" deyiniz.

class Deneme
{
static void Main(string[] args)
{
string str1, str2;
30 Memik Yanık - C#’a Başlangıç Kitabı

int number1, numberi2;


System.Console.Write("Đlk sayıyı girin : ");
str1 = System.Console.ReadLine();
System.Console.Write("Đkinci sayıyı girin: ");
str2 = System.Console.ReadLine();
number1 = System.Int16.Parse(str1);
number2 = System.Int16.Parse(str2);
}
}

Hemen bir hatırlatmada bulunmak isterim:Her ne kadar bu örnekte


kullanıcıya "sayı girin" mesajı verilmiş olunsa bile kullanıcı konsoldan sayısal
bilgi yerine karaktersel bilgi girerse Parse() metodu dönüştürme
yapamayacağı için hata meydana gelir. Bu tip karşılaşılması muhtemel
hataların önüne geçmek için hata kontrol blokları hazırlanabilir. Tabii bu
bölümde try-catch deyimlerinden söz etmeyeceğiz. Merak edenler C#
kitabımdan alıp kişisel sitemde sizinle paylaştığım Hata Yakalamak ve
Exception Sınıfları makalesine bakabilirler. Bu makaleyi okuyanlar sıfıra
bölme hatasını anlatmak için gerekli değişkenlere ad seçerken başka Türkçe
kaynaklardan çalıntı yapmanın şart olup olmadığını öğrenirler.

Bu şekilde konsoldan girilen bilgileri Parse() metodu ile dönüştürüp int


tipindeki değişkenlere aktardıktan sonra matematiksel işlem yapabiliriz.
Matematiksel işlem sonucu bulunacak değeri aktarmak üzere int tipinde 3.
bir değişken tanımladım.

Bu kodu dikkatice incelerseniz bir satırda aynı tipte birden fazla değişkeni
tanımlamış olduğumuzu görürsünüz. Hemen hatırlatmak gerekirse; bu
programı derleyip çalıştırıp sonra 1. sayı ile 2. sayının çarpımı sonucu elde
edilen sayısal bilgi 2147.483.647’den büyük olursa hata meydana gelir.
Memik Yanık - C#’a Başlangıç Kitabı 31

Ayrıca string bilgileri Int16 yapısının Parse() metodu ile dönüştürdüğümüz


için konsoldan girilen sayılar 32767’den büyük olmamalı. Int16 yapısının
Parse() metodu yerine Int32 yapısının Parse() metodunu kullansaydım 1.
veya 2. sayı 2147.483.647 gibi büyük bir değer olabilirdi.

Çarpma işlemi sonucu bulunan değeri Console sınıfının WriteLine()


metodu sayesinde direk konsola yazmak mümkün olmasına rağmen amacım
bazı konuları anlatmak olduğu için üçüncü bir string değişken tanımlayıp
çarpma işlemi sonucu bulunan değeri dönüştürüp bu değişkene aktardım.
Bu işlemi nasıl yaptığımı aşağıda görebilirsiniz.

class Deneme
{
static void Main(string[] args)
{
string str1,str2, sonuc_str;
int sonuc, sayi1, sayi2;
System.Console.Write("Đlk sayıyı girin : ");
str1 = System.Console.ReadLine();
System.Console.Write("Đkinci sayıyı 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 değişkenin içeriğini string tipindeki


değişkene aktarabilmek için Convert sınıfının ToString() metodundan
yararlandım. C# ile az çok uğraşmış olanlar bu işlemin daha kısa bir
yolunun olduğunu ileri sürebilirler. Bu arkadaşlar haklıdırlar; dönüştürme
yaparken Convert sınıfının ToString() metodu yerine Object sınıfının
ToString() metodunu kullanabilirsiniz.

Object sınıfının ToString() metodunun nasıl kullanıldığını daha sonra


anlatacağım. ToString() metodu ile integer bilgiyi string bilgiye
dönüştürdükten sonra WriteLine() metodu ile konsola yazdım. Tabii bu kısa
açıklamayı yapmasaydım bazı üniversitelerin öğretim üyeleri "Parse()
metodunun nasıl kullanıldığını Memik Yanık'ın bilmesine imkan yoktur.
Mutlaka başka Türkçe kitaplardan çalıntı yapmıştır" diyebilirlerdi.
32 Memik Yanık - C#’a Başlangıç Kitabı

class Deneme
{
static void Main(string[] args)
{
string str1,str2, sonuc_str;
int sonuc, sayi1, sayi2;
System.Console.Write("Đlk sayıyı girin : ");
str1 = System.Console.ReadLine();
System.Console.Write("Đkinci sayıyı 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("Sayıların çarpımı :"+ sonuc_str);
System.Console.Write("Devam etmek için bir tuşa basın");
System.Console.Readkey();
}
}

Biraz da Namespace’lerden söz edelim..

Şimdi yukarıda uzun uzun anlatılan örneği bir tarafa bırakıp başka bir örnek
hazırlayacağım. C# programlarını yazarken Visual Studio veya C# için
hazırlanmış Express Edition’dan yararlanma yoluna henüz gitmediğimiz için
CS uzantılı C# kodunu yine Not Defteri ile hazırlayacağız. Hazırladığım basit
C# programını aşağıda verdim. DOS penceresinde derlenip DOS
penceresinden bilgi alış verişi yapan C# programlarına konsol uygulaması
adı verilmektedir.

Class Sinif_1
{
public static void Main()
{
System.Console.Write("Efes Pilsen Basketbol Takımı");
System.Console.ReadLine();
}
}

Bu şekilde hazırlanan C# programı DOS ortamında derlenip çalıştırılırsa


belirtilen bilgi Write() metodu sayesinde DOS penceresine yani konsola
yazılır. Bir sonraki satırda kullanılan ReadLine() metodu sayesinde enter
tuşuna basılıncaya kadar program çalışmaya devam eder. Bu örnekte
ReadLine() yerine Read() metodu kullanılsaydı değişen bir şey olmazdı.
Tabii bu 3 satırlık kodda ReadLine() yerine ReadKey() metodunu
kullanırsanız uygulamanın çalışmasını sona erdirmek için herhangi bir tuşa
basılabilir.
Memik Yanık - C#’a Başlangıç Kitabı 33

.NET Framework adı verilen sınıf kitaplığı ile gelen sınıfların Namespace adı
verilen yapılarda saklandığını biliyorsunuz. C# programlarında kullanmak
istediğiniz Class hangi Namespace’in içinde yer alıyorsa o namespace’ı
using deyimi ile programa dahil etmelisiniz veya yukarıda yapıldığı gibi
içerdiği sınıfları kullanmak istediğiniz namespace’in adını metodun önüne
her seferinde yazmalısınız.

DOS penceresi ile ilgili Console sınıfı System adlı Namespace’te yer aldığı
için Write() metodundan önce bu sınıfın yer aldığı Namespace’in adını
yazdım. Söz konusu Namespace’teki sınıfları programınızda çok kez
kullanıyorsanız her seferinde Namespace’in adını bu şekilde yazmak yerine
aşağıda yapıldığı gibi ilgili Namespace’i using deyimi ile koda dâhil
edebilirsiniz. using deyimi ile olmayan bir namespace’i C# programınıza
dahil etmek istemeniz yani olmayan bir namespace'in kaynaklarından
yararlanmak istemeniz halinde derleme sırasında hata meydana gelir.

using System;
Class sinif_1
{
public static void Main()
{
Console.Write("Efes Pilsen Basketbol Takımı");
Console.ReadLine();
}
}

C# programlarınızda .NET Framework ile gelen Namespace’lerdeki hazır


sınıfları kullanmanın ötesinde kendi hazırladığınız class’ları bir Namespace’in
içine koymanız gerekir. Yukarıda bunu yapmamış olmamıza rağmen
herhangi bir hata meydana gelmedi. Çünkü programcı yazdıklarını bir
Namespace’e yerleştirmediği zaman C# derleyicisi kendiliğinden bir
Namespace hazırlamaktadır. Şimdi yukarıda verdiğim programdaki “Sinif_1”
adını verdiğim Class’ı bir Namespace’e dahil edeceğim.

using System;
namespace Tokmak
{
class sinif_1
{
public static void Main()
{
Console.Write("Efes Pilsen Basketbol Takımı");
Console.ReadLine();
}
}
}
34 Memik Yanık - C#’a Başlangıç Kitabı

Yukarıda bold yapılan paragrafı ve bu kısa C# kodunu; C++ veya Java gibi
nesneye yönelik programlama dilleri hakkında az çok bilgi sahibi olan
birisine gösterseniz şaşırıp “bunda önemli olan nedir veya üzerinde
durulacak ne var ki?” diye size soru yöneltmesi yüksek ihtimaldir. Çünkü
konuya kendi açısından bakacaktır. Bu dersleri C# veya nesneye yönelik
programcılık konusunda yeni olanları düşünerek kaleme aldığım için
yukarıda verdiğim kısa kod ve kalın(bold) yapılan açıklama karşısında
duraklamanız normaldir. Bu düşünce ile aşağıda farklı renge boyanan
paragrafı kaleme aldım.

C# veya Visual Basic’in .NET uyumlu sürümü ile program yazanların


kaçmakla kurtulamayacakları 2 kavramdan birisi Class, diğeri ise
Namespace’tir. Nesneye yönelik programcılığın temeli olan Class kavramı
hakkında bu derslerde henüz doğru dürüst bilgi verilmemiş olmakla birlikte
sanırım Class kavramı hakkında kafanızda beliren soruların üzerinde
durmamayı şimdilik başarıyorsunuz Class bir yana bir de Namespace’ten söz
edilince kafanızdaki sorular önem kazanmaya başlamış olabilir.

Birden Fazla Main() Metodu

Uygulamanızda birden fazla Class varsa Main() metodunun hangi Class’ta


olduğunun önemi yoktur. Çünkü C# derleyicisi Main() metodunun hangi
Class’ta olduğunu arayıp buluyor. Uygulamadaki birden fazla sınıfta Main()
metodu varsa hangisinin kullanılacağının belirtilmesi gerekir. Bu konuda
bilgi vermek için aşağıdaki gibi bir C# programı hazırladım.

using System;
class sinif_1
{
public static void Main()
{
Console.Write("Program Đlk sınıftaki Main ile başladı");
Console.ReadLine();
}
}
class sinif_2
{
public static void Main()
{
Console.Write("Program Đkinci sınıftaki Main ile başladı");
Console.ReadLine();
}
}
Memik Yanık - C#’a Başlangıç Kitabı 35

Bu örneğe dikkat ederseniz Main() metodunun parametresiz olduğunu veya


parantezin içine herhangi bir değişken adı yazmadığımı görürsünüz. Ayrıca
bu örnekte Namespace hazırlamadığımı fark etmiş olmalısınız.

Bu şekilde hazırlanan C# programı bilinen şekilde derlendiğinde hata


meydana gelir. Derleme satırında hangi sınıftaki Main() metodunun
kullanılmak istendiği belirtilmelidir. Bu program aşağıdaki gibi derlenirse
uygulama ilk sınıftaki Main() metodundan itibaren çalışmaya başlar.

Write ve WriteLine Metotları

Yukarıda verdiğim örneklerde konsola yalnızca bir bilgi yazdım. Şimdi


konunun anlaşılmasına katkı olması için 4 bilgiyi yazacağım. Bu amaçla
aşağıda verdiğim C# programını hazırladım. Eğer saygıdeğer bir yazarımız
kitabında Console sınıfının Write() metodunu anlatırken benim gibi konsola
Futbol takımlarının adını yazmayı tercih etmişse yandım. Çünkü o i ve j gibi
değişkenleri kullanmak, Selection Sort gibi bütün programcılar tarafından
bilinen sıralama tekniğini kullanmanın suç olduğunu ileri süren Prof'ların
olduğu bir memlekette programcılık üzerine yazmak cesaret istiyor.

using System;
namespace Tokmak
{
class sinif_1
{
public static void Main()
{
Console.Write("Fenerbahçe");
Console.Write("Galatasaray");
Console.Write("Beşiktaş");
Console.Write("Trabzonspor");
Console.ReadLine();
}
}
}

Bu programda Write() metodu ile konsola 4 bilgi arka arkaya yazılmakta ve


ReadLine() metodu ile programın işletimi askıya alınmaktadır. Write()
metodu ile konsola bilgi yazıldıktan sonra imleç yazma işleminin
36 Memik Yanık - C#’a Başlangıç Kitabı

tamamlandığı yerde bekleyeceği için bu program derlenip çalıştırılırsa


aşağıdaki gibi bir sonuç elde edilir.

Bu bilgilerin ayrı satırlara yazılmasını sağlamak için Write() yerine


WriteLine() metodunu kullanabilirsiniz. WriteLine() metodu kendisine
parametre olarak verilen bilgiyi belirtilen ortama(burada konsol) yazdıktan
sonra imleci bir sonraki satırın başına alır.

using System;
namespace Tokmak
{
class sinif_1
{
public static void Main()
{
Console.WriteLine("Fenerbahçe");
Console.WriteLine("Galatasaray");
Console.WriteLine("Beşiktaş");
Console.WriteLine("Trabzonspor");
Console.Read();
}
}
}

Write() metodu ile konsola yazılan metnin sonuna satır başı


karakterini(“\n”) ekleyerek aynı sonucu alabilirsiniz. Satır başı karakterinin
nasıl kullanıldığını aşağıda görebilirsiniz.

using System;
class sinif_1
{
public static void Main()
{
Console.Write("Fenerbahçe\n");
Console.Write("Galatasaray \n");
Console.Write("Beşiktaş \n");
Console.Write("Trabzonspor \n");
Console.Read();
}
}
Memik Yanık - C#’a Başlangıç Kitabı 37

Ey programcı olmak isteyen arkadaş: Burada anlatılanları birçok kitapta


veya sitede görmüş olmalısınız. Hele hele Console sınıfının ReadLine gibi
metotları hakkında bilgi içeren binlerce siteyi bulman mümkündür. Lütfen
eğri otursanız bile doğru konuşun; sizce bu metnin anlatım biçiminden yani
cümle şeklinden başka orijinal bir yanı var mıdır? Bence yoktur. Buna
rağmen birileri çıkıp "Memik Yanık bu metni garanti benim kitaptan çalmıştır
veya çeviriştir" derse nasıl bir tepki verirdiniz? Lütfen gülmeyiniz, derler..
Hem de Prof unvanına sahip birileri bu iddiayı onaylarlar. Bir sonraki derste
C# için hazırlanmış Express Edition'dan söz edeceğiz.
BÖLÜM 4
KONSOL UYGULAMALARI ve EXPRESS EDITION

C#’la ilgili ilk derse söylemiş olmama rağmen tekrar edelim: Bu derslerin
amacı programcılık ve C# öğrenmek isteyenlere ilk öğrenmeleri gereken
konuları anlatmaktır. C# ile çalışmaya bu dersleri okuyarak başlayanların
C# öğrenme süreleri kısalacaktır, C# kitaplarında yazılanları, C# derslerinde
anlatılanları anlamaları kolaylaşacaktır. Bu nedenle elinizdeki C# konulu
kitapları okumadan, dokümanları incelemeden önce bu dersleri okumanızı
öneriyorum.

Bildiğiniz gibi Microsoft firması 2002 yılından bu yana .NET Framework adı
verilen sınıf kitaplığını ücretsiz olarak dağıtmaktadır. Bütün .NET Framework
sürümlerinde hazır sınıflardan başka Visual Basic, C# ve C++ derleyicileri
de bulunmaktadır. Başka bir deyişle herhangi bir .NET Framework
sürümünden yararlanıp Visual Basic veya C# diliyle uygulamalar geliştirmek
mümkündür. Ne ki Not Defteri veya başka bir editörle C# veya Visual Basic
programlarını yazıp DOS penceresinde derlemek zahmetli olup günümüz
şartlarında iğneyle kuyu kazmak gibidir. C#’la ilgili 2. ve 3. derste Not
Defteri ile konsol uygulamaları geliştirip C#’a alışmaya çalışmıştık.

Çözüm ise Microsoft ürünü Visual Studio adı verilen program geliştirme
aracından yani IDE’den yararlanmaktadır. Visual Studio paketi ile hem Web
uygulamaları hem C# hem C++ hem de Visual Basic dilini kullanan
uygulamalar geliştirmek mümkündür. Microsoft firması 2004 yılından
itibaren dillere özel ve Visual Studio’nun kısıtlı özelliklere sahip sürümlerini
hazırlayıp ücretsiz olarak dağıtmaya başladı. Bu sürümlere Express Edition
adı verildi. Visual Studio 2008 için konuşmak gerekirse Visual Studio 2008
ile .NET Framework 3.5 destekli ve istenilen programlama dilinde uygulama
geliştirmek mümkün iken Visual Basic’e özel Express Edition ile ancak Visual
Basic uygulaması geliştirmek mümkündür.

Bu söylenenlerden yola çıkarak C# için hazırlanmış Express Edition hakkında


şunlar söylenebilir: Not Defteri ile uygulama geliştirmek istemeyenler ve
Visual Studio’yu pahalı bulup edinemeyenler Express Edition’la idare
edebililer.

Bu bölümde C# için hazırlanmış Express Edition 2008’in program geliştirme


ortamı hakkında kısaca bilgi verilecektir. Tekrar etmek gerekirse Express
Edition ilgili programlama dilinin veya derleyicinin adı olmayıp “program
geliştirme ortamının” veya yaygın bilinen adıyla IDE’nin adıdır. C# için
hazırlanan Express Edition yazdığınız programları derlerken .NET Framework
Memik Yanık - C#’a Başlangıç Kitabı 39

ile gelen C# derleyicisinden yararlanır. Visual Basic uygulaması geliştirmek


isteyenlerin Visual Basic için hazırlanmış Express Edition’ı, Web uygulaması
geliştirmek isteyenlerin ise Visual Web Developer Express Edition’la
ilgilenmeleri gerekir. Bu arada bir isimlendirme yanlışlığını vurgulayalım. Bu
yanlışlığın ası kaynağı Microsoft firmasıdır. Örneğin Microsoft’un sitesine
bakıldığı zaman Visual Basic’le ilgili Express Edition’ın adı “Microsoft Visual
Basic 2008 Express Edition”. Đlk bakışta bu adlandırmada 2008’in Visual
Basic derleyicisin sürümünü işaret ettiğini sanabilirsiniz. Hal bu ki buradaki
2008 derleyicinin sürümü yerine IDE’nin sürüm numarasıdır. Express
Edition’lar piyasaya verildiğinden bu yana bu yanlışlığa defalarca işaret
etmeme rağmen bir çok kaynakta 2008’in bir Visual Basic sürümü olduğu
yazılmaktadır.

Visual C# Đçin Hazırlanmış Express Edition’ı Kurmak

C# için hazırlanmış Express Edition’ı bilgisayarınıza kurmadan önce


bilgisayarınıza .NET Framework 2.0 veya 3.5 sürümünü kurmalısınız. C# için
hazırlanmış Express Edition’ın 2005 sürümünü kullanacaksanız .NET
Framework 2.0 sürümü yeterli olmaktadır. Express Edition’ın 2008
sürümünü kullanmak istiyorsanız daha önceden .NET Framework 3.5
sürümünü kurmuş olmalısınız. Đleri ki sayfalarda işaret edileceği üzere .NET
Framework 3.5 sürümünü bilgisayarınıza kurmadan C# için hazırlanmış
Express Edition’ın 2008 sürümünü kurmanız halinde Express Edition ile
birlikte .NET Framework’ün 3.5 sürümü otomatik olarak Microsoft’un
sitesinden indirilip kurulur. C# ile program geliştirme konusunda henüz
yolun başında olanlar için kullanılacak Express Edition sürümünün 2005
veya 2008 olmasının fazla bir önemi yoktur.

Şimdi sırada C# için hazırlanan Express Edition’ı kurmak var.


Microsoft.com’da arama yapıp aşağıda ekran görüntüsünü verdiğim sayfayı
buldum. Gördüğünüz gibi bu sayfada değişik programlama dilleri için
hazırlanmış olan Express sürümlerin linkleri var. Bazı Express sürümlerin
birden fazla dil için hazırlanan kopyaları olduğundan Select a Language
başlıklı liste kutusunda dil seçmek gerekir.
40 Memik Yanık - C#’a Başlangıç Kitabı

Select a Language liste kutusunda Đngilizce veya başka bir dili seçtiğinizde
veya Download linkini tıkladığınızda yaklaşık 2.5 MB‘lık vcssetup.exe
dosyası indirilmek üzere sizden izin istenir. C# yerine Visual Basic ile
ilgileniyorsanız Visual Basic’le ilgili Download linkini tıklamalısınız.
Memik Yanık - C#’a Başlangıç Kitabı 41

Bu EXE dosyayı indirip çalıştırdığınızda ilk olarak aşağıda verdiğim diyalog


kutusu ekrana gelir. Welcome Setup başlıklı bu diyalog kutusundaki onay
kutusunu seçtiğinizde kurma işlemi sırasında yaşadığınız sorunlar
Microsoft’a iletilir.

Welcome başlıklı bu diyalog kutusunda herhangi bir işlem yapmadan Next


düğmesini tıklayınca bu kez ekrana lisans hakları ilgili pencere geldi. Kurma
işlemine devam etmek üzere lisans hakları ile ilgili penceredeki ilgili radyo
düğmesini seçip Next düğmesini tıklarsanız ekrana aşağıda verilen
Installation Options diyalog kutusu gelir. Visual Studio ve C#’la ilgili
dokümanların indirilip kurulmasını istiyorsanız bu diyalog kutusundaki
Microsoft Express MSDN... onay kutusunu seçmelisiniz.
42 Memik Yanık - C#’a Başlangıç Kitabı

Bu arada Microsoft’un sitesinden SQL Server’ın Express Edition adı verilen


ücretsiz sürümünün indirilip kurulmasını istiyorsanız SQL Server’la ilgili onay
kutusunu seçmelisiniz. C# ile geliştireceğim uygulamalarda veritabanı
olarak hep Access kullanacağım demiyorsanız SQL Server’ın kurulmasını
sağlamalısınız. Bu metni kaleme aldığım günlerde SQL Server’ın Express
Edition’ın en son sürüm nosu 2005 iken şu günlerde 2008 sürümü kullanıma
sunuldu.

Tabii SQL Server’la ilgili bu onay kutusunu seçmeden C# için hazırlanan


Express sürümü kuracak olursanız daha sonradan SQL Server’a gerek
duyduğunuzda Microsoft’un sitesinden indirip kurabilirsiniz. Daha önce SQL
Server’ın Express sürümünü indirdiğim için tekrar indirilsin istemedim.
Ayrıca bu sırada kullandığım bilgisayarda SQL Server’ın Express sürümü
kurulu olsaydı bu seçenek Installation Options diyalog kutusunda
bulunmazdı.

Ekranda Installation Options diyalog kutusu varken Next düğmesini


tıkladığınızda Visual C# 2008 Express Edition’ın kurulacağı sürücü ve
klasörün belirlendiği Destination Folder başlıklı diyalog kutusu ekrana
gelir. C# için hazırlanmış Express Edition’a ait dosyalar “\Program
Memik Yanık - C#’a Başlangıç Kitabı 43

Files\Microsoft Visual Studio 9.0” klasörünün altında hazırlanan bir klasöre


yerleştirilmektedir. Express Edition’a ait dosyaların başka bir klasöre
yerleştirilmesini istiyorsanız bu diyalog kutusunda ayarlama yapabilirsiniz.
Bana sorarsanız bu diyalog kutusunda herhangi bir değişiklik yapmayın ve
C# için hazırlanmış Express Edition’ın 2008 sürümünü varsayılan klasöre
kurun. Merak edenlere hemen söyleyelim: Kullanılan bilgisayarda hem
Visual Studio hem de istenen Express Edition’lar olabilmektedir. Yani
Express Edition kuranlar sonradan Visual Studio’yu kurabilirler.

Bu ekran görüntüsünü aldığım sırada kullandığım bilgisayara .NET


Framework 3.5 kuruluydu. Bu nedenle kurulacak bileşenlerin listelendiği bu
diyalog kutusunda .NET Framework 3.5 listelenmiyor. Bu sırada kullandığım
bilgisayara .NET Framework kurulu olmasaydı bu diyalog kutusunda
kurulacağı işaret edilen seçenekler daha fazla olabilirdi.

Đşleme devam etmek üzere Install düğmesini tıklarsanız kurma işlemi


seçilen bileşenlere ve Internet’in hazına bağlı olarak kısa sürede
tamamlanır. Kurma işlemi tamamlandığında ekrana aşağıda verilen Setup
Complete diyalog kutusu getirilir. Bu diyalog kutusundaki Windows
44 Memik Yanık - C#’a Başlangıç Kitabı

Update linkini tıklayabilir veya Microsoft’un sitesinden servis


paketlerini(varsa) daha sonra indirip kurabilirsiniz.

Visual C# Đçin Hazırlanmış Express Editon’ı Register Etmek

Anlatılan şekilde kurulan Express Edition’ı register etmeden 30 gün boyunca


kullanabilirsiniz. Ürün ücretsiz olduğu için register işlemini sorun yapmayın
derim. Đnsanlar kurdukları programı hemen kullanmak istiyorlar ve nasıl olsa
30 günüm var deyip Register işlemini erteliyorlar. Ben de bu alışkanlığa
uyup Setup Complete diyalog kutusundaki Exit düğmesini tıklayıp Register
işlemi sonraya bıraktım. C# için hazırlanmış Express Edition’ı
çalıştırdığınızda aşağıdaki gibi bir pencere ile karşılaşırsınız.
Memik Yanık - C#’a Başlangıç Kitabı 45

Bu sırada nasıl proje hazırlanıp nasıl kod yazıldığı ayrı bir konudur. Đleriki
sayfalarda bu konu işlenecektir. Eski Türk filmlerindeki gibi 30 günün göz
açıp kapayıncaya kadar geçtiğini varsayıp hemen Register etmeye çalışalım.
Bu amaçla Help menüsünden Register Product komutunu verelim. Help
menüsünden bu komutu verdiğinizde ekrana aşağıda verilen diyalog kutusu
gelir. Bu diyalog kutusunda sizden register anahtarı isteniyor.
46 Memik Yanık - C#’a Başlangıç Kitabı

Bu anahtar elimizde olmadığına göre Microsoft’tan isteyeceğiz. Microsoft’tan


Registration anahtarını istemek için bu diyalog kutusundaki Register now
linkini tıklamak gerekiyor. Bu linki tıkladığınızda karşınıza aşağıda verdiğim
sayfa gelir ve mail adresinizle parolanız istenir.

Gerek olmamasına rağmen bu işlem için başka bir mail adresini kullanmak
istiyorsanız veya mail adresiniz yoksa Sign up now düğmesini tıklayıp
Hotmail’den yeni bir adres edinebilirsiniz. Mevcut mail adresinizi ve
parolanızı girip Sing in düğmesini tıkladığınızda ekrana aşağıda verilen
sayfa getirilerek sizden bazı ek bilgiler istenir.
Memik Yanık - C#’a Başlangıç Kitabı 47

Đstenen bilgileri girip sayfanın alt kısmındaki Continue düğmesini tıklayıp


işleme devam ettiğinizde aşağıda verilen sayfa ekrana getirilerek sizin için
hazırlanan kayıt anahtarı sayfaya yazılır.

Bu anahtarı kopyalayıp Help menüsündeki Register Product komutu ile


ekrana getirilen diyalog kutusuna yapıştırmak gerekiyor. Aşağıda verilen
ekran görüntüsünü bu işlemi yaptıktan sonra aldım.
48 Memik Yanık - C#’a Başlangıç Kitabı

Register anahtarını bu diyalog kutusuna yapıştırıp Complete Registration


düğmesini tıkladığınızda işlem tamamlanmış olur. Anlatılan şekilde Express
Edition’ı register edip ondan sonra Help menüsünden Register Product
komutunu verdiğinizde ekrana aşağıdaki gibi bir diyalog kutusu getirilerek
ürünün zaten kayıtlı olduğu işaret edilir.

Visual C# 2008 Express Edition’ı(bu adlandırma kafaları karıştırdığı için


zaman zaman “C# için hazırlanan Express Edition” deme gereğini
duyuyorum) kurup çalıştırırsanız aşağıdaki gibi Visual C# 2008 Express
Edition penceresi ile karşılaşırsınız. Bu ekran görüntüsünü dikkatlice
incelediğinizde pencerenin sol tarafında gizlenmiş Toolbox penceresinin sağ
tarafında ise açık durumda olan Solution Explorer penceresinin olduğunu
görürsünüz.

Kurup çalıştırdığım Express Edition’in 2005 sürümü olsaydı aşağıdaki gibi


sonuçla karşılaşırdım. Bu derslerin içeriği bağlamında Express Edition’ın
2005 ile 2008 sürümü arasında pek fark yoktur.
Memik Yanık - C#’a Başlangıç Kitabı 49

Visual C# 2005/2008 Express Edition çalıştırıldığında yeni proje


hazırlayabilmeniz veya mevcut projeleri açabilmeniz için Start Page ekrana
getirilmektedir. Recent Projects kutusundaki Open ve Create seçenekler
ile mevcut projeleri açabilir ve yeni projeler hazırlayabilirsiniz. Đsterseniz
Start Page sayfasını kapatabilirsiniz. Bazı arkadaşlarımız C# ile çalışırken
Express Edition yerine Visual Studio’yu tercih edebilirler. Bu dersler
bağlamında Visual Studio ile Express Edition birbirinden pek farklı değildir.
50 Memik Yanık - C#’a Başlangıç Kitabı

Proje Hazırlamak

Daha önce açılıp kapatılan C# projeleri Start Page sayfasında Recent


Projects kutusunda listeleniyor. Mevcut projelerden birisini açmak
istiyorsanız Open seçeneğinin karşısındaki Project linkini tıklayabilir veya
File menüsünden komut verebilirsiniz. Yeni bir C# projesi hazırlamak üzere
Start Page’deki Create seçeneğinin Project linkini tıklarsanız ekrana New
Project diyalog kutusu gelir. Bu diyalog kutusunda Visual C# için
hazırlanan Express Edition ile birlikte verilen şablonlar listelenmektedir.
Memik Yanık - C#’a Başlangıç Kitabı 51

Bu sırada C# için hazırlanmış Express Edition yerine Visual Studio kullanıyor


olsaydım New Project diyalog kutusunda daha fazla seçenek olurdu. Çünkü
Visual Studio ile C# uygulamalarından başka Visual Basic, C++ ve Web
uygulamalarını geliştirmek mümkündür.

Madem daha önceki derslerde DOS penceresinde derlenip çalıştırılan C#


programları hazırladık; kaldığımız yerden devam etme niyetine bir konsol
uygulaması hazırlayalım. Bu amaçla New Project diyalog kutusunda
Console Application şablonunu seçip Name kutusuna konsol
uygulamasına vermek istediğim adı yazdım. Bu şablonu seçip OK düğmesini
tıklarsanız aşağıdaki gibi bir Express Edition penceresi ile karşılaşırsınız.

Express Edition tarafından hazırlanan bu kodu incelerseniz size yabancı


gelen fazla bir şeyin olmadığını fark edersiniz. Şimdiye kadar
anlattıklarımıza ek olarak using deyimiyle System.Collections.Generic,
System.Linq ve System.Text adlı namespace’lerdeki sınıflardan
yararlanılmak istendiği işaret edilmiştir. Zaten daha önce verdiğimiz kısacık
örneklerde bu namespace’lerdeki sınıflara gerek duymamıştık. New Project
diyalog kutusunda uygulamaya vermiş olduğum ad aynı zamanda
Namespace adı olarak kullanılmış. Devamında Program adında bir Class
hazırlanmış. Başka bir deyişle Express Edition, kod dosyasının adını aynı
zamanda Class adı olarak kullanmış. Tabii sizler bu Class’a yani sınıfa başka
52 Memik Yanık - C#’a Başlangıç Kitabı

bir ad verebilirsiniz. Her C# uygulamasında Main() metodunun olması


zorunlu olduğu için bu Class’ın sınırları içinde Main() metoduna yer verilmiş.

Bu şartlarda “Proje1” adını verdiğim konsol uygulaması henüz kaydedilmiş


değildir. Şimdi henüz herhangi bir değişiklik yapmadığımız bu konsol
uygulamasını kaydedelim. Bu amaçla Express Edition’ın File menüsünden
Save All komutunu verebilir veya Standard araç çubuğundaki Save All
düğmesini tıklayabilirsiniz. File menüsünden Save All komutunu verdiğinizde
ekrana aşağıda verdiğim Save Project diyalog kutusu gelir.

Her ne kadar projeyi veya konsol uygulamasını hazırlarken New Project


diyalog kutusunda bir ad vermekle birlikte projeyi kaydederken bu adı
değiştirme imkanımız var. Projeye vermek istediğiniz adı Name kutusuna,
projenin kaydedileceği klasörü ise Location klasörüne yazmanız gerekir.
Klasör adını doğrudan yazmak yerine Browse düğmesini tıklayıp mevcut
klasörlerden birsini seçebilirsiniz.

Save Project diyalog kutusuna ayrıca Solution Name başlıklı bir metin
kutusu bulunmaktadır. C# için hazırlanmış Express Edition veya Visual
Studio sayesinde hazırlanan bir veya birden fazla proje bir araya getirilerek
Solution hazırlanmaktadır. Başlangıçta proje adı ile proje grubu işlevi gören
“Solution” adının aynı olacağı varsayılmaktadır. Projenin kaydı sırasında
hazırlanan dosya veya klasörleri sizlere göstermek için Solution’a farklı bir
ad verdim.

Express Edition veya Visual Studio ile hazırlanan projelerin geçerli


kullanıcıya ait “Belgelerim” klasörünün altındaki “Visual Studio
2008\Projects” klasörüne kaydedilmek istendiği varsayılmaktadır. Bu konsol
Memik Yanık - C#’a Başlangıç Kitabı 53

uygulaması için Express Edition tarafından hazırlanan klasör ve dosyalara


dikkatinizi çekmek için Location metin kutusunda “C:\Projeler” yazdım.

C# projesi hazırlanırken belirtilen klasörün altında önce Solution ile aynı ada
sahip bir klasör hazırlanıyor. Ardından Solution’a ait klasörün içinde proje
için ayrı bir klasör hazırlanmaktadır. Çünkü Solution’lar çok sayıda projeye
sahip olabilirler. Proje için hazırlanan klasör ve dosyaları aşağıda
görebilirsiniz.

Bu ekran görüntüsünü incelerseniz Solution için hazırlanan klasörün içinde


proje ile aynı ada sahip bir klasörün hazırlanıp projeye ait dosyaların bu
klasöre yerleştirildiğini görebilirsiniz. Solution birden fazla projeden
meydana gelmeyecekse Solution ile projeye ait dosyaların bir arada olmasını
sağlayabilirsiniz.

Solution için ayrı bir klasör hazırlanmasını istemiyorsanız Save Project


diyalog kutusundaki Create directory for solution onay kutusunu pasif
duruma getirmelisiniz. Bu onay kutusunu pasif duruma getirdiğinizde Save
Project diyalog kutusunda Solution’a ad veremezsiniz. Aşağıda verilen
ekran görüntüsünü “Create directory for solution” onay kutusunu pasif
duruma getirip “Proje1” adında bir konsol uygulaması hazırladıktan sonra
aldım.
54 Memik Yanık - C#’a Başlangıç Kitabı

Eminim ki bu dersleri izleyenlerin çoğunluğu şimdiye kadar bilgisayarlarına


Express Edition’ı kurdular ve bu metni okurken bir taraftan yukarıda
yaptığım gibi kendileri de konsol uygulaması hazırladılar. Bu ekran
görüntüsüne veya kendi hazırladığınız proje için hazırlanan klasöre
bakarsanız Express Edition’ın konsol uygulaması için çok sayıda klasör ve
dosyayı hazırladığını fark etmiş olmalısınız. Beni dinlerseniz şimdilik kafayı
bu dosyaların işlevine takmayın.

C# için hazırlanmış Express Edition ile yukarıda anlatılan şekilde hazırlanan


projeyi çalıştırırsanız projenin çalışması ile çalışmasının sona ermesi bir olur.
Projenin veya konsol uygulamasının çalışmasının hemen sona ermesini
engellemek için Program.cs dosyasındaki Main() metoduna aşağıdaki gibi 3
satır 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 için bir tuşa basın");
System.Console.ReadKey();
}
}
}

Bu satırlar Express Edition penceresinde Main() metodu ile sınırlanan bloğa


yazılıp sonra da Debug menüsünden Start Debugging komutu verilir veya
Standard araç çubuğundaki Start Debugging düğmesi tıklanırsa Express
Memik Yanık - C#’a Başlangıç Kitabı 55

Edition otomatik olarak derleme yapıp EXE dosyayı hazırlayıp çalıştırır.


Aşağıda verdiğim ekran görüntüsünü bu konsol uygulamasını Debug
menüsündeki Start Debugging komutu ile çalıştırdıktan sonra aldım.

Express Edition tarafından hazırlanan EXE dosya projeye ait klasörün


altındaki Bin klasörü içinde yer alan Debug klasörüne kaydedilir. Bu EXE
dosyayı alıp .NET Framework kurulu başka bilgisayarda çalıştırabilirsiniz.

Fırsattan istifade hemen kısa bir reklam arası vereceğim: Daha önce Visual
Studio veya Express Edition’ı temel alan programcılık kitabı incelemiş
olanların malumu olduğu gibi dünyanın hiçbir yerinde hiç kimse Visual
Studio veya Express Edition’ı böyle anlatmıyor. Hele hele biraz sonra
anlatacaklarımı hiçbir kitabın başlangıç sayfalarında bulamazsınız. C# veya
.NET uyumlu başka programlama dili hakkında kitap veya makale yazanlar
burada anlattıklarımı bilmiyorlar mı? Bilmez olurlar mı? Mutlaka bilirler, belki
de bazıları Memik YANIK’tan daha iyi biliyorlardır. O zaman neden
anlatmazlar bunları? Nedeni çok basit: Onların Memik YANIK gibi ilk
okumada anlaşılma gibi bir kaygıları yoktur. Tabii Memik YANIK ilk okumada
56 Memik Yanık - C#’a Başlangıç Kitabı

mutlaka anlaşılacağım dediği için veya böyle bir tercihi olduğu için başka
yazarların 10 sayfada anlattıklarını Memik YANIK en fazla 12 sayfada anlatır.
Bu nedenledir ki bazıları her fırsatta “Memik YANIK kitaplarını ekran
görüntüleri ile doldurup şişiriyor” diye beni suçlarlar. Bu derslerde yer ve
sayfa sorunu olmadığı için kitaplarda kullandığımda çok daha fazla ekran
görüntüsüne yer verdim.

Express Edition tarafından hazırlanan SLN uzantılı dosya Solution dosyasıdır.


Tekrar etmek gerekirse Solution’lar proje grubu gibi işlev görmekte ve
birden fazla proje üzerinde çalışıldığı zaman kolaylıklar sağlamaktadır. Bu
örnekte konsol uygulamamız bir projeden meydana geldiği için SLN uzantılı
dosyayı şimdilik unutabiliriz.

Buradaki “csproj” uzantılı dosya ise proje dosyasıdır. “csproj” uzantılı proje
dosyalarında projedeki form ve class’lar hakkında bilgi bulunmaktadır.
Express Edition tarafından hazırlanan proje dosyasının içeriğini size
göstermek için Not Defteri’nden yararlandım. XML formatındaki bu dosyaya
ilgisiz kalabilirsiniz.

Konsol uygulaması için Express Edition tarafından hazırlanan SLN ve


CSPROJ uzantılı dosyalarla ilgimizi şimdilik kopardıktan sonra geriye bir tek
“program.cs” dosyası kaldı. Şimdi “Program.cs” dosyasını Not Defteri ile açıp
içeriğini size göstereceğim.
Memik Yanık - C#’a Başlangıç Kitabı 57

Gördüğünüz gibi bu satırlar Express Edition penceresinde yazdıklarımızla


aynıdır. Daha önceki C# sürümlerini ve Visual Studio 2003’ü kullananlar için
söylemek gerekirse; Microsoft firması Visual Studio 2005 ve C# 2.0’dan
itibaren C# projelerinde “Program.cs” adında bir dosya hazırlamaya başladı.
Konsol uygulamalarında başlangıçta kod içeren bir tek “Program.cs” dosyası
olduğu için uygulama çalıştırıldığında işletilmesini istediğiniz satırları Main()
metodunun içine yazabilirsiniz. Şimdi öyle bir ayarlama yapacağım ki bu
uygulama çalıştırıldığı zaman ekrana bir pencerenin gelmesini sağlayacağım.
58 Memik Yanık - C#’a Başlangıç Kitabı

Bu kodu dikkatlice incelerseniz using deyimiyle System.Windows.Forms


adlı Namespace’deki Class’lardan yararlanılmak istendiği belirtilmiş. Aynı
satırı sizler yazmaya kalkışırsanız hata meydana gelir. Çünkü bu Namespace
.NET Framework ile gelen System.Windows.Forms.dll adlı DLL
dosyasında yer almaktadır. .NET Framework’e ait klasöre baktığınızda bu
dosyayı görebilirsiniz.

Konsol uygulamaları dahilinde ekrana pencere getirmek için bu DLL


dosyasının konsol uygulamasına dahil edilmesi gerekiyor. Başka bir deyişle
Express Edition’ın bu referans hakkında bilgilendirilmesi gerekir. Bunun için
Express Edition penceresi içinde yer alan Solution Explorer penceresinden
yararlanıp Add Reference diyalog kutusunu ekrana getirip
System.Windows.Forms.dll referansını uygulamaya dahil etmelisiniz.

Aşağıda verdiğim ekran görüntüsünü bu referans veya DLL dosyasını


uygulamaya dahil ettikten sonra aldım. Her ne kadar burada referansın
uygulamaya dahil edildiğinden söz edilse bile gerçek tam böyle değildir.
Yapılan, Express Edition’ın dolayısıyla C# derleyicisinin bu referanstan
yararlanılmak istendiği konusunda haberdar edilmesinden ibarettir.
Memik Yanık - C#’a Başlangıç Kitabı 59

Bu konuda daha sonra bilgi verileceği için bu örneği denemeyebilirsiniz.


Konsol uygulamaları üzerinde fazla durmayacağım için referans nedir gibi
soruları atlıyorum. Yukarıda verdiğim konsol uygulaması çalıştırıldığı zaman
önce bir DOS penceresi açılır. Ardından yaptığım hazırlıktan dolayı ekrana
bir pencere gelir. Bu pencereyi kapattığınızda konsol uygulamasının
çalışması sona erer ve DOS penceresi kapatılır.

Buna rağmen yukarıda verilen kodun üzerinde biraz duralım. Main()


metoduna yazdığım bu satırların ilkinde “Form1” adında ve
System.Windows.Forms adlı Namespace’teki Form sınıfı tipinde bir
değişken tanımlanmaktadır. Devamında new anahtar kelimesi ile Form
sınıfının örneğini alıp(yani nesne hazırlayıp) referansını Form1 adını
60 Memik Yanık - C#’a Başlangıç Kitabı

verdiğim değişkene aktardım. En son olarak bu Form nesnesini Application


sınıfının Run() metoduna parametre olarak verdim. Dikkat ederseniz burada
tanımladığım değişkene Form1 adını verdim. Yarın bir gün birisi çıkıp bu
değişken adını yani Form1’i kendi namı hesabıma Register ettim derse gülüp
geçin.

Windows Forms Uygulamaları

Daha önceki derslerde söylendiği gibi konsol uygulamalarına çok az ihtiyaç


duyacağınız için Express Edition ile hazırlanan konsol uygulamaları üzerinde
fazla durmaya gerek duymadan Windows Forms denilen normal
uygulamalara odaklanacağız. Bu nedenle yukarıda hazırladığım konsol
uygulamasını kapatıp ekrana New Project diyalog kutusunu getirip
Windows Application şablonunu seçtim.

C# için hazırlanan Express Edition ile hazırlanan projelerde New Project


diyalog kutusunda projeye verilen ad sonradan değiştirilebilmektedir.
Projeye vermek istediğim adı Name kutusuna yazıp OK düğmesini tıklayınca
aşağıdaki gibi bir Visual C# 2005 Express Edition penceresi ile
karşılaştım.
Memik Yanık - C#’a Başlangıç Kitabı 61

Windows Application şablonu ile hazırlanan projeye bir form dahil


edilmekte ve bu formun görsel yapısı Express Edition penceresine
gerilmektedir. Bu proje üzerinde herhangi bir değişiklik yapmadan Debug
menüsündeki Start Debugging komutu ile çalıştırırsanız karşınıza bu form
veya pencere gelir.

Bu formun üzerine hemen düğmeler, TextBox’lar veya ListBox’lar


yerleştirmek yerine Windows Application şablonu ile hazırlanan projenin
özelliklerine bakalım. Bu amaçla Solution Explorer penceresini açtım.
62 Memik Yanık - C#’a Başlangıç Kitabı

Express Edition ile C# projesi hazırlandığı zaman çok kullanılan bazı


referanslar veya namespace ve sınıfları içeren DLL dosyaları projeye dahil
edilmektedir. Hatırlarsanız yukarıdaki sayfalarda konsol uygulaması
dahilinde ekrana form veya pencere getirmek için
System.Windows.Forms’deki Form adlı sınıftan yararlanmıştık.

Üzerinde çalışılan projede .NET Framework ile gelen sınıflardan birisinden


yararlanmak için o sınıfın yer aldığı Namespace’i içeren DLL dosyasının veya
referansın projeye dahil edilmesi gerektiği için Solution Explorer
penceresinden yararlanıp Add Reference diyalog kutusunu ekrana
getirmiştik.

Benzer durum Express Edition ile hazırlanan Windows Forms uygulamaları


için de geçerlidir. Visual C# 2008 Express Edition en çok gerek duyulan
referansları projelere kendisi dahil ettiği için bir süre referanslar ile
ilgilenilmeyebilir. Express Edition ile hazırlanan projelere dahil edilen
referansları size göstermek için Solution Explorer penceresinde References
seçeneğine ait artı(+) işaretini tıkladım.
Memik Yanık - C#’a Başlangıç Kitabı 63

Gördüğünüz gibi Express Edition tarafından


6 referans veya DLL dosyası Windows
Forms uygulamalarına otomatik olarak
dahil edilmektedir. Yararlanmak istediğiniz
sınıf hangi DLL dosyası veya referansta yer
alıyorsa o referansın Solution Explorer
penceresinden yararlanılarak projeye dahil
edilmesi gerekir. .NET Framework ile gelen
herhangi bir sınıftan yararlanabilmek için
referansın projeye dahil edilmesi yetmez
ayrıca ilgili Namespace’in Imports deyimi
ile koda dahil edilmesi gerekir.

Birçok yerli yabancı kaynakta bu altını çizdiğim paragrafın benzerini bulma


ihtimali yüksektir. Bu paragrafta söylenenler yanlış olmasa bile eksiktir ve
okurun konuyu en başından yanlış kavramasına neden olmaktadır. Gelin bu
paragrafı yeniden yazalım. .NET Framework ile birlikte çok sayıda DLL
dosyası gelmektedir ve dosyalar Windows’un kurulu olduğu klasörün
altındaki Microsoft.NET\Framework klasörüne yerleştirilmektedir.

Daha önce söylendiği gibi bu DLL dosyalarında Namespace’ler


bulunmaktadır. Örneğin System.Windows.Forms.dll adlı dosyada
System.Windows.Forms adlı namespace yer almaktadır. Namespace’lerde
64 Memik Yanık - C#’a Başlangıç Kitabı

ise Class’lar ve/veya yapılar bulunmaktadır. Uygulamanızda hangi Class’ı


kullanmak istiyorsanız o Class’ın yer aldığı namespace’i içeren DLL dosyasını
yani referansı Solution Explorer penceresinde listelemeniz gerekiyor. Bir
referansı Solution Explorer penceresinde listelemek demek bir bakıma Visual
Studio veya Express Edition’a “bu referanstan yararlanmak istiyorum”
demektir. Yoksa uygulamaya dahil edilen bir şey yok. Söz konusu DLL
dosyası yerinde duruyor. Yararlanmak istediğiniz sınıfın yer aldığı
Namespace’i içeren DLL dosyasını Solution Explorer penceresinde
listeledikten sonra aşağıda verdiğim kodda olduğu gibi Class adından önce
Namespace adını yazarak söz konusu namespace’teki istediğiniz gibi
Class’tan 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 adından önce Namespace adını yazmak istemiyorsanız


using deyimiyle söz konusu Namespace’teki Class’lardan yararlanmak
istediğinizi Visual Studio veya Express Edition’a belirtebilirsiniz. Buradaki
using deyimi DOS’un Path komutu ile benzer işleve 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 çalışılan proje hakkında bilgi edinilmek istendiği zaman başvurulan


Solution Explorer penceresini dikkatlice incelerseniz projedeki formla ilgili
olarak 3 dosyanın hazırlanmış olduğunu görürsünüz. Burada dikkatinizi
öncelikle “Program.cs” dosyasına çekmek istiyorum. Daha önceki derslerden
bildiğiniz gibi C# projelerinin başlangıç noktası Main() metodudur. Express
Memik Yanık - C#’a Başlangıç Kitabı 65

Edition veya Visual Studio ile hazırlanan projelerde Main() metodu


“Program.cs” adlı kod dosyasında bulunduğu için bu dosya önemlidir.

Her ne kadar bu dosya önemlidir desem bile bu dosyaya kayıtsız kalıp usta
işi programlar yazmak mümkündür. Ne ki işin geri planının anlaşılması için
bu dosyanın üzerinde biraz durmak bir zorunluluk. Solution Explorer
penceresinde “Program.cs” dosyasını çift tıklarsanız bu kod dosyasının
içeriği görüntülenir.

Express Edition tarafından hazırlanan bu kodu dikkatlice incelerseniz


System, System.Collections.Generic ve System.Windows.Forms adlı 3
Namespace’deki sınıfların kullanılmak istendiği konusunda using deyimiyle
ayarlama yapılmış olduğunu görebilirsiniz. Program.cs dosyasındaki diğer
satırlar hakkında şimdi verilecek bilgilerin altyapısı olmadığı için üzerinde
fazla durmayacağım. Buna rağmen şu satırı dikkatinize sunmak istiyorum.

Application.Run(new Form1());

Bu satırı daha önce görmüş olanlar şöyle bir açıklamayı okumuş olabilirler:
“Uygulama Run() metodu ile başlatılmaktadır”. Aslında bu tek cümlelik
66 Memik Yanık - C#’a Başlangıç Kitabı

tanım yanlış değildir. Ne ki bu tanım, bu satırla nelerin yapıldığını, geri


planda nelerin geliştiğini açıklamaya yetmiyor.

Konunun devamında anlatılacağı gibi Express Edition ile bir Windows Forms
uygulaması hazırlandığında System.Windows.Forms adlı Namespace’teki
Form adlı Class’ın mirasçısı “Form1” adında bir Class hazırlanmaktadır. Đşte
bu satırda “Form1” adlı Class’ın örneği alınıp Application nesnesinin Run()
metoduna parametre olarak verilmektedir. Yeterince açık olmayan bu 2
cümlenin açıklamasını bir sonraki derse bırakıyorum.
BÖLÜM 5
VISUAL STUDIO ĐLE PROGRAM GELĐŞTĐRMEK

Bu derste Visual Studio’nun program geliştirme ortamı hakkında kısaca bilgi


verilecektir. Daha önce Visual Studio’nun herhangi bir sürümünü
kullandıysanız bu dersi atlamak isteyebilirsiniz. Bu derse en azından göz
gezdirmenizi önermek isterim. Çünkü bu derste ileride işlenecek bazı
konulara temel oluşturan birkaç ayrıntıdan söz edilmektedir. Aslında C#
programlama dilinden bağımsız olarak Visual Studio hakkında yüzlerce sayfa
yazılabilir. Ne ki bu derslerde böyle bir amacım yoktur. Bu derslerde amaç
C# programlama dilini ve .NET Framework ile gelen sınıflar hakkında
başlangıç düzeyi bilgi vermek olduğu için Visual Studio hakkında kısa bir
özet yapılmakla yetinildi.

Visual Studio 2008’in kurulması kolay ve sorunsuzdur. Visual Studio 2008


DVD’si sürücüye takıldığında veya “Setup.exe” programı çalıştırıldığında
ekrana aşağıda verilen pencere gelmektedir. Visual Studio’nun değişik
sürümleri bulunmaktadır. Professional sürüm işinizi görecektir. Visual
Studio’nun deneme sürümünü microsoft.com’dan indirebilirsiniz.

Bu penceredeki ilk seçenek tıklandığında size birkaç tanıdık soru


yöneltildikten sonra kurma işlemi tamamlanmaktadır. Bu tanıdık sorulardan
birisi Visual Studio’ya ait dosyaların kurulacağı sürücü ve klasördür. Visual
Studio varsayım olarak C:\Program Files\Microsoft Visual Studio 9.0\
klasörüne kurulmaktadır.
68 Memik Yanık - Visual C#’a Başlangıç Kitabı

Bu pencerede kurma tipi olarak Custom seçilirse Install düğmesi yerini


Next düğmesine bırakır. Önce Custom radyo düğmesini seçip Next
düğmesini tıkladığınızda ekrana Visual Studio’nun kurulacak bileşenlerinin
seçildiği pencere gelir.
Bölüm 6: Windows Forms Uygulamaları 69

Bu pencereden yararlanıp Visual Studio’nun kurulacak bileşenlerini


seçebilirsiniz. Örneğin Visual Studio ile Visual Basic veya C++ dilinde
uygulama geliştirmeyi düşünmüyorsanız bu dillerle ilgili bileşenlerin
kurulmalarını engelleyebilirsiniz. Visual Studio bilgisayara kurulduktan sonra
Başlat menüsünde Microsoft Visual Studio 2008 adında bir program grubu
hazırlanmakta ve bu program grubuna Visual Studio’ya ait kısayollar dahil
edilmektedir.

Visual Studio kurulup başlatıldığında ekrana aşağıda verilen diyalog kutusu


getirilerek program geliştirme ortamının düzenlenmesi konusunda seçim
yapmanız istenir. C# programları geliştirmek istediğim için bu diyalog
kutusunda Visual C#’ı seçtim. Bu seçim sayesinde Visual Studio’nun ortamı
C#’ın varsayılan seçimlerine göre ayarlanır.
70 Memik Yanık - Visual C#’a Başlangıç Kitabı

Bu diyalog kutusunda Visual C#’ı seçtiğinizi varsayalım. Bir süre sonra


Visual Basic’in ayarlarına dönmek isterseniz Tools menüsünden Import
and Export komutu verildiği zaman çalışmaya başlayan Wizard’ın ilk
adımını temsil eden diyalog kutusunda Reset all Settings radyo düğmesini
seçip ortamın hangi dilin varsayılan ayarlarına göre düzenleneceği
konusunda seçim yapılan bu diyalog kutusunu ekrana getirebilirsiniz.
Bölüm 6: Windows Forms Uygulamaları 71

Bu diyalog kutusundaki Reset all settings radyo düğmesini seçip Next


düğmesiyle işleme devam ettiğinizde Wizard ekrana Choose a Default
Collection of Settings diyalog kutusunu getirir. Hangi dilin ayarlarının
geçerli olmasını istiyorsanız o dili seçebilirsiniz. Örneğin eski bir Visual Basic
programcısı iseniz C# uygulamaları geliştirirken Visual Basic’in ayarlarının
geçerli olmasını sağlayabilirsiniz.
72 Memik Yanık - Visual C#’a Başlangıç Kitabı

Visual Basic’in varsayılan ayarları ile Visual C#’ın ayarları arasındaki önemli
farklardan birisi şudur: Visual Basic ayarları geçerli iken Visual Studio sizi
hazırladığınız projeyi hemen kaydetmek zorunda bırakmıyor. Tabii bu
diyalog kutusunda hangi dilin varsayılan ayarlarını seçerseniz seçin
sonradan Tools menüsünden Options komutu ile ekrana getirilen diyalog
kutusunda ortam ayarlarında istediğiniz değişikliği yapabilirsiniz. 2004
yılında yayınlanan C# kitabımda Data Adapter Configuration Wizard ile
DataAdapter nesnesinin özelliklerini ayarladım diye yargılandığıma göre
yarın bir gün yerli yazarın birisi çıkıp bu Import and Export Settings
Wizard’ı kullanmayı ilk ben akıl ettim derse sorumluluk kabul etmem.
Ayrıca bu memlekette Wizard tarafından ekrana getirilen diyalog kutularının
birden fazla kitapta aynı sırada olduğunu rapor edecek çok sayıda bilim
adamı(!) olduğuna göre bu Wizard’dan yararlanmak risk teşkil edebilir.

Visual Studio çalıştırıldığında yeni proje hazırlayabilmeniz veya mevcut


projeleri açabilmeniz için Start Page ekrana getirilmektedir. Bu sayfadaki
Recent Projects kutusunda Open adı altında gruplanan seçenekler ile
Bölüm 6: Windows Forms Uygulamaları 73

mevcut projeleri açabilirsiniz. Create adı altında gruplanan 2 seçenekten


yararlanıp yeni proje hazırlayabilirsiniz.

Mevcut projelerden birisini açmak istiyorsanız Open adı altında gruplanan


seçeneklerden Project’i tıklamanız gerekir. Project seçeneğini tıklarsanız
geçerli kullanıcıya ait “Belgelerim” klasörünün altında yer alan Visual
Studio Projects klasöründeki projeler listelenir. Visual Studio ile hazırlanan
her proje için ayrı bir klasör hazırlanmakta ve projeye ait dosyalar bu
klasöre kaydedilmektedir.

Visual Studio ile C# projesi hazırlamak üzere Start Page’deki Create adı
altında gruplanan 2 seçenekten Project’i tıklarsanız ekrana New Project
diyalog kutusu gelir. Project types kutusunda listelenen seçenekler Visual
Studio’nun bilgisayara kurulan bileşenlerine göre değişmektedir. C# projesi
hazırlamak istediğim için Project types kutusunda Visual C# ve
Templates kutusunda Windows Foms Application şablonunu seçtim.
74 Memik Yanık - Visual C#’a Başlangıç Kitabı

Tam bu noktada bazen kafaların karışmasına neden olan Visual C# ile C#


ayrımına değinmek gerekiyor. Visual C#, Microsoft firmasının ticari
markasıdır. Madem C# programlama dilini Microsoft firması geliştirdi ve bu
kitapta Microsoft firması tarafından geliştirilen Visual Studio’dan
yararlanıyoruz C# ile Visual C# aynı anlamda kullanılabilir.

C# uygulamalarını geliştirirken Visual Studio yerine C# için hazırlanmış


Express Edition’ı kullanıyor olsaydım New Project diyalog kutusunda
daha az şablon listelenirdi. Aşağıda verilen ekran görüntüsü C# için
hazırlanmış Express Edition’a aittir.
Bölüm 6: Windows Forms Uygulamaları 75

Visual Studio 2003 veya 2005 ile C# projesi hazırlanmak istendiği zaman
ekrana getirilen New Project diyalog kutusunda .NET Framework
sürümünü tercih etme imkanı yoktu. Visual Studio 2003 ile .NET Framework
1.1 uyumlu projeler hazırlanabilirken Visual Studio 2005 ile .NET 2.0
uyumlu projeler hazırlanabiliniyordu. Visual Studio 2008’de ise proje
hazırlarken .NET Framework’ün 2.0, 3.0 veya 3.5 sürümlerinden birisini
seçme imkanın bulunmaktadır. New Project diyalog kutusunda seçilen
.NET Framework sürümüne göre Templates liste kutusunda listelenen
şablonlar değişmektedir.

Başlangıçta projeler için(yani eğitim amaçlı projelerde) .NET Framework’ün


2.0 veya 3.5 sürümünü seçmenin bir önemi olmamasına rağmen 3.5
sürümünü tercih ettim. New Project diyalog kutusunda .NET Framework’ün
2.0 sürümünü tercih ederseniz C# 3.0 ile ilgili bazı yeniliklerden
yararlanamazsınız. Örneğin LINQ teknolojisi ile sorgulama yapamazsınız.
New Project diyalog kutusunun alt kısmında Name seçeneğinden
yararlanarak projenin adını girebilir ve Location seçeneği ile projenin
kaydedileceği klasörü belirleyebilirsiniz.

Visual Studio ile hazırlanan C# projelerinin geçerli kullanıcıya ait


Belgelerim klasörünün altında bulunan Visual Studio Projects klasörüne
kaydedileceği varsayılmaktadır. Hazırlamak istediğim projeyi “C:”
sürücüsündeki “\Projeler” klasörüne kaydetmek istediğim için Browse
düğmesini tıklayıp klasör seçilen Project Location diyalog kutusunu ekrana
getirip bu klasörü seçtim.
76 Memik Yanık - Visual C#’a Başlangıç Kitabı

Yukarıda anlatılan şekilde proje hazırladığınızda Visual Studio ayrıca bir


Solution hazırlamaktadır. Solution’lar proje grubu gibi işlev görmektedir.
Başlangıçta projenin adı aynı zamanda Solution adı olarak kullanılmaktadır.
Solution’a birden fazla proje dahil edeceksiniz farklı bir ad vermeniz önerilir.
Proje hazırlanırken Visual Studio tarafından oluşturulan klasörleri
gösterebilmek için Solution’a farklı bir ad verdim. Bu ayarlamalardan sonra
New Project diyalog kutusunu kapatırsanız Visual Studio projeyi hazırlar ve
aşağıdaki gibi bir Visual Studio penceresi ile karşılaşırsınız.
Bölüm 6: Windows Forms Uygulamaları 77

Başlangıçta Solution Explorer ve Properties pencereleri Visual Studio


penceresinin sağ tarafına yuvalanmış durumdadır. Sol tarafta ise Toolbox
gizlenmiş durumdadır. Bu ekran görüntüsü Visual Studio bilgisayara
kurulduktan hemen sonra alındığı için sizin bilgisayarda Visual Studio ile ilgili
pencerelerin yerleşim şekli farklı olabilir.

Proje hazırlanırken belirtilen klasörün altında proje ile aynı ada sahip bir
klasör hazırlanıyor. Buna göre her Visual C# projesi için ayrı bir klasör
hazırlanmaktadır. Proje için hazırlanan klasör ve dosyaları aşağıda
görebilirsiniz.

Bu ekran görüntüsünde Solution için hazırlanan klasörün içinde proje ile


aynı ada sahip bir klasörün hazırlandığını görebilirsiniz. Solution birden fazla
projeden meydana gelmeyecekse Solution ile projeye ait dosyaların bir
arada olmasını tercih edebilirsiniz. Solution için ayrı bir klasörün
hazırlanmasını istemiyorsanız New Project diyalog kutusundaki Create
directory for solution onay kutusunu pasif duruma getirmelisiniz.

Projeye ait klasöre kaydedilen “Form1.cs” uzantılı dosya projedeki formu


temsil etmektedir. Formların görsel yapısı ile ilgili bilgiler Designer.cs
dosyalarında tutulurken “resx” uzantılı dosyalarda ise formla ilgili
kaynaklar(resource) tutulmaktadır. Visual Studio tarafından hazırlanan C#
projesi dosyalarına “csproj” uzantısı verilmektedir. Visual Studio ile proje
hazırladığınızda aynı zamanda bir Solution hazırlanır ve Solution’a ait bilgiler
“sln” dosyalarında saklanmaktadır.

Yukarıda örnek olması için hazırladığım C# projesine "Proje1" adını verdim.


Bu proje adını yerli programcılık kitabı yazarları daha önceden kendi
78 Memik Yanık - Visual C#’a Başlangıç Kitabı

adlarına register etmiş olabilir. Bu nedenle kendinizi riske etmeyip Proje1


yerine projelere argo veya gavurca adlar vermeniz önerilir. Örneğin Proje1
yerine “Project1” veya “En_baba_proje” gibi adları tercih edebilirsiniz.

Solution Explorer Penceresi

Üzerinde çalıştığınız projeye hangi formların ve dosyaların dahil edilmiş


olduğunu görmek istiyorsanız Visual Studio’nun Solution Explorer
penceresine bakabilirsiniz. Solution Explorer penceresinde bir bakıma
projeye ait klasörün içeriği görüntülenmektedir. Solution Explorer
penceresinin başlık çubuğunu çift tıklayıp bağımsız pencere olmasını
sağlayabilirsiniz. Aşağıda verilen ekran görüntüsünü proje için 2. bir form
hazırladıktan sonra aldım. Projeye 2. bir form dahil etmek demek gerçekte
.NET Framework ile gelen Form sınıfının mirasçısı 2. bir sınıf hazırlamak
demektir. Tıpkı Form1 sınıfında olduğu gibi Form2 sınıfının bir yarısı
Form2.cs dosyasında, diğer yarısı ise Form2.Designer.cs dosyasında yer
almaktadır.

Solution ve proje hakkında bilgi içeren bu pencereyi View menüsünden


komut vererek veya Standard araç çubuğundaki ilgili düğmeyi tıklayarak
ekrana getirebilirsiniz. Bu ekran görüntüsünü aldığım sırada “Proje1” adını
verdiğim projede Form1 ve Form2 adında 2 form vardı. Visual Studio ile
hazırlanan projelerde her form için ikisi CS uzantılı 3 dosya
hazırlanmaktadır.

Windows Forms Application şablonu ile hazırlanan projenin kaydedildiği


klasöre bakıldığında Bin ve Obj adında 2 klasörün hazırlandığı görülür.
Visual Studio başlangıçta bu 2 klasörü Solution Explorer penceresinde
listelemiyor. Üzerinde çalıştığınız proje ile ilgili bütün dosya ve klasörlerin
listelenmesini istiyorsanız Solution Explorer penceresindeki Show All Files
düğmesini tıklamanız gerekir. Bu düğmenin işlevini aşağıda görebilirsiniz.
Bölüm 6: Windows Forms Uygulamaları 79

C# projesine dahil edilmiş referansları görmek istiyorsanız Solution Explorer


penceresinde References seçeneğini tıklamalısınız. Visual Studio 2008 ile
hazırlanan C# projelerine 8 referans otomatik olarak dahil edilmektedir. Ek
bir işlem yapmaya gerek kalmadan bu referanslarda bulunan
namespace’lerdeki sınıfları kullanabilirsiniz. DLL dosyaları veya buradaki
adıyla referanslar doğaları gereği gerek duyulduğunda belleğe yüklenirler.

.NET Framework ile gelen veya kendi hazırladığınız referanslardan


birisindeki sınıflardan yararlanacaksanız References seçeneğine ait kısayol
menüsünden Add Reference komutunu vermelisiniz. Her ne kadar burada
referans eklemeden söz edilse bile eklenen herhangi bir şey yoktur. Yapılan
şudur: Yararlanılmak istenen referanslar hakkında Visual Studio
bilgilendirilmektedir. Yoksa referanslar yani DLL dosyaları ilgili klasörde
durmaktadır.
80 Memik Yanık - Visual C#’a Başlangıç Kitabı

Bu komutu verirseniz ekrana Add Reference diyalog kutusu gelir. Projede


kullanmak istediğiniz bileşen veya referansı seçip OK düğmesini tıklamanız
yeterlidir.

Bu pencerede .NET sekmesinde listelenen her seçenek veya referans


gerçekte .NET Framework ile gelen birer DLL dosyasıdır. Kendiniz Visual
Bölüm 6: Windows Forms Uygulamaları 81

Studio ile gelen Class Library şablonu ile kolayca DLL dosyaları hazırlayıp
.NET Framework ile gelenlerde oluğu gibi bu DLL dosyalarından
yararlanabilirsiniz.

Form Designer ve Code Editor Pencereleri

Şimdiye kadar verilen ekran görüntülerinden tespit olabileceğiniz gibi yeni


bir proje hazırlandığınızda projeye otomatik olarak dahil edilen formun
görsel yapısı Visual Studio penceresinin Form Designer adı verilen orta
kısımda görüntülenmektedir. Aşağıda verdiğim ekran görüntüsünü aldığım
sırada projedeki ilk formun görsel yapısı görüntüleniyordu.

Açık olan her form veya kod dosyası için Windows Form Designer
penceresinin üst kısmında bir sekme hazırlanmaktadır. Bu sırada Solution
Explorer penceresinde Form2.cs’nin üzerinde çift tıklama yaparsanız bu kod
dosyası dahilinde hazırlanan Class’ın yani Form2’nin görsel yapısı
görüntülenir. Açık olan formlardan birisine ait kodları görmek istiyorsanız o
formu seçip View menüsünden Code komutunu vermelisiniz.

Form2 aktif form iken View menüsünden Code komutu verilirse bu formu
oluşturan kodlar görüntülenir. Aşağıda verilen ekran görüntüsünü almadan
önce Solution Explorer ve Properties pencerelerini gizledim. Bu kodu
yakından incelediğinizde “Form2” adında ve .NET Framework ile gelen Form
sınıfının mirasçısı bir Class’ın hazırlandığını görürsünüz.
82 Memik Yanık - Visual C#’a Başlangıç Kitabı

Projedeki 2. formu temsil eden Form2 sınıfına ait kodların bir kısmı bu
dosyada iken diğer yarısı “Form2.Designer.cs” dosyasında bulunmaktadır.
Projedeki mevcut kod dosyalarını açmak için Solution Explorer penceresine
başvurmak yerine File menüsünden Open-File komutunu verebilirsiniz.

Kod yapısı görüntülenen formun görsel yapısını görmek istiyorsanız View


menüsünden Designer komutunu vermelisiniz. Projedeki formlara ait
kodları veya görsel yapılarını görüntülerken Solution Explorer penceresinden
yararlanabilirsiniz. Söz konusu forma ait kısayol menüsünden View
Designer komutunu verirseniz formun görsel yapısı, View Code komutunu
verirseniz forma ait kodlar görüntülenir.

ToolBox Penceresi

Visual Studio bilgisayara kurulup başlatıldığında ekrana getirilen bir diğer


pencere Toolbox penceresidir. Toolbox’ta formların üzerine
yerleştirebileceğiniz kontroller yani .NET Framework ile gelen hazır sınıflar
listelenmektedir. Visual Studio penceresinin sol tarafında Toolbox’tan başka
ayrıca Server Explorer penceresini temsil eden bir düğme bulunmaktadır.
Bölüm 6: Windows Forms Uygulamaları 83

Bu ekran görüntüsünü aldığım sırada Server Explorer penceresi açık


olmasına rağmen gizlenmişti. Bu pencereden veritabanı işlemleri yapılırken
yararlanılmaktadır. Bu derslerde veritabanı işlemlerinden söz edilmediği için
Server Explorer penceresini kapattım.

Toolbox’ın otomatik gizlenme özelliğini iptal etmek istiyorsanız Auto Hide


düğmesini tıklamalısınız. Auto Hide özelliği devrede değilken Toolbox
penceresinin başlık çubuğunda çift tıklama yapıp bağımsız pencere olmasını
sağlayabilirsiniz.
84 Memik Yanık - Visual C#’a Başlangıç Kitabı

.NET Framework ile birlikte Toolbox’ta birer düğme ile temsil edilenlerden
çok daha fazla kontrol verilmektedir. Üzerinde çalıştığınız forma
yerleştirmek istediğiniz kontrol Toolbox’ta yer almıyorsa Tools menüsünden
Choose Toolbox Items veya Toolbox’a ait kısayol menüsünden Choose Items
komutunu verebilirsiniz.

Örneğin SQL Server veya Access veritabanlarına bağlanırken kullanılan


SqlConnection ve OleDbConnection kontrolleri başlangıçta Toolbox’ta yer
almıyor. Bu kontrollere gerek duyanların Toolbox’a ait kısayol menüsünden
komut verip ekrana gelen Choose Toolbox Items diyalog kutusunda
ayarlama yapmaları gerekir.

Toolbox’ta listelenen kontrollerin birisini seçip forma yerleştirmek demek


gerçekte söz konusu kontrolün yani Class’ın örneğini almak olarak
düşünmek gerek. Forma yerleştirilen kontrol söz konusu Class’ın yani
formun bir üyesi olur. Tabii Button veya TextBox gibi sınıfların örneklerini
alırken yani nesne hazırlarken Visual Studio’dan yararlanmak yerine bu
işlemi kod yazarak yapabilirsiniz.

Form ve Kod Pencerelerinin Organizasyonu

Şimdiye kadar verilen ekran görüntülerinden tespit etmiş olabileceğiniz


Properties, Toolbox, Solution Explorer ve Server Explorer gibi pencerelerin
Bölüm 6: Windows Forms Uygulamaları 85

dışında açık olan her form için Visual Studio penceresinin orta kısmında bir
sekme hazırlanmaktadır. Programcı açık olan hangi formla ilgileniyorsa o
formu temsil eden sekmeyi tıklar. Aşağıda verilen ekran görüntüsünü
aldığım sırada açık durumda olan 3 form vardı ve Form2’nin görsel yapısı
görüntüleniyordu.

Programcı bu sırada Form1 veya Form2’ye ait sekmeyi tıklayıp bu formları


görüntüleyebilir. Başka bir deyişle bu şartlarda form pencerelerini simge
durumuna küçültmek mümkün değildir. Açık olan her formun ayrı bir
pencereye sahip olmasını istiyorsanız Tools menüsündeki Options komutu
ile ekrana getirilen diyalog kutusunda ayarlama yapmalısınız.
86 Memik Yanık - Visual C#’a Başlangıç Kitabı

Options diyalog kutusunda General adı altında gruplanan seçeneklerden


Multiple documents radyo düğmesini seçerseniz açık olan her form ayrı
bir pencereye sahip olur ve bu pencereleri simge durumuna küçültebilirsiniz.
Aşağıda verilen ekran görüntüsünü “Multiple documents” radyo düğmesini
seçtikten sonra aldım.
Bölüm 6: Windows Forms Uygulamaları 87

Bu ekran görüntüsünü aldığım sırada 3 form açıktı. Bu pencerelerinin


boyutlarını ve Visual Studio penceresi içindeki konumlarını istediğiniz gibi
ayarlayabilirsiniz. Bu metni kaleme alırken ekran görüntülerini istediğim gibi
ayarlayabilmek için Options diyalog kutusunda Multiple documents radyo
düğmesini seçip formların bağımsız pencere olmalarını sağladım.

Projelerinin Bileşenleri

Visual Studio ile geliştirilen uygulamalara Solution adı verilmekte ve


Solution’larda projeler bulunmaktadır. Üzerinde çalıştığınız Solution
hakkında bilgi edinmek istiyorsanız Solution Explorer penceresine
bakabilirsiniz. Madem C# uygulamalarını geliştirirken Visual Studio veya
Express Edition kullanıyoruz Visual Studio’nun hazırladığı projeler
hakkında bilgi edinmek gerekir.

Visual Studio ile hazırlanan C# projelerinde formlardan ve formları temsil


eden kod dosyalarından başka “Program.cs” adında bir kod dosyası
bulunmaktadır. Visual Studio veya Express Edition ile hazırlanan C#
projeleri çalışmaya bu dosyadan başlamaktadır. Çünkü C# projelerinin
başlangıç noktası olan Main() metodu bu kod dosyasında bulunmaktadır.
“Program.cs” dosyası Visual Studio 2003’te yoktu. Bu dosyanın en önemli
işlevi Main() metodunu içermesidir. Main() metodunu alıp başka bir kod
dosyasına yerleştirirseniz “Program.cs” dosyasına gerek kalmaz. Madem
Visual Studio kullanıyoruz bence Program.cs dosyasını aynı şekilde
bırakmakta fayda vardır.
88 Memik Yanık - Visual C#’a Başlangıç Kitabı

C# projeleri Main() metoduna sahip olmak zorundadır. Çünkü C# projeleri


tıpkı C ve C++ projelerinde olduğu gibi Main() metodundan itibaren
çalışmaya başlarlar. Ayrıca Main() metodu public ve static olmalıdır. Bu
örnekte Main() metodu geriye bir değer göndermediği için void olduğu
işaret edildi.

C# projelerinin ikinci önemli bileşenleri formlar ve formlarla ilgili kod


dosyalarıdır. Visual Studio, projelere dahil edilen her form için 3 ayrı dosya
hazırlamaktadır. Asıl kod dosyaları yani programcının yazdığı kodlar form ile
aynı ada sahip CS uzantılı dosyada saklanmaktadır. Formun görsel yapısı ile
ilgili bilgiler ise “Designer.cs” dosyasında tutulmaktadır. Designer.cs
dosyasının içeriği genellikle Visual Studio tarafından oluşturulduğu için
programcılar pek ilgilenmezler.

Visual Studio, formlara ait Designer.cs dosyasındaki kodları bir bakıma


tasarım anında yorumlayıp söz konusu form çalışma anında ekrana
geldiğinde nasıl bir görünüme sahip olacağı konusunda programcıyı önceden
yani tasarım anında bilgilendirmektedir.

Formun üzerine nesne yerleştirilmesi veya formun özelliklerinde değişiklik


yapılması halinde Visual Studio tarafından geri planda “Designer.cs”
dosyasında değişiklik yapılır. Başka bir deyişle formların ve formalara
yerleştirilen nesnelerin görsel özellikleriyle ilgili satırlar
“FormAdı.Designer.cs” dosyasında bulunmaktadır. Tabii bu C# derleyicisi
için şart değildir. Çünkü bu ayrım Visual Studio’nun tercihidir.

Projelerdeki her form için “cs”” ve “resx” uzantılı 3 dosya hazırlanmaktadır.


Not Defteri ile CS uzantılı dosyaları açıp inceleyebilir veya değiştirebilirsiniz.
Aşağıda verilen ekran görüntüsünü Form1’e ait CS dosyasını Not Defteri ile
açtıktan sonra aldım.
Bölüm 6: Windows Forms Uygulamaları 89

.NET Framework ile gelen Form sınıfının mirasçısı sınıfları kendiniz kod
yazarak hazırlayabilirsiniz ancak bu durumda Visual Studio penceresi içinde
formların görsel yapısının görüntülenmesinde sorunlar yaşanır.

C# projeleri hard diske “csproj” uzantısı ile kaydedilmektedir. “csproj”


uzantılı proje dosyalarında projedeki form ve class’lar hakkında bilgi
bulunmaktadır. “csproj” uzantılı dosyanın içeriğine bakıp projede kaç form
ve class’ın olduğunu öğrenebilirsiniz.
90 Memik Yanık - Visual C#’a Başlangıç Kitabı

Đleri ki sayfalarda değinileceği gibi Visual Studio ile yeni bir proje
hazırlandığı zaman ayrıca “sln” uzantılı bir Solution dosyası hazırlanıyor.
Visual Studio ile hazırlanan C# projelerinde yukarıda sözü edilen dosyalara
ek olarak Properties adı altında gruplanan 5 dosya daha bulunmaktadır. Bu
5 dosya sayesinde projenin özellikleri ayarlanmaktadır. Örneğin uygulama
dahilinde kullanılan resim dosyaları Resources.resx dosyasına dahil
edilebilmektedir. Bu 5 dosya projeye ait klasörün içinde Properties
klasöründe saklanmaktadır.

Üzerinde çalıştığınız projenin başka bilgisayarlarda kullanılmak veya


çalıştırılmak üzere alınan/götürülen dosyaların hepsine birden Assembly
denilmektedir. Assembly tek exe dosyadan meydana gelebileceği gibi çok
sayıda resim, text vb. dosyasından da oluşabilir. Assembly hakkındaki
bilgiler Properties klasöründe tutulan AssemblyInfo.cs dosyasında
tutulmaktadır. Bu dosyanın içeriği Project Properties penceresinden
ulaşılan Assembly Information diyalog kutusunda yapılan ayarlardan
etkilenmektedir. Bana sorarsanız henüz yolun başında olanların Assembly
nedir ne işe yarar gibi sorularla ilgilenmelerine gerek yoktur.

Yukarıdaki sayfalarda ekran görüntüsü verilen New Project diyalog


kutusunda değişik amaçlar için kullanabileceğiniz çok sayıda şablon
listelenmektedir. Bu kitapta bu şablonların birkaçından söz edilecektir.
Örneğin Empty Project şablonu herhangi bir forma ve “Program.cs”
dosyasına sahip olmayan bir proje hazırlamaktadır.

Visual Studio veya Express Edition ile hazırlanan projeler hakkında bilgi
sahibi olmanız için New Project diyalog kutusunu ekrana getirip Empty
Project şablonu ile bir proje hazırlayıp kaydettim. Aşağıda verilen ekran
görüntüsünden tespit edeceğiniz gibi Solution Explorer penceresinde
herhangi bir klasör veya dosya listelenmiyor.
Bölüm 6: Windows Forms Uygulamaları 91

Bu şartlarda projenin kaydedildiği klasöre bakacak olursanız sadece solution


ve proje dosyalarının hazırlandığını görebilirsiniz. Daha sonra bu proje için
Main() metodunu içeren "Program.cs" dosyasını ve başlangıç formunu
hazırlayabilirsiniz.

Solution Hazırlamak

Yukarıdaki sayfalarda Solution Explorer penceresiyle ilgili olarak verilen bazı


ekran görüntülerinde Solution varken bazılarında yoktu. Üzerinde çalıştığınız
Solution tek projeden meydana geliyorsa Solution Explorer penceresinde
Solution adının yer almasına gerek duymayabilirsiniz. Bu durumda Tools
menüsündeki Options komutu ile ekrana getirilen diyalog kutusunda
Project and Solutions seçenek grubunda ayarlama yapmalısınız. Bu
diyalog kutusunda Always show solution onay kutusunu pasif duruma
getirirseniz Solution Explorer penceresinde Solution adı listelenmez.
92 Memik Yanık - Visual C#’a Başlangıç Kitabı

Yukarıda belirtildiği gibi Visual Studio ile yeni bir proje hazırladığınızda
ayrıca bir Solution hazırlanmaktadır. Bu konuda adım adım bilgi vermek
için Visual Studio’nun File menüsünden komut verip New Project diyalog
kutusunu ekrana getirdim.

Visual Studio, projeye verilen adı aynı zamanda Solution adı olarak
kullanmaktadır. Karışıklık olmasın diye proje adı ile Solution adının farklı
olmasını sağladım. Bu şartlarda OK düğmesi tıklanırsa kullandığım
bilgisayardaki “C:\Projeler” klasöründe “Solution1” adında bir klasör
hazırlanıp solution’a ait SLN uzantılı dosya bu klasöre konulur. Ayrıca bu
klasörün içinde proje için “WindowsApplication1” adında bir klasör hazırlanıp
projeye ait dosya ve diğer klasörler bu klasörün içine konulur.

Bildiğiniz gibi New Project diyalog kutusundaki Create directory for


solution onay kutusu seçili değilken solution için ayrı bir klasör
hazırlanmayıp proje ve solution dosyaları bir arada tutulmaktadır. Tekrar
etmek gerekirse Visual Studio ile bir C# projesi hazırladığınızda otomatik
olarak SLN uzantılı bir solution dosyası hazırlanmaktadır. Solution’lar
projeleri gruplamaya yaradıkları için geliştirdiğiniz uygulama birden fazla
projeden meydana gelmeyecekse SLN uzantılı Solution dosyasını
unutabilirsiniz.
Bölüm 6: Windows Forms Uygulamaları 93

Otomatik olarak hazırlanan Solution’u görmek istiyorsanız Solution


Explorer penceresine bakabilirsiniz. Birden fazla proje söz konusu olmadığı
sürece otomatik olarak hazırlanan Solution işlevsel değildir. Başka bir
deyişle aynı anda birden fazla projeyi açmayı düşünmüyorsanız
Solution’larla ilgilenmenize gerek yoktur.

Visual Studio tarafından hazırlanan Solution’a ait kısayol menüsündeki New


Project komutu ile yeni bir projeyi veya Existing Project komutu ile
mevcut projelerden birisini Solution’a dahil edebilirsiniz. Kısayol
menüsünden New Project komutunu verirseniz ekrana Add New Project
diyalog kutusu gelir.

Tahmin edebileceğiniz gibi Solution’larda .Net destekli ve Microsoft ürünü


herhangi bir programlama dili ile hazırlanmış başka projeler olabilmektedir.
Konumuz C# olduğu için Project Types kutusunda Visual C# Projects ve
Templates liste kutusunda ise Windows Application’i seçip OK düğmesini
tıklayınca Solution Explorer penceresi aşağıda verilen şekle dönüştü.
94 Memik Yanık - Visual C#’a Başlangıç Kitabı

Solution’da birden fazla proje varken bu projelerden birisi aktif projedir.


Aktif projenin adı Solution Explorer penceresinde kalın olarak yazılmaktadır.
Yanda verilen ekran görüntüsünü aldığım sırada “WindowsApplication1” adlı
proje aktifti. Diğer projeyi aktif proje yapmak istiyorsanız o projeye ait
kısayol menüsünden Set as StartUp Project komutunu vermelisiniz.
Solution’daki projelerden birisini çıkarmak istiyorsanız o projeye ait kısayol
menüsünden Remove komutunu verebilirsiniz.

Yukarıda otomatik olarak hazırlanan Solution’a sonradan 2. bir projeyi dahil


ettim. Ancak işe boş bir Solution hazırlamakla başlayabilirsiniz. Đçeriği boş
solution hazırlamak istiyorsanız New Project diyalog kutusundaki Blank
Solution şablonundan yararlanabilirsiniz.

Herhangi bir proje içermeyen yeni bir Solution hazırlamak için Project
Types liste kutusunda Visual Studio Solutions ve Templates kutusunda
ise Blank Solution şablonunu seçip solution için klasör seçip OK düğmesini
tıklarsanız aşağıdaki gibi Visual Studio penceresi ile karşılaşırsınız. Bu sırada
Solution’a dahil edilmiş olan herhangi bir proje olmadığı için Solution
Explorer penceresinde yalnızca Solution adı listelenir.

Bu sırada mevcut projelerden birisini Solution’a dahil edebilir veya Solution


için yeni bir proje hazırlayabilirsiniz. Bu işlemler için Solution Explorer
penceresinde Solution’a ait kısayol menüsünden New Project veya
Existing Project komutlarından birisini verebilirsiniz. Herhangi bir zamanda
SLN uzantılı Solution dosyasını açmanız halinde Solution’a dahil edilmiş olan
bütün projeler açılır.

Projeleri Çalıştırmak Ve Derlemek

Şimdi sırada yukarıdaki sayfalarda anlatılan şekilde hazırlanan projeleri


çalıştırmak, test etmek ve derlemek var. Bu düşünce ile New Project
diyalog kutusunu ekrana getirip Windows Forms Application şablonu ile
Bölüm 6: Windows Forms Uygulamaları 95

“Proje1” adında bir proje hazırlayıp bu projeyi “C:” sürücüsünde “\Proje1”


klasörüne kaydettim. Projeyi kaydettiğim klasörü özellikle işaret ettim.
Çünkü proje çalıştırıldığında veya derlendiğinde geri planda Visual Studio
tarafından hazırlanan dosyalardan söz etmek istiyorum.

Ayrıca New Project diyalog kutusunda Create directory for solution onay
kutusu pasif duruma getirip proje hazırlanırken otomatik olarak hazırlanan
Solution’la ilgili dosyanın ayrı bir klasöre konulmasını engelledim. Program
geliştirme aracı yani IDE olarak Visual Studio yerine C# için hazırlanmış
Express Edition’ı kullananlar için şunu söylemek isterim: Projeleri
çalıştırmak bağlamında Visual Studio ile Express Edition birbirinden pek
farklı değildir.

Şimdi hazırladığım projede herhangi bir değişiklik yapmadan, başlangıç


formuna kontrol yerleştirmeden ve başka bir Class hazırlamadan
çalıştıracağım. Projeleri çalıştırmak, başka bir deyişle projeyi test edip hata
içerip içermediğini kontrol etmek için genellikle Debug menüsündeki Start
Debugging komutu kullanılmaktadır. Genellikle dedim; çünkü projeleri
çalıştırmanın başka yöntemleri de vardır.

Çalışır durumdaki projeye ait ilk formu Kapat düğmesi ile kapatıp projenin
çalışmasını sona erdirip tasarım moduna geçebilirsiniz. Projenin çalışmasını
sona erdirip Design moduna geçilirse Visual Studio’nun Toolbox ve
Properties gibi pencereler tekrar görüntülenir.

Visual Studio ile hazırlanan C# projeleri Debug menüsünden komut


verilerek çalıştırıldıkları, başka bir deyişle test edildikleri zaman Visual
Studio tarafından otomatik olarak EXE dosya hazırlanmaktadır. Proje
96 Memik Yanık - Visual C#’a Başlangıç Kitabı

çalıştırıldığında hazırlanan EXE dosyanın yerini aşağıda görebilirsiniz. Bu EXE


dosya ancak proje hazırlanırken tercih edilen .NET Framework
sürümünün(2.0, 3.0 veya 3.5) kurulu olduğu bilgisayarda çalışabilir.
Aşağıda ekran görüntüsü verilen dosya listesindeki “pdb” uzantılı dosyaya
dikkatinizi çekmek istiyorum. Kodun debug edilmesi yani hatalardan
ayıklanması işlemiyle ilgili bilgiler bu dosyaya yazılmaktadır. Tabii bu
bölümde hata ayıklama işlemleri üzerinde durmayacağımız için “pdb”
uzantılı dosyanın işlevinden söz edilmeyecektir.

Yukarıda söylendiği gibi Visual Studio ile hazırladığınız C# projesini çalıştırıp


test etmek için Debug menüsünden Start Debugging komutunu verebilir
veya direk F5 tuşuna basabilirsiniz. Aslında Debug menüsünden bu komutu
vermekle Visual Studio’ya bir bakıma “hazırladığım projeyi entegre hata
ayıklayıcının nezaretinde test etmek istiyorum ve varsa hatalarından
ayıklamak istiyorum” demiş oluyorsunuz. Üzerinde çalıştığınız projeyi
Ctrl+F5 tuşları ile çalıştırırsanız projeyi entegre Debugger’dan bağımsız
çalıştırmış olursunuz.

En başında belirtmek gerekir ki Start Debugging komutu verildiği zaman


proje için otomatik olarak hazırlanan EXE dosya başkalarına verilecek, başla
bir deyişle projeden yararlanacaklara verilecek EXE kopya değildir. Elbette
Start Debugging komutu sayesinde otomatik olarak hazırlanıp projeye ait
klasörün içinde yer alan “\Bin\Debug” klasörüne yerleştirilen EXE dosyayı
alıp başka bilgisayarda çalıştırmak mümkündür. Ancak debug modunda iken
hazırlanan EXE dosyanın dağıtılması önerilmiyor.

Şimdi gelelim şu Debug moduna. Programcılar genelde uygulamalarını


geliştirmeyi ve test etmeyi Debug modunda yaparlar. Ne zaman ki
uygulama tamamlanıp testlerden geçer o zaman Release sürümü hazırlayıp
kullanıcılara öyle verirler. Yukarıdaki sayfalarda işaret edildiği gibi Visual
Studio ile yeni C# projesi hazırlanıp kaydedildiği zaman projeye ait klasörün
içinde “Bin” ve “Obj” adında 2 klasör hazırlanmaktadır.
Bölüm 6: Windows Forms Uygulamaları 97

Derleme sırasında hazırlanan geçici dosyalar “Obj” klasörüne konulmaktadır.


Obj klasörünün altında “Debug” ve “Release” adında 2 klasör
hazırlanmaktadır. Aynı şekilde “Bin” klasörünün içinde yine “Debug” ve
“Release” adında 2 klasör hazırlanmaktadır. Uygulamanın Debug sürümü
Bin klasörünün içinde bulunan \Bin\Debug klasörüne konulurken Release
sürümü \Bin\Release klasörüne yerleştirilmektedir.

Yukarıda belirtildiği gibi Visual Studio ile bir Windows Forms Application
hazırlayıp bu uygulamayı kaydedip sonrada Debug menüsünden Start
Debugging komutunu verdiğinizde Visual Studio söz konusu uygulamayı
önce derlemektedir. Tabi Visual Studio bu işlemi yaparken .NET Framework
ile gelen C# derleyicisini kullanmaktadır. Derleme işlemi sırasında
hazırlanan dosyalar \uygulama\obj\Debug klasörüne yerleştirilmektedir.

Start Debugging komutu verildiği zaman Visual Studio derleme yapıp bu


dosyaları hazırladıktan sonra ayrıca “uygulama\Bin\Debug” klasörüne kodun
EXE’sini ve birkaç dosya daha yerleştirilip bu EXE dosya çalıştırılmaktadır.

Hazırladığınız proje veya Solution’ı çalıştırıp test etmek yerine derlemek


istiyorsanız Build menüsündeki komutlardan yararlanmanız gerekir. Build
menüsünde gerçekte aşağıda verilen ekran görüntüsündekinden daha fazla
komut bulunmaktadır. Başlangıçta Solution’ların derlemesiyle ilgili komutlar
Build menüsünde yer almıyor. Eğer birden fazla projeyi bir Solution’da
topluyorsanız Tools menüsünden komut verip ekrana Options diyalog
kutusunu getirip Project And Solutions sekmesinde ayarlama
yapabilirsiniz.
98 Memik Yanık - Visual C#’a Başlangıç Kitabı

Bu menüdeki komutların adlarına üzerinde çalışılan projenin adı


eklenmektedir. Bu sırada üzerinde çalıştığım projenin Proje1’di. Üzerinde
çalıştığınız projeyi derlemek üzere Build menüsünden Build komutunu
verirseniz Visual Studio projenizi derler. Derleme sırasında önce Uygulama
adı\obj\Debug klasörüne bazı dosyalar yerleştirilir.

Derleme işleminin ikinci aşamasında birisi EXE olmak üzere birkaç dosya
hazırlanıp “Uygulama adı\Bin\Debug” klasörüne yerleştirilir. EXE dosyayı çift
tıklayıp veya Başlat menüsünden Çalıştır komutunu verip projenizi
çalıştırabilirsiniz. Tabii profesyonel programcılar projeleri için kurma CD’si
hazırlayıp uygulamalarını öyle dağıtırlar. Kurma CD’sini Visual Studio ile
gelen Setup Wizard’dan yararlanarak hazırlayabilirsiniz.

Derleme sonucu hazırlanıp “\Obj\Debug” ve “\Bin\Debug” klasörlerine


yerleştirilen dosyaları silmek istiyorsanız Build menüsünden Clean
komutunu vermelisiniz. Daha önce derlediğiniz projeyi Build komutu ile
tekrar derlediğinizde projenin yalnızca değişen kısımları gözetilir. Rebuild
komutu ise projeyi sanki ilk kez derleniyormuş gibi yeni baştan derler.

Debug modundan Release moduna geçmek istiyorsanız Visual Studio’nun


Debug menüsünden komut verip Cunfiguration Manager diyalog
kutusunu ekrana getirmelisiniz. Başlangıçta bu komut Debug menüsünde
yer almıyor ve bu nedenle Tools menüsündeki Options komutu ile ekrana
getirilen diyalog kutusunda ayarlama yapmak gerekmektedir.
Bölüm 6: Windows Forms Uygulamaları 99

Options diyalog kutusunda Project and Solution seçenek grubundaki


Show advanced build configurations onay kutusunu seçmelisiniz. Bu
ayarlamayı yapıp Debug menüsünde Cunfiguration Manager komutunun
yer almasını sağlayıp bu komutu verdiğinizde akrana aşağıda verilen diyalog
kutusu gelir.
100 Memik Yanık - Visual C#’a Başlangıç Kitabı

Bu ekran görüntüsünü aldığım sırada üzerinde çalıştığım projenin dahil


olduğu Solution bir tek projeye sahipti. Bu sırada Solution’da birden fazla
proje olsaydı bu projeler de listelenirdi. Bu diyalog kutusundaki Active
Solution configuration ve Active solution platform liste kutularında
yapılan seçimlerden bütün projeler etkilenmektedir.

Active Solution configuration liste kutusunu açıp Release’i seçerseniz


Debug modundan Release moduna geçmiş olursunuz. Bu andan itibaren
Debug menüsünden Start Debugging komutunu verip projeyi çalıştırırsanız
EXE kodun Release sürümü hazırlanır ve bu EXE dosya “\Bin\Release”
klasörüne yerleştirilir. Bu sırada yani Release modunda iken Build
menüsünden Clean… komutunu verirseniz “\Obj\Release” ve “\Bin\Release”
klasörlerine yerleştirilmiş dosyalar silinir.

Debug modunda iken Build menüsünden Build… veya Rebuild… komutu


verilerek derleme yapıldığında derleme sonucu hazırlanan dosyalar yine
“\Obj\Release” ve “\Bin\Release” klasörlerine yerleştirilmektedir. Hangi
modda olduğunuzu öğrenirken Project Properties penceresinden
yararlanabilirsiniz.

Bu dersi baştan sonra inceleyenlerin tespit etmiş olabileceği gibi bazı küçük
ayrıntılar hariç burada anlatılan işlemlerin hemen hepsini başka kaynaklarda
bulmak mümkündür. Hatta daha önce eski Visual Basic ve Delphi IDE’sini az
çok kullanmış olanların kaynak karıştırmalarına bile gerek kalmadan bu
metinde anlatılanları kendilerinin zaten biliyor olmaları uzak bir ihtimal
değildir. Buna rağmen yarın bir gün sırf bu metni kaleme aldım diye
yargılanmamak, sanık pozisyonunda hakim karşısına çıkmamak için ek
açıklama yapma gereğini duyuyorum: Ey yetkililer, ey yerli programcılık
kitabı yazarları; 1994 yılından bu yana Microsoft’un IDE’lerini kullanan
programlama dilleri üzerine çok sayıda kitap yazmış birisi olarak yukarıdaki
sayfalarda yazdıklarımı gidip bozuk cümlelerle dolu yerli programcılık
kitaplarından öğrenmemin bir mantığı var mıdır? Yani yukarıda verilen
bilgilerin daha önce yayınlana bazı programcılık kitaplarında yer alıyor
Bölüm 6: Windows Forms Uygulamaları 101

olması bence Visual Studio’nun suçudur. Keşke Visual Studio “at sahibine
göre kişner” atasözünü kendisine rehber edip yazarına ve programcısına
göre çalışsa, yazarına göre işlem yapsa…
BÖLÜM 6
WINDOWS FORMS UYGULAMALARI
Daha önceki derslerde önde C# için hazırlanmış Express Edition sonra da Visual
Studio hakkında ön bilgi verdik. Bu derste ise Express Edition ile Windows Forms
hazırlayacağız. Bu derste yazılanlar itibarı ile Express Edition kullanmak ile Visual
Studio kullanmak arasında pek bir fark yoktur. Başka bir deyişle bilgisayarlarına
Visual Studio kurmuş olanlar bu derste yazılanları zorluk çekmeden uygulayabilirler.

Đlk derslerinde konsol uygulaması hazırlamamızın nedeni C# uygulamaları hakkında


adım adım bilgi vermekti. Yoksa konsol uygulamalarına çok özel durumlarda ihtiyaç
duyulmaktadır. Bu nedenle bundan sonra Windows Forms denilen normal
uygulamalara odaklanacağız. Bu nedenle Express Edition’ı başlatıp File menüsünden
komut verip New Project diyalog kutusunu ekrana getirip Windows Application
şablonunu seçtim.

C# için hazırlanan Express Edition ile hazırlanan projelerde New Project diyalog
kutusunda projeye verilen ad sonradan değiştirilebilmektedir. Projeye vermek
istediğim adı Name kutusuna yazıp OK düğmesini tıklayınca aşağıdaki gibi bir
Visual C# 2008 Express Edition penceresi ile karşılaştım.
Bölüm 6: Windows Forms Uygulamaları 103

Windows Application şablonu ile hazırlanan projeye bir form dahil


edilmekte ve bu formun görsel yapısı Express Edition penceresine
getirilmektedir. Bu formun üzerine hemen düğmeler, TextBox’lar ve
ListBox’lar yerleştirmek yerine Windows Forms Application şablonu ile
hazırlanan projenin özelliklerine bir bakalım. Bu amaçla Solution Explorer
penceresini açtım.

Express Edition ile C# projesi hazırlandığı zaman çok kullanılan bazı sınıfları
içeren referanslar yani DLL dosyaları projeye dahil edilmektedir. Daha
doğrusu Express Edition’a bazı referanslardaki sınıflardan yararlanılmak
istendiği söylenmektedir. Hatırlarsanız yukarıdaki sayfalarda konsol
uygulaması dahilinde ekrana form veya pencere getirmek için
System.Windows.Forms’deki Form adlı sınıftan yararlanmıştık.
104 Memik Yanık - Visual C#’a Başlangıç Kitabı

Üzerinde çalışılan projede .NET Framework ile gelen sınıflardan birisinden


yararlanmak için o sınıfın yer aldığı namespace’i içeren DLL dosyasının veya
referansın Solution Explorer penceresinde listelenmesi gerektiği için Solution
Explorer penceresinden yararlanıp Add Reference diyalog kutusunu ekrana
getirmiştik. Benzer durum Express Edition ile hazırlanan Windows Forms
uygulamaları için de geçerlidir. Express Edition en çok gerek duyulan
referansları kendiliğinden Solution Explorer penceresinde listelemektedir.

Üzerinde çalışılan proje hakkında bilgi edinilmek istendiği zaman başvurulan


Solution Explorer penceresine dikkatlice bakarsanız projedeki formla ilgili
olarak 3 dosyanın hazırlanmış olduğunu görürsünüz. Burada dikkatinizi
öncelikle “Program.cs” dosyasına çekmek istiyorum. Yukarıdaki sayfalarda
işaret edildiği C# projelerinin başlangıç noktası Main() metodudur. Express
Edition veya Visual Studio ile hazırlanan projelerde Main() metodu
“Program.cs” adlı kod dosyasına konulduğu için bu dosya önemlidir.

Solution Explorer penceresinde “Program.cs” dosyasını çift tıklarsanız bu


kod dosyasının içeriği görüntülenir. Hemen belirtmek gerekir ki Main()
metodunun Program.cs dosyasında olması şart değildir. Microsoft firması
Main() metodunun “Program.cs” dosyasında olmasını tercih ettiği için bu
tercihe bağlı kalmanız önerilir.

Express Edition tarafından hazırlanan bu kodu dikkatlice incelerseniz


System, System.Collections.Generic, System.Windows.Forms gibi
Bölüm 6: Windows Forms Uygulamaları 105

namespace’lerdeki sınıfları direk kullanabilmeniz, yani sınıf adından önce


namespace adını yazmak zorunda kalmamanız için using deyimi ile
ayarlama yapılmış olduğunu görürsünüz. “Program.cs” dosyasındaki Main()
metodundaki son satırı yukarıdaki sayfalarda görmüştük.

Application.Run(new Form1());

Windows Forms uygulamalarında System.Windows.Forms’deki sınıfları direk


kullanabilmeniz için Express Edition tarafından using deyimi ile ayarlama
yapıldığı için sınıf adından önce namespace adı yazılmamış. Bu satırı daha
önce görmüş olanlar şöyle bir açıklamayı okumuş olabilirler: “Uygulama
Run() metodu ile başlatılmaktadır”. Aslında bu tek cümlelik tanım yanlış
değildir. Ne var ki bu tanım bu satırla nelerin yapıldığını, geri planda nelerin
geliştiğini açıklamaya yetmiyor.

Konunun devamında anlatılacağı gibi Express Edition ile Windows Forms


uygulaması hazırlandığında System.Windows.Forms adlı namespace’teki
Form adlı Class’ın mirasçısı “Form1” adında bir Class hazırlanmaktadır. Đşte
bu satırda “Form1” adlı Class’ın örneği alınıp Application sınıfının Run()
metoduna parametre olarak verilmektedir. Konu üzerinde düşünmenizi
sağlamak için Windows Forms uygulamasının “Program.cs” dosyasındaki
Main() metodunu aşağıdaki gibi düzenledim.

static void Main()


{
string mesaj = "Proje başlatıldı, Form1 ekrana getirilecek";
MessageBox.Show(mesaj);
Application.Run(new Form1());
}

Express Edition tarafından hazırlanan Main() metodundan sildiğim 2 satır


mutlaka gerekli olan satırlar değildir. Kod kısalsın diye sildim. Main()
metodunun bu halinde önce string tipte bir değişken tanımlayıp bilgi
aktardım. Değişken tanımlama ile tanımlanan değişkene bilgi aktarma
işlemini ayrı satırlarda yapabilirdim. Đleri de yerli bir yazarın “Memik Yanık
değişkenimizin adını çalmış” suçlamasından kendimi kurtarmak için bu kodu
bir de aşağıdaki gibi düzenledim.

static void Main()


{
string msg = "Proje başlatıldı, Form1 ekrana getirilecek";
MessageBox.Show(msg);
Application.Run(new Form1());
}
106 Memik Yanık - Visual C#’a Başlangıç Kitabı

Bu şekilde String tipteki değişkeni tanımlayıp bilgi aktardıktan sonra .NET


Framework ile gelen MessageBox sınıfının Show() metodu ile bu
değişkenin içeriğini bir diyalog kutusu içinde ekrana getirdim. Dolayısıyla
Main() metodu bu şekilde düzenlenen proje çalıştırıldığı zaman ekrana önce
aşağıdaki gibi bir diyalog kutusu gelir.

Bu diyalog kutusu kapatıldığında ise sıra Application sınıfının Run()


metodunun kullanıldığı satıra gelir ve ekrana projenin formu gelir. Run()
metodunun kullanıldığı satırı incelerseniz Form1 sınıfının örneğinin new
anahtar kelimesi kullanılarak parantezlerin içine alındığını görürsünüz. Bir
sınıfın örneğini alma yani nesne hazırlama işleminin anlaşılmasına katkı
olması için bu projenin Main() metodunu aşağıdaki gibi düzenledim.

static void Main()


{
string msg = "Proje başlatıldı, 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 satırlık kodu yorumlayalım. Express Edition veya Visual


Studio ile Windows Forms uygulaması hazırlandığı zaman .NET Framework
ile gelen ve System.Windows.Forms’de yer alan “Form” sınıfının mirasçısı
“Form1” adında bir sınıf hazırlanmakta ve bu sınıfla ilgili “Form1.cs” ve
“Form1.Designer.cs” adında 2 kod dosyası hazırlanmaktadır. Burada yani bu
Main() metodunda yaptığım, önce Express Edition tarafından Windows
Forms uygulaması için otomatik olarak hazırlanan Form1 tipinde(sınıf) bir
değişken tanımlamak, sonra bu sınıfın örneğini new anahtar kelimesi ile
hazırlayıp(nesne hazırlamak) tanımladığım değişkene aktarmaktır. En son
satırda ise Form1 tipindeki nesneyi Application sınıfının Run() metoduna
parametre olarak verdim. Ne zaman ki Application sınıfının Run() metoduna
parametre olarak verilen form kapatılır o zaman projenin çalışması sona
ermiş olur.
Bölüm 6: Windows Forms Uygulamaları 107

Formlar Đçin Hazırlanan Kodlar

Express Edition veya Visual Studio ile yeni bir proje hazırlandığında projeye
“Form1” adında bir formun dahil edildiğini biliyorsunuz. Formu oluşturan
kodları görüntülemek için Solution Explorer penceresinde söz konusu form
seçili iken View menüsünden Code komutunu verebilirsiniz. Aşağıdaki
ekran görüntüsünü incelediğinizde projedeki her form için hazırlanan CS
dosyalarının ilkinde en başta kullanılması muhtemel sınıfların yer aldığı
namespace’ler işaret edilmektedir. Ardından form ile aynı ada sahip bir
Class hazırlanmaktadır.

Bu class System.Windows.Forms adlı namespace’teki Form adlı Class’ın


mirasçısı olduğu için çok sayıda özellik ve metoda sahip olur. Bu koda dikkat
ederseniz önce namespace bloğu bulunmaktadır ve projenin adı namespace
adı olarak kullanılmaktadır. Devamında public ve partial olarak işaret
edilen class bloğu gelmektedir. Hazırlanan Class’a Form1 adı verilmiş.

Hazırlanmak istenen Class’ın adından sonra mirasçı(bu sınıfa bazı


programcılar ana sınıf-base class diyorlar) pozisyonundaki “Form” sınıfının
adı yazılmış. Hazırlanmak istenen Class ile mirasçı Class’ın adını birbirinden
ayırmak için “:” kullanılmaktadır. Form sınıfı System.Windows.Forms’de yer
aldığı ve bu namespace using bloğunda işaret edildiği için “Form” sınıfının
adının önüne namespace adı yazılmaya gerek duyulmamış.

Devamında “Form1” sınıfının yapıcı metoduna yer verilmiş. Class ile aynı
ada sahip metotlara yapıcı veya constructor metot adı verilmektedir.
Form1 adı verilen Class’ın yapıcı metodunda yalnızca
InitializeComponent() metodu işletilmektedir. Form1 sınıfıyla ilgili
108 Memik Yanık - Visual C#’a Başlangıç Kitabı

InitializeComponent metodu “Form1.Designer.cs” adlı ikinci kod


dosyasında yer almaktadır.

Formların ve formların üzerine yerleştirilen nesnelerin özellikleri


Form1.Designer.cs dosyasında ayarlanmaktadır. Designer.cs dosyasında
da “Form1” adında bir Class bulunmaktadır. Başka bir deyişle “Form1” adlı
Class’ın bir kısmı Form1.cs’de diğer kısmı “Form1.Designer.cs” dosyasında
bulunmaktadır.

7
Class’ların birden fazla kod dosyası veya parça şeklinde düzenlenmesine
Partial Class denilmektedir. Bu nedenle Form1.cs veya Form1.Designer.cs
dosyalarındaki partial anahtar kelimeleri silinirse hata meydana gelir.
“Form1” adlı Class için Visual Studio tarafından hazırlanan
“Form1.Designer.cs” dosyasına bakarsanız Dispose() adında bir metodun
olduğunu görürsünüz. Bu metot, sınıfla ilgili olarak hazırlanan nesnelerin
zamanı gelince bellekten silmesiyle ilgilidir.
Şimdi “Form1” için Visual Studio tarafından hazırlanan satırları ve bu
satırlarda kullanılan metot ve anahtar kelimelerin bazılarından söz
edeceğim. Visual Studio her form için Form1.Designer.cs dosyasında
yukarıda verilen satırlardan daha fazlasını hazırlamaktadır. Tasarım anında
Properties penceresinde yapılan değişiklilere programcı doğrudan müdahale
etmeyi tercih etmeyeceği için bu satırlar Windows Form Designer
generated code adlı altında gruplanıp gizlenmektedir. Aşağıda verilen
kodda bu bölgeye yazılan satırları görebilirsiniz.
Bölüm 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 satırlar Toolbox’tan yararlanılarak


formun üzerine yerleştirilen nesnelere göre artabilmektedir. Bu sırada
Toolbox’tan yararlanıp forma nesne yerleştirir veya Properties
penceresinden yararlanıp formun özelliklerini değiştirseniz Windows Form
Designer generated code bölgesine yeni satırlar eklenir veya mevcut
satırlarda değişiklik meydana gelir.

Formlara Nesne Yerleştirmek

Yukarıdaki sayfalarda Express Edition veya Visual Studio ile hazırlanan C#


projeleri hakkında biraz bilgi sahibi olduktan sonra şimdi sırada forma
button nesnesi yani düğme yerleştirmek var. Tabii bazılarınız hemen bunu
bilmeyecek ne var diye sorabilirler. Siz yine de okumaya devam edin.
Formlara nesne yerleştirip bunlar için kod yazabilmek için yeni bir proje
hazırladım ve projenin ilk(aynı zamanda başlangıç) formuna button nesnesi
yerleştirebilmek için Toolbox’ı açtım.
110 Memik Yanık - Visual C#’a Başlangıç Kitabı

Toolbox’ta listelenen seçeneklere Component adı verilmektedir. Bu


seçeneklere kontrol da denilebilir. Bu kontroller gerçekte .NET Framework
ile birlikte gelen birer Class’tır. Express Edition formlara yerleştirilebilinen
class’ların örneklerini alıp kullanmanız konusunda size yardımcı olmaktadır.
Daha açık bir anlatımla Toolbox’tan Button adlı kontrolü seçip formu
tıklarsanız Button sınıfından yola çıkıp “button1” adında bir nesne hazırlamış
olursunuz.

Forma bu şekilde button1 adında bir Button nesnesi yerleştirince Express


Edition bizim için gidip bu formun “Form1.Designer.cs” adlı kod dosyasına
bazı satırlar ekledi. Bu satırların sayesinde button1 nesnesi formun üzerinde
görünmeye başladı. Başka bir anlatımla, forma Button nesnesi
yerleştirmekle biz gerçekte Express Edition’a diyoruz ki “formun üzerinde şu
özelliklere sahip bir düğmenin olması için git Form1.Designer.cs dosyasında
bazı ayarlamalar yap, button nesnesi hazırlayan satırlar ekle”.

Şimdi gidip bakalım Express Edition bizim için projedeki ilk formun
Form1.Designer.cs dosyasına neler yazmış? Form1.Designer.cs dosyasında
aşağıda verilen ekran görüntüsünde görülenlerden daha fazla satır olmasına
rağmen ekran görüntüsü küçük olsun diye yalnızca button1 nesnesiyle ilgili
satırların görünmesine izin verdim.
Bölüm 6: Windows Forms Uygulamaları 111

Toolbox’tan yararlanıp forma button nesnesi yerleştirildiği zaman Express


Edition(aynı şeyler Visual Studio içinde söylenebilir) ilk olarak “button1”
adında ve System.Windows.Forms.Button tipinde bir değişken
tanımlıyor. Bu sırada forma 2. bir button nesnesi yerleştirmeniz halinde
Express Edition buna button2 adını verir. Tabi forma yerleştirmiş olduğunuz
nesnelere sonradan istediğiniz adı verebilirsiniz. Siz siz olun bu nesnelere
“aktar” gibi yerli yazarlar tarafından sık kullanılan adlar vermeyin.
Bakarsınız yarın bir gün yerli yazarın birisi düğme adımı çalmışsınız diye
sizden şikayetçi olur. Bu nedenle düğmelere argo isimler vermeniz önerilir.

Express Edition veya Visual Studio, System.Windows.Forms.Button


tipindeki değişkeni tanımladıktan sonra form için daha önce hazırlanan
InitializeComponent() adlı metotta önce new anahtar kelimesi ile button
nesnesi hazırlıyor. Devamında bu nesnenin Name, Location, Size, Text
gibi birkaç özelliğini ayarlıyor. Bu sırada Form1.Designer.cs dosyasından
button nesnesi ile ilgili satırları silerseniz button nesnesini formun üzerinden
kaldırmış olursunuz. Çünkü formun üzerinde button nesnesinin olmasına
neden olan satırlar bunlardır. Bu satırlarla oynayıp button nesnesinin
özelliklerinde değişiklik yapabilirsiniz. Formların ve forma yerleştirilen
nesnelerin özelliklerini fare ile ayarlamak daha kolay olduğu için
programcılar çok gerekmedikçe nesnelerin özelliklerini ayarlamak için
Designer.cs dosyasına başvurmazlar.

Forma düğme yerleştirmenin geri planında nelerin olduğu konusunda biraz


bilgi sahibi olduktan sonra şimdi button1 adlı düğmenin başlık metnini yani
Text özelliğini değiştireceğim. Bu amaçla Form1.cs(Design) sekmesini
tıklayıp Express Edition penceresi içinde Form1.Designer.cs adlı kod dosyası
yerine Form1’in görsel yapısının görüntülenmesini sağladım.
112 Memik Yanık - Visual C#’a Başlangıç Kitabı

Formların ve forma yerleştirilen nesnelerin özelliklerini ayarlarken


Properties penceresinden yararlanılmaktadır. Properties penceresini
görüntülemek için View menüsünden komut vermek gerekmektedir. Aşağıda
verdiğim ekran görüntüsünü “button1” nesnesinin Text özelliğini
değiştirdikten sonra aldım. Aslında button1 adlı nesnenin Text özelliğini bu
şekilde değiştirmekle risk almış oldum. Çünkü yarın bir gün yerli bir yazar
ortaya çıkıp “Göster’i benim kitaptan çalmışsın” diye beni dava edebilir.

Properties penceresinde button1 adlı nesnenin Text özelliğinde değişiklik


yapılırsa Express Edition bu değişikliği anında Form1.Designer.cs dosyasına
yansıtır. Bu button nesnesinin adını değiştirmek istemiş olsaydım Properties
penceresinde Name özelliğinde değişiklik yapardım.

Şimdi öyle bir ayarlama yapacağım ki kullanıcı çalışma anında Form1’deki


düğmeyi tıkladığı zaman bir diyalog kutusu içinde kullanıcıya mesaj
verilmesini sağlayacağım. Bu işlem için yerli yabancı diğer kitapların aksine
size hemen button1’in üzerinde çift tıklama yapın sonra da şu satırı yazın
demeyeceğim.

Đşin özünü anlatmak için Form1’in görsel yapısı görüntülenirken View


menüsünden Code komutunu verip Form1’e ait “Form1.cs” adlı kod
dosyasının görüntülenmesini sağladım. Ekran görüntüsü küçük olsun diye
using bloğundan şu anda gerekli olmayan bazı satırları sildim.
Bölüm 6: Windows Forms Uygulamaları 113

Kafanızın karışmaması için baştan alayım: Express Edition veya Visual


Studio ile Windows Forms uygulaması hazırlanıp uygulamaya dahil edilen
her form için 2 kod dosyası hazırlanmaktadır. Form1.cs dosyasında
programcının yazdığı kodlar yer alırken formun görsel yapısı ile ilgili satırlar
Form1.Designer.cs dosyasında yer olmaktadır. Derleme sırasında bu 2
dosya bir araya getirilmektedir.

Bu şekilde bir sınıfa ait kodların birden fazla kod dosyası arasında
paylaşılmasına Partial Class(parçalı sınıf) denilmektedir. Form1.cs
dosyasına dikkatli baktığınızda InitializeComponent() metodunun
işletildiğini görebilirsiniz. Bu metodun yani InitializeComponent
metodunun Form1.Designer.cs dosyasında olduğunu biliyorsunuz.

Şimdi Form1.cs dosyasındaki Form1 sınıfının sınırları içinde button1 nesnesi


tıklandığında işletilmek üzere bir metot hazırlayacağım. Hazırladığım metot
Object ve EventArgs tipinde 2 parametreye sahiptir. Çünkü herhangi bir
button nesnesinin Click olayını 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(“Düğmeyi tıkladınız”);
}
}
114 Memik Yanık - Visual C#’a Başlangıç Kitabı

Kendi hazırladığım metoda ilk_button_Click() adını verdim. Doğrusu,


metoda, ilgili nesnenin adını çağrıştıracak bir adın verilmesidir. Çalışma
anında projenin formundaki düğme tıklansa bile bu metot işletilmez. Bizim
yapmamız gereken button1 nesnesinin Click olayı ile, bu metodu
ilişkilendirmek olmalıdır. Bu ilişkilendirmeyi yapmaya en uygun yer
Form1.Designer.cs dosyasındaki InitializeComponent() metodudur. Bu
metodun içine yazdığım satırı aşağıda görebilirsiniz.

Bu satırda eşitliğin sol tarafındaki “button1” düğmenin adıdır. Eşitliğin sol


tarafındaki Click ise button1 nesnesinin tıklama olayını işaret etmektedir.
Tabii bu satırdaki “this” gözünüzden kaçmamıştır: this, kendisi için metot
yazılan “Form1” sınıfını temsil etmektedir. Eşitliğin sağ tarafında ise
parantezin içine yazılanın Form1.cs adlı kod dosyasında hazırladığım
metodun adı olduğunu söylemekle yetineceğim.

Bu ayarlamadan sonra çalışma anında ne zaman Form1’deki düğme


tıklanırsa Form1.cs’deki ilk_button_Click() metodu işletilir. Dikkat
ettiyseniz yukarıda Form1’deki düğme için metot hazırlama ve bu metodu
Click olayı ile ilişkilendirme konusunda Express Edition’dan yararlanmadım.

Şimdi hem Form1.cs dosyasındaki metodu hem de Form1.Designer.cs


dosyasına yazıp yukarıda işaret ettiğim satırı sileceğim. Ardından metot
hazırlama ve bu metodu Click olayı ile ilişkilendirme işlemini yaparken
Express Edition’dan yararlanacağım. Tasarım anında forma yerleştirdiğiniz
button nesnesini çift tıklamanız halinde Express Edition sizin için hem bir
metot hazırlar hem de yukarıda verilen satırın benzerini hazırlayıp
Form1.Designer.cs dosyasındaki InitializeComponent() metoduna ekler.
Aşağıda verdiğim ekran görüntüsünü yukarıda kendi hazırladığım metodu
silip tasarım anında “button1” nesnesini çift tıkladıktan sonra aldım.
Bölüm 6: Windows Forms Uygulamaları 115

Bu metot button1 nesnesinin Click olayını temsil etmesi için hazırlandığı için
Express Edition metoda ad seçerken nesnenin ve olayın adını kullandı. Tabii
bu şart değildir. Anlatılan şekilde hazırladığınız metoda istediğiniz adı
verebilirsiniz.

Bu andan itibaren çalışma anında Form1’e yerleştirdiğim düğme çalışma


anında tıklandığında bu metot işletilir. Tabi bu metot henüz işletilebilir
herhangi bir satır içermediği için çalışma anında düğme tıklanıp Click
olayının meydana gelmesi sağlansa bile tepki vermez.

Tahmin edeceğiniz gibi tasarım anında formdaki düğme çift tıklandığında bu


metodun hazırlanmasından başka Form1.Designer.cs dosyasında bulunan
InitializeComponent() metoduna yukarıda verdiğim satır eklenerek bu
metot ile button1 nesnesinin Click olayı ilişkilendirildi.

Forma yerleştirilen button ve diğer nesnelerin ilgili olayıyla metotların ilişkisi


istenirse Properties penceresinde kurulabilir. Aşağıda verdiğim ekran
görüntüsünü aldığım sırada Properties penceresinde button1 nesnesinin
özellikleri listeleniyordu.
116 Memik Yanık - Visual C#’a Başlangıç Kitabı

Properties penceresi 2 amaca yönelik olarak işlev görmektedir. Birincisi,


form ve Toolbox’tan yararlanılarak formlara yerleştirilen nesnelerin
özellikleri hakkında bilgi edinmek ve gerekirse bu özelliklerde değişiklik
yapmaktır. Bu penceredeki Events düğmesi tıklandığında ise o sırada seçili
durumdaki nesneye kaynaklık eden Class’ın olayları listelenmektedir.
Aşağıda verilen ekran görüntüsünü button1 nesnesinin özellikleri
listelenirken Events düğmesini tıkladıktan sonra aldım.

Bu button nesnesinin Click olayı Express Edition(veya Visual Studio)


tarafından daha önceden Form1.cs dosyasındaki button1_Click()
metoduyla ilişkilendirildiği için Click olayının karşısında bu metodun adı
yazılıdır. Bu sırada Click olayının karşısındaki metodun adını silerseniz
Express Edition gider Form1.Desing.cs dosyadaki metot ile olayı
ilişkilendiren satırı siler.

Konu üzerinde düşünmenizi sağlamak için forma button2 adında 2. bir


düğme yerleştirip Properties penceresinden yararlanıp bu düğmenin Click
olayına button1_Click adını vermiş olduğum metodun adını aktardım.

Bu şartlarda çalışma anında formdaki 2. düğme tıklandığında Express


Edition’den yararlanıp button1 için hazırlayıp button1_Click() adını verdiğim
metot işletilir. Bu şartlarda button1_Click() metodu ile, hem button1’in hem
de button2’nin Click olayı ilişkilendirildiği için çalışma anında ister button1
ister button2 tıklansın aynı metot işletilir. Hem button1 hem de button2 için
Properties penceresinde Click olayı için aynı metodu seçmenin etkisiyle
Form1.Designer.cs dosyasına aşağıda verdiğim 2 satır eklenir.

this.button1.Click += new System.EventHandler(this.button1_Click);


this.button2.Click += new System.EventHandler(this.button1_Click);
Bölüm 6: Windows Forms Uygulamaları 117

Şimdi ise forma bir TextBox yerleştireceğim. Öncelikle forma daha önce
yerleştirdiğim button1 ve button2 adlı düğmeleri sileceğim. Forma
yerleştirdiğiniz düğmeleri seçip Delete tuşuna basarsanız Express Edition
gider Form1.Designer.cs dosyasında bu düğmelerle ilgili ne var ne yok her
şeyi siler. Ancak tasarım anında düğmeyi çift tıklayarak veya kendi
hazırladığınız bir metot varsa Form1.cs dosyasından silinmez. Söz konusu
metoda gerek duymuyorsanız kendiniz silebilirsiniz.

Forma yerleştirmiş olduğunuz TextBox’ı tasarım anında çift tıklarsanız


Express Edition TextBox’ın TextChanged olayı için metot hazırlamak
istediğinizi varsaymaktadır. Bu nedenle TextBox’ı çift tıklarsanız hem
Form1.cs dosyasının içeriği görüntülenir hem de aşağıdaki gibi bir metot
hazırlanır.

public partial class Form1 : Form


{
public Form1()
{
InitializeComponent();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
}

Bu metot çalışma anında TextBox’ın içeriği değiştirildikçe otomatik olarak


işletilir. Ancak kendim bu TextBox’ın TextChanged olayı için değil KeyPress
olayı için metot hazırlamak istiyorum. Şimdi bir tekrar yapalım: Tasarım
anında formu çift tıklarsanız Express Edition ve Visual Studio sizin formun
Load olayı için bir metot hazırlamak istediğinizi, Button nesnesini çift
tıkladığınızda button nesnenin Click olayı için metot hazırlamak istediğinizi
ve TextBox’ı çift tıkladığınızda ise TextChanged olayını temsil edecek bir
metot hazırlamak istediğinizi varsaymaktadır. Madem forma yerleştirdiğim
TextBox’ın KeyPress olayını temsil edecek bir metot hazırlamak istiyorum o
halde söz konusu TextBox seçili iken Properties penceresinde TextBox’a ait
olaylarının listelenmesini sağlamalıyım.
118 Memik Yanık - Visual C#’a Başlangıç Kitabı

Bu TextBox’la ilgili olarak KeyPress olayı meydana geldiğinde(yani imleç


TextBox’ın içinde iken kullanıcı klavyenin herhangi bir tuşuna bastığında)
işletilmek üzere daha önce hazırladığınız bir metot varsa bu olaya ait liste
kutusunu açıp bu metodu KeyPress olayıyla ilişkilendirebilirsiniz.

Bu amaçla kullanabileceğimiz herhangi bir metodumuz olmadığı için


KeyPress olayının üzerinde çift tıklama yapmalıyız. KeyPress olayını çift
tıkladığınızda Express Edition hem bir metot hazırlar hem de
Form1.Designer.cs dosyasına müdahale edip bu metot ile KeyPress olayını
ilişkilendirir.

public partial class Form1 : Form


{
public Form1()
{
InitializeComponent();
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
}
}

Express Edition tarafından hazırlanan bu metotta, metot adından sonra


parantezlerin içinde (object sender, KeyPressEventArgs e) bilgisi var.
Başka bir deyişle TextBox1’in KeyPress olayını temsil etmek üzere
hazırlanan bu metot Object ve KeyPressEventArgs tipinde 2 parametreye
sahiptir. Basılan tuşu temsil eden bilgi metoda KeyPressEventArgs
tipindeki “e” adındaki parametre ile gönderilir. TextBox’ın içinde iken Enter
tuşuna basıldığı zaman TextBox’a girilmiş bilgileri bir diyalog kutusu içinde
ekrana getirmek için bu metodu aşağıdaki gibi düzenledim.

private void textBox1_KeyPress(object sender,KeyPressEventArgs e)


{
if (e.KeyChar == 13)
MessageBox.Show(textBox1.Text);
}

Bu metotta “if” deyimi ile en son basılan tuşun ASCII kodu 13 olan Enter
olup olmadığı araştırılıyor. En son basılan tuşun kodu 13 ise MessageBox
Bölüm 6: Windows Forms Uygulamaları 119

sınıfının Show() metodu ile TextBox’ın “Text” özelliğinin içeriği ekrana


getiriliyor. En son basılan tuşun kodu 13 değilse imleç TextBox’ın içinde bilgi
girişi için beklemeye devam eder.

Forma yerleştirilen TextBox ve Button gibi nesnelerin değişik olaylarını


temsil etmek üzere metot hazırlama işleminin kavranmasına katkı olması
için TextBox’ların Enter ve Leave olaylarından söz edeceğim. Formdaki
herhangi bir nesneden TextBox’ın üzerine gittiğinizde veya imlecin
TextBox’a yerleşmesine neden olduğunuzda Enter olayı meydana gelir. Bu
olayın nasıl kullanıldığına örnek olması için forma birden fazla TextBox
yerleştirip ilk TextBox’ın Enter olayını temsil etmek üzere aşağıda verdiğim
metodu hazırladım.

Tabii yarın bir gün yerli yazarın birisi ortaya çıkıp TextBox’ların Enter olayını
temsilen metot hazırlamayı ilk ben akıl ettim, dolayısıyla fikri haklarıma
tecavüz ettiniz buyurun mahkemeye derse hiç şaşırmamak gerekir. Zira bu
memlekette bu böyle bir iddiayı onaylayacak çok sayıda bilim eri vardır.

private void textBox1_Enter(object sender, EventArgs e)


{
textBox1.BackColor = Color.GreenYellow;
}

Bu metoda yazılan satır sayesinde textBox1’in üzerine gidildiğinde zemin


rengi değişikliği olur. Kullanıcı TextBox’a bilgi girip başka bir kontrolün yani
nesnenin üzerine gittiğinde ise zemin rengini eski halinde çevirmek
istiyorsanız aynı TextBox’ın Leave olayını temsil eden(yani Leave olayı
meydana geldiğinde işletilen) metodu aşağıdaki gibi düzenleyebilirsiniz.

private void textBox1_Leave(object sender, EventArgs e)


{
textBox1.BackColor = Color.White;
}
Bazen istenen miktarda bilgi girmediği için kullanıcının TextBox’tan
ayrılmasına izin verilmek istenmez. Bu gibi durumlarda Validated olayından
yararlanılır. Kullanıcı TextBox’ı boş geçmek istediğinde buna izin vermemek
için TextBox’ın Validated olayını temsil eden metodu aşağıdaki gibi
düzenledim. Bu metotta kullanılan Focus() metodu ile formdaki istenen
nesnenin üzerine gidilebilmektedir.

private void textBox1_Validated(object sender, EventArgs e)


{
if (textBox1.Text == "")
{
MessageBox.Show("Bu alanı boş geçemezsiniz");
textBox1.Focus();
}
}
120 Memik Yanık - Visual C#’a Başlangıç Kitabı

Projeler Đçin 2. Form Hazırlamak

Yukarıdaki sayfalarda işaret edildiği gibi Express Edition ile gelen Windows
Forms Application şablonu ile hazırlanan projeler “Form1” adında bir
forma sahip olmakta ve bu form projenin başlangıç formu olmaktadır.
Projenizde 2. bir formun olmasını istiyorsanız Express Edition’nın Project
menüsünden Add Windows Form komutunu verip ekrana aşağıda verilen
Add New Item diyalog kutusu getirmelisiniz.

Bu diyalog kutusunda üzerinde çalıştığınız projeye kod dosyaları, formlar vs


eklerken kullanabileceğiniz şablonlar listelenmektedir. Projeye normal bir
form eklemek istediğim için Windows Form şablonunu seçtim. Bu diyalog
kutusunda kod dosyasına vereceğiniz ad aynı zamanda hazırlanacak sınıfın
yani formun adı olarak kullanılmaktadır. Üzerinde çalıştığım projeye Form2
adında ikinci bir form ekleyince Express Edition penceresi aşağıda verilen
şekle dönüştü.
Bölüm 6: Windows Forms Uygulamaları 121

Add New Item diyalog kutusundaki Windows Form şablonundan yararlanıp


üzerinde çalıştığım projeye Form2 adında 2. form dahil edince bu formu
temsilen ikisi kod dosyası olmak üzere toplam 3 dosya hazırlandı.
Form2.Designer.cs dosyasında formun görsel yapısı ile ilgili kodlar
bulunurken “Form2.cs” dosyasında ise programcının yazdığı satırlar
olmaktadır.

Şimdi projedeki 2. formu başlangıç formu olarak ayarlayacağım. Başka bir


deyişle proje çalıştırıldığı zaman ekrana 2. formun gelmesini sağlayacağım.
Bu amaçla Program.cs dosyasındaki Main() metodunda Applicaiton
sınıfının Run() metoduna parametre olarak Form1 sınıfının örneği yerine
Form2’nin örneğini parametre olarak verdim.

static void Main()


{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form2());
}

Projeki 2. Formu Ekrana Getirmek

Projenizdeki ikinci formu yani başlangıç formu olarak kullanılmayan formu


ekrana getirmek istiyorsanız bazı hazırlıkları yapmanız gerekir. Üzerinde
çalıştığım projedeki 2. formu ekrana getirirken kullanmak üzere ilk forma bir
düğme yerleştirdim ve bu düğmenin Click olayını temsil etmek üzere
aşağıda verdiğim metodu hazırladım. Bu metoda yazdığım satır ile Form2
sınıfından yola çıkılarak “ikinci_Form” adında bir nesne hazırlanmaktadır.
Bakmayın siz başka kitaplarda bu işleme “yavru(m) değişken tanımlama”
demelerine burada Form2 sınıfının örneği hazırlanmaktadır, yani nesne
hazırlanmaktadır.

private void button1_Click(object sender, EventArgs e)


{
Form2 ikinci_form = new Form2();
}

Yukarıdaki sayfalarda belirtildiği gibi herhangi bir Class’ın(burada Form2)


örneği hazırlanırken new anahtar kelimesi kullanılmaktadır. new anahtar
kelimesinden sonra ilgili sınıfın yapıcı yani constructor metodunu
kullanmak gerekiyor. Yukarıdaki sayfalarda belirtildiği gibi sınıfların yapıcı
metoduna sınıfın adı verilmektedir. Buna göre Form2 sınıfının yapıcı
metodunun adı “Form2()” olmaktadır. C# programlama dilinde metotlar
kullanılırken metot adına “()” eklenmektedir.

Bazı yazarlar bir sınıfın örneğini almaya yavru değişken tanımlama


diyorlar. Tabii bazılarınızın aklına yavru değişken olduğuna göre torun
122 Memik Yanık - Visual C#’a Başlangıç Kitabı

değişken nasıl tanımlanır sorusu gelmiş olabilir. Size bir tiyo: Dünyanın en
zor işlerinden birisi nesneye yönelik programcılık kavramlarına sahip
olmadan C# gibi %100 nesneye yönelik programlama dilini anlatmaya
soyunmaktır.

Bu metoda yazdığım satırda gerçekte 2 işlem yapılmaktadır. Đlk işlemde


Form2 tipinde değişken tanımlanmaktadır. 2. işlemde ise new anahtar
kelimesi ile Form2 sınıfının yapıcı metodu işletilip bu metodun geriye
gönderdiği nesne örneği(daha doğrusu nesnenin referansı) tanımlanan
değişkene aktarılmaktadır.

Bu şekilde hazırlanan Form2 tipindeki nesne Show() metodu ile ekrana


getirilir. “Form” sınıfının Show() metodunun nasıl kullanıldığını aşağıda
görebilirsiniz. 2 form içeren proje başlatıldığında projenin ilk formunun
kendiliğinden ekrana geldiğini biliyorsunuz.

private void button1_Click(object sender, EventArgs e)


{
Form2 ikinci_form = new Form2();
ikinci_form.Show();
}

Bu kodda Form2 sınıfının örneğinin referansını tutacak değişkene ikinci_form


adını verdim. Olur ya yerli yazarın birisi de kitabında ikinci_form adında bir
değişken tanımlamıştır. Tedbir almazsam değişken adı çalmakla
suçlanabilirim. “değişken adı çalmış mı” sorusuna cevap aramak amacıyla
bu metni okuyacaklara rehber olması bakımından yukarıda verdiğim kodu
bir de aşağıdaki gibi düzenledim. Yani böylece değişkenlere ad seçerken
çaresiz kalıp başka kitaplardan değişken adı çalmayı tercih etmediğimi
bilgisayar tahsili yapmış öğretim üyelerine, bilen kişilere ve yerli yazarlara
kanıtlamış oluyorum.

private void button1_Click(object sender, EventArgs e)


{
Form2 ikinci_kazma = new Form2();
ikinci_kazma.Show();
}

Böylece değişkenlere ad bulabildiğimi kanıtladıktan sonra konumuza devam


edebiliriz. Ekranda 2. form varken yukarıda verilen kod işletildiğinde, yani
formdaki düğme tekrar tıklandığında aynı formun 2. veya 3. kopyası ekrana
getirilir. Projedeki 2. formun 2. ve 3. kopyasının aynı anda ekrana gelmesini
engellemek için kullanılabilinecek değişik teknikler olmakla birlikte ilk aklıma
geleni yazacağım. Bu amaçla yukarıda hazırladığım kodu değiştirip Show()
metodu yerine ShowDialog() metodunu kullandım.
Bölüm 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 kapatılmadan projenin ana


formuna geçilemez. Formları ShowDialog() metodu ile ekrana getirmenin bir
diğer özelliği ise şudur: ShowDialog() metodu ile ekrana getirilen form
normal bir şekilde yani Kapat düğmesi tıklanarak kapatıldığında bellekten
yok edilmeyip gizlenmektedir.

Bu sorunun önüne geçmek, başka bir deyişle hem 2. formu Show() metodu
ile ekrana getirmek hem de ekranda aynı anda 2. kopyasının olmasını
engellemek için değişken tanımlama satırı düğmeye ait Click() metodunun
dışına alınabilinir. Aşağıda verilen kodda bu işlemi nasıl yaptığımı
görebilirsiniz.

Yukarıda verdiğim kodda “ikinci_form” adındaki değişkeni button1_Click()


metodu sınırları içinde tanımladığım için bu değişken yani nesne ancak bu
metodun sınırları içinde yaşar. Aşağıda verdiğim kodda ise bu değişkeni
metodun sınırları dışına, başka bir Class bloğuna aldığım için bu nesne bu
Class’ın her yerinde yaşar.

Form2 ikinci_form = new Form2();


private void button1_Click(object sender, EventArgs e)
{
ikinci_form.Show();
}

Bu şartlarda formdaki düğmeyi tekrar tıklasanız bile projedeki 2. form tekrar


ekrana getirilmez. Ancak bu şekilde ekrana getirdiğiniz 2. formu kapattıktan
sonra Show() metodu ile tekrar ekrana getirmek istemeniz halinde hata
meydana gelir. Çünkü bu şekilde hazırlanıp Show() metodu ile ekrana
getirilen form normal bir şekilde kapatıldığında otomatik olarak bellekten
silinir. Dolayısıyla yok edilen form tekrar ekrana getirilemez.

Projedeki 2. formun ekrana getirilmesi sırasında yaşanan bütün sorunların


önüne geçmek için formu oluşturan ve Show() metodu ile ekrana getiren
satırları aynı metoda yazdım ama form nesnesini new anahtar kelimesi ile
tekrar oluştururken mevcut olup olmadığını araştırdım. Söz konusu form
henüz oluşturulmadıysa null olmaktadır.
124 Memik Yanık - Visual C#’a Başlangıç 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();
}
}

Yukarıdaki sayfalarda yazılanlara göre projede kaç form olursa olsun


“Program.cs” dosyasında bu formlardan birisinin örneği new anahtar
kelimesi ile hazırlanıp Application nesnesinin Run() metoduna parametre
olarak verilmektedir. Program.cs dosyasında new anahtar kelimesini birden
fazla kez kullanıp farklı sonuçlar elde edebilirsiniz. Bu konuda bilgi vermek
için 2 forma sahip yeni bir proje hazırladım ve Program.cs dosyasındaki
Main() metodunu aşağıdaki gibi düzenledim.

static void Main()


{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
Application.Run(new Form2());
}

Bu şartlarda proje çalıştırılırsa Run() metodunun kullanıldığı ilk satırda


projenin ilk formu ekrana getirilir. Đlk form kapatıldığında Run() metodunun
2. kez kullanıldığı satır işletilir ve 2. form ekrana getirilir. Bu şartlarda
Form2 kapatıldıktan sonra projenin çalışması sona erer.

Formları Kapatmak ve Projelerin Çalışmasını Sona Erdirmek

Projenizin başlangıç formunu kapattığınızda ister o sırada açık olan başka


form olsun ister olmasın projenin çalışması sona erer. Đster projenin
başlangıç formu ister diğer formlar kapatılmak istensin kapatılma öncesi
FormClosing olayı meydana gelmektedir. Bu olay meydana geldiği zaman
işletilecek bir metot hazırlayarak kullanıcıyı uyarabilir veya formun
kapatılmasını engelleyebilirsiniz.

Bu amaçla Properties penceresinde projenin ilk formunun özellikleri


listelenirken Events sekmesine geçtim ve FormClosing olayını çift tıklayıp
Express Edition’nın aşağıdaki gibi bir metot hazırlamasını sağladım.

private void Form1_FormClosing(object sender, FormClosingEventArgs e)


{
}
Bölüm 6: Windows Forms Uygulamaları 125

Metodun yapısı incelendiğinde birisi object tipinde diğeri


FormClosingEventArgs tipinde 2 parametreye sahip olduğu görülür.
Kullanıcı formu kapatmak isteyip FormClosing olayının meydana gelmesine
neden olduğunda metotta “e” adı verilen FormClosingEventArgs tipindeki
parametreden yararlanıp formun kapatılmasını kullanıcının onayına
bağlayabilirsiniz. Bu işlemin nasıl yapıldığını anlatmak için bu metodu
aşağıdaki gibi düzenledim.

private void Form1_FormClosing(object sender, FormClosingEventArgs e)


{
DialogResult Sonuc;
Sonuc=MessageBox.Show("Pencere kapatılsın mı?",
Kapatma", MessageBoxButtons.YesNoCancel);
if (Sonuc == DialogResult.No || Sonuc == DialogResult.Cancel)
{
e.Cancel = true;
}
}

Bu kodda önce DialogResult tipinde bir değişken tanımladım. Çünkü


kullanıcıdan onay alınırken kullanılan MessageBox sınıfının Show() metodu
geriye DialogResult tipinde bilgi göndermektedir. Bu metotta MessageBox
sınıfının Show() metodunun 3 parametreli sürümünü kullandım. 3.
parametre olarak MessageBoxButtons.YesNoCancel kullanarak ekrana
getirilecek diyalog kutusunda Evet, Hayır ve Đptal düğmelerinin olmasını
sağladım.

MessageBox sınıfının Show() metodu ile ekrana getirmek istediğim diyalog


kutusunda Durdur, Yeniden Dene ve Yoksay düğmelerinin olmasını istemiş
olsaydım 3. parametre olarak MessageBoxButtons.AbortRetryIgnore
sabitini kullanırdım. MessageBox sınıfının Show() metodu, tıklanan düğmeye
bağlı olarak geriye DialogResult tipinde bir değer göndermektedir. Geriye
gönderilen bilgiyi öğrenmek için “Sonuc” değişkenin içeriğini kontrol edip
kullanıcı hayır veya iptal düğmesini tıkladıysa metodun
FormClosingEventArgs tipindeki 2. parametresinin Cancel özelliğini True
yapıp formun kapatılmasını engelledim.

Kullanıcı MessageBox sınıfının Show() metodu ile ekrana getirilen diyalog


kutusunda Evet düğmesini tıklarsa “if” deyimi ile yapılan karşılaştırma doğru
değerini vermeyeceği için “e” adlı parametrenin Cancel özelliği false olarak
kalmaya devam edeceği için formun kapatılmasının önüne geçilmemiş
olunur.

Yukarıda işaret edildiği gibi projenizin başlangıç formunu kapatmanız


halinde projenin çalışması sona ermektedir. Varsayalım ki karşınızda
projenizin başlangıç formu yok ve siz projenin çalışmasını sona erdirmek
istiyorsunuz. Bu durumda önce başlangıç formunu aktif form yapıp sonra
126 Memik Yanık - Visual C#’a Başlangıç Kitabı

kapatırsınız. Projenizin çalışmasını sona erdirirken Application sınıfının Exit()


metodundan yararlanabilirsiniz. Bu metodun nasıl kullanıldığını anlatmak
için forma “Cikis” adında bir düğme yerleştirip bu düğmenin Click olayını
temsil eden metodu aşağıdaki gibi düzenledim.

private void Cikis_Click(object sender, EventArgs e)


{
DialogResult onay;
onay = MessageBox.Show("Projeden Çıkılsın mı?",
"Onay Kutusu", MessageBoxButtons.YesNo);
if (onay == DialogResult.Yes)
{
Application.Exit();
}
}

Bu metotta önce DialogResult tipinde bir değişken tanımladım. Ardından


kullanıcıdan programdan çıkılıp çıkılmayacağı konusunda MessageBox
sınıfının Show() metodu sayesinde onay alınmaktadır. Show metodu bu
şekilde kullanıldığında ekrana getirilecek diyalog kutusunda Evet veya Hayır
düğmeleri olur.

Kullanıcı bu diyalog kutusundaki Evet düğmesini tıklarsa “onay” değişkenine


“DialogResult.Yes” bilgisi, Hayır düğmesini tıkladığında ise “DialogResult.No”
bilgisi aktarılır. “onay” adını verdiğim değişkenine "DialogResult.Yes" sabiti
aktarılmışsa if deyimine parametre olarak verilen karşılaştırmanın sonucu
doğru olur ve “{“ ile “}” işaretleri arasında bulunan satır işletilir ve
Application.Exit(); satırı ile projenin işletimi sona erdirilir

PictureBox Konrolü

.NET Framework ile gelip Visual Studio ve Express Edition’nın Toolbox’ında


yer alan çok sayıda kontrol bulunmaktadır. Gerçekte birer sınıf olan bu
kontrollerin her birisinin farklı işlevleri vardır. Bu kitapçıkta ancak birkaç
kontrolden söz edebildik. Programcılığa henüz adım atanların ilgisini çeken
kontrollerden birisi PictureBox olduğu için kısaca PictureBox’tan söz
edeceğiz. Bu amaçla Toolbox’tan yararlanıp üzerinde çalıştığım projenin
formuna PictureBox nesnesi yerleştirdim.
Bölüm 6: Windows Forms Uygulamaları 127

Forma PictureBox nesnesini yerleştirdikten sonra PictureBox tarafından


sınırlanan alanda istediğiniz resim dosyasının içeriğini görüntüleyebilirsiniz.
Bu işlemi Properties penceresinde yapmak yerine kod yazarak yapacağım.
Bu amaçla forma Button nesnesi yerleştirip bu düğmenin Click olayı ile
ilişkilendirdiğim metodu aşağıdaki gibi düzenledim.

private void resim_sec_Click(object sender, EventArgs e)


{
pictureBox1.Image= System.Drawing.Bitmap.FromFile("C:\\jazz.jpg");
}

Bu metoda yazdığım satırda System.Drawing’de bulunan Bitmap sınıfının


FromFile() metodu ile ilgilendiğim jpg dosyasını okuyup PictureBox
nesnesinin Image özelliğine aktardım. Express Edition ve Visual Studio ile
hazırlanan projelerde System.Drawing adlı namespace kod dosyasının
başında using deyimi ile kullanılacak sınıfların aranacağı listeye dahil
edildiği için Bitmap sınıfından önce namespace adını yazmayabilirdim.
Burada dikkat edilmesi gereken bir nokta var: C#’ta “\” karakteri özel bir
karakter olduğu için çift “\\” kullanmak gerekiyor.

PictureBox’ta görüntülenecek dosyayı çalışma anında seçebilmek için forma


ayrıca bir OpenFileDialog nesnesi yerleştirdim. OpenFileDialog nesnesi
çalışma anında formun üzerinde görünmediği, başka bir deyişle görsel bir
kontrol olmadığı için formun altında hazırlanan panele yerleştirilmektedir.
128 Memik Yanık - Visual C#’a Başlangıç Kitabı

Çalışma anında kullanıcı formdaki düğmeyi tıkladığında ekrana dosya seçimi


yapılan diyalog kutusunu getirmek ve seçilen dosyayı PictureBox’ta
görüntülemek için yukarıda verdiğim kodu aşağıdaki gibi düzenledim.

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 tanımladığım değişken ve nesnelere verdiğim adlar(resim_sec,


Sonuc ve Dosya) herkesin aklına gelebilecek birer değişken adı olduğu için
“değişken adı hırsızı” olarak anılmam an meselesidir. Bu nedenle yani bu
kodda tanımlanan değişkenlere başka adlar verilse bile kodun çalışacağını
kanıtlamak için bu kodu bir de aşağıdaki gibi düzenledim.

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


değişken tanımladım. Bu değişkenden dosya seçilen diyalog kutusunu
kullanıcının hangi düğme ile kapattığını öğrenirken yararlanacağım.
Devamında OpenFileDialog nesnesinin Filter özelliğini ayarladım. Bu
ayarlama sayesinde OpenFileDialog nesnesi ile ekrana getirilecek diyalog
kutusunda yalnızca geçerli klasördeki JPG, BMP ve GIF uzantılı dosyaların
listelenmesini sağladım.

FromFile() metodunun işlevi üzerinde düşünmenizi sağlamak için önce bir


Bitmap tipinde bir değişken tanımladım. Devamında FromFile() metodu ile
okuduğum resim dosyasını Bitmap nesnesine, oradan da PictureBox’a
aktarmaya çalıştım.
Bölüm 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 bakışta bu 3 satırlık koddan sonuç alınabileceği sanılabilir. Gerçekte bu


kod hataya neden olur. Çünkü Bitmap sınıfının FromFile() metodu geriye
Image tipinde nesne göndermesine rağmen Bitmap tipindeki değişkene
aktarmaya çalıştık. Yukarıda FromFile() metodunun geriye gönderdiği
nesneyi direk PictureBox’ın Image tipindeki Image özelliğine aktardığımız
için sorun yaşamamıştık. Bu 3 satırlık kod aşağıdaki gibi düzenlenirse hata
meydana gelmez.

private void resim_sec_Click(object sender, EventArgs e)


{
Image resim;
resim = Image.FromFile("C:\\jazz.jpg");
pictureBox1.Image = resim;
}

Programcıların en çok gerek duydukları işlemlerden birisi tipler arasında


dönüştürme yapmaktır. Image tipindeki nesneyi Bitmap tipindeki nesneye
aktarmak için bu kodu değiştirip Bitmap tipinde değişken tanımlayıp
FromFile() metodunun geriye gönderdiği Image tipindeki nesneyi
dönüştürüp Bitmap tipindeki değişkene aktardım.

private void resim_sec_Click(object sender, EventArgs e)


{
Bitmap resim;
resim = (Bitmap)Bitmap.FromFile("C:\\jazz.jpg");
pictureBox1.Image = resim;
}

Burada 2. satırdaki “(Bitmap)” ile söz konusu bilgi Bitmap tipine


dönüştürülmektedir. Đlgilenilen nesne hangi tipe dönüştürülmek isteniyorsa
o tip parantezlerin içinde dönüştürülmek istenen nesnenin önüne
yazılmalıdır. Burada kafaların karışmasına neden, Bitmap sınıfının
FromFile() metodunun geriye Bitmap yerine Image tipinde bilgi
göndermesidir. Bitmap sınıfının FromFile() metodu yerine Image sınıfının
FromFile() metodunu kullansaydım dönüştürme 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 Yanık - Visual C#’a Başlangıç Kitabı

Dönüştürme işleminin anlaşılmasına katkı olması için şimdi de ICO uzantılı


bir dosyayı PictureBox’ta görüntüleyeceğim. Bu amaçla hazırladığım kodu
aşağıda görebilirsiniz. System.Drawing’de yer alan Icon sınıfının Bitmap ve
Image sınıflarında olduğu gibi FromFile() gibi bir metodu olmadığı için
ilgilendiğim ico uzantılı dosyayı Icon sınıfının yapıcı 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 bakışta bu kodun hatasız çalışıp Icon tipindeki nesnenin Image tipine
dönüştürülüp PictureBox’ta görüntüleneceği sanılabilir. Ne ki burada
yapıldığı gibi icon tipindeki nesneyi Image nesnesine dönüştürmek mümkün
olmadığı için Icon sınıfının ToBitmap() metodundan yararlanmak gerekiyor.
Bu metodun nasıl kullanıldığını aşağıda görebilirsiniz.

private void resim_sec_Click(object sender, EventArgs e)


{
Icon ikon = new Icon("C:\\kapat.ico");
pictureBox1.Image = ikon.ToBitmap() ;
}
Bölüm 6: Windows Forms Uygulamaları 131

C# 3.0 Kitabım Hakkında

Aslında bu kitap üzerine konuşmadan önce yayınlanmış başka C# kitaplarını


incelemiş olsaydım bu kitabın farkını daha rahat ortaya koyabilirdim. Ne var
ki i, j, şayi1, sayi2 gibi değişkenleri çalmakla suçlanıp dava edildiğim
günden bu yana Türk yazarlar tarafından kaleme alınmış kitaplara mümkün
mertebe bakmıyorum. Tabi bazılarınız hemen beni uyaracaklardır: Türk
yazarlar tarafından kaleme alınmış kitapları incelemeden "değişken adı
benzerliği" kabahatinden kendini nasıl korursun? Valla keçeyi bir kez suya
attık ve değişken çalmakla suçlanıp hakim karşısına çıktığıma göre cesur
olmaktan başka çare yoktur. Eklemem gerek: Değişken adı çalmakla
suçlanmama neden olan sizlersiniz. Eğer beni dava eden ve şahane kitaplar
yazan saygıdeğer yazarların programcılık kitaplarını üçer beşer satın
alsaydınız şu anda mahkemelerde sürünmezdim. Size önerim Memik
Yanık'ın hepsiburada.com'dan veya kitapyurdu.com'da bulacağınız kitabı
yerine Memik Yanık'ı değişken çalmakla suçlayıp dava eden yazarların
şahane C# kitaplarını en azından ikişer adet satın almanızdır.

Biliyorsunuz C# 3.0 kitabım biraz gecikmeyle bir süre önce yayınlandı.


Bilmeyenler için hatırlatmak gerekirse gecikme nedeni kitapta değişken adı
tadilatına(!) gitmiş olmamdır. Madem kitapta verdiğim kısa kısa kodlarda
değişken adı ve nesne adı benzerliği kabahatini işlememek için kitabı yeni
baştan düzenlemek gerekti. Ben de kitaba birkaç yeni bölüm ekleyip bazı
konulara ayrılan sayfaların sayısını azalttım. Bununla da yetinmedim;
şartları zorlayıp kenar boşluklarını azaltıp kitapta daha çok konuya yer
vermeye çalıştım. C# 3.0 üzerine yazdığım bu kitabın nasıl bir kitap
olduğunu, nasıl bir anlatım biçimine sahip olduğunu merak edenler bu
kitaptan alıp kişisel web sitemde daha önce yayınladığım Hata Yakalamak
ve Exception Sınıfları ile C# Uygulamalarında Word’den Yararlanmak
adlı makalelerime bakabilirler. Tabii C# konusunda henüz yolun başında
olanların bu makalelere bakıp kitap hakkında değerlendirme yapmaları zor
olacağı için kitap hakkında biraz konuşacağım.
132 Memik Yanık - Visual C#’a Başlangıç Kitabı

Meraklılara önerim şudur: Bütün web sitelerini gezin, sizde veya


arkadaşlarınızdaki bütün C# konulu kitapları elinize alın ve C# uygulamaları
dahilinde Word'den nasıl yararlanıldığını anlatan metinlere bir bakın. Sonra
da yukarıda verdiğim linkte bu kitabın ilgili bölümüne şöyle bir göz gezdirin.
Memik Yanık'ın anlatımında bir fark göremiyorsanız "Ne de olsa bu adam i,
j, sayi1, sayi2, deger gibi değişkenlerin adını çalmış birisi" deyip bu kitaptan
uzak durun. Kitabın bir bölümüne bakıp değerlendirme yapmak yanıltıcı
olabilir diyorsanız bir de Hata Yakalamak ve Exception Sınıfları adlı bölüme
bakın. Yok hayır Đngilizcesi yeterli olmayan Memik Yanık çeviri yapmıştır
diyorsanız şu linkteki Programcılar Đçin Yazarlık Dersleri adlı e-book'u biraz
inceleyin derim. Bu e-book'tan bilgisayar ve programcılık üzerine yazmayı
düşünen arkadaşlarınıza söz etmeyi unutmayın.

Bu kitabı yazarken ağırlıklı olarak Visual Studio kullanmış olsam bile Visual
Studio yerine C# için hazırlanmış olan Express Edition kullananlar
herhangi bir zorluk çekmezler. Ötesi bazı yüksek okullarda verilen C#
Bölüm 6: Windows Forms Uygulamaları 133

derslerinde başlangıçta konsol uygulamaları tercih ediliyor. Bu nedenle bazı


arkadaşlarımız gidip C# anlatılırken yalnızca konsol uygulamalarının
kullanıldığı kitapları tercih ediyorlar. En başta belirtmeliyim ki bu kitapta
konsol uygulamaları hakkında yeterince bilgi vardır.

En kapsamlı Türkçe C# kitabı iddiası ile hazırladığım bu kitapta bazı


konularda ayrıntıya giremedim. Örneğin Generic sınıfları kabul edilebilir bir
ayrıntıda anlatabilmem için kitaba en az 50 sayfa daha eklemem gerekirdi.
Kitapta giriş düzeyinde bilgi verilen bir diğer konu LINQ teknolojisidir.
Yurtdışında yalnızca LINQ hakkında bilgi içeren çok sayıda kitabın
yayınlandığını söylersem ne demek istediğim sanırım anlaşılır. Kısaca
anlatmak gerekirse; C# öğrenmeye bu kitapla başlayanları veya C#
konusunda kendini geliştirmek isteyenleri temelden alarak C# ve .NET
programcılığı uzmanlık düzeyine çıkarmayı hedefledim.

Bu kitabın farkı nedir diye soracaklara vereceğim cevap şudur: Bu kitapta


bütün konular ilk okumada anlaşılacak yalınlıktadır. Hayır hayır bu yalınlık
yalnızca değişken tanımlama, Integer bilgiyi String bilgiye dönüştürmenin
nasıl anlatıldığı sayfalarla sınırlı değildir. Örneğin bu kitapta Windows
Mesajları adlı bölümde anlatılanlar da ilk okumada anlaşılacak yalınlıktadır.
Benzer şeyler Garbage Collector hakkında yazılanlar için de geçerlidir.
Kolay okunmanın, hemen anlaşılmanın formülü nedir diye merak edenler
Yazarlık Dersleri adını verip sizlerle paylaştığım e-book’a bakabilirler.

Bu kitabı edinmek isteyenler seckin.com.tr'den, hepsiburada.com'dan veya


kitapyurdu.com'dan talep edebilirler. Bu kitabın fiyatı hakkında
değerlendirme yapmak isteyenlere kitabın fiyatını toplam sayfa sayısına
bölüp sayfa başına ne ödediklerini öğrenmelerini önermek isterim. Kitap
fiyatları konusunda bir cümle daha : Satın aldığınız kitaba(yayınlanmasının
üzerinden yıllar geçmemişse) ödediğiniz ile, kitabın kapak fiyatı arasında
uçurumlar yani %30, %40 gibi farklar varsa kitabın kapak fiyatı pazarlama
taktiği olarak yüksek seçilmiştir denilebilir. Bir kitap satış sitesi kitabın
kapak fiyatı üzerinde %15-20 indirim yapması son derece normaldir.
134 Memik Yanık - Visual C#’a Başlangıç Kitabı

C# 3.0 Kitabımı Anlattım

Bu yazının amacı bu kitabın satışını arttırmak değildir. Bu yazının amacı olsa


olsa böyle bir kitaba ihtiyacı olmayanların bu kitabı satın alıp para ve zaman
kaybetmelerinin önüne geçmek olabilir. Her ne kadar bu kitap .NET 3.5
destekli C# 3.0’ı anlatmak kaygısı ile kaleme alınmış olsa bile C# 3.0
piyasaya verileli az olmadı. Bu bilgiyi şunun için yazdım: Mevcut bir işletim
sisteminin veya bir programlama dilinin yeni sürümü çıktığında özellikle yurt
dışında sıcağı sıcağında yeni sürümle gelen yeniliklere odaklanan kitaplar
yazılıp yayınlanmaktadır. Böyle kitaplar eski sürüm hakkında bilgisi olup
yeni sürümle gelen yeni özellikler hakkında hemen bilgi edinmek isteyenlere
uygundur. En başta söylemeliyim ki bu kitap C# 3.0 ve .NET 3.5’la gelen
yenilikleri anlatmak kaygısı ile kaleme alınan bir kitap değildir. Başka bir
deyişle bu kitabın hedef okuru programcılık nedir az çok bilip C# ve nesneye
yönelik programcılıkta uzman olmayı kafasına koyanlardır. Bu nedenledir ki
bu kitapta konular temelden ele alınarak 1100 sayfa boyunca C# anlatıldı.
C# anlatılırken .NET Framework 3.5 ile gelen C# 3.0 derleyicisi ve Visual
Studio 2008 kullanıldı. Bu yazıda asıl bu kitapta C#’ı nasıl anlattım sorusuna
cevap aramaya çalışacağım.

Elbette C# uygulamaları geliştirmek için kullanılan bilgisayara .NET


Framework kurulup Not Defteri programı ile istenen programları yazmak
mümkün olsa bile bu zahmetlidir. Bu nedenle C# veya .NET uyumlu başka
bir programla diliyle uygulama geliştirmek isteyenler Visual Studio’yu veya
C# için hazırlanmış Express Edition’ı kullanmayı tercih ediyorlar. Bu
nedenledir ki bu kitabın başında 18 sayfa boyunca Visual Studio ile
hazırlanan C# uygulamalarının temel özellikleri ve bu uygulamaların nasıl
derlenip çalıştırıldığı ve nasıl debug edildiğinden kısaca söz edildi. Đşte bu
kitabın ilk bölümüyle ilgili olarak kitaptan alınmış bir paragraf : “Bu bölümde
ileride işlenecek bazı konulara temel oluşturan birkaç ayrıntıdan söz
edilmektedir. Aslında C# programlama dilinden bağımsız olarak Visual
Studio hakkında yüzlerce sayfa yazılabilir. Ne ki bu kitabın böyle amacı
yoktur.” Kitabın içindekiler sayfasına bakıp “bu kitabın 18 sayfası ekran
görüntüleriyle doldurulmuş” diye eleştireceklere şunu söylemek isterim: Đlk
bölümde Visual Studio’nun yardımıyla uygulama geliştirilirken karşılaşılan en
önemli kavramlardan birisi olan Debug ve Release modlarından söz
edilmektedir.

Bu kitabın C# ile Programcılığa Giriş adlı 2. bölümünde C# ve nesneye


yönelik programcılık hakkında kuşbakışı bilgi verilmektedir. Bu sayede
okurun C# ve nesneye yönelik programcılık hakkında temel bilgilere sahip
olması hedeflendi. Bu kitabı incelemeden eleştirmeyi kafalarına koymuş
olanlara şunu söylemek isterim:Memik Yanık’ın C# 3.0 kitabının 36
sayfadan meydana gelen Programcılığa Giriş adlı 2. bölümünü okuyanlar
metotlarla olayları karıştırmazlar, Application sınıfının işlevinden bi haber
Bölüm 6: Windows Forms Uygulamaları 135

olmazlar, formların nasıl hazırlanıp ekrana getirildiğini bilirler. Aşağıda


verdiğim paragrafı kitaptan olduğu gibi buraya aldım: “Daha önce az çok
kod yazmış olanlar bir sonraki bölüme şöyle bir baktıklarında bütün
yazılanların bildikleri konular olduklarını sanabilirler. Sanabilirler diyorum
çünkü bir sonraki bölümde C# ile program yazılırken gerek duyulan pek çok
kavram hakkında teknik açıklamalar yapılmaktadır. Bu nedenle bu kitabı
eline alan herkesin bir sonraki yani 2. bölümü dikkatli okumasını
öneriyorum. Tabii bu öneri kitapçıda veya herhangi bir yerde bu kitabı satın
almayacakları önceden belli olup ta meraktan bu kitabı şöyle bir gözden
geçirenleri veya C# hakkında yeterince bilgisi olanları kapsamıyor. Böyle bir
kitaba ihtiyaçları olmayanların bir sonraki bölümde yazılanlara yabancı
olmamaları normaldir. Bir sonraki bölümün gerek içerik gerekse de
konuların işleyişi bakımından bütün yerli yabancı kaynaklardan ayrıldığını
söyleyebilirim.” Elbette bu kitabın 2. bölümünde yazılanların bir kısmının
başka kaynaklarda bulunma ihtimali yüksektir. Programcılık kitaplarında
bilim yapmadığımıza göre bu kitapta anlatılan her konunun başka kaynakları
bulunması son derece normaldir. Kitapların arasındaki en önemli fark
konuların anlatım biçimi ve hikâye edilme tarzıdır.

Gelelim bu kitabın Konsol Uygulamaları adlı 2. bölümüne. Bir sonraki


bölüm bir bakıma Programcılığa Giriş adlı 2. bölümün devamı gibidir. Çünkü
Konsol Uygulamaları adını verdiğim 3. bölümde C# kodu yazılmak
istendiği zaman “ilk” gerek duyulacak kavramlar ve en çok kullanılan .NET
sınıflarını anlatmaya çalıştım. Her ne kadar konsol uygulaması geliştirip
başkasına verme ihtimaliniz düşük olsa bile bir sonraki bölümde C# ile
program yazmanın geri planı üzerinde biraz durulmaktadır. Tabii bununla da
yetinilmeyip Konsol Uygulamaları dahilinde Windows Formlarının nasıl
ekrana getirilebileceği anlatılarak referans ve namespace kavramları
hakkında ön bilgi verilmeye çalışılmaktadır. Yine bazı arkadaşlar “madem
Windows formuna gerek duyuyorsun da neden konsol uygulaması
hazırladın” diye sorabilirler. Bu soruyu soran arkadaşlara aşağıda 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 Yanık - Visual C#’a Başlangıç Kitabı

Sizce Memik Yanık konsol uygulamasının Main() metodunu bu şekilde


düzenlemekle neyi hedeflemektedir? Sizce hangi kaynakta(yerli yabancı fark
etmez) Form nesnesi Application sınıfından yararlanılmadan Show()
metodu ile ekrana getirilmeye çalışılmıştır? Hayır hayır Memik Yanık
Amerika’yı yeniden keşfetmiyor; Memik Yanık’ın burada yaptığı okurun
dikkatini Application sınıfının işlevine çekmektir. Sizce Application sınıfı
hakkında yeterince bilgi edinmemiş birisi Windows mesajlarını hakkıyla
anlayabilir mi?

Gelelim bu kitabın 4. bölümde anlatılan şu Namespace kavramına. Her ne


kadar bu kitabın 2. ve 3. bölümlerinde referans ve namespace’lerden söz
edilmiş olsa bile .NET programcılığında henüz yolun başında olan birisi için
Namespace kavramı hakkıyla öğrenmesi gereken kavramlardan birisidir.
Tabi henüz yolun başında olan birisine namespace kavramını en başta
anlatacağım deyip kafasını karıştırmamak gerekir. Bu düşünce ile
namespace’ler hakkında bilgi vermeye kısıtlı bir konsol uygulaması
hazırlayarak başladım. Çünkü C# derleyicisinin derleme yaparken neyin sınıf
neyin namespace olduğuna karar verirken nasıl bir yöntemi kullandığının
bilinmesi gerekiyor. Bu nedenle Memik Yanık’ın kitabında derleme hakkında
bilgi verirken “System.dll” ve “System.core.dll” adlı referanslardan söz etti.
Namespace adlı bölümün ileri ki sayfalarında .NET Framework ile gelen
Namespace’lerdeki sınıfları kullanmaktan öte programcıların kendi sınıflarını
nasıl namespace olarak düzenleyebileceklerinden söz edildi. Tabii ki C#
konulu kitapların hemen hepsinde nasıl namespace hazırlandığından söz
edilmektedir.

Memik Yanık’ın C# kitabının 5. bölümünde 36 sayfa boyunca değişkenler


hakkında bilgi verilmektedir. Bazı okurlara göre değişkenlere bu kadar sayfa
ayırmanın gerekçesi nedir diye sorabilirler. Elbette daha önce C# hakkında
az çok bilgi edinmiş olanları göz önüne alırsak değişkenlere daha az sayfa
ayırmak gerekirdi. Örneğin daha önce C# konulu kaynakları okumuş olanlar
değişkenlerin nasıl tanımlanıp nasıl ilk değer aktarıldığını bilirler. Her ne
kadar bu bölümde Nullable tiplerden, Parse() metodundan, Convert
sınıfından söz edilse bile bu kitabı bu bölüm bağlamında değerlendirecek
olursam şunları söyleyebilirim: Bu kitabın bu bölüm bağlamında bir artısı
varsa değişkenlerin bütün yönleri ile ele alınmış olmasıdır. Bu nedenle
değişkenler konusunu bu kitaptan okuyan birisi değişkenlerle ilgili olarak
başka kaynaklara bakma gereğini duymaz. Benzer şeyler bu kitabın 6.
bölümü için de söylenebilir. Çünkü kitabın 6. bölümünde 18 sayfa boyunca
dizi değişkenler ve Array sınıfı her yönüyle en ince ayrıntısına kadar
anlatılmaktadır. Belki bu kitap Değişkenler adlı bölüm bağlamında şöyle
eleştirilebilir: Bu metni biraz kesip, bazı metot ve işlemlerden söz etmeyip
birkaç sayfa tasarruf edebilirdiniz. Ancak ben tercihimi dizi değişkenleri her
yönüyle anlatmak yönünde yaptım. Yani istedim ki bu kitabı edinenler C#’la
ilgili temel konuları öğrenirken başka kaynaklara başvurma gereğini
duymasın.
Bölüm 6: Windows Forms Uygulamaları 137

Şimdi sırada bu kitapta toplam 8 sayfa yer tutan Operatörler adlı bölüm
var. Tabi hemen bazı arkadaşlar 8 sayfa boyunca artı(+), eksi(-), bölme(/)
vs.. operatörlerinden söz etmiş olduğumu düşünebilirler. Bu bölümde bu
operatörlere kısaca değinilmiş olsa bile asıl ağırlık Kaydırma Operatörleri
ile as ve is operatörlerine verildi. Çünkü as ve is operatörleri çok sık
kullanılmaktadır. Devamında 3 sayfa boyunca bit düzeyinde işlem yapılırken
kullanılan operatörlerden söz edildi. Matematiksel işlemlerde kullanılan
operatörler hakkında bu kitapta yazılanlar çıkarılsa bile sayfa sayısı
değişmiyordu. Bit düzeyinde işlem yapılırken kullanılan operatörlerden
yararlanmak son derece teknik bir işlem olmasına rağmen konular öyle
hikaye edildi ki ilk okumada mutlaka anlaşılacak yalınlıktadır.

Bu kitabın Blok Kontrol adlı bölümünde 10 sayfa boyunca if, while, for,
foreach’ten söz edildi. Bu kitabın bu bölüm bağlamında diğer kitaplara bir
artısı pek yoktur. Ancak başlangıçta zor anlaşılan foreach döngüsünü daha
önce hiç duymamış olanlar bile bu kitabın ilgili sayfalarını okuduklarında
foreach döngülerine hemen hakim olabilirler.

Bu kitabın 9. bölümünde 26 sayfa boyunca string işlemlerinden ve Math


sınıfındaki metotlardan söz edilmektedir. Neden mi bu konuyu önemsedim?
Çünkü kod yazılırken en çok yapılan işlemlerin başında string işlemleri
gelmektedir. Elbette String ve Math sınıflarının bazı metotlarını göz ardı edip
bu bölümün sayfa sayısını 22’ye düşürmek mümkündü. Bu durumda C# ile
programcılıkta yeni olan okurların başka kaynaklara başvurma ihtiyacı
olurdu. Açıkçası istedim ki bu kitabı her kim edinirse String ve Math sınıfının
metotları konusunda eksiksiz bilgiye sahip olsun. Örneğin String sınıfının
Splip metodunu ayrıntılı bir şekilde anlattım. Bu kitabın 14 sayfalık 10.
bölümü bir bakıma String Đşlemleri adlı 9. bölümün devamı gibidir. Çünkü
10. bölümde StringBuilder sınıfından ve Düzenli Đfadelerden söz
edilmektedir. Tam bu noktada bu kitabın boyutlarından kısaca söz etmek
istiyorum. Bu kitabın yazı alanın genişliği tam tamına 13 cm’dir. Đsim
vermeye gerek yok aynı genişliğe sahip(16 cm) birçok kitapta yazı alanı
genişliği en fazla 11.5 cm’dir. Asıl demek istediğim şudur: Toplam 1074
sayfa olan bu kitap başka yayınevlerinin ölçüleri ile basılsaydı sayfa sayısı en
az 1200 olurdu. Yani anlayacağınız bu kitabın sayfa sayısını azaltmak sürekli
çaba harcadım.

11. bölümde 16 sayfa boyunca tarih ve zaman bilgileri bütün ayrıntıları ile
anlatılmaktadır. Başka bir deyişle bu kitabı okuyan birisi için tarih ve zaman
bilgileri üzerinde yapılan işlemler bağlamında bilmediği hiçbir ayrıntı kalmaz.
Ayrıca bu bölümü okuyanlar Ticks özelliği ve TimeSpan yapısı hakkında
bilgi sahibi olurlar. Bazı arkadaşlar yine itiraz edip Tarih ve zaman bilgileri
üzerinde yapılan işlemleri anlatmak için 16 sayfa fazla değil mi? Bir görüşe
göre evet. Şartları zorlayıp bu bölümün sayfa sayısını 12 veya 14’e indirmek
mümkündü. Ötesi birçok kitapta bu konuya ayrılan sayfa sayısı üç beştir.
Buna rağmen neden mi bu konuyu bütün ayrıntıları ile anlattım. Çünkü
138 Memik Yanık - Visual C#’a Başlangıç Kitabı

izlediğim forumlarda zaman ve tarihsel bilgiler üzerinde yapılan işlemlerle


ilgili çok sayıda soru sorulmaktadır. Başka bir deyişle her C# programcısının
bu işlemlere ihtiyacı olduğundan herkesin bu işlemler hakkında bilgi sahibi
olması gerekiyor.

Bu kitabın 12. bölümünde toplam 12 sayfa boyunca Pointer değişkenlerden


söz edilmektedir. Son derece teknik bir konu olan Pointer değişkenler
hakkında bu kitapta yazılanlar ilk okumada anlaşılacak yalınlıktadır. Ötesi bu
bölümde IntPtr tipi değişkenlerden söz edilmektedir. Türkiye’de IntPtr tipi
Pointer değişkenlerden ilk söz edenin Memik Yanık olduğunu dikkatinize
sunmak isterim. IntPtr tipi Pointer değişkenler çok mu önemlidir?
Windows’un API adı verilen fonksiyonlarını kullanmayı düşünüyorsanız IntPtr
tipi Pointer değişkenler hakkında az da olsa bilgi sahibi olmak
durumundasınız.

Her ne kadar bu kitabın Programcılığa Giriş ve Konsol Uygulamaları adlı


2. ve 3. bölümlerinde Class kavramından az çok söz edilmiş olsa bile
konunun ayrıntıları 13. bölümden itibaren anlatılmaktadır. Birçok yerli
yabancı kitapta Class’lardan söz edilirken memeli hayvanlardan, arabalardan
vs. söz edilir. Başka bir deyişle Class kavramının zor anlaşılması için herkes
görüş birliğine varmış gibi. Memik Yanık nesneye yönelik programcılık
şudur, şu ilkeleri vardır vs demeden direk kod üzerinde Class kavramından
söz eder. Örneğin Memik Yanık bu kitabın ta ilk sayfalarında şöyle bir cümle
kurdu: “C# programlarını Class olarak düzenlemek zorunluluğu vardır. Bu
nedenle aşağıdaki gibi bir Class bloğu hazırladım”. Bu kadar basit. Henüz
yolun başında olan ve programcılıkla ilgili temel kavramlardan bile bi haber
olan birisine memelilerden, arabalardan vs söz etmek kafaları
karıştırmaktan öte bir işe yaramaz. Ötesi C#’la ilgili kaynaklarda değişken-
alan ayrımından hiç söz edilmez. Tamam kitabın başında eski alışkanlıklara
uyup alanlara değişken denilmesi belki anlatım kolaylığı sağlıyor ama
Class’lar ve nesneye yönelik programcılık anlatılırken değişkenlerin gerçekte
alan olduğundan hiç söz edilmez.

Daha önce az çok program yazmış ve nesne nedir Class nedir sorularına
verecek cevabı olan birisi Memik Yanık’ın kitabındaki “Class’lar ve Nesneye
Yönelik Programcılık” adlı 38 sayfalık bölüme şöyle baktığına kesin burun
kıvıracaktır. Sanki Memik Yanık bu bölümü C# uzmanları için yazmış ta
uzmanların bu metinden öğreneceği yeni bir şey yokmuş. Sanki Memik
Yanık bu bölümü herkesin işine yarayacak Class örnekleri hazırlamak için
kaleme almış. Bu bölümün amacı Class’lar ve Class’ların üyelerinden söz
etmektir, yapıcı ve yok edici metotların nasıl hazırlandığını okura
göstermektir, statik yapıcı metotların işlevinden söz etmektir. Eğer okurun
birisi bu bölümü okuyup Class’lar hakkında genel bilgiye sahip oluyorsa bu
bölüm işlevini yerine getirmiştir. Her ne kadar bu kitabın “Class’lar ve
Nesneye Yönelik Programcılık” adlı bölümde Class’ların en önemli üyesi
metotlardan söz edilmiş olsa bile metotlar ayrı bir bölümde ayrıntılı bir
Bölüm 6: Windows Forms Uygulamaları 139

şekilde incelendi. Başka bir deyişle Memik Yanık’ın C# 3.0 kitabının 16


sayfalık 14. bölümünü okuyanlar metotlarla ilgili her tür bilgiye sahip
olurlar.

Bu kitabın 15. ve 16. bölümlerinde Đndeksleyiciler ve Interface’lerden söz


edildi. Nesneye yönelik programcılıkta indeksleyiciler zor anlaşılan
konulardan birisidir. Memik Yanık 10 sayfalık bu bölümü öyle bir kaleme aldı
ki hayatında daha önce indeksleyici kavramını hiç duymamış olanlar bile ilk
okumada yazılan her şeyi anlayabilirler. Benzer şeyler 12 sayfa boyunca
Interface’ler hakkında bilgi verilen bölüm için de söylenebilir. Gelelim
nesneye yönelik programcılığın hem önemli hem de zor anlaşılan 2
konusuna: Delegate ve Olaylar. Sizce Delegate’ler ve Olaylar neden zor ve
genellikle yanlış anlaşılan 2 konudur. Tabi bazı arkadaşlar şöyle bir yorum
getirecekler: Forma bir Button nesnesi yerleştirirsin sonra tasarım anında bu
button nesnesini çift tıklarsın vs.. Zaten Delegate ve Olayların zor ve yanlış
anlaşılmasının temelleri Button nesnesinden ve tasarım anında Button
nesnesi çift tıklandığında hazırlanan kodun anlatılış şeklinde yapılmaktadır.
Hal bu ki gerçek başkadır: Tasarım anında formdaki Button nesnesi çift
tıklandığında Visual Studio programcının söz konusu Button nesnesinin Click
olayını temsil edecek bir metot hazırlamak istediğini varsayıp Click olayının
yapısına uygun bir metodu hazırlayıp Click olayıyla ilişkilendirmektedir. Tabii
kullanıcı çalışma anında button nesnesini tıkladığında Button nesnesiyle ilgili
olarak Click olayının nasıl tetiklendiğinden söz edilmediği için konu havada
kalıyor. Memik Yanık bu düşünceyle 20 sayfa boyunca delegate ve
olaylardan söz etti.

Bu kitabın 16 sayfalık Stuct ve Enum Tipleri adlı bölümünü okuyanlar


Struct’ların ne olduğu, hangi amaçlarla kullanıldığı, sınıflarla struct’lar
arasında ne gibi farkların olduğunu kısa sürede öğrenirler. Devamında Enum
tipleri hakkında ayrıntılı bilgiye sahip olduğu gibi Enum’larla ilgili olarak
başka kaynaklara başvurma ihtiyacı kalmaz. Gelelim bu kitabın 12 sayfalık
Object Sınıfı adlı bölümüne. Bütün C# kitaplarında dakka 1 gol 1 misali
daha ilk sayfadan Object sınıfından söz edilir. Okur kitabın sonuna kadar
gelir ama hala Object sınıfı hakkında derli toplu bilgiye rastlamaz. Object
sınıfı hakkında yeterli bilgiye sahip olmayan okur ToString() metoduyla ilgili
olarak anlatılanları kavramakta zorlanır. Memik Yanık ne mi yaptı? Kitabının
ortalarına bile gelmeden Object sınıfının önemli gördüğü özelliklerini ve
metotlarını anlaşılır bir dille anlattı.

Bu kitabın mevcut yerli yabancı C# kitaplarına fark atılan bölümlerden bir


diğeri Koleksiyon Sınıfları adlı 20. bölümdür. Bu bölümde 48 sayfa
boyunca .NET Framework ile koleksiyon sınıfları ve bu sınıflarla ilgili bütün
Interface’ler ayrıntılı bir şekilde anlatılmaktadır. Bu bölümün tümünü
okuyan birisi kendisini koleksiyon uzmanı olarak ilan edebilir. Koleksiyonlar
konusu oldukça kapsamlı olduğu için BitArray, BitConverter, Buffer,
StringCollection ve StringDictionary sınıflarını ayrı bir bölüm olarak
140 Memik Yanık - Visual C#’a Başlangıç Kitabı

düzenledim. Tabi hemen aklınıza Generic koleksiyonları ne yaptınız Sorusu


gelmiş olabilir. Bu kitabın 22. bölümünde 26 sayfa boyunca önce .NET
Framework ile gelen Generic koleksiyon sınıflarından, devamında Generic
sınıflarından söz ettim. Yurt dışında yalnızca Generic sınıflardan söz edilen
bağımsız kitaplar yazıldığına göre bu kitabımda Generic koleksiyonları ve
sınıfları bütün yönleriyle anlatmadığımı tahmin etmiş olmalısınız.

Şimdi sözünü edeceğim 3 bölüm gerek içerik gerekse de anlatım şekli


bakımından mevcut(tabi bu değerlendirme benim görebildiğim kitaplarla
sınırlıdır) kitaplara fark atmaktadır. Her ne kadar Hata Ayıklamak ve Debug
Đşlemleri adlı 18 sayfalık bölümün ilk 7 sayfasında anlatılan konuları hemen
her kaynakta bulmak mümkün olsa bile bu bölümün diğer sayfalarında
Debug, Trace, TextWriterTraceListener ve EventLogTraceListener
sınıfları hakkında ayrıntılı bilgi verilmektedir. 27. bölümde ise hata
yakalanırken kullanılan Exception sınıfları anlatılmaktadır. Tabii ki başka
kaynaklarda da Exception sınıfları hakkında bilgi bulabilirsiniz. Gelelim şu
Application sınıfına. Diğer kaynaklarda Application sınıfının bazı özellikleri
ve metotları hakkında bilgi veriliyor olsa bile hiçbir kaynakta 14 sayfa
boyunca yalnızca Application sınıfından söz edilmemektedir.

Bu kitabın içindekiler sayfasına bakan birisi Form Sınıfının Özellikleri,


Olayları ve Metotları adlı bölümde 18 sayfa boyunca klasik olarak
formların herkes tarafından bilinen özelliklerinden söz edildiğini sanabilir.
Đşte size bu bölümden alınma 3 satırlık kod.

protected override void OnCreateControl()


{
base.OnCreateControl();
}

Tabii ki burada bu 3 satırlık kodun işlevinden söz etmeyeceğim, demek


istediğim şudur: Bu koda başka basılı kaynaklarda rastlama ihtimaliniz son
derece düşüktür. Başka bir deyişle bölümün adı Form Sınıfının Özellikleri
olsa bile son derece teknik bilgiler içermektedir.

Bu kitabın diğer basılı kaynaklar bağlamında en sıradan bölümü “Sık


Kullanılan Kontroller” adlı bölümüdür. Bu bölümde sık kullanılan 20’ye yakın
kontrol 36 sayfa boyunca anlatılmaktadır. Bu kontroller anlatılırken daha
önce az çok kod yazmış herkesin ilk bakışta tahmin edeceği özellik ve
metotlardan söz edilmedi.

Bu kitabın Dosya ve Klasör Đşlemleri adlı 36. bölümünde 28 sayfa


boyunca C# kodu yazan birisinin gerek duyması muhtemel bütün bilgiler
verilmektedir. Başka bir deyişle bu bölümü okuyanlar dosya ve klasör
işlemleri bağlamında başka kaynaklara başvurma ihtiyacını duymazlar.
Bölüm 6: Windows Forms Uygulamaları 141

Kapsam bir yana Memik Yanık’ın kitabının bu bölümünü okuyanlar


yorulmazlar, anlatılanları izlemekte zorluk çekmezler.

Şimdi bu kitabın mevcut basılı kitaplar bağlamında bence açık ara önde
olduğu 3 bölümden kısaca söz edeceğim. Birçok kaynakta C# uygulamaları
dahilinde Word ve Excel’den nasıl yararlanıldığı kısaca anlatılırken Memik
Yanık’ın kitabında bu konu 32 sayfa boyunca ayrıntılı bir şekilde
anlatılmıştır. Ayrıca bu anlatma öyle bir anlatmadır ki ilk okumada
anlaşılmayacak bir tek cümle bile yoktur. Benzer şekilde Api Fonksiyonları
adlı bölümde Memik Yanık programcıların en çok gerek duyduğunu sandığı
API fonksiyonlarını 32 sayfa boyunca anlatmıştır. Windows Mesajları adlı
bölümde ise Memik Yanık 32 sayfa boyunca son derece teknik bir konuyu ilk
okumada anlaşılacak yalınlıkta anlatmıştır. Bu kitabın hepsi ileri düzey
konular olan diğer bölümlerinden söz etmeye gerek duymadım. Çünkü ileri
düzey konulara gerek duyanlar zaten neyi aradıklarını biliyorlar.

Buraya kadar C# kitabımım yarısından biraz fazlasından söz ettim. Kitabın


diğer bölümlerini de anlatıp bu yazının sayfa sayısını iki katına çıkarırsam
tamamını okuyanların oranı düşüreceği için bu kitabım üzerine konuşmayı
burada kesiyorum.
142 Memik Yanık - Visual C#’a Başlangıç Kitabı

C# 3.0 Kitabımın Önsözü...


2004 yılında yayınlanan ilk C# kitabım 950 sayfaydı ve yeni başlayanların öncelikle
öğrenmek isteyeceklerini sandığım konuları içeriyordu. Başka bir deyişle konuları
bütün ayrıntılarıyla anlatmak yerine 950 sayfaya mümkün mertebe çok sayıda
konuyu sığdırmayı hedefleniştim. Bu nedenle ilk C# kitabımda hem temel konulara
yer vermiş hem de veritabanı yani ADO.NET konuları yeterli ağırlıkta işlenmişti.
Tabii 950 sayfada hem başlangıç hem de veritabanı konularına yer verince ileri
düzey denilen bazı konular kitapta kendilerine yer bulamamıştı. Sonra Visual Studio
2005’i temel alan C# 2.0 kitabım üzerinde çalışmaya başlamıştım. 2005 yılı başında
yazmaya başladığım bu kitabımın hem sayfa sayısını biraz artırıp hem de başlangıç
düzeyi diye bilinen konulara ayrılan sayfaları azaltma yoluna gidip kitabın içeriğinin
daha doyurucu olmasını hedeflemiştim. Ne var ki bölümleri kaleme aldıkça sayfa
sayısı tahminlerimin üzerine çıkmıştı. 1200 sayfalık bir C# kitabını tercih etmediğim
için 2 cilt olarak düzenlemeye karar vermiştim. C# 2.0 kitabımın ilk cildi yaklaşık
730 sayfa iken yalnızca ADO.NET’le ilgili konuları içeren 2. cilt 420 sayfaydı. Başka
bir deyişle C# 2.0 kitabım toplam 1150 sayfa olmasına rağmen ileri düzey diye
adlandırılan bazı konuları içermiyordu. Örneğin Assemby’ler, Attribute’ler ve
Reflection sınıfları hakkında bilgi verme imkanım olmamıştı.

Gelelim bu kitaba. ADO.NET hakkında bilgi içermeyen bu kitap 1070 sayfa olmasına
rağmen, ileri düzey diye anılan bir çok konuda ayrıntılı bilgi içermesine rağmen
kaleme alıp bu kitapta kullanmadığım elimde yaklaşık 300 sayfalık metin
bulunmaktadır. Başka bir anlatımla 2005 yılı sonunda yayınlanan ve C# 2.0’ı
anlatmak kaygısı ile kaleme aldığım kitabımın 1. cildinin üzerine 300 sayfayı
ekleyince bu kitap çıktı. Tabii bunu yaparken bölümleri yeniden kaleme alıp C# 3.0
ile gelen yeni özelliklerden söz ettim.

Bu kitaba önsöz yazarken C# kitabımın 1. cildi için hazırladığım önsözün bir kısmını
buraya alacağım: Bir programlama dilini anlatma kaygısı ile yazılan kitaplarla ilgili
olarak Başlangıç Düzeyi ile Başlangıç Konuları kavramları bazen birbirine
karıştırılıyor. Örneklemek gerekirse; başlangıç düzeyi bir kitapta değişkenler
hakkında bilgi içeren sayfalarda Pointer değişkenlerden söz edilmez. Ötesi başlangıç
düzeyi kitaplarda değişkenler hakkında bilgi verilirken ayrıntılara inilmez.

Düzeyi başlangıç olmayan kitaplar ise başlangıç konularını içerebilir. Bu açıdan bir
değerlendirme yapmak gerekirse, bu kitap ister istemez bazı başlangıç konularını
içermektedir. Ancak bu kitapta ileri düzey diye değerlendirilen kitaplardaki birçok
konu hakkında ayrıntılı bilgi bulunmaktadır. Örneğin usta bir programcının
değişkenler hakkında ne bilmesi gerekiyorsa hepsi bu kitapta bulunmaktadır. Buna
rağmen bu kitapta her konu başlangıç düzeyi kitaplarının basitliğinde anlatıldı. Yine
örneklemek gerekirse bu kitapta Pointer değişkenler ve Attribute’ler hakkında bilgi
içeren sayfalar ilk okumada anlaşılacak yalınlıktadır.

Bu kitabı kaleme alırken beni en çok zorlayan çalışma, kitapta hangi konulara yer
yerip, kitap için seçtiğim konulara ayrılacak sayfaların sayısını tespit etmek oldu.
Örneğin Assembyl’ler hakkında mutlaka bilgi vermek gerekiyordu. Ötesi Assembly
kavramı hakkında bilgi sahibi olmayan birisine mevcut assembly’lerden söz etmenin
zorluğu ortadadır. Đşte asıl zorluk burada başlıyor:Çünkü Assembly çok geniş bir
Bölüm 6: Windows Forms Uygulamaları 143

konudur. Kitapta hiç söz edilmemesi başka sorun, bütün yönleri ile anlatıldığında
başka sorunlara neden olmaktadır. Benim tercihim orta yolu bulmak şeklinde oldu.
Yani Assembly’leri bütün yönleri ve ayrıntıları ile anlatmak yerine temel
özelliklerinden söz etmekle yetindim.

Benzer orta yol tercihini Attribute’ler, Generic sınıflar, Windows Mesajları, Reflection
için de yaptım. Gelelim bu kitapta torpil geçtiğim konulara: 2004 yılında yazdığım
C# kitabını kaleme alırken başka bir C# kitabından çalıntı yapmakla suçlandım.
Suçlamaların asıl dayanak noktası değişken adı benzerliğiydi. Değişken adı
benzerliğine sıfıra bölme hatasının, Selection Sort işleminin ve Word belgeleri
üzerinde nasıl işlem yapıldığının anlatıldığı sayfalarda vs. rastlanmıştı. Her ne kadar
benzer olduğu söylenen değişkenlerin adlarının bir çoğunu 1994 yılında yayınlanan
Clipper kitabımda yıllar önce kullanmış olsam bile çalıntı yapmakla suçlandığım
konulara bu kitapta torpil geçip daha ayrıntılı bir şekilde ele aldım. Belki bu şekilde
bu konuları bildiğime bir kaç kişiyi inandırmış olurum. Ötesi değişken adı
benzerliğinden dolayı tekrar suçlanmamak için Osmanlıca bir sözlük edinip bazı
değişkenlere Osmanlıca adlar verdim.
144 Memik Yanık - Visual C#’a Başlangıç Kitabı

Memik Yanık ve Programcılık

Programcılık üzerinde yoğun bir şekilde çalışmaya 1989 yılında başladım. O


günlerde işletim sistemi olarak DOS’un 3.30 sürümü yaygındı. Programcılık
denilince akla GW Basic, Pascal ve C gelirdi. Tabii o günlerde yaygın olarak
kullanılan dBASE III Plus’ı unutmamak gerek. dBASE III+ yorumlayıcı bir ortam
sunduğu için programcıları dBASE derleyicisi arayışına sevk ediyordu. Bu arada
dBASE’den daha iyi bir dBASE iddiası ile Fox firması tarafından hazırlanıp piyasaya
verilen FoxPro’yu unutmamak gerekir. Konu program yazmak olduğunda FoxPro her
zaman dBASE’den iyi olmuştur. Tam bu günlerde dBASE kodu yazmak isteyenlerin
imdadına bir dBASE derleyicisi olan Clipper yetişti. Clipper ne mi yapıyordu? dBASE
III+’ın tekstine bağlı kalınarak(%100 değil) yazılan kodu derleyip kendi başına
çalışan EXE yapıyordu. Bununla da yetinmeyip dBASE’e kolayca ekler yapılmasının
önünü açıyordu. O günlerde yüzlerce yazılım firması Clipper için Library’ler
hazırlamıştı(Funcky Lib’i unutmamak gerek). En yaygın kullanılan Clipper sürümü
Summer 97 idi.

Bir süre sonra dBASE’in o günlerdeki sahibi A. Tate firması büyük gürültülerle
dBASE IV’ü çıkardı. Clipper ise dBASE IV uyumlu olmayı bırakıp Clipper 5.0 ile kendi
yoluna devam etti. Clipper ile veritabanı işlemleri son derece kolay olduğu için
binlerce yerli yazılım firması uygulamalarını Clipper ile geliştiriyordu. Clipper ile
çalışmayı sevince bir süre sonra Clipper üzerine yazılar yazmaya başladım. 1992
yılında o zamanın bilgisayar dergilerinde Clipper konulu çok sayıda yazım
yayınlandı. O günlerde Clipper konulu bir tek Türkçe kitap vardı. Bu kitap ise Ankara
merkezli Ekonomist yayınevinden çıkan çeviri bir kitaptı. Yani anlayacağınız Clipper
konulu Türkçe kaynak yok gibiydi. Bu nedenle Clipper konulu kitap yazmaya karar
verdim. Şu aralar Memik Yanık’ı değişkenlerini çalmakla itham edenler belki o
günlerde yaşları itibarı ile bilgisayarla henüz tanışmamıştı. Üstelik Memik Yanık
bugünlerde çalmakla itham edildiği değişkenlerin adlarını Clipper kitabında
kullanmıştı.

Tekrar etmek gerekirse; Clipper kitabını kaleme alırken yıl 1993, internet yok,
Türkçe yayınlanmış bir tek Clipper kitabı var. Ki bu kitap kapsamlı değildi. Bu
şartlarda son derece kısıtlı Đngilizcesi ile Memik Yanık taraflı tarafsız herkes
tarafından beğenilip çok satan Clipper 5.2 kitabını yazıp yayınlıyor. Üstelik
bugünlerde değişken çalmakla itham edilen Memik Yanık bu kitabında verdiği
kodlarda i, j, sayi, dosya vs adında değişkenler tanımlayıp kullanıyor(!). Bir Allahın
kulu çıkıp Memik Yanık bu kitabı yani Clipper kitabını çevirmiştir demiyor.
Diyemezlerdi çünkü kitabın içeriğinin bir kısmını daha önce dergilerde
yayınlamıştım. Neyse uzatmayayım; Memik Yanık 1993 yılında Internet’in olmadığı
günlerde bir tek Türkçe kaynağın olduğu günlerde Clipper 5.2 adında süper bir
programcılık kitabı yazdı mı? Yazdı. Bu kitap sayesinde binlerce kişi programcı oldu
mu? Cevap net:Oldu. Bu yıllarda insanlar Clipper ile harıl harıl program yazarken
hiçbir üniversite ve yüksek okulda Clipper dersleri verilmiyordu.

Programcılar dBASE IV yerine Clipper’a yönelince A.Tate firması(o günlerde Borland


tarafından satın alınmıştı) dBASE derleyicisi arayışına girmişti. Derken Borland
firması şu anda adını hatırlamadığım bir firmanın dBASE derleyicisini satın alıp
dBASE IV Compiler adıyla piyasaya verdi. Elimde bir tek Help metinleri varken
Bölüm 6: Windows Forms Uygulamaları 145

1995 yılınca gece gündüz çalışıp dBASE IV Compiler adında bir kitap hazırladım. O
günlerde dBASE IV Compiler hakkında bırakın Türkçe kaynağı yabancı kaynak
bulmak bile Türkiye şartlarında imkansız gibiydi. Yabancı kaynak olsa bile benim
için değişen bir şey olmazdı. Çünkü Clipper ve dBASE IV Compiler kitaplarını kaleme
alırken programcıların ihtiyaçlarını gözetiyordum. Clipper ile program geliştiren birisi
ne biliyorsa, neleri kullanıyorsa kitaplarda o konulara yer veriyordum. Bir süre
sonra Windows uyumlu programcılık yaygınlaşmaya başlayınca Borland firması
dBASE’in Windows uyumlu sürümünü çıkardı ama fazla tutulmadı. Çünkü bu sırada
Microsoft firması Access’i piyasaya vermişti. Kısaca özetlemek gerekirse dBASE
Compiler üzerine yazdığım kitap alanında tek kaldı. Yani dBASE IV Compiler kitabı
dolayısıyla Memik Yanık’ın dava edilmesi mümkün değildi.

dBASE IV Compiler kitabını tamamladıktan sonra FoxPro 2.6 üzerinde çalışmaya


başladım. FoxPro 2.6’nın hem DOS hem de Windows 3.1 uyumlu sürümü vardı.
Amacım Windows programcılığını anlatmak olduğu için Windows sürümünü tercih
etmiştim. Daha önce Clipper ve dBASE Compiler konulu kitaplar yazmış olmam
benim için avantajdı. Sizleri hemen uyarmak isterim o günlerde FoxPro’nun
Windows sürümünü kendisine konu edinen başka kitap olmadığından bugün ki gibi
Memik Yanık’ı kitaplarından değişken çalmakla veya Selection Sort sıralama
algoritmasını almakla suçlayacak kimse yoktu. Dolayısıyla Memik Yanık’ı FoxPro 2.6
kitabında başkalarına ait değişkenleri çalma suçlamasını onaylamak Prof unvanlı
kimseye nasip olamadı.

Sanırım FoxPro 2.6 kitabım çok iyi olmuştu ki o zamanın Microsoft genel müdürü
beni telefonla arayıp teşekkür etmişti. Đzin verin 2 cümle daha ekleyeyim: Yani daha
önce hakkında kitabı bırakın makale bile yazılmamış bir konuda Memik Yanık kitap
yazıyor, hem de o günün şartlarına göre çok iyi bir kitap yazıyor. Sonra aradan tam
10 yıl geçiyor birileri çıkıyor Memik Yanık’ı sıfıra bölme hatasını anlatmak üzere
yazdığı 3 satırlık kodun kendi kitaplarından çalıntı olduğunu iddia ediyor. Kanıt ise
bu 3 satırlık kodda kullanılan sayi1, sayi2 adı verilen değişkenlermiş. Yani Memik
Yanık sınıfa bölme hatasını anlatmak için yazdığı kodda tanımladığı değişkenlere
sayi1, sayi2 yerine number1, number2 adlarını vermiş olsaydı kitabında verdiği 3
kod değerinden çok şey kaybedecekti(!).

Gelelim Visual Basic 3.0 kitabına. Microsoft firması daha önce Visual Basic’nin 2
sürümünü çıkarmış olsa bile ilgi 3.0 sürümü ile geldi. Visual Basic 3.0 piyasaya
verildikten sonra bir süre sonra Microsoft Press tarafından yayınlanmış kitap
Türkçe olarak yayınlandı. Son derece kısıtlı bir içeriği sahip bu kitabı görünce Visual
Basic konulu kitap yazmaya karar verdim. Uzun uğraşlar sonucu Visual Basic 3.0
kitabım çıktı. Bu kitap çok beğenildi. Çünkü Visual Basic konusu ilk kitabım o günün
şartlarına göre çok sayıda ileri düzey konu içeriyordu. Örneğin kod yazarak çalışma
anında Access veritabanının nasıl hazırlandığını adım adım ilk anlatan Memik
Yanık’tır. Bilmeyenlere hatırlatmak isterim: Visual Basic 3.0 Windows’un 3.1
sürümüne gerek duyuyordu. Ötesi Visual Basic 3.0 piyasaya verildiği günlerde
insanlar Windows’u yeni yeni kullanmaya başlamışlardı. Dolayısıyla programcılığa
çok sonra başlayıp uzman programcı olan bazı arkadaşlar Memik Yanık’ın 1995
yılında yazdığı Visual Basic kitabını bugünün şartlarına göre değerlendirip yorum
yapıyorlar. Bu arkadaşlar son birkaç yıl içinde yayınlanan ADO.NET, Delphi 2007,
C# 3.0 ve Visual Basic 9.0 kitaplarımı artık 5-6 yıl sonra güncelliklerini
kaybettiklerinde zahmet edip değerlendirirler.
146 Memik Yanık - Visual C#’a Başlangıç Kitabı

C# 3.0 Kitabımdan Alınma Örnek Bölüm


C# UYGULAMALARINDA WORD’den YARARLANMAK
Bu uzun makaleyi yakında zamanda yazımını tamamladığım C# 3.0
kitabımdan aldım. Kitaptan aldığım bu metne bazı eklemeler yapıp küçük
değişiklikler yaptım. Son yıllarda yayınlanan programcılık kitaplarının bir
bölümü okurlar kitap hakkında fikir sahibi olsunlar diye nette
yayınlanmaktadır. Ne var ki C# 3.0 kitabımın bu bölümünü burada sizinle
paylaşıyor olmamın nedeni başka. Çünkü sözünü ettiğim kitabın hata
yakalamakla ilgili uzunca bölümünü daha önce sizlerle zaten paylaşmıştım.
Başka bir deyişle bu bölümü yayınlama nedenim kitabın içeriği ve anlatım
şekli konusunda sizleri bilgilendirmek değildir.

Kısaca açıklayayım: 2004 yayınlanan C# kitabımda toplam 8 sayfada C#


uygulamalarında Word ve Excel’den nasıl yaralanıldığını ayrıntıya girmeden
kendimce anlatmıştım. Tabii C# uygulamalarında Word belgeleri ve Excel
tabloları üzerinde nasıl işlem yapılabildiğini annemim karnında iken
öğrenmemiştim. Bu konuda bilgi edinmek için MSDN’e ve birkaç
programcılık sitesine bakmıştım. Doğal olarak Word belgeleri üzerinde işlem
yapılırken kullanmam gereken sınıfların hangileri olduklarını öğrenmiştim.
Ötesi bu sınıfların hangi referans ve namespace’lerde olduğunu öğrenip ona
göre nasıl bir hazırlamak yapmak gerektiğini araştırmıştım.

C# 1.0 kitabımı kaleme aldığım günlerde birkaç yerli web sitesinde yukarıda
sözünü ettiğim soruların cevapları zaten vardı. Buna rağmen birileri çıkıp
Memik Yanık kitabında Word ve Excel’le ilgili olarak yazdıklarını “bizim
kitapları okumadan öğrenmiş olamaz” dediler. Sanki söz konusu olan bir pop
müzik sanatçısı ile yapılmış özel bir söyleşiymiş, sanki ikinci bir kaynağın
olabilme ihtimalinin sıfır olduğu özel bir araştırmaymış söz konusu olan. Hal
bu ki Microsoft gibi derleyici üreten firmalar derleyicileri hakkında en küçük
ayrıntıları bile derleyiciyi piyasaya vermeden çok önce açıklıyorlar. Yoksa
insanlar nasıl program yazarlardı, yazarlar nasıl programcılık kitapları
yazarlardı? Yayınlanıp piyasada satılan bir programcılık kitabını edinip bir
konuyu öğrenmek doğal olmasına rağmen C# kitabımın Word ve Excel’le
ilgili bölümünü yazarken yerli web sitelerindeki 2 yazıyı ve MSDN’de birkaç
metodun orijinal yapısına bakmakla yetinmiştim.

C# uygulamaları dahilinde Word belgeleri ve Excel tabloları üzerinde işlem


yaparken tanımlamam gereken değişkenlere ad verebildiğimi ve kullanılması
gereken metotların yapısını ve parametrelerini yerli kaynaklara bakmadan
öğrenebildiğimi kanıtlamak için C# 3.0 kitabımda Word ve Excel
uygulamaları üzerinde nasıl işlem yapıldığı bölümdeki sayfa sayısını biraz
arttırıp bugün kadar bu konuda kaleme alınmış en uzun ve ayrıntılı metni
hazırladım. Belki bu sayede Memik Yanık çeviri yapıyor diyenler, Memik
Yanık değişken çalıyor diyenler ellerini vicdanlarına götürme gereğini
Bölüm 6: Windows Forms Uygulamaları 147

duyarlar. Kısa bir süre sonra bu metni nasıl kaleme aldığımı adım adım
açıkladığım bir makale hazırlayıp “Programcılar Đçin Yazarlık Dersleri 4”
adıyla yayınlayacağım.

C# projelerinde Word ve Excel’in kaynaklarından kolaylıkla


yararlanabilirsiniz. Bu sayede kullanıcının bilgi girmesi gerektiği zaman
karşısına Word penceresini veya tablo hazırlaması gerektiği zaman Excel
penceresini getirebilirsiniz. Bu makalede C# uygulamaları dahilinde Word ve
Excel ile yapılabilineceklerin ancak bir özetine yer verebildim. Kitabımın bu
bölümünü ilk kaleme aldığımda uzunluğu 10 sayfaydı. Ne ki özel
nedenlerden dolayı bu bölüme biraz torpil geçip sayfa sayısını arttırdım. Bu
sayede bu konuda en ayrıntılı Türkçe metni kaleme almış oldum. Madem
şimdiye kadar hiçbir Türkçe kaynakta bu konu bu kadar ayrıntılı anlatılmadı
o halde yerli kaynaklardan izinsiz alıntı yapmış olma ve değişken adı çalma
ihtimalim azalmış oluyor(!). Her ne kadar bu bölümde yalnızca Word ve
Excel’den söz edilmiş olunsa bile C# uygulamaları dahilinde diğer Office
programlarından da yararlanmak mümkündür.

C# projesi dahilinde Word’den yararlanmak istiyorsanız ilk olarak Solution


Explorer penceresinde References seçeneğine ait kısayol menüsünden
komut verip Add Reference diyalog kutusunu ekrana getirip COM
sekmesindeki Microsoft Office 11 Object Library adlı bileşeni seçip
uygulamaya dahil etmelisiniz. Daha doğrusu C# uygulamasını bu
referanstan haberdar etmelisiniz.
148 Memik Yanık - Visual C#’a Başlangıç Kitabı

Bu ekran görüntüsünü aldığım sırada kullandığım bilgisayarda Word 2003


yüklüydü. Kullanılan bilgisayara Word’ün XP sürümü yüklüyse bu bileşenin
adı Microsoft Office 10 Object Library olur.

2003 içinde ilk C# kitabımı kaleme alırken Add Reference diyalog kutusunda
araştırmaya çıkıp acaba Word belgeleri üzerinde işlem yaparken hangi
referansı kullanmak gerekiyordur sorusuna kendimce cevap arasaydım
bulmak zor olmazdı. Ancak çok daha önce birkaç yerli web sitesinde bu
konu üzerine yazılmış makaleler ilk yayınlandıklarında okuduğum için Word
belgeleri üzerinde işlem yaparken gerek duyulacak sınıfların hangi
namespace’lerde, bu namespace’lerin ise hangi referanslarda yer aldığını
biliyordum.

Visual Studio 2005 ile hazırlanan projelerde bu bileşen seçilip OK düğmesi


tıklandığında projeye 3 referans eklenirdi. Visual Studio 2008’de yukarıda
yapılan işlem projeye yalnızca Microsoft.Office.Core referansının
eklenmesine neden olmaktadır. Bu nedenle Add Reference diyalog
kutusunu tekrar ekrana getirip .NET sekmesinde ayrıca
Microsoft.Office.Interop.Word referansını projeye eklemek
gerekmektedir.

Proje bu 2 referans hakkında bilgilendirildikten sonra kodun en üstüne


aşağıda verdiğim 2 satırı yazarak ilgili namespace’lerdeki Class’lardan
yararlanmak istediğinizi işaret etmelisiniz. Başlangıçta
Bölüm 6: Windows Forms Uygulamaları 149

Microsoft.Office.Core’deki sınıflardan yararlanmayacağımız için using


bloğunda bu namespace’in adını işaret etmeyebilirsiniz.

using Microsoft.Office.Core;
using Microsoft.Office.Interop.Word;

Gerekli referansları projeye dahil edip(başka bir deyişle bu referanslardan


derleyiciyi haberdar ettikten…) bu namespace’lerdeki class’lardan
yararlanacağımı using deyimiyle işaret ettikten sonra forma yerleştirdiğim
düğmenin Click olayını temsil eden metodu aşağıdaki gibi düzenledim.

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 duralım. Bu 2 satırlık kodda örneğini aldığım sınıfın adı
Word.ApplicationClass. Bu sınıftan yola çıkıp hazırlanacak nesneye
“Word_uygulamasi” gibi Türkçe bir ad verilirsek(yani bu sınıfa Türkçe bir
karşılık ararsak) başka Türkçe kaynaklarla benzer değişken adını kullanma
tehlikesi ile karşı karşıya gelebiliriz. Başka bir deyişle başka yazarların
kıymetli değişkenlerinin adını çalmakla suçlanabiliriz. Bunun önüne geçmek
için, başka bir deyişle 2 satırlık bu kodda tanımlanan değişkene
programcılar ad seçerken başka kaynaklardan değişken avına çıkmalarının
mecburi olmadığını kanıtlamak için bu kodu aşağıdaki gibi düzenledim. Yani
başlangıçta Word_uygulamasi adını verdiğim değişkenin adını
“Word_nesnesi” olarak değiştirdim.

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 programcıların yazacakları kodların başkaları tarafından görülmesi


düşük ihtimal olduğu için değişkenlere ad seçerken kendilerini birden
“değişken hırsızı” olarak görmeleri zordur. Bu nedenle bu kodu aşağıdaki
gibi değiştirip kendinizi iyice sağlama 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 Yanık - Visual C#’a Başlangıç Kitabı

Bu metotta Word.ApplicationClass nesnesini hazırlama işlemini 2 satırda


gerçekleştirdim ve söz konusu Class’ın yer aldığı namespace’i işaret ettim.
Daha önceden bu namespace’deki sınıflardan yararlanmak istediğimi using
deyimi ile belirttiğim için bu kodun satırlarını kısaltmak mümkündür. Bu
metoda yazılan ilk 2 satır sayesinde Word programı başlatılır ama ekranda
görünmez. Word penceresinin ekranda görünmesi için
Word.ApplicationClass’tan yararlanarak hazırladığınız nesnesinin Visible
özelliğini true yapmalısınız. Bu nedenle yukarıda verdiğim metoda 3. bir
satır ekledim.

private void Word_penceresi_Click(object sender, EventArgs e)


{
ApplicationClass Word_nesnesi;
Word_nesnesi = new ApplicationClass();
Word_nesnesi.Visible = true;
}

Projeyi çalıştırıp bu metodu işletince aşağıdaki gibi bir sonuç elde ettim. Bu
şekilde açılan Word penceresinde herhangi bir belge olmaz. Bu sırada komut
verip Word penceresinde yeni belge hazırlayabilir veya mevcut belgeleri
açabilirsiniz. Daha açık bir anlatımla yukarıda hazırladığımız
ApplicationClass nesnesi Başlat menüsünden komut vererek ekrana
getirdiğimiz Word penceresini temsil ediyor.

Şimdi yukarıda verdiğim kodda değişiklik yapıp Word penceresi ekrana


getirildiği zaman boş bir belgenin hazırlanmasını sağlayacağım. Yukarıda
hazırladığımız ApplicationClass nesnesinin Documents adında bir
koleksiyonu bulunmakta ve açılan(ya da hazırlanan) Word belgeleri bu
koleksiyonda saklanmaktadır. Başka bir deyişle hazırlanacak belgenin veya
Document nesnesinin bu koleksiyona eklenmesi gerekiyor.

Yukarıda verdiğim ekran görüntüsünü aldığım sırada Word penceresi içinde


görüntülenen herhangi bir belge olmadığı için Documents koleksiyonu
Bölüm 6: Windows Forms Uygulamaları 151

herhangi bir elemana sahip değildir. Document nesneleri DocumentClass


sınıfının Add() metodundan yararlanılarak hazırlanmaktadır. Bu amaçla
Document nesnesi hazırlayıp bu nesneyi Add() metodu ile
ApplicationClass nesnesine ekleyeceğim. Başka bir deyişle Document
nesnesi klasik yöntemle new anahtar kelimesiyle sınıftan yola çıkılarak
hazırlanıp sonra da ilgili koleksiyona eklenmiyor. Add() metodu, hem nesne
hazırlama hem de koleksiyona ekleme işlemini bir seferde yapmaktadır.

Lütfen uzatmama izin verin: Öncelikle Microsoft’un sitesine yani MSDN’de


burada sözünü ettiğim Add() metodu ile ilgili olarak verilen örneği size
sunacağım. Aşağıda verdiğim kod eski sürüme göre hazırlanmış. Bu kitapta
C# hakkında bilgi verirken Visual Studio 2008 ve C# 3.0’ı kullandığım için
küçük farklılıklar 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 istediğim asıl konu Add() metodunun 4


parametreye sahip olmasıdır. Parametrelerden ilkinde hazırlanmak istenen
Word belgesine temel oluşturacak DOT uzantılı şablon dosyası verilmektedir.
Zaten ilk parametrenin yararlanılmak istenen şablon olması gerektiği
MSDN’den aldığım 2 satırlık kodda işaret ediliyor. Başka bir deyişle 1.
parametrede sorun yok ve şablon olarak kullanmak istediğimiz DOT uzantılı
dosyayı ve yolunu belirteceğiz. Word başlatılıp içeriği boş bir belge
hazırlandığında “normal.dot” adlı şablon dosyasının kullanıldığını
biliyorsunuz. Yıllar önce Word konulu kitap yazmış birisi olduğum için
umarım birileri çıkıp “DOT uzantılı dosya hakkında yukarıda yazdığım
cümleyi başka kaynaktan izin alıntı yaptığımı ileri sürmezler.

Add() metodunun 2., 3. ve 4. parametreleri ise


System.Reflection.Missing.Value tipindedir. Microsoft’un programcıları
tarafından Add() metodunu örneklemek için yazılan bu 3 satırlık kodda 2.,
3. ve 4. parametre için önceden “missing” adında değişken tanımlamışlar.
Her ne kadar bu örnek kodda Add() metodunun 2., 3. ve 4. parametreleri
aynı tipte olsa bile farklı işlevleri vardır. Bu parametrelerin işlevlerini ileriki
sayfalarda sırasıyla anlatacağım. Gerçekte Add() metodunun son 3
parametresiyle ilgilenmeyebilirsiniz.

Madem C# uygulaması dahilinde yeni bir Word belgesi hazırlayacağız Add()


metodunu yukarıdaki gibi kullanmaktan başka çaremiz yoktur. Belki de
vardır ama bu konuda bilgim ne yazık ki yoktur. Belki birileri çıkıp yukarıda
yapısını verdiğim Add() metodunu kullanmadan nasıl Word belgesi
hazırlandığını anlatırlar. Biz de o tekniği kullanırken mucitlerini anarız,
kendilerine her seferinde teşekkür ederiz.
152 Memik Yanık - Visual C#’a Başlangıç Kitabı

Şimdilik Add() metodunu kullanmak dışında başka teknik olmadığına göre


ilk olarak kullandığım bilgisayarda arama yapıp “Normal.dot” adlı dosyayı
bulup “C:” sürücüsünün kök klasörüne kopyaladım. dot uzantılı bu şablon
dosyasının adını ise “sablon” adını verdiğim bir değişkene aktardım.

Sonra da Microsoft’un programcılarının yaptığı gibi


System.Reflection.Missing.Value tipinde bir değişken tanımladım. Madem bu
değişken Value tipindedir ben de aklı evvellik yapıp yani bütün imkanlarımı
seferber edip bu değişkene orijinal bir ad bulamayınca bu değişkene
Türkçesi olan “deger” adını verdim. Bu 2 hazırlıktan sonra yukarıda verdiğim
kod aşağıda verilen şekle dönüştü.

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 değişkene ad verirken Türkçe karşılığını


kullanmış olsam bile “deger” birçok programcı ve yazar tarafından kullanılan
bir değişken adı olduğu için riske girmeye cesaret edemeyip bu değişkene
ad verirken MSDN’den değişken adı çalma yolunu tercih ettim. Çünkü elin
gavurları değişkenlerinin adları konusunda hak talep etmiyorlar. Sözünü
ettiğim 2 değişkeni tanımladıktan sonra hazırlanacak belgenin aktarılacağı
bir DocumentClass nesnesi hazırladım. DocumentClass nesnesine gönül
rahatlığı ile Belge1 adını verdim. Çünkü Word belgelere Belge1, Belge2 gibi
adlar veriyor. Microsoft firması beni değişken adlarını çalmakla
suçlamayacağına göre 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 hazırlıklardan sonra şimdi sırada Add() metodunu kullanıp Word


belgesini hazırlamak var. Bu amaçla bu koda ekleme yaptım. Aşağıda
verilen kod işletildiğinde tıpkı Word başlatılıp başlangıçta “Belge1” gibi ada
sahip bir belge hazırlandığı gibi C# uygulaması dahilinde Word başlatılıp
Bölüm 6: Windows Forms Uygulamaları 153

“Belge1” adında bir belge hazırlanmış olunur. Bu belgeye istenildiği 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 yıl önce yayınlanan ilk C# kitabımda konuyu uzatmak istemediğim


için bu kodu bir seferde vermiştim. Bu kez ayrıntılara girmek istediğim için
adım adım anlatmaya çalışıyorum. Bu kodu dikkatle incelerseniz 2., 3. ve 4.
parametrelerin aynı olduklarını fark ederseniz. Çünkü bu 3 parametrenin
System.Reflection.Missing.Value tipinde olması sağlanırsa varsayılan
değerler kullanılır. Bunu bir de şöyle açıklamak gerek: Her ne kadar Add()
metodu 4 parametreye sahip olsa bile bunlardan ilki hariç diğer üçünü
belirtme gereğini duymuyorum. Buradaki karmaşanın geri planında Word
kaynaklı sınıfların yönetilen(managed) kod olmamalarında yatıyor. Tabi
System.Reflection.Missing.Value tipindeki değişken Türkçe bir ad
verilseydi kod belki biraz daha okunur olurda ama değişken adı çalmış olma
ihtimali artardı.

Đlk C# kitabım için Add() metodu hakkında günlerce araştırma yapmama


rağmen Add() metodunun son 3 parametresi hakkında net bilgilere
ulaşamamıştım. Đleriki sayfalarda hakkında bilgi verilecek Open()
metodunun 3. parametresinin işlevi açılacak belgeye ReadOnly özelliğini
veriyor olması beni yanıltmıştı. C# 1.0 kitabımı yazarken Add() metodunun
2. parametresinden ise hiç söz etmemiştim.

Şimdi gelelim 2. parametrenin asıl işlevine. C# uygulaması dahilinde Word


belgesi hazırlama amacınız yeni bir şablon hazırlamak ise 2. parametreden
yararlanabilirsiniz. Bu parametrenin işlevini göstermek için object tipinde
bir değişken tanımlayıp true yaptım.

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 Yanık - Visual C#’a Başlangıç Kitabı

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

Bu şekilde düzenlenen kod ile C# uygulaması dahilinde hazırlanan Word


belgesi hazırlanıp sonra da kaydedilmek istendiğinde varsayılan kayıt tipi
DOT uzantılı şablon olur. Tabii Farklı Kaydet diyalog kutusundaki Kayıt
Türü liste kutusunda kayıt türü olarak Word Belgesi veya başka bir format
seçilebilir. C# uygulaması dahilinde DOT uzantılı şablon dosyası hazırlamak
istemiyorsanız Add() metodunun 2. parametresi ile ilgilenmeyip bu
parametrenin System.Reflection.Missing.Value tipinde bir değişken olmasını
sağlayabilirsiniz.

Word uygulamasını temsil eden ApplicationClass nesnesi için yeni belge


hazırlanırken kullanılan Add() metodunun 3. parametresinin adı
DocumentType. Toplam 5 farklı değer alabilen bu parametre
kullanılmadığında, başka bir deyişle bu parametrenin yerine
System.Reflection.Missing.Value tipinde bir değişken kullanıldığında boş bir
belge hazırlanmak istendiği varsayılır. 3. parametrenin nasıl kullanıldığını
aşağıda görebilirsiniz.

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 adında bir Enum’un


olduğunu fark ederseniz. C# uygulaması dahilinde hazırlamak istediğim
Word belgesini web sayfası olarak değerlendirmek gibi bir amacım olsaydı
Add() metodunun 3. parametresini aşağıdaki gibi düzenlerdim

object belge_tipi = WdNewDocumentType.wdNewWebPage;

Microsoft.Office.Interop.Word’de yer alan WdNewDocumentType adlı


enum tipinin üyelerinin işlevlerini aşağıda tablo halinde verdim. Ek açıklama
yapmak gerekirse Word’ün güncel sürümleri ile istenen tipte ve içerikte
belgeler hazırlamak mümkündür.
Bölüm 6: Windows Forms Uygulamaları 155

Üye adı Đşlevi

wdNewBlankDocument Bol belge

wdNewEmailMessage E-mail

wdNewFrameset Frameset

wdNewWebPage Web sayfası

wdNewXMLDocument XML belgesi

Şimdi gelelim hazırlanan belgenin Word penceresinde görünmesini sağlayan


veya engelleyen 4. parametresine. 4. parametre yerine
System.Reflection.Missing.Value tipinde bilgi içeren Object tipinde bir
değişken kullanıldığında hazırlanan belge ekranda görünmektedir. Yukarıda
anlatılan şekilde hazırladığınız belgenin görünmesini istemiyorsanız bu
parametre için object tipinde bir değişken tanımlayıp false aktarmalısınız. Bu
işlemin nasıl yapıldığını aşağıda görebilirsiniz.

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 düzenlenen kod işletilirse Word başlatılıp içeriği boş(tabii


Normal.dot’ın orijinal olduğunu varsayıyorum. Yani Microsoft’tan geldiği
şekli ile..) bir Word belgesi hazırlanıp ekrana getirilir. Gerçekte başka
yazarlar veya programcılar tarafından daha önce kullanılma ihtimali yüksek
olan “gorunme” adlı değişken yerine Microsoft’un verdiği kısa örneklerde
kullandığı visible’ı değişken adı olarak kullanmanız önerilir. Hazırlayıp Word
penceresine getirdiğiniz belgenin görüntülenmesini istemiyorsanız 4.
parametreyi false yapmalısınız. Aşağıda verilen kod işletildiğinde Word
penceresi ekrana gelir ama Add() metodu ile hazırlanan belge
görüntülenmez.
156 Memik Yanık - Visual C#’a Başlangıç 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);
}

Hazırlayıp geri planda kod yazarak bilgi aktarıp sonra kaydetmek istediğiniz
Word belgesinin ekranda görünmesini istemeyebilirsiniz. Tabii
ApplicationClass nesnesinin Visible özelliğini false yapıp Word penceresini
görünmesini engellediyseniz Add() metodunun 4. parametresinin false ya da
true olmasının bir önemi olmuyor.

Bildiğiniz Word belge hazırlarken DOT uzantılı şablon dosyalarından


yararlanmaktadır ve Normal.dot şablonu varsayılan şablondur. Konu kolay
anlaşılsın diye bu şablonu “C:” sürücüsünün kök klasörüne kopyaladım.
Yukarıda anlatılan şekilde düzenlenen Add() metodu işletilirse ekrana
aşağıdaki gibi bir Word penceresi gelir. Bu sırada Word belgesine istediğiniz
gibi bilgi girebilir ve yeni belgeler hazırlayabilirsiniz.

Yine Word ile çalışırken arka arkaya birden fazla belgeyi hazırlayıp birden
fazla belge üzerinde çalışmak mümkündür. Şimdi yukarıda verdiğim koda
ekleme yapıp arka arkaya 2 Word belgesi hazırlayacağım.
Bölüm 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 edeceğiniz C# uygulaması dahilinde hazırlanan belgelerin birisi aktif


belgedir. Aktif belge normal şartlarda son hazırlanan veya açılan belgedir.
Hangi belgeyi aktif belge yapmak istiyorsanız Active() metodunu o belgeyi
temsil eden nesneye uygulamanız yeterlidir. Bu metodun nasıl kullanıldığını
yukarıda görebilirsiniz. Mevcut belgelerin nasıl açıldığı anlatıldıktan sonra
açık belgelerin arasında nasıl dolaşıldığı konularında bilgi verilecektir.

Word Belgelerine Bilgi Girmek

Yukarıda anlatılan şekilde hazırlanan Word belgesine doğrudan bilgi


girebileceğiniz gibi kod yazarak bilgi aktarabilirisiniz. Doğrudan bilgi
girdiğiniz Word belgesini C# uygulaması dahilinde kaydedebilir, kapatabilir
veya içeriğini yazdırabilirsiniz. Başka bir deyişle Word programı ile normal
şartlarda yapılan her işlemi C# uygulaması dahilinde kod yazarak
yapabilirsiniz.

Đlk olarak yukarıda anlatılan şekilde hazırladığım Word belgesine kod


yazarak bilgi girmeyi deneyeceğim. Belgelere bilgi girilirken Range
nesnesinin InsertAfter() veya InsertBefore() metotlarından
yararlanabilirsiniz. InsertAfter() metodunun nasıl kullanıldığını anlatmak için
Document tipindeki değişken tanımlandığım satırı metodun dışına alıp
“Form1” sınıfının bütün metotlarında yaşayabilmesine imkan sağladım.
Ardından forma bir düğme yerleştirip aşağıda verdiğim kodu yazdım. Forma
yerleştirdiğim bu düğmeye “ekle” adını vermek yerine Osmanlıca karşılık
aradım uygun düğme adı aklıma gelmedi. Çünkü “ekle” tehlikeli bir düğme
veya değişken adıdır, bakarsınız ekle’yi birileri register etmiştir, kullanım
hakkını 50 yıllığına satın almıştır.
158 Memik Yanık - Visual C#’a Başlangıç Kitabı

private void ekle_Click(object sender, EventArgs e)


{
object missing = System.Reflection.Missing.Value;
Belge1.Range(ref missing, ref missing).InsertAfter("Fenerbahçe");
}

Word penceresini açıp ekrana getirmek amacıyla hazırladığım metoda


eklediğim bu satır sayesinde ekleme noktasının bulunduğu yere
InsertAfter() metoduna parametre olarak verilen bilgi yazılır. Proje
çalıştırılıp bu kod işletildiğinde aşağıdaki gibi bir sonuç alınır.

Bildiğiniz gibi yeni bir Word belgesi hazırlandığı zaman belge içeriği boş bir
paragrafa sahip olmakta ve Enter tuşuna her basılışta yeni bir paragraf
hazırlanmaktadır. Bu şartlarda yani C# uygulaması dahilinde içeriği boş bir
belge hazırlanıp imleç belgenin başlangıç noktasında iken InsertAfter()
yerine InsertBefore() metodu kullanılmış olunsaydı aynı sonuç alınırdı.

Şimdi bu Word belgesine kod yazarak bir paragraf ekleyip tekrar bilgi
gireceğim. Belgeye paragraf ekleme işlemi, yani Paragraphs koleksiyonuna
eleman ekleme işlemi Add() metodu ile yapılmaktadır. Bu metodun nasıl
kullanıldığını aşağıda görebilirsiniz. Document nesnesinin Paragraphs
koleksiyonundan yararlanıp her türlü paragraf işlemlerini yapmak
mümkündür.

private void ekle_Click(object sender, EventArgs e)


{
object missing = System.Reflection.Missing.Value;
Belge1.Range(ref missing, ref missing).InsertAfter("Fenerbahçe");
Belge1.Paragraphs.Add(ref missing);
Belge1.Range(ref missing, ref missing).InsertAfter("Beşiktaş");
}

Bu şekilde düzenlenen kod işletilirse aşağıdaki gibi bir sonuç alınır. Bu sırada
Word belgesi 2 paragrafa sahiptir. Aynı şekilde Word belgesine istediğiniz
gibi bilgi girebilirsiniz.
Bölüm 6: Windows Forms Uygulamaları 159

Şimdi örnek olması için Word belgesine mevcut bir ListBox’ın elemanlarını
aktaracağım. Bu işlemi yapmak üzere hazırladığım kodu aşağıda verdim.
Benzer mantıkla veritabanından okunan kayıtların her birisi Word belgesine
ayrı bir satır olarak aktarılabilinir.

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);
}
}

Yukarıda anlatılan şekilde C# uygulaması dahilinde hazırlanan Word


belgesine bilgi aktarma işlemi asıl Selection nesnesinin TypeText()
metodu ile yapılmaktadır. Bu metodun nasıl kullanıldığını aşağıda
görebilirsiniz.

private void ekle_Click(object sender, EventArgs e)


{
Word_nesnesi.Selection.TypeText("Fenerbahçe");
}

Bu metot aktif Word belgesinde imleç nerede bulunuyorsa imlecin sonuna


kendisine parametre olarak verilen bilgiyi yazar. Başka bir deyişle söz
konusu belgede seçili bir kısmı yoksa bunun imlecin bulunduğu yer olduğu
varsayılır.

Şimdi yukarıda verdiğim örneği değiştirip ListBox’ın içeriğini Word belgesine


aktarırken Selection nesnesinin TypeText() metodundan yararlanacağım.
160 Memik Yanık - Visual C#’a Başlangıç Kitabı

Değişken adı benzerliğinden suçlanmamak için bu işlemi yapacak düğmeye


“Aktar” yerine “naklet” adını 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# uygulamasının formundaki bir TextBox’a yazdığınız her karakterin


anında Word belgesine aktarılmasını istiyorsanız söz konusu TextBox’ın
KeyPress olayını temsil eden metodu aşağıdaki gibi düzenleyebilirsiniz.
TextBox aracılığı ile Word belgesine aktarmak istediğiniz metin birden fazla
satırdan meydana gelecekse MultiLine özelliğini True yapmanız gerekir.

private void textBox1_KeyPress(object sender,KeyPressEventArgs e)


{
char kar = e.KeyChar;
Word_nesnesi.Selection.TypeText(kar.ToString());
}

Bu 2 satırlık kod ile Word belgesine TextBox aracılığı ile bilgi aktarırken
TextBox’ın MutliLine özelliği True iken Enter tuşuna basılıp bir alt satıra
inildiğinde Word belgesinde yeni bir paragrafa geçilmiş olunur. Aktif Word
belgesine paragraf eklerken Selection sınıfının TypeParagraph()
metodunu kullanabilirsiniz.

private void Parag_ekle_Click(object sender, EventArgs e)


{
Word_nesnesi.Selection.TypeParagraph();
}

Nasıl ki ListBox’ların Items koleksiyonları varsa C# uygulamaları dahilinden


hazırlanan Word belgelerinin yani Document nesnelerinin Characters,
Words, Sentences, Paragraphs ve Sections koleksiyonları vardır. Bu
koleksiyonlardan yararlanarak belge hakkında bilgi edinebilir veya belge
üzerinde bazı işlemleri yapabilirsiniz.

Şimdi C# projesi dahilinde hazırladığım Word belgesinin içeriğini forma


yerleştirdiğim RichTextBox’a aktaracağım. Bu işlem için Range nesnesini
aşağıdaki gibi kullandım.
Bölüm 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;
}

Yukarıda Word penceresine yazılanları RichTextBox’a aktarırken Range()


nesnesine parametre olarak System.Reflection.Missing.Value sabitini
içeren object tipindeki “missing ” adını verdiğim değişkeni kullandım. Word
penceresine yazılanların hepsini değil de belli sayıdaki karakterini aktarmak
istiyorsanız alınacak ilk ve son karakterin sıra numarasını Range() nesnesine
aşağıdaki 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 açtığım Word belgesinin içeriğini


okumaya çalışacağım. Word belgesindeki ilk kelimeyi okumak istemiş
olsaydım aşağıdaki gibi bir satır yazardım. Bu kodda kullandığım
“Word_nesnesi” C# uygulaması dahilinde hazırladığım Word penceresini,
ActiveDocument ise o sırada aktif olan belgeyi temsil etmektedir. Açık
olan her hangi bir belge yokken bu satır işletilirse hata meydana gelir.

textBox1.Text = Word_nesnesi.ActiveDocument.Words[1].Text;

Tekrar uyarmak gerekirse, konu C# uygulaması dahilinde açılan Word


belgesi olduğunda Words gibi koleksiyonların ilk elemanın sıra numarası 0
olmayıp 1’dir. Belgedeki bütün kelimeleri yani bütün içeriğini okumak
istemiş olsaydım aşağıdaki gibi kod yazardım.

int sayi = Word_nesnesi.ActiveDocument.Words.Count;


for (int i = 1; i <= sayi; i++)
{
richTextBox1.Text = richTextBox1.Text +
Word_nesnesi.ActiveDocument.Words[i].Text;
}

Yukarıda belirtildiği gibi ActiveDocument nesnesinin Words’den başka


Characters koleksiyonu bulunmaktadır. Bu koleksiyondan yararlanıp Word
belgesinden istenen karakterler okunabilir. Şimdi Word belgesinin 2.
cümlesini okuyup RichTextBox’a aktaracağım. Word programı cümleleri
birbirinden ayırırken nokta ve ardından gelen boşluktan yararlanmaktadır.
162 Memik Yanık - Visual C#’a Başlangıç Kitabı

Başka bir deyişle cümle sonunu işaret etmek üzere yazılan noktadan sonra
boşluğa yer verilmezse Word cümlenin devam ettiğini sanıyor.

richTextBox1.Text = Word_nesnesi.ActiveDocument.Sentences[2].Text;

C# uygulaması dahilinde açtığım veya hazırlayıp bilgi aktardığım Word


belgesinden paragraf bazında okuma yapmak isteseydim aşağıdaki gibi kod
yazardım. Aşağıda verilen satır sayesinde belginin ilk paragrafı
RichTextBox’a aktarılır.

richTextBox1.Text= Word_nesnesi.ActiveDocument.Paragraphs[1].Range.Text;

Aktif belgenin bütün içeriğini okumak istemiş olsaydım aşağıdaki gibi kod
yazardım.

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 Đçeriğini Biçimlemek

Bildiğiniz gibi Word ile çalışırken imlecin bulunduğu noktanın biçim özellikleri
nasılsa yeni girilen karakterler de aynı biçim özelliklerine sahip olmaktadır.
Bu nedenle kullanıcılar çoğunlukla metnin genellinde kullanacakları biçim
özelliklerini ayarlayıp öyle bilgi girerler. Benzer şekilde C# uygulaması
dahilinde hazırladığınız Word belgesine kod yazarak aktarmak istediğiniz
metin için önceden biçim özelliklerini ayarlayabilirsiniz. Bu işlemin nasıl
yapıldığını aşağıda görebilirsiniz.

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;
}
Bölüm 6: Windows Forms Uygulamaları 163

Selection.Font.Bold özelliği Integer tipinde olduğu için 0 veya 1 değerini


aktarmak gerekmektedir. O normali temsil ederken 1 veya daha büyük
değerler Bold’u temsil etmektedir. Şimdi ise C# uygulaması dahilinde
hazırlanan Word belgesinin mevcut içeriğinin seçili durumda olan kısmının
altı çizili olmasını sağlayacağım. Bu amaçla forma bir düğme yerleştirip
aşağıda verdiğim kodu yazdım.

private void alti_cizili_Click(object sender, EventArgs e)


{
Word_nesnesi.Selection.Font.Underline=WdUnderline.wdUnderlineSingle;
}

Word belgesinin seçili durumda olan kısmını altı çizili yapacak kodu button
nesnesinin Click olayını temsil eden metoda yazmak yerine CheckBox
nesnesinin CheckedChanged olayını temsil eden metoda aşağıdaki 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 yapılabilinen bütün biçimleme işlemleri C#


uygulaması dahilinde hazırlanan Word belgesine kolaylıkla
uygulanabilmektedir. Bu kitap bir Word kitabı olmadığı için ancak birkaç
biçimleme işleminden söz edeceğim. Şimdi ise C# uygulaması dahilinde
hazırlanan Word belgesindeki geçerli veya seçili durumdaki paragrafın
hizalama özelliklerini ayarlamak üzere forma bir CheckBox yerleştirip
aşağıda verilen kodu yazdım. Bu kod sayesinde üzerinde bulunulan paragraf
veya seçili durumdaki paragraflar sağa doğru hizalanır.

private void saga_hizali_CheckedChanged(object sender, EventArgs e)


{
Word_nesnesi.Selection.Paragraphs.Alignment =
WdParagraphAlignment.wdAlignParagraphRight;
}

Word Belgesi Üzerinde Hareket Etmek

C# uygulaması dahilinde hazırladığınız Word belgesinde imlecin yerini kod


yazarak kolayca değiştirebilirsiniz. Bu konuda bilgi vermek için forma bir
düğme yerleştirdim ve aşağıda verdiğim kodu yazdım.
164 Memik Yanık - Visual C#’a Başlangıç 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 değişken tanımladım. Bu değişkenlere


Microsoft’un programcılarının alışkanlığına uyarak “missing” ve “unit”
adlarını verdim. Sizler bu değişkenlere istediğiniz adı verebilirsiniz. “unit”
adını verdiğim değişkene Microsoft.Office.Interop.Word’de yer alan
WdUnits adlı enum’un wsStory elemanını aktardım. Devamında Word
uygulamasının Selection nesnesine HomeKey() metodunu uyguladım. Bu
kod işletildiğinde imleç aktif belgenin başına gider. Eğer belgenin sonuna
gitmek istemiş olsaydım bu kodu aşağıdaki gibi düzenlerdim. Bu 2 kod
arasında tek fark HomeKey() yerine EndKey() metodunun kullanılmış
olmasıdır.

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 satırın sonuna gidilmek istendiğinde ise aşağıdaki gibi


kod yazılmalıdır. Bu kodun belgenin başına veya sonuna gidilirken kullanılan
koddan farkı “unit” adını verdiğim değişkene aktarılan sabit bilgidedir.
Belgenin başına giderken yararlandığım “unit” adlı değişkene
WdUnits.wdStory sabitini aktarırken satır üzerinde hareket etmek üzere
tanımladığım bu değişkene WdUnits.wdLine aktardım.

Selection nesnesine uygulanan EndKey() yerine HomeKey() metodunu


yazsaydım bu kod üzerinde bulunulan satırın başına gidilmesine neden
olurdu. Burada “unit” adını verdiğim object tipindeki değişkene
“WdUnits.wdLine” aktardığım için işlemler satır bazında yapılır.

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 içeriği üzerinde hareket etmeyi paragraf bazında


yapacağım. Aşağıda verdiğim kod işletildiğin imlecin yatay konumu
değişmeden bir sonraki paragrafın üzerine gedilir.

object missing = System.Reflection.Missing.Value;


Bölüm 6: Windows Forms Uygulamaları 165

object unit = Microsoft.Office.Interop.Word.WdUnits.wdParagraph;


Word_nesnesi.Selection.MoveDown(ref unit, ref missing,ref missing);

Sanki aşağı ok tuşuna basılmış gibi bir imlecin yatay konumu değişmeden
bir sonraki satırın üzerine gitmek istiyorsanız aşağıdaki 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 satırdaki bir sonraki kelimenin başına veya bir
önceki kelimenin sonuna gitmesini istiyorsanız bu kodda “unit” adını
verdiğimiz object tipindeki değişkene WdUnits.wdWord sabitini
aktardıktan sonra Word uygulamasını temsil eden nesneye MoveLeft()
veya MoveRight() metodunu uygulamanız gerekir. Bu metotların nasıl
kullanıldığını aşağıda görebilirsiniz.

object missing = System.Reflection.Missing.Value;


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

Seçim Đşlemleri ve Range Nesnesi

Word belgesinin bütün içeriğini seçmek istiyorsanız Select() metodundan


yararlanabilirsiniz. Bu metodun nasıl kullanıldığını anlatmak için forma
“Tümünü Seç” başlıklı bir düğme yerleştirip bu düğmenin Click olayı ile
ilişkilendirdiğim metodunu aşağıdaki gibi düzenledim.

private void Tumunu_sec_Click(object sender, EventArgs e)


{
Belge1.Select();
}

Select() metodunu burada yapıldığı gibi Document nesnesine uygulamak


yerine ApplicationClass nesnesinin ActiveDocument nesnesine aşağıdaki
gibi uygulayabilirsiniz.

Word_nesnesi.ActiveDocument.Select();

Word belgesinin bütün içeriğini seçerken Range nesnesinden


yararlanabilirsiniz. Aşağıda verdiğim kodda önce söz konusu belgedeki
karakter sayısını öğrendim. Çünkü DocumentClass nesnelerinin Characters
adında bir koleksiyonu bulunmaktadır.
166 Memik Yanık - Visual C#’a Başlangıç 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();
}

Yukarıdaki sayfalarda yapılan bazı işlemlerin Range nesnelerine


uygulandığını fark etmiş olmalısınız. Biçimleme ve diğer işlemler için
önceden Range nesnesi hazırlayıp işlemleri Range nesnesine
uygulayabilirsiniz. Range nesnesini nasıl hazırladığımı aşağıda görebilirsiniz.
Tahmin edeceğiniz gibi bu satırlar bir metoda yazılıp işletilirse “Belge1” adlı
Document nesnesinin bütün içeriği Bold yapılır.

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 bütün içeriğini Range nesnesi


olarak değerlendirdim. Range nesnesini hazırlarken ApplicationClass
sınıfının ActiveDocument özelliğinden yararlanabilirsiniz. Bu nedenle
aşağıda verilen kod işletildiğinde aktif belgenin bütün içeriği aynı şekilde
bold yapılır.

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 paragrafını Range nesnesi olarak


değerlendireceğim. Başka bir deyişle aktif belgenin ilk paragrafının bir
Range nesnesi tarafından temsil edilmesini sağlayacağım. Tahmin
edeceğiniz gibi aşağıda verilen kod işletildiğinde C# uygulaması dahilinde
açılan Word uygulamasının aktif belgesinin ilk paragrafı panoya kopyalanır.

private void Kopyala_Click(object sender, EventArgs e)


{
Range erim = Word_nesnesi.ActiveDocument.Paragraphs[1].Range;
erim.Copy();
}

Şimdi ise “Word_nesnesi” adını verdiğim Word uygulamasının aktif


belgesinin seçili durumdaki kısmını Range nesnesi olarak değerlendireceğim.
Aktif belgenin seçili durumda olan herhangi bir kısmı yoksa bu kodun bir
işlevi olmaz.
Bölüm 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 seçilen kısmı Word uygulamasının Selection nesnesine


aktarılmaktadır. Copy() veya Cut() metodu ile Selection nesnesinin içeriğini
panoya veya başka bir nesneye aktarabilirsiniz. C# projesi dahilinde Word
belgesi açıp kullanıcıya Word aracılığı ile işlem yapması pek istenmez.
Aşağıda verilen kod işletildiğinde aktif belgenin seçili durumdaki kısmı kesilip
panoya alınır.

Range erim = Word_nesnesi.Selection.Range;


erim.Cut();

Şimdi ise aktif belgede imlecin mevcut konumunun sağındaki ilk 10


karakteri seçeceğim. Tabi seçme işlemine başlamadan yukarıdaki sayfalarda
anlatılan şekilde istenen yere konumlandırılması 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ı değişkene WdUnits.wdCharacter aktarıldığı için imleç 2.
parametre kadar sağa gider. Başka bir anlatımla imlecin ilk bulunduğu
yerden başlamak üzere 10 karakter seçilir. MoveEnd() metodu aşağıdaki
gibi kullanılırsa imlecin sağındaki 2 kelime seçilmiş olur. Bu belgenin seçili
durumda olan kısmı varsa seçili kısım 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” adını verdiğim değişkenin içeriğinde


değişiklik yapıp seçme işleminin satır, paragraf veya sayfa bazında
yapılmasını sağlayabilirsiniz. Seçim işlemi bütün satırı veya paragrafı
seçmek şeklinde olmayıp o sırada imlecin bulunduğu noktadan sonrası
168 Memik Yanık - Visual C#’a Başlangıç Kitabı

üzerinde etkili olur. Örneğin imleç belgenin bir satırın orta kısmında iken
aşağıda verilen kod işletilirse 1.5 satır kadar seçimi yapılmış 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 hazırladığınız Word belgelerinde arama


yapacaksanız belgenin aramaya konu etmek istediğiniz kısmını Range ya da
Selection nesnesi ile belirtebilirsiniz. Range nesnesi ile yapılan arama
tekniğine öncelik verdiğim için forma bir düğme ve TextBox yerleştirip
aşağıda verdiğim kodu hazırladım.

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 kullanıcı Word belgesinde aramak istediği metni TextBox’a


girip bu düğmeyi tıkladığında belgenin tümünü kapsayacak Range nesnesi
hazırlamış olur. Sizler aramayı belgenin tümü yerine istediğiniz kısmı ile
sınırlayabilirsiniz.

Belgenin aramaya konu edilecek kısmı bu şekilde tespit edildikten sonra sıra
arama yapılırken kullanılan ve Microsoft.Office.Interop.Word’de yer alan
Find arayüzünün örneğini almaya gelir. Find nesnesini nasıl hazırladığımı
aşağıda görebilirsiniz.

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;
}
Bölüm 6: Windows Forms Uygulamaları 169

Arama yapmak üzere hazırladığım bu kodda Range nesnesinin Find özelliğini


Find tipindeki değişkene aktararak Find nesnesi hazırlamış oldum. Sıra geldi
Execute() metodu ile arama yapmaya. Word’de normalde arama yapılırken
ekrana getirilen diyalog kutusunda nasıl çok sayıda seçenek bulunuyorsa
Execute() metodu da çok sayıda parametreye sahiptir. Biz aranacak metni
1. parametre olarak vermekle yetineceğiz ve diğer bütün parametrelerin
yerine System.Reflection.Missing.Value içeriğine sahip Object tipinde bir
değişkeni kullanacağız. Object tipindeki bu değişkene “deger” gibi Türkçe bir
ad verip kendimi tehlikeye atmadım.

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");
}

Gördüğünüz gibi Execute() metodu toplam 15 parametreye sahiptir.


Kendisine 1. parametre olarak verilen bilgi söz konusu belgenin Range
nesnesi ile işaret edilen kısmında varsa Find nesnesinin Found özelliği true
olmaktadır. Arama işleminin seyri hakkında bilgi edinirken Find nesnesinin
Found özelliğine bakmak yerine Execute() metodunun geriye gönderdiği
bool bilgiye bakabilirsiniz. Aranan bilgi bulunduğunda Execute() metodu
geriye true göndermektedir.

Yukarıda söylendiği gibi arama işlemi belgenin Range nesnesi ile işaret
edilen kısmında yapılabildiği gibi Selection nesnesinden yararlanılabilir.
Selection nesnesinden yararlanılarak nasıl arama yapıldığını aşağıda
görebilirsiniz. Bu kitabı Word kitabına çevirmemek için Execute()
metodunun parametreleri hakkında 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 Yanık - Visual C#’a Başlangıç 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

Yukarıdaki sayfalarda C# uygulaması dahilinde yeni Word belgesi hazırlayıp


bilgi girmiştik. Şimdi sırada kod yazarak hazırlayıp bilgi girdiğimiz belgeyi
kaydetme var. Đşin meraklılarını düşünerek bu işlem için kullanılan
SaveAs() metodunun orijinal yapısını vereceğin. Bu metodun yapısı
incelendiğinde tam tamına 16 parametreye sahip olduğu görülür. Ancak
ürkmenize gerek yok bu 16 parametreden ilki hariç diğerlerini kullanmak
isteğe bağlıdır.

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 bölüme ayrılan sayfa sayısını fazla arttırmamak için bütün


parametrelerden söz etmeyeceğim. Yukarıda Add() metodu hakkında bilgi
verilen sayfalardan bildiğiniz Word belgelerini, açarken, hazırlarken ve
kaydederken varsayılan değerlere bağlı kalınmak istenen parametrelerin
yerine System.Reflection.Missing.Value sabiti aktarılmış Object
tipindeki bir değişkeni kullanmak mümkündür.
Bölüm 6: Windows Forms Uygulamaları 171

C# projesi dahilinde hazırlanan Word belgesinin nasıl kaydedildiğini


anlatmak için forma bir SaveFileDialog nesnesi ve “Kaydet” adında bir
düğme yerleştirip aşağıda verdiğim kodu hazırladım. Kaydetmek istediğim
belge yukarıda hazırlayıp ve “Belge1” adını verdiğim DocumentClass
nesnesidir.

Karışıklık olmasın diye DocumentClass ve ApplicationClass nesnelerini


hazırladığım satırları “Kaydet” düğmesi için hazırladığım metodun yakınına
taşıdım. Ayrıca kaydetme işlemi sırasında hazırlanacak DOC uzantılı
dosyanın adını kullanıcıdan istemek için forma bir SaveFileDialog nesnesi
yerleştirdim.

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 sırada C# uygulaması dahilinde hazırlanan Word belgesini kaydetmek


üzere bu kod işletildiğinde kullanıcıdan önce dosya adı istenir. Adını
girdiğiniz dosyaya DOC uzantısını vermeniz önerilir. Çünkü bu sırada
kaydedilmek istenen DocumentClass nesnesi hazırlanırken belge tipinin
DOC uzantısı verilen normal belge olduğunu varsayıyoruz. Ayrıca kayıt
sırasında kayıt türü konusunda bir ayarlama yapmadık. Bu kod işletilip
kullanıcının girdiği belge adı o sırada açık Word penceresinin başlığına
yazılır.

Word’ü az çok kullanmış olanların bildiği gibi Word belgeleri kaydedilirken


Farklı Kaydet diyalog kutusunda istenen kayıt türü seçilebilmektedir.
Benzer seçimi C# uygulaması dahilinde hazırladığınız belgeleri kaydederken
yapabilirsiniz. Şimdi yukarıda hazırladığım Word belgesini bu kez RTF
formatında kaydedeceğim. Bunu yaparken kayıt türünü SaveAs()
metodunun 2. parametresinde belirteceğim.

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 Yanık - Visual C#’a Başlangıç 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 yukarıdakinden farklı olarak object tipinde bir değişken


tanımlayıp Microsoft.Office.Interop.Word de yer alan WdSaveFormat adlı
enum’un wdFormatRTF üyesini bu değişkene aktardım. Devamında
“kayit_turu” adını verdiğim değişkeni SaveAs() metoduna 2. parametre
olarak verdim.

Word Belgelerini Kapatmak

Şimdi ise C# uygulaması dahilinde hazırlayıp sonra da SaveAs() metodu ile


kaydettiğim Word belgesini kapatacağım. Bu amaçla forma Kapat
adında(Close mı deseydim, belki Kapat’ı birileri register etmiştir) bir düğme
yerleştirip aşağıda verdiğim kodu hazırladım.

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 amacıyla kullanılan Close() metodu 3


parametreye sahiptir. Bu metodu varsayılan değerlere göre işletmek
istiyorsanız yine object tipinde bir değişken tanımlayıp bu değişkene
System.Reflection.Missing.Value aktarıp her 3 parametrenin yerine
kullanmalısınız. Bu durumda son hali kaydedilmemiş bir belge Close()
metodu ile kapatılmak istenirse otomatik olarak ekrana Farklı Kaydet
diyalog kutusu gelir. Kapatılmak istenen belgede yapılan değişikliklerin
kaydedilmesi konusunda size uyarı bulunulmasını istemiyorsanız Close()
metodunun 1. parametresini aşağıdaki gibi düzenleyebilirsiniz.

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);
}
Bölüm 6: Windows Forms Uygulamaları 173

Word belgesi yerine C# uygulaması dahilinde açtığınız Word penceresini


kapatmak veya Word’ün çalışmasını sona erdirmek istiyorsanız
ApplicationClass sınıfının Quit() metodunu kullanabilirsiniz. Bu metodun
nasıl kullanıldığını aşağıda görebilirsiniz.

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 açtığınız Word penceresini kapatırken açık olan


belgelerle ilgili olarak ekrana Farklı Kaydet diyalog kutusu getirilir. Bu
diyalog kutusunun gelmesini istemiyorsanız Quit() metodunun ilk
parametresi ile aşağıdaki gibi ayarlama yapmalısınız.

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);
}

Yukarıdaki sayfalarda işaret edildiği gibi Word uygulamasını temsil eden


ApplicationClass sınıfının Documents adında bir koleksiyonu
bulunmaktadır. O sırada C# uygulaması dahilinde açılan veya hazırlanan her
belge bu koleksiyonun üyesi yapılmaktadır. Açık olan belgelerin sayısını
öğrenmek Count özelliğine bakabilirsiniz.

int sayi = Word_nesnesi.Documents.Count;

Documents koleksiyonundaki mevcut belgelerden birisini elde etmek


istiyorsanız Documents koleksiyonun get_item() metodundan
yararlanabilirsiniz. Bu metodun nasıl kullanıldığını aşağıda görebilirsiniz.
Burada dikkat edilmesi gereken ince nokta Documents koleksiyonun ilk
elemanın sıra numarasının 1 olmasıdır.

Document Belgem = new DocumentClass();


object sira = 1;
Belgem = Word_nesnesi.Documents.get_Item(ref sira);

Mevcut Word Belgelerini Açmak

Yukarıdaki sayfalarda önce Word’ü başlattık. Sonra Add() metodu ile yeni
belge hazırlayıp Word penceresine getirip bilgi girip biçimlendirdik. Ardından
bu belgeleri kaydetmeyi denedik. Şimdi sırada mevcut Word belgelerini
174 Memik Yanık - Visual C#’a Başlangıç Kitabı

açmak var. Tabi Word ile mevcut belgelerini açabilmek için daha önceden
ApplicationClass sınıfı ile Word’ü başlatmış olmak gerekir. Yukarıdaki
sayfalarda Word’ün varsayılan ayarlarına bağlı kalıp Word başlatıldığı zaman
ekrana içeriği boş bir belge getirdik.

Word başlatıldığında otomatik olarak hazırlanan Word belgesine bilgi


girilmeden mevcut belgelerden birisi açıldığında Word otomatik olarak
hazırladığı belgeyi kapatmaktadır. C# uygulamaları dahilinde mevcut
belgeler DocumentClass sınıfının Open() metodu ile açılmaktadır. Çok
sayıda parametreye sahip bu metodun yapısını aşağıda görebilirsiniz.

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);

Gördüğünüz gibi Open() metodu da tıpkı SaveAs() metodu gibi çok sayıda
parametreye sahiptir. Açılacak dosyanın işaret edildiği ilk parametre hariç
diğerlerini hazırlayıp kullanmak zorunda değilsiniz. Başka bir deyişle ilk
parametre hariç diğerlerinin yerine kullanmak üzere object tipinde bir
değişken tanımlayıp bu değişkene System.Reflection.Missing.Value
sabitini aktarıp kullanabilirsiniz.

Mevcut Word belgelerinden birisini Open() metodu ile nasıl açabileceğinizi


anlatmak için karışıklık olmasın diye yeni bir proje hazırladım ve forma
OpenFileDialog nesnesi yerleştirip aşağıda verdiğim kodu hazırladım.
Çünkü amacımız DocumentClass sınıfının Open() metodunu yakından
incelemektir. Değişken adı benzerliği kabahatini işleme olasılığını azaltmak
için düğme adının bir kısmını Đngilizce bir kısmını Türkçe yaptım.

ApplicationClass Word_nesnesi;
Document Belge1;
private void Dosya_open_Click(object sender, EventArgs e)
{
Belge1 = new DocumentClass();
Bölüm 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);
}

Gördüğünüz gibi ilk parametre hariç diğer 15 parametre olarak


System.Reflection.Missing.Value aktardığım object tipindeki değişkeni
kullandım. Bu kod işletildiğinde ekrana gelecek Open diyalog kutusunda
seçilecek dosya açılıp Word penceresine gelir. Tabii kullanıcı dosya seçimi
yapılan diyalog kutusunda dosya seçmez veya uygun olmayan bir dosyayı
seçerse hata meydana gelir. Konuyu uzatmamak ve kodun kısa olmasını
sağlamak için hata kontrol işlemlerini yapmadım.

Anlatılan şekilde DocumentClass sınıfının Open() metodu ile açıp Word


penceresine getirdiğiniz belgenin içeriğinde değişiklik yapılmasını(yani
dosyanın değiştirilmesini) istemiyorsanız Open metoduna 3. parametre
olarak System.Reflection.Missing.Value sabitini aktardığınız Object tipindeki
değişken yerine object tipinde başka bir değişken tanımlayıp true aktarıp
kullanmanız gerekir. Bu işlemi nasıl yaptığımı aşağıda görebilirsiniz.

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 Yanık - Visual C#’a Başlangıç Kitabı

Bu şekilde düzenlenen Open() metodu ile açılan Word belgesinde değişiklik


yapılabilir ancak değişiklikler açılan dosyaya yansıtılamaz. Đsterseniz
belgenin yeni halini başka bir dosya adı altında kaydedebilirsiniz. Open
metodu ile açmak istediğiniz dosya DOC uzantılı değilse ve dönüştürme
öncesi kullanıcıdan onay alınsın istiyorsanız Open() metoduna 2. parametre
olarak true içeriğe sahip object tipindeki bir değişkeni kullanmalısınız.

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);
}

Kitabın sayfa sayısını arttırmamak için Open() metodunun burada sözü


edilmeyen diğer 13 parametresinin her birisinin işlevlerini araştırmayı size
bırakıyorum.

Word Belgelerini Yazdırmak

C# projesi dahilinde hazırladığınız veya açtığınız Word belgesini yazdırmak


istiyorsanız ApplicationClass sınıfının Printout() metodundan
yararlanmanız gerekir. Bu metot tıpkı SaveAs() ve Open() metotları gibi
çok sayıda parametreye sahip olduğu için kullanılması 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,
Bölüm 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 nasıl kullanıldığını anlatmak için mevcut Word belgelerinin nasıl


açıldığını anlatmak üzere hazırladığım projenin formuna “Yazdir” adında bir
düğme yerleştirdim. Ardından bu düğmenin Click olayını temsil eden
metodu aşağıdaki gibi düzenledim.

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ş olabileceğiniz gibi PrintOut() metodunun bütün


parametrelerinde System.Reflection.Missing.Value sabiti aktarılmış
object tipindeki değişkeni kullanmak mümkündür. Bu şekilde düzenlenen
PrintOut() metodu aktif belgenin tümünü yazıcıya gönderir. Geçerli belgenin
tümü yerine seçili durumdaki kısmını yazıcıya göndermek istiyorsanız
PrintOut() metodunun 3. parametresini aşağıdaki gibi ayarlamalısınız.

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 seçili kısmı yerine geçerli sayfayı yani belgenin o sırada
üzerinde olunan sayfasını yazdırmak istemiş olsaydım “secim” adını vermiş
olduğum değişkenin içeriğini aşağıdaki gibi ayarlardım.

object secim = WdPrintOutRange.wdPrintCurrentPage;


178 Memik Yanık - Visual C#’a Başlangıç Kitabı

ApplicationClass nesnesi sayesinde ekrana getirilen Word penceresinde


DocumentClass nesnesi sayesinde içeriği görüntülenen Word belgesinin belli
numaraya sahip sayfalarını yazdırmak istiyorsanız bu sayfaları PrintOut()
metodunun 5. ve 6. parametreleri ile işaret etmeniz gerekir. Tabi bu
durumda 3. parametrenin ayrıca ayarlanması gerekir. PrintOut() metodu
aşağıdaki gibi düzenlenirse aktif belgenin 2. ve 3. sayfaları yazdırılır.

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 için PrintOut() metodunun diğer parametrelerinin


işlevini size bırakıyorum. Aktif belgeyi hemen yazdırmak yerine
önizleme(Preview) modunda incelemek istiyorsanız ApplicationClass
nesnesinin PrintPreview özelliğini true yapabilirsiniz. Bu özelliğin nasıl
kullanıldığını anlatmak için forma bir düğme yerleştirip aşağıda verdiğim
satırı yazdım. Bu metot işletirse sanki Word penceresine geçip Dosya
menüsünden Önizleme komutu verilmiş gibi önizleme moduna geçilir.

private void on_izle_Click(object sender, EventArgs e)


{
Word_nesnesi.PrintPreview = true;
}
Bölüm 6: Windows Forms Uygulamaları 179

ADO.NET KĐTABIMIN ÖNSÖZÜ


Bu kitabı birkaç cümle ile bize anlat denmiş olsaydı cevabım şu olurdu: Bu
kitapta 420 sayfa boyunca ADO.NET anlattım. Bunu yaparken okurların C#
hakkında temel bilgilere sahip olduğunu varsaydım. Bu kitaptan biraz
zahmetli de olsa Visual Basic .NET kullanıcıları da yararlanabilirler. Çünkü
her 2 programlama dili de .NET Framework ile gelen aynı sınıfları kullanıyor.

Bu kitap SQL Server konulu bir kitap olmamasına rağmen daha önce SQL
Server’ı hiç kullanmamış olanların kitaptan yararlanmasını sağlamak için yer
yer SQL Server’dan söz ettim. Hemen soranlar olacaktır: Bu kitapta
ADO.NET hakkında her konuda bilgi var mı? Bu soruya vereceğim elbette
hayırdır. Tam 420 sayfa boyunca ADO.NET anlattım. Bu kitap 300 sayfa
olsaydı bazı konular kitapta yer almazdı. Kitabı 420 yerine 500 sayfa olarak
düzenlemiş olsaydım kitaba başka konular ekler, mevcut konulardan
bazılarını ise daha ayrıntılı anlatırdım. Örneğin C# uygulaması dahilinde C#
kodu yazarak SQL Server için Store Procedure veya kullanıcı tanımlı
fonksiyon hazırlama gibi konuları daha ayrıntılı anlatırdım, ClickOnce için
ayrılan sayfaların sayısı iki katına çıkardı.

Yakın bir zamana kadar kitaplarımda kullandığım 3-5 satırlık kodları bazen
ekran görüntüsü olarak kitap metni içinde kullanırdım. Bu sayede kodu
incelemek daha kolay oluyordu. Bazıları bu ekran görüntülerini “kitap
şişirme” olarak değerlendirip Memik YANIK’ın kitaplarını eleştiriyorlardı. Hal
bu ki kitap metni içinde direk kod yerine, kodun olduğu ekran görüntüsünü
kullanmanın kitabın sayfa sayısı üzerinde etkisi çok sınırlıydı. Bunu
kanıtlamak için oturup çalışıp bir yazı hazırlayıp kişisel sistemde yayınladım.
Bu kitapta kod içeren ekran görüntülerinden mümkün mertebe kaçındım.
Tabii ki bu demek değildir ki bu kitapta hiç ekran görüntüsü yoktur. Zaten
ekran görüntüsü kullanmadan bazı konuları anlatmak mümkün değildir.
Örneğin Setup Wizard’ı anlatırken ekran görüntüsü kullanmak
zorundasınız.

Bu kitapta yazılanları anlamak için tekrar tekrar okumak zorunda


kalmazsınız. Çünkü Memik YANIK’ın kaleminden çıkan kitaplar klasik
programlama kitapları gibi değildir, Memik YANIK’ın tarafından yazılan
kitaplarda Help tadı yoktur, Memik YANIK’ın cümleleri çeviri kokmaz. Bu
nedenledir ki bu kitap kolay okunur, bu kitapta yazılanları anlamak için akla
karayı seçmezsiniz.

Yakında bir zamanda Microsoft firması Visual Studio 2008’i piyasaya


verecektir. Bu arada birçok kişi Visual Studio 2005’i kullanmaya devam
edecektir. Ayrıca 2008 yılı için SQL Server’ın yeni sürümü piyasaya
verilebilir. Bu kitapta veritabanı olarak genellikle SQL Server’ın 2005
sürümünü kullandım. Hemen belirtmek gerekirse, bu kitap program
180 Memik Yanık - Visual C#’a Başlangıç Kitabı

geliştirme aracı olarak ister Visual Studio 2005 ister Visual Studio 2008
kullanılsın herhangi bir uyum sorunu yaşanmaya ihtimali düşüktür. Benzer
şekilde bu kitabın içeriği bakımından veritabanın SQL Server 2005 veya SQL
Server 2008 olmasının önemli bir etkisi yoktur. www.memikyanik.com’dan
mail ve MSN adresimi alıp her türlü sorununuzu yazabilir veya direk benimle
bağlantı kurabilirsiniz.
Bölüm 6: Windows Forms Uygulamaları 181

Delphi 2007 Kitabım Nasıl Bir Kitaptır?


Biraz tarih: 1995 yılının sonları; daha önce Visual Basic hakkında kitap
yazmış birisi olarak görsel programlamaya yatkındım ve görsel program
geliştirme araçlarını anlatma konusunda hazırlığım vardı. Çünkü Visual
Basic’in TextBox’ı ile Delphi’nin Edit’i benzer işlev ve özelliklere sahip
oldukları için fazla yabancılık çekmeyeceğimi düşünmüştüm. Ötesi, o
günlerde Pascal uzmanı olmasam bile Pascal diline yabancı değilim.

Neyse uzatmayalım; 7-8 aylık yoğun bir çalışmanın sonucu Delphi kitabını
hazırladım. Daha sonra bu Delphi kitabına eklemeler yaptım. En son Ezel
Balkan adıyla yayınladığım Delphi 7 kitabı 920 sayfa olup potansiyel
okurların beklentilerinin büyük bir kısmını karşılayacak bir içeriğe sahipti.
Açıkça belirtmek gerekirse 2006 yılı ortalarında elimde okurlardan ilgi
gördüğü için 3 baskı yapan 920 sayfalık kitap varken tam 10 ay boyunca
Delphi üzerinde çalışıp Delphi 2007 for Win32 kitabını yazdım. Bundan şu
sonucu çıkarabilirsiniz: Ezel Balkan adıyla yayınladığım 920 sayfalık Delphi
kitabımla burada sözünü ettiğim kitap arasında dağlar kadar fark var.
182 Memik Yanık - Visual C#’a Başlangıç Kitabı

Delphi 2007 kitabını ilk yazmaya başladığım sırada normal çalışma


tempomla 3 aylık bir sürenin yeterli olacağını düşünüyordum. Açık yazmak
gerekirse, elimde 920 sayfalık Delphi 7 kitabı vardı; düzey yükseltme adına
bazı konuları kitaptan çıkaracaktım. Böylece Delphi 2007 kitabı yaklaşık 950
sayfa olacaktı. Son Delphi kitabıma 100 sayfa eklersem eksikliklerini büyük
oranda azaltmış olacaktım ve bu kitap en kapsamlı Türkçe Delphi kitabı
olabilecekti. Başka bir deyişle ilgi gören son Delphi kitabımdan 70 sayfa
çıkarıp yerine 100 sayfa ekleyecektim.

Bazı sayfaları madem çıkaracaktın da neden 3 yıl önce bu sayfaları kitaba


ekledin diye soranlar olabilir? Bu soruya Delphi.NET kitabımdan örnek
vererek anlatacağım: Delphi.NET kitabımda Transaction’lar hakkında bilgi
verirken önce SQL Server 2000 ile gelen Interprise Manager’dan
yararlanıp 2 basit Stored Procedure hazırlayıp işlettim. Sonra bunları
Transaction bloğuna alıp işlettim. Đstedim ki SQL Server dahilinde
Transaction’leri kullanmamış olanlar konuya kolayca adapte olsunlar. Bu
durumda SQL Server ve Transaction’lar hakkında ortalama düzeyde bilgisi
olanlar için kitabın sayfa sayısı 3 sayfa boşuna artmış oldu. Ancak SQL
Bölüm 6: Windows Forms Uygulamaları 183

Server konusunda ortalama düzeyde bilgisi olmayanların Delphi projesi


dahilinde Transation’lerin nasıl kullanıldığını anlamalarını garanti etmiş
oldum. Đşte kitabın sayfa sayısını azaltma bu gibi konularda oluyor. Örneğin
potansiyel okurların çoğunluğunun artık Paradox veritabanları hakkında
bilgiye ihtiyacı yoktur deyip kitabın Paradox veritabanları hakkında bilgi
içeren sayfalarını azaltırsınız.

Neyse konudan uzaklaşmayayım: Başlangıçta 920 sayfalık Delphi 7 kitabının


850 sayfasını yeni kitabımda kullanmayı düşünürken “Memik YANIK hep
başlangıç düzeyi kitaplar yazar, yeni başladıysan önerebilirim, ancak Memik
YANIK kitapları yeterli değildir” şeklindeki yaygın eleştiriden sanırım
etkilendim ki elimdeki kitabın 850 sayfasını yeni kitapta kullanmayı
düşünürken bir de baktım kitabın düzeyini yükseltme adına neredeyse her
şeyi yeni baştan yazmışım.

Şimdi yukarıda kısaca özetlediğim Memik YANIK kitaplarının yeni


başlayanlar için uygun olduğu şeklindeki genel inanışa biraz değinmek
istiyorum. Konumuz Delphi olsun: Delphi’yi öğrenip program yazmaya karar
verdiniz. Yani yolun başındasınız. Bu durumda edindiğiniz kitabın en önemli
işlevi sizi cesaretlendirmesi ve hevesinizi kırmamasıdır. Çünkü öğrenme
isteği ve çalışma azmi kimsede sonsuz değildir. Bu nedenle metni öyle
kaleme almalıyım ki okur okumakta zorlanmamalı, yazdığımı anlaması için
başka kaynaklara başvurma ihtiyacını duymamalıdır. Örneğin birkaç gün
önce C# kitabımı yazarken Access veritabanlarında kullanıcılar için parola
tanımlama ve mevcut kullanıcının parolasını C# uygulaması dahilinde isteme
gibi konulara örnek verirken yazdıklarımın havada kaldığını fark ettim.
Çünkü bu konulara programcılık kitaplarında yer verilmezken Access
kitaplarında ise olaya programcı gözü ile bakılmıyordu.

Bunu fark edince bendeki mevcut kitaplara baktım. Birisi Microsoft Press’ten
çıkmış 1000 sayfalık kapsamlı kitap olmakla birlikte diğer 3 kitapta
yazılanlar yanlış olmamakla birlikte hiç birisi Access veritabanı kullanan
programcının güvenlikle ilgili olarak gerek duyacağı bilgileri içermiyordu.
Ayrıca yazılanları anlamak kolay değildi. Kitabın birisinde yazar açıklama
yapmadan okuru ikna etmeden direk Wizard hakkında bilgi veriyordu. Ben
ne mi yaptım? Önce okuru karşılaşacağı muhtemel sorunlar hakkında
bilgilendirdim. Devamında onu ikna ettim. Sıra Wizard’a geldiğinden okur ne
yapacağını zaten biliyordu. Şimdi sorayım: ne yazdığı belli olmayan kolay
okunmayan kitap ileri düzey oluyordu da konunun ilk okumada anlaşılması
için başka yazarların 3 sayfada anlattıklarını 4 sayfada anlatan Memik
Yanık’ın kitabı neden başlangıç düzeyi oluyor? Kişisel görüşüme göre bir
kitapta yazılanlar zor anlaşılıyorsa ya okur yanlış bir kitap seçmiştir ya da
kitap kötü kaleme alınmıştır.

Programcılıkta belli bir noktaya gelmiş olanlar kitaplar hakkında


konuştuklarında ister istemez kendi pencerelerinden bakarak değerlendirme
184 Memik Yanık - Visual C#’a Başlangıç Kitabı

yapıyorlar. Hal bu ki kendisinin programcılık kitabından öğreneceği çok az


şey kalmıştır. Olur ya zamanında gerek duymadığı için ilgilenmediği bir
konuyu sonradan merak ettiğinde elindeki kitaba bakar. Başka bir deyişle
artık neyin ne olduğunu, neyin ne işe yaradığını biliyordur. Kitaptan aradığı
olsa olsa bilmediği veya unuttuğu işlemin “nasıl yapılacağıdır”. Hal bu ki yeni
başlayan veya o programlama dilinden henüz ekmeğini çıkarmayan kişi
neyin ne işe yaradığını bilmiyordur. Bu nedenle ona konuları adım adım
anlatmak gerekiyor. Tabii konular adım adım anlatılınca ister istemez sayfa
sayısı artıyor.

Bu görüşe bir de örnek verelim: Konu Delphi’de interface’ler olsun. Usta


programcımız interface’lerin ne olduğunu ne işe yaradıklarını biliyordur da
belki gerek duymadığı için Delphi’de nasıl hazırlandığını bilmiyordur veya
unutmuştur. Usta programcımız kitaptan bu konuyu öğrenmek istediğinde
işin hikaye kısmından haklı olarak hemen sıkılır. Çünkü interface’lerin ne
olduğunu ne işe yaradığını zaten biliyordur. Ne var ki bir yazar olarak
interface’leri anlatmaya başlamadan ön bilgi vermeyi tercih ederim. Ön bilgi
verilmeden hemen asıl konuya geçilirse Interface’lerin nasıl hazırlanıp
kullanıldığı öğrenilse bile temeli bilinmediği için kısa sürede unutulur. Bu
açıdan Delphi 2007 kitabıma baktığımda hiçbir konunun üzerinin örtülüp
ezbere anlatılmadığını, her konunun nedenleri ile derinlemesine incelendiğini
rahatlıkla söyleyebilirim.

Çok sayıda forum sitesinde Delphi ile ilgili olarak daha önce sorulmuş ve
cevaplanmış binlerce soru vardır, yayınlanmış yüzlerce makale vardır. Bu
şartlarda kalkıp Memik Yanık’ın 1100 sayfalık Delphi kitabına 49 YTL
ödemek caiz midir? Delphi’ye merak sarsaydınız bu kitaba 49 YTL öder
miydiniz? Bazı arkadaşlar bu soruya hayır diye cevap vereceklerdir. Çünkü
merak ettiği konuları forumlara soracağını, Delphi hakkında sitelerde
yüzlerce makalenin olduğunu, hatta yerli yabancı çok sayıda E-Book bile
bulabileceğini söyleyeceklerdir.

Çok zamanınız varsa, sınırsız öğrenme isteğiniz varsa; ötesi hiç aceleniz
yoksa, bir iki yıl içinde Delphi ile program yazmayı düşünmüyorsanız,
öğrenciyseniz ve yakın bir zamanda geçmeniz gereken bir Delphi dersi
yoksa masraf yapıp Memik YANIK’ın Delphi kitabını almanıza gerek yoktur.
Ötesi ben çevirmenlerin kurduğu cümleleri iki üç kez okumaktan sıkılmam,
çeviri kitaplarda yazılanları anlayamazsam suçu kitabın yazarı-çevirmeni
yerine kendimde ararım diyorsanız 49 YTL verip Memik Yanık’ın Delphi
kitabını almanıza gerek yoktur.

Tecrübe açısından orta düzeydeki bir programcının Delphi ile ilgili olarak
şimdiye kadar merak edip cevabını arayıp bulduğu 100 sorunun olduğunu
varsayalım. Delphi ile program yazmaya karar veren birisinin bu soruların
hepsini bir veya birden fazla kitapta cevap bulması, bu soruların hepsinin
cevabını okuldaki veya kurstaki hocasından alması veya gece gündüz
Bölüm 6: Windows Forms Uygulamaları 185

forumlarda zaman harcayarak cevap bulması mümkün değildir. Kişisel


görüşüme göre Delphi ile ilgili olarak karşılaşmanız muhtemel olan ilk 25
sorunun cevabını kitaptan almaz veya gittiğiniz kurstan bu sorulara cevap
verilmezse geriye kalan 75 soruya forumlardan makalelerden cevap bulmak
yıllarınızı alır. O zamana kadar da o programlama dili güncelliğini kaybeder.
Memik YANIK bu kitabında Delphi ile program yazmak isteyenlerin
karşılaşması muhtemel olan soruların hepsine cevap vermeyi hedeflemedi.
Hedeflediği şudur: Bu kitabı okuyanlar Delphi ilgili her konuyu öğrenebilecek
potansiyele sahip olurlar.

Forumlarda Delphi veya başka programlama dili konusunda henüz yolun


başında olanlar sık sık Delphi’de ustalaşmak, program yazmak istediğini
yazıp nasıl bir yol izlemesi gerektiğini sorar ve kitap önerin derler. Ne var ki
bazen Delphi konusunda belli bir düzeye gelmiş arkadaşların bazıları böyle
sorulara “kitaba gerek yok, e-book’lara bak, sitelerdeki makaleleri oku,
merak ettiğin konu olduğunda cevabını bulamadığın sorular olduğunda
forumlara yaz” derler. Aslında söyledikleri, önerdikleri tümden yararsız ve
geçersiz şeyler değildir.

Memik Yanık’ın Delphi kitabını okuyan kişi temel konulara vakıf olduğu için
soru sormasını biliyordur, verilen cevapları anlıyordur. Forum yöneticileri
foruma soru yazanların dertlerini net olarak yazamadıklarından, soruların
açık olmadığından sürekli dert yanarlar. Soruların(Delphi konusundaki
soruların diyelim) anlaşılmaz olmasının nedeni o kişinin Memik YANIK’ın
Delphi kitabını okumamış olması ve o programla dili ile ilgili temel
kavramlara sahip olmamasıdır.

Hele hele bazıları e-book meraklısıdır. Gerekli gereksiz yüzlerce konuları


içeren e-book’ları bulup biriktirirler. Sanki sınırsız zamanları var, sanki
tarayıcılar gibi 3-5 saniyede bir sayfayı okuyup bir daha unutmamak üzere
belleklerine kaydediyorlar. Arkadaşlar e-book’lar yararsızdır demem ama
daha önceden Memik YANIK kitabı okumadıysanız e-book’ların size katkıları
sınırlı olacaktır.

Son olarak Delphi 2007 kitabım hakkında şunları söyleyebilirim: Kitabın


sayfa sayısını azaltmak için yoğun çabalar göstermeme rağmen, yaklaşık
1100 sayfa olmasına rağmen bu kitapta Delphi ilgili her konuya yer
verebildiğimi söyleyemem. Gerekli gördüğüm bazı eksiklikleri kaleme alıp
kişisel Web sitemde yayınlayacağım. Tekrar etmek gerekirse bu kitabımın
düzeyini gereği kadar yükseltmiş olmama ve ta en başından Nesneye
Yönelik Programcılık penceresinden bakarak konuları kaleme almış olmama
rağmen bu kitapta yine ilk okumada anlaşılmayacak hiçbir konu yoktur.

Bu kitapta yalnızca bir veritabanına bağlı kalmadım. Eski Paradox başta


olmak üzere Interbase, FireBird, Access, SQL Server ve MySQL
veritabanlarını Delphi projeleri dahilinde kullanmayı denedim. Ne var ki
186 Memik Yanık - Visual C#’a Başlangıç Kitabı

MySQL’e yeterince yer verdiğimi söyleyemem. Bu kitap bir Delphi kitabı


olduğu için Delphi projeleri dahilinde erişim sağlanan her veritabanını yeteri
ayrıntıda anlatmak zaten imkan dışıydı. Belki bu kitap tekrar basıldığında
MySQL’e yeterince ağırlık verme imkanım olur.

Memik YANIK’ın programcılık kitaplarının ayırt edici özelliklerinden birisi


okurun hevesini kırmamasıdır. Çünkü Memik YANIK teknik konular nasıl
anlatıldığında, nasıl cümleler kurulduğunda okurun ilgisi dağılmaz,
anlatılanları kavrar? Sorularına verilecek cevapları vardır. Eğer programcılık
kitabının yazarı dönüp yazdığı metne bakıp okurlar tarafından nasıl
algılanacağı konusunda kafa yormazsa ve bu konuda fikri hazırlığı yoksa
yazdıkları doğru olsa bile zor anlaşılır.

Her ne kadar bu kitabın kapağında sırayla Delphi 20007 for Win32, Turbo
Delphi ve Delphi 2006 olmakla birlikte Delphi 7 ve Delphi 2005 kullanıcıları
da bu kitaptan yararlanabilir. Bu kitabın içeriğinin büyük bir kısmı Delphi 7
için de geçerlidir. Bir diğer konu şudur: Borland’ın C++ Builder derleyicisini
kullanarak C++ hakkında bilgi sahibi olduysanız C++ Builder ile gelen
görsel kitaplık ve kontroller hakkında(özellikle veritabanı işlemleri) bilgi
edinmek isteyenler bu kitaptan belli oranda yararlanabilirler.

Bu metni niye mi kaleme aldım: Çünkü Türkiye’de kimse zahmet edip


programcılık kitapları üzerine bir şey yazmıyor. Bu nedenle iş başa düştü ve
kendi kitabım hakkında yazmak istedim. “Kitabın hakkında yazarken objektif
olabildin mi?” diye soranlara elbette diye cevap veririm.

You might also like