#1
|
||||
|
||||
Visual C# ile Basit Bir Not Defteri Uygulaması
Visual C# ile Basit Bir Not Defteri Uygulaması
Bu yazımızda konu olarak Windows Form’u seçtim;çünkü bu konuda Türkçe kaynak neredeyse yok, doğru dürüst bir programın yapımını gösteren bir yazı, bir site bulamadım, tabi ki Türkçe bir çok makale var sitelerde, bende onlardan yararlanarak ve deneyerek bir şeyler yaptım ve şimdi bu yaptıklarımı sizinle paylaşıyorum. Eğer bu yazıyı sonuna kadar okursanız ve kodları sizde yazarsanız, yazının sonuna geldiğiniz Basit Not Defteri adında bir uygulamanız olacak. Önce bu programdan biraz bahsedelim. Adı üstünde bir Not Defteri uygulaması ancak basit hem de çok basit. Yapabildiği şeyler: Yeni dosya yaratmak, var olan dosyaları açmak, dosya kaydetmek… Böyle bir program yapmamın sebebi tabi ki metin editörleri konusunda alternatif oluşturma isteği falan değil, tek sebep benim ilk başlarda çok zorlandığım SaveFileDialog, OpenFileDialog gibi kontroller konusunda örneklemeler yapmak.. Lafı daha fazla uzatmadan artık uygulamaya geçelim. Önce aşağıdaki programı Visual Studio .Net’in Designer’ında oluşturun… Ben bu resime kullandığım kontrollerin isimlerini de yazdım ki kodları incelerken zorluk çıkmasın. Yalnız burada görünmeyen 2 kontrol daha var. Biri SaveFileDialog (objSave), diğeri OpenFileDialog (objOpen). Bu kontrolleri de ekleyip adlarını parantez içlerindeki gibi yaparsanız sorun çıkmaz… Şimdi kodlarımıza geçebiliriz. Bu bölümde adım adım ilerleyeceğiz. Menülerdeki tüm başlıkların olaylarını yazacağız. 1)Genel değişkenimizi tanımlama Bu programda Degisim adında, “bool” yani sadece true ve false değerleri alabilen bir değişken tanımladım. Bu değişken sayesinde kullanıcıyı metinin değişip değişmediği konusunda uyaracağız, böylece isterse değişen metni kayıt imkanı vereceğiz… private bool Degisim; 2)Form1’in onLoad Olayı Bu olay programımızın açılışında yürütülen olaydır. Burada objSave ve objOpen için bazı ayarlar yapıyoruz ve göstermesini istediğimiz dosyaların uzantılarını giriyoruz. private void Form1_Load(object sender, System.EventArgs e) { objOpen.Filter = "Text Dosyaları(*.txt)|*.txt|Tüm Dosylar(*.*)|*.*" ; objOpen.FilterIndex = 1 ; objSave.Filter = "Text Dosyaları(*.txt)|*.txt|Tüm Dosyalar(*.*)|*.*" ; objSave.FilterIndex = 1 ; } 3)Kullanılacak metotların tanımlanması… Ben bu programda sadece 2 tane metot tanımladım. Bunlardan birincisi KayitMekanizmasi, diğeri DegisimUyari . KayitMekanizmasi adı üstünde yazdıklarımızı kaydedecek olan mekanizma, DegisimUyari ise objText içindeki metnin değişimi durumda programı kapatırken falan bize haber verecek olan kod. public void KayitMekanizmasi(string strVeri) { if (objSave.ShowDialog() == DialogResult.OK) { StreamWriter Kayitci = new StreamWriter(Environment.GetEnvironmentVariable("m ydocuments")+objSave.FileName.ToString(),false,System.Text.Encoding.Unicode); Kayitci.Write(strVeri); Kayitci.Close(); Degisim = false; } } Önce yukarıdaki kodu biraz inceleyelim. Burada önce bi if kontrolü görüyorsunuz. Bu kontrolün amacı, Kayıt ekranı açıldığı zaman kullanıcı “OK” düğmesine tıklayıp tıklamadığını kontrol etmek. Eğer “OK”e tıkladı ise programımız bir adet StreamWriter oluşturuyor. Kayitci adındaki bu Writer Environment.GetEnvironmentVariable("mydocuments”) bu kod ile ayarlı olan Belgelerim klasörüne gidiyor otomatik olarak. objSave.FileName ise bizim Kayıt Ekranın da dosyaya verdiğimiz ismi bize döndürüyor. Son olarak ise bu satırda Unicode bir kodlama yaptığımız gösteriyoruz. Bunu yazmazsanız Türkçe karakterlerinizin yerinde yeller estiğini görürsünüz. Kayitci.Write(strVeri) satırı ile gelen veriyi kaydediyor ve StreamWriter nesnesini kapatıyor. Degisim değerini ise true olarak atıyor. Bunun nedeni değişim oldu ve ben bunu gördüm demek. Kullanıcıya haber vermeye gerek yok anlamına gelecek. Şimdi devam edelim. public bool DegisimUyari() { if (MessageBox.Show("Dosyanızda bir değişiklik oldu kaydetmek ister misiniz?","Değişiklik Var",MessageBoxButtons.YesNo,MessageBoxIcon.Excla m ation) == DialogResult.Yes) { return true; } else { Degisim = false; return false; } } Yukarıdaki kodda ise tipik bir MessageBox kullanımı görüyorsunuz. Buradaki metodumuz birde değer döndürüyor.Bir bool değeri döndürüyor. Bu dönen değer ile biz az sonra kullanıcının çıkan mesaj kutusunda dosyayı kaydetmek isteyip istemediğini anlayacağız. MessageBox.Show("Dosyanızda bir değişiklik oldu kaydetmek ister misiniz?","Değişiklik Var",MessageBoxButtons.YesNo,MessageBoxIcon.Excla m ation) == DialogResult.Yes) Bu satırı biraz incelemek lazım. Burada ilk overload (Overload metodlara parantezler içinde yollanan veri demek.) mesaj kutusunda görünecek olan yazı, ikinicisi bu mesaj kutusunun başlığı, üçüncüsü mesaj kutusu üzerinde ki “Evet”, “Hayır” düğmeleri ve son olarak mesaj kutusundaki simge. Ancak kodlara bakmaya devam ettiğimizde bir karşılaştırma görüyoruz (“==” ifadesi) DialogResult.Yes , aslında açıklamaya bile gerek yok. Eğer kullanıcı “Evet”e tıkladı ise demek. Asıl kodlarda bu durumda bir “true” ifadesi döndürüldüğünü görebilirsiniz. Biz daha sonra bunu kontrol ederek KayitMekanizmasi metodumuzu çağıracağız. 4) Yeni düğmesi Menümüzdeki “Yeni” düğmesine tıkladığımızda olacak olayları gireceğiz. Bunun için bu düğmeye Designer’dan çift tıklayınız. private void menuItem2_Click(object sender, System.EventArgs e) { if (Degisim == false) { objText.Clear(); } else { if (DegisimUyari()) { KayitMekanizmasi(objText.Text); objText.Clear(); Degisim = false; } else { objText.Clear(); Degisim = false; } } } Burada önce Degisim değerini kontrol ediyoruz. Eğer değer “false” ise yani değişim yoksa ya bu dosya önceden kaydedilmiştir ya da yeni açılmıştır. O zaman içeriğinin temizlenmesinde bir sorun yok. Eğer değer “true” ise biraz karışıyor ortalık. Önce kullanıcıyı uyarmak için DegisimUyari() çalıştırılıyor. Eğer kullanıcı kayıt etmek istiyorsa, KayitMekanizmasi() çalıştırılıyor, ekran temizleniyor ve Degisim değeri false oluyor.Eğer kullanıcı kayıt etmek istemiyorsa içerik temizleniyor ve Degisim değeri yine false oluyor. Böylece yeni bir dosya açma işlemlerini hallettik. 5) Varolan dosyayı açma Metin editörünüz ile daha önce var olan bir dosyayı açmak istersiniz diye böyle bir özellik ekledik birde. Menümüzde “Aç”a çift tıklayın ve tıklama olayına aşağıdaki kodları girin. private void menuItem3_Click(object sender, System.EventArgs e) { if (Degisim == true) { if (DegisimUyari()) { KayitMekanizmasi(objText.Text); } } if (objOpen.ShowDialog() == DialogResult.OK) { FileInfo strKaynak = new FileInfo(Environment.GetEnvironmentVariable("mydoc uments")+objOpen.FileName.ToString()); StreamReader Okuyucu = strKaynak.OpenText(); objText.Text = Okuyucu.ReadToEnd(); Degisim = false; Okuyucu.Close(); } } Bu kodlarda da önce değişim var mı diye bakıyoruz. Yani amacımız kullanıcının yazdığı metni yanlışlıkla bastığı bir düğme yüzünden kaybetmesini engellemek. Eğer değişim varsa ve uyarıdan “true” değeri dönerse kaydediyoruz, aksi halde herhangi bir şey yapmıyoruz. Bundan sonra yukarıda SaveFileDialog için yaptığımız benzer şeyleri yapıyoruz. Yani .ShowDialog() metodunu çağırıyoruz. Kullanıcı OK’e tıklayınca kodlarımız devam ediyor. Ancak burada yukarıdakinden farklı kodlar var. Dosya okumak için çok farklı yöntemler var. Yazmak içinde tabi ki. Mesela StreamWriter’ın StreamReader’ı da var ve ben burada bunu kullandım. Eğer kodları incelerseniz biraz farklı olduğunu göreceksiniz. Çünkü burada FileInfo diye de bir şey var. FileInfo bu tür dosya işlemcilerine yardımcı olur. strKaynak değişkenine atadığımız nesnemizde StreamWriter daki gibi path gösterip dosyamızı açıyoruz. Burada objOpen.FileName’den gelen veri, kullanıcının açmak istediği dosya. StreamReader nesnesini de oluşturup strKaynak.OpenText() ile metin dosyamızı açıyoruz. Yalnız burada bir noktaya dikkat çekmek istiyorum. Ben burada açılacak dosyanın bir .txt dosyası olduğunu bildiğim için .OpenText’i kullandım. Yoksa başka versiyonları da mevcut. Bu nesneyi de oluşturduktan sonra objText’e Okuyucu.ReadToEnd ile baştan sonra tüm veriyi okuyup aktarıyoruz. Değişimden haberimiz olduğunu programa bildirip, nesnelerimizi kapatıyoruz… 6) Kaydet düğmesi Kullanıcı çalışmasını kaydetmek istediği zaman bu düğmeye tıklayabilir. Çok kısa bir kodu var. Zaten asıl işi yapan KayitMekanizmasi(), biz sadece onu çağıracağız şimdi. private void menuItem4_Click(object sender, System.EventArgs e) { KayitMekanizmasi(objText.Text); Degisim = false; } Burada açıklanacak bir kod yok. Gördüğünüz gibi … 7) Kapat Düğmesi Kullanıcı programı kapatmak isteyebilir ve bunun için Dosya menüsündeki Kapat düğmesini kullanabilir. O zaman bu düğmeye de bir olay atamamız lazım. Şimdi çift tıklayın ve aşağıdaki kodları yazın. private void menuItem6_Click(object sender, System.EventArgs e) { Close(); } Bu kod çok basit. Sadece Close() metodunu çağırıyor. Bu özel tanımlı bir metodur ve o form penceresinin kapanmasını sağlar. Şimdi aklınıza gelebilir ya içeride kaydedilmemiş veri varsa hiç kontrol etmedik. O zaman biraz sabır, ona da bakacağız… 8) Kapanmadan önce kontrol Kullanıcımız programı çok farklı şekillerde kapatabilir. Alt + F4 kombinasyonu, köşedeki X ile kapatabilir ya da Kapat düğmemize tıklar;ancak az önce de dediğimiz gibi ya içeride veri varsa. O zaman bu veri için bi kontrol yapmamız lazım. Form’ların “Closing” adında olayları vardır. Bu form kapatılmadan hemen önce yapılacakları belirler. Biz buna bazı olaylar atıyoruz şimdi. private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) { if (Degisim == true) { if (DegisimUyari()) { KayitMekanizmasi(objText.Text); Close(); } } else { Close(); } } Burada yapılanlardan farklı olan hiç bir şey yok. Degisim değerini kontrol ediyoruz ve ona göre işlem yapıyoruz.. 9) Son bir metod… Asıl en önemli şeyi yapmadık sanıyorum. Örneğin kullanıcı programa bir veri girdiğinde yani herhangi bi yazı yazdığında Degisim değeri değişmedi. O zaman bunu halledelim. objText’in TextChanged adında bir olayı var. Şimdi o olay kodları içine aşağıdaki tek satırlık kodu yazıyoruz. private void objText_TextChanged(object sender, System.EventArgs e) { Degisim = true; } Evet, böylece olayın iş yapan kısmı bitti.. Ancak menülerimiz arasında hiç ilgilenmediğimiz bir düğme var. Hakkında. Bu aslında en gereksiz şey belki ama bir programcının en çok önemsediği bölüm Bunun için basit bir form yaratınız. Ben aşağıdaki formu oluşturdum ve adını “hakkinda” yaptım.
|