Professional Documents
Culture Documents
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
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.
Ç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.
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.
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.
• .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.
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ı
Express Edition
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.
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.
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.
class Deneme
{
static void Main(string[] args)
{
int yil;
}
}
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.
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()
{
}
}
class Deneme
{
static void Mesaj()
{
}
static void Main(string[] args)
{
int yil;
Mesaj();
}
}
Memik Yanık - C#’a Başlangıç Kitabı 17
class Deneme
{
static void Main(string[] args)
{
int yil;
Mesaj();
}
18 Memik Yanık - C#’a Başlangıç Kitabı
Programları Derlemek
“C:\WINDOWS\Microsoft.NET\Framework\v3.5;”
"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;"
Ş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ı.
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ı
class Deneme
{
static void Main(string[] args)
{
int yil;
System.Console.Write("Hangi Yıldayız : ");
yil = System.Console.Read();
}
}
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);
}
}
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ı
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 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.
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
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.
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);
}
}
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ı
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);
}
}
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.
class Deneme
{
static void Main(string[] args)
{
string str1, str2;
30 Memik Yanık - C#’a Başlangıç Kitabı
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
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);
}
}
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();
}
}
Ş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();
}
}
.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();
}
}
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.
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
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();
}
}
}
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();
}
}
}
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
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.
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 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ı
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
Proje Hazırlamak
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.
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.
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();
}
}
}
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.
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.
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);
}
}
}
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.
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ı
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
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 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ı
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.
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.
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.
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.
ToolBox Penceresi
.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.
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.
Projelerinin Bileşenleri
.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.
Đ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.
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
Solution Hazırlamak
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.
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.
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.
Ç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.
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.
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.
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.
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
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ı
Application.Run(new Form1());
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.
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ı
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";
}
}
}
Ş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
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.
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.
Ş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.
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
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.
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.
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 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.
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();
}
}
PictureBox Konrolü
Đ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.
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
Ş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.
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ı
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
Ş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.
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ı
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.
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.
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# 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.
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.
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.
using Microsoft.Office.Core;
using Microsoft.Office.Interop.Word;
Ş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.
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.
“Belge1” adında bir belge hazırlanmış olunur. Bu belgeye istenildiği gibi bilgi
girilip kaydedilebilir.
Word_nesnesi.Visible = true;
Belge1 = Word_nesnesi.Documents.Add(ref sablon,
ref yeni_sablon, ref missing, ref missing);
}
wdNewEmailMessage E-mail
wdNewFrameset Frameset
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.
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
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.
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.
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.
textBox1.Text = Word_nesnesi.ActiveDocument.Words[1].Text;
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;
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.
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.
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.
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.
Đ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.
Word_nesnesi.ActiveDocument.Select();
object ilk = 0;
object son = Belge1.Characters.Count;
Range erim = Belge1.Range(ref ilk, ref son);
erim.Bold = 1;
object ilk = 0;
object son = Word_nesnesi.ActiveDocument.Characters.Count;
Range erim =Word_nesnesi.ActiveDocument.Range(ref ilk, ref son);
erim.Bold = 1;
ü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.
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.
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.
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");
}
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.
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.
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
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ı
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);
}
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.
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.
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
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ı
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.
Ç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
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.
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.