3- C# İLE NOTEPAD (NOTDEFTERİ) YAPIMI
C# İLE NOTEPAD (NOTDEFTERİ) YAPIMI
Geçen yazımda hesap makinesi yapımını anlatmıştım. Bu dersimizde Notepad (Not Defteri) yapımını anlatacağım. Ama öncelikle bu dersimizde neler öğreneceğimize göz atalım.
- MenuStrip Kontrolleri
- RichTextbox kontrolü
- OpenDialog, SaveDialog, FontDialog ve ColorDialog Kontrolleri
- Form Closing Olayı
ARAYÜZ TASARIMI
Programımızı oluşturmadan önce nasıl bir arayüz yapacağımıza karar vermemiz gerekir. Arayüz tasarlarken işletim sistemimizin 'Not Defteri' uygulamasından kopya çekebilirsiniz.
Windows'un not defteri böyle bir şey. Yukarıda menüler var. Bunları kısaca incelememiz gerekirse, Dosya menüsü altında Yeni,Aç,Kaydet,Farklı Kaydet, Sayfa Yapısı, Yazdır, Çıkış menüleri bulunmaktadır.
Düzen menüsü altında kes, kopyala, yapıştır gibi menüler bulunmaktadır. Biçim menüsü altında ise Font ayarları, sözcük kaydırma gibi menüler bulunmaktadır. Görünüm ve Yardım menüleri de yine yukarıda bulunan menülerden diğer ikisi.
Visual Studio bu noktada bize bir kolaylık sağlıyor. Bu tür programlarda standart menüleri kendisi otomatik olarak ekliyor. Yukarıda resimde de görüldüğü gibi MenuStrip kontrolünün sağ üst köşesinde çıkan Inserr Standart Items (standart öğeleri ekle) linkine tıkladığımız zaman otomatik olarak en çok kullanılan öğeleri yükler.
Görüldüğü gibi elemanlarımız yüklendi.
Şimdi de RichTextBox kontrolümüzün tüm sayfayı kaplaması için Dock özelliğini fill (doldur) olarak ayarlıyoruz.
Font özelliğini de değiştirerek varsayılan Font olarak herhangi bir font tipi seçebilirsiniz.
Başlık çubuğunda görüntülenmesi istenen dosya adı için BaslikGoster adında bir metod tanımlasak fena olmazdı. Çünkü bu metodu bir kaç yerde kullanmamız gerekecek.
Metot dosya adını adres bilgisinden aldıktan sonra sadece adın görüntülenmesi için string sınıfının remove metoduyla son dört karakteri atılmaktadır. Elde edilen ismin ad alanında görüntülenmesi için this.text metodundan yararlanılabilir.
public void BaslikDegistir(string DosyaAdi)
{
// Dosya adını adres bilgisinden al.
Baslik_DosyaAdi = Path.GetFileName(DosyaAdi);
// Son dört karakterini kaldır.
Baslik_DosyaAdi = Baslik_DosyaAdi.Remove(Baslik_DosyaAdi.Length - 4);
// Dosya adının başlıkta görünmesini sağla
this.Text = "Not Defteri - " + Baslik_DosyaAdi;
}
Yukarıdaki kodlarla bir metot tanımladık. Zaten metot içerisinde açıklamalar mevcut.
Şimdi de RichTextBox kontrolümüzde değişiklik olup olmadığını kontrol edelim. Eğer değişiklik olduysa ona göre Kaydetme işlemi gerçekleştirilebilir.
Dosya adını verdiğimiz RichTextBox kontrolümüz üzerinde çift tıklayarak Text_Changed olayına gidiyoruz. Scooplar içerisine şu kodları ekliyoruz.
private void rchDosya_TextChanged(object sender, EventArgs e)
{
// Değişiklik olduysa Degisim değişkenine true değerini ata.
Degisim = true;
}
Çıkış yapmadan önce programımızda değişiklik varsa MessageBox ile kullanıcı uyarılmalı. Eğer kullanıcı kaydetmeyi isterse Programın daha önce kayıtlı olup olmadığı kontrol edilmeli. Eğer kayıtlı ise o halde aynı isimle kaydetmesini sağlamalıyız. Eğer kayıtlı değilse Farklı Kaydet metodu ile kaydetmesi sağlanmalıdır.
Devamı Gelecek ....
Düzen menüsü altında kes, kopyala, yapıştır gibi menüler bulunmaktadır. Biçim menüsü altında ise Font ayarları, sözcük kaydırma gibi menüler bulunmaktadır. Görünüm ve Yardım menüleri de yine yukarıda bulunan menülerden diğer ikisi.
- MenuStrip (Menü Şeridi) --> Yukarıdaki menüleri otomatik olarak ekleyen kontrol
- RichTextBox (Zengin Metin Kutusu) --> Zengin içerikli bir metin kutusudur.
- OpenFileDialog (Dosya Aç Diyalog Penceresi) --> Dosya açtırmak, seçtirmek için kullanılır.
- SaveFileDialog (Dosya Kaydetme Diyalog Penceresi) --> Dosya kaydettirmek için kullanılır.
- FontDialog (Yazı Tipi Diyalog Penceresi) --> Yazı tipini seçtirmek için kullanılır.
- ColorDialog (Renk Diyalog Penceresi) --> Yazının rengini seçtirmek için kullanılır.
Bütün kontrolleri eklediğimizde formumuz yukarıdaki gibi görünmektedir.
Arayüzün Oluşturulması
Öncelikle bir Windows Form Uygulaması başlatarak adını 'NotePad' olarak değiştirelim. Aynı zamanda formun Iconunu ve Formun text özelliğini de 'Not Defteri' olarak değiştirelim.
Visual Studio bu noktada bize bir kolaylık sağlıyor. Bu tür programlarda standart menüleri kendisi otomatik olarak ekliyor. Yukarıda resimde de görüldüğü gibi MenuStrip kontrolünün sağ üst köşesinde çıkan Inserr Standart Items (standart öğeleri ekle) linkine tıkladığımız zaman otomatik olarak en çok kullanılan öğeleri yükler.
Görüldüğü gibi elemanlarımız yüklendi.
Şimdi de RichTextBox kontrolümüzün tüm sayfayı kaplaması için Dock özelliğini fill (doldur) olarak ayarlıyoruz.
Font özelliğini de değiştirerek varsayılan Font olarak herhangi bir font tipi seçebilirsiniz.
OpenFileDialog (Dosya Açma Diyalog Penceresi)
Bilgisayarda bulunan bir dosyayı açmak ya da kullanıcıya açtırmak için kullanılan bir kontroldür.
SaveFileDialog (Dosya Kaydet)
Çalışmamızı kaydetmemizi yarayan kontroldür.
FontDialog (Yazı Özellikleri)
Yazı tipi, yazı stili, yazı boyutu gibi özellikleri düzenlememize yarayan kontroldür.
ColorDialog (Renk Diyalog)
Form ve form üzerinde bulunan tüm kontrollerin renk ayarları için kullanılır.
KOD YAZIMI
Dosya Menüsü
Program çalıştırılırken yeni bir dosyanın oluşturulması ve dosya türünü tutan değişkene (DosyaAdi), başlangıç değerinin (*.rtf) atanması gerekmektedir. Ayrıca formun başlık çubuğunda adsız yazısının da görünmesi gerekmektedir.
DosyaAdi adlı değişken program boyunca kullanılacağından dolayı bu değişkeni global olarak tanımlamamız gerekmektedir.
Dosyada kullanacağımız değişkenlerden Degisim isimli olanını dosyada değişiklik olup olmadığını, Kayitli isimli değişkeni ise dosyanın kayıt durumunu kontrol etmek için kullanacağız. Kayitli değişkeninin türü ise boolean. Programı başlatır başlatmaz herhangi bir değişiklik gerçekleşmediğinden dolayı başlangıç değerini False olarak atamamız gerekmektedir.
namespace NotepadUygulamasi
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// EVRENSEL OLARAK TANIMLANAN DEĞİŞKENLERİMİZ
string DosyaAdi, Baslik_DosyaAdi;
Boolean Degisim; //Dosyada değişim kontrolü yap.
Boolean Kayitli; // Dosyanın kayıtlı olup olmadığını kontrol et.
private void Form1_Load(object sender, EventArgs e)
{
Degisim = false; Kayitli = false;
Baslik_DosyaAdi = "Adsız.rtf"; // Formun başlık çubuğunda Adsız olan dosya adının görünmesini sağla.
DosyaAdi = "*.rtf"; // DosyaAdi değişkenine ilk değer atama .
}
}
}
Başlık çubuğunda görüntülenmesi istenen dosya adı için BaslikGoster adında bir metod tanımlasak fena olmazdı. Çünkü bu metodu bir kaç yerde kullanmamız gerekecek.
Metot dosya adını adres bilgisinden aldıktan sonra sadece adın görüntülenmesi için string sınıfının remove metoduyla son dört karakteri atılmaktadır. Elde edilen ismin ad alanında görüntülenmesi için this.text metodundan yararlanılabilir.
public void BaslikDegistir(string DosyaAdi)
{
// Dosya adını adres bilgisinden al.
Baslik_DosyaAdi = Path.GetFileName(DosyaAdi);
// Son dört karakterini kaldır.
Baslik_DosyaAdi = Baslik_DosyaAdi.Remove(Baslik_DosyaAdi.Length - 4);
// Dosya adının başlıkta görünmesini sağla
this.Text = "Not Defteri - " + Baslik_DosyaAdi;
}
Yukarıdaki kodlarla bir metot tanımladık. Zaten metot içerisinde açıklamalar mevcut.
Şimdi de RichTextBox kontrolümüzde değişiklik olup olmadığını kontrol edelim. Eğer değişiklik olduysa ona göre Kaydetme işlemi gerçekleştirilebilir.
Dosya adını verdiğimiz RichTextBox kontrolümüz üzerinde çift tıklayarak Text_Changed olayına gidiyoruz. Scooplar içerisine şu kodları ekliyoruz.
private void rchDosya_TextChanged(object sender, EventArgs e)
{
// Değişiklik olduysa Degisim değişkenine true değerini ata.
Degisim = true;
}
Yeni Belge Oluşturma
Bilindiği gibi Yeni seçeneği içi boş, ismi 'Adsız' olan yeni bir metin belgesi açmaktadır. Eğer daha önceden değişiklik yapılan bir çalışma varsa onu kaydetmek isteyip istemediğinizi sorar. Evet seçeneği seçildiğinde eğer o belge varsa üzerine kaydetme işlemi, eğer o belge yoksa kaydet penceresini açar.
Not Defteri Form üzerinde File menüsü altında bulunan New menüsünün Click olayı seçildiğinde program tarafından oluşturulan NewToolStripMenuItem_Click metoduna aşağıdaki kodu ekleyin.
private void newToolStripMenuItem_Click(object sender, EventArgs e)
{
if (Degisim)
{
DialogResult dr = MessageBox.Show(Baslik_DosyaAdi + " Belge değişti. Değişiklikleri kaydetmek ister misiniz?", "Yeni Belge", MessageBoxButtons.YesNoCancel);
if (dr == DialogResult.Yes)
{
saveAsToolStripMenuItem_Click(sender, e);
}
else if (dr == DialogResult.Cancel)
return;
}
richTextBox1.Clear();
Degisim = false;
Kayitli = false;
DosyaAdi = "*.rtf";
Baslik_Degistir("Adsız.rtf");
}
Yaptıklarımızı kısaca açıklayalım:
Yeni belge oluşturulmak istenildiğinde, eğer açık olan belge üzerinde değişiklik yapıldıysa kullanıcıya "Belge değişti. Kaydetmek istiyor musunuz? " diye soruluyor. .Ve MessageBox penceresinden gelen cevap evet ise (dr == DialogResult.Yes) bu durumda program Farklı Kaydet metoduna gidecektir. (Farklı kaydet penceresi için henüz metod tanımlamadık. Bunu bir sonraki aşamada yapacağız.)
Eğer gelen cevap İptal ise (dr == DialogResult.Cancel) program hiçbir şey yapmadan MessageBox penceresini kapatacaktır.
Eğer gelen cevap Hayır ise o zaman da if bloklarının dışındaki blok çalışacak ve önce temizleme işlemi yapılacak, daha sonra da Degisim ve Kayitli değişkenlerine false değerleri atanacaktır. Ayrıca DosyaAdi değişkenine "*.rtf" adı verilecek ve son olarak da Baslik_Degistir metodu çalıştırılacak ve formun üzerinde yazan isim "Adsız" olarak değiştirilecektir.
Not Defteri Form üzerinde File menüsü altında bulunan New menüsünün Click olayı seçildiğinde program tarafından oluşturulan NewToolStripMenuItem_Click metoduna aşağıdaki kodu ekleyin.
private void newToolStripMenuItem_Click(object sender, EventArgs e)
{
if (Degisim)
{
DialogResult dr = MessageBox.Show(Baslik_DosyaAdi + " Belge değişti. Değişiklikleri kaydetmek ister misiniz?", "Yeni Belge", MessageBoxButtons.YesNoCancel);
if (dr == DialogResult.Yes)
{
saveAsToolStripMenuItem_Click(sender, e);
}
else if (dr == DialogResult.Cancel)
return;
}
richTextBox1.Clear();
Degisim = false;
Kayitli = false;
DosyaAdi = "*.rtf";
Baslik_Degistir("Adsız.rtf");
}
Yaptıklarımızı kısaca açıklayalım:
Yeni belge oluşturulmak istenildiğinde, eğer açık olan belge üzerinde değişiklik yapıldıysa kullanıcıya "Belge değişti. Kaydetmek istiyor musunuz? " diye soruluyor. .Ve MessageBox penceresinden gelen cevap evet ise (dr == DialogResult.Yes) bu durumda program Farklı Kaydet metoduna gidecektir. (Farklı kaydet penceresi için henüz metod tanımlamadık. Bunu bir sonraki aşamada yapacağız.)
Eğer gelen cevap İptal ise (dr == DialogResult.Cancel) program hiçbir şey yapmadan MessageBox penceresini kapatacaktır.
Eğer gelen cevap Hayır ise o zaman da if bloklarının dışındaki blok çalışacak ve önce temizleme işlemi yapılacak, daha sonra da Degisim ve Kayitli değişkenlerine false değerleri atanacaktır. Ayrıca DosyaAdi değişkenine "*.rtf" adı verilecek ve son olarak da Baslik_Degistir metodu çalıştırılacak ve formun üzerinde yazan isim "Adsız" olarak değiştirilecektir.
Var Olan Bir Belgenin Açılması
Var olan bir belge açılırken öncelikle belgede değişiklik yapılıp yapılmadığı kontrol edilmelidir. Eğer değişiklik yapılmışsa Farklı Kaydet metodu çağrılmalıdır. Eğer değişiklik yoksa OpenFileDialog penceresi açılmalı ve OK tuşuna basıldığında o an seçili olan belge açılmalıdır. Ayrıca Baslik_Degistir metodu ile de Formun başlığı değiştirilmelidir. Unutmadan, belge açıldığında herhangi bir değişiklik yapılmadığından dolayı Degisim değişkeninin değerini false olarak atamalıyız.
// Dosya Aç menüsü işlemleri
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
DialogResult dr;
if (Degisim) // Eğer Değişim Varsa
{
dr = MessageBox.Show(Baslik_DosyaAdi + " belge değişti. Kaydetmek istiyor musunuz?", "Yeni Belge", MessageBoxButtons.YesNoCancel); // OpenFileDialog penceresini göster
if (dr == DialogResult.Yes)
{
saveAsToolStripMenuItem_Click(sender, e);
}
else if (dr == DialogResult.Cancel)
return;
}
dr = openFileDialog1.ShowDialog(); //OpenFileDialog penceresini aç
if (dr==DialogResult.OK)
{
//Kullanıcı tarafından seçilen dosyayı çağır
richTextBox1.LoadFile(openFileDialog1.FileName);
//DosyaAdi değişkeni ile açılan dosyanın adını tut.
DosyaAdi = openFileDialog1.FileName;
//Başlık çubuğunda yeni dosya adının görünmesini sağla.
Baslik_Degistir(DosyaAdi);
Degisim = false;
}
}
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
DialogResult dr;
if (Degisim) // Eğer Değişim Varsa
{
dr = MessageBox.Show(Baslik_DosyaAdi + " belge değişti. Kaydetmek istiyor musunuz?", "Yeni Belge", MessageBoxButtons.YesNoCancel); // OpenFileDialog penceresini göster
if (dr == DialogResult.Yes)
{
saveAsToolStripMenuItem_Click(sender, e);
}
else if (dr == DialogResult.Cancel)
return;
}
dr = openFileDialog1.ShowDialog(); //OpenFileDialog penceresini aç
if (dr==DialogResult.OK)
{
//Kullanıcı tarafından seçilen dosyayı çağır
richTextBox1.LoadFile(openFileDialog1.FileName);
//DosyaAdi değişkeni ile açılan dosyanın adını tut.
DosyaAdi = openFileDialog1.FileName;
//Başlık çubuğunda yeni dosya adının görünmesini sağla.
Baslik_Degistir(DosyaAdi);
Degisim = false;
}
}
Belgenin Kaydedilmesi
Kaydet butonuna basıldığında önce mevcut dosyanın kayıtlı olup olmadığı kontrol edilmeli daha sonra da kayıtlı ise aynı isim üzerine kaydedilmeli, kayıtlı değilse Farklı Kaydet seçeneği açılmalıdır.
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
if (Kayitli) //Kaytlıysa
{
richTextBox1.SaveFile(DosyaAdi); //Kayıtlıysa aynı isimle kaydet
}
else
{
saveAsToolStripMenuItem_Click(sender, e);
}
Degisim = false;
Kayitli = true;
}
Çıkış İle Programın Sonlandırılması
Çıkış yapmadan önce programımızda değişiklik varsa MessageBox ile kullanıcı uyarılmalı. Eğer kullanıcı kaydetmeyi isterse Programın daha önce kayıtlı olup olmadığı kontrol edilmeli. Eğer kayıtlı ise o halde aynı isimle kaydetmesini sağlamalıyız. Eğer kayıtlı değilse Farklı Kaydet metodu ile kaydetmesi sağlanmalıdır.
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
if (Degisim) //Değişim varsa
{
DialogResult dr = MessageBox.Show(Baslik_DosyaAdi + " belge değişti. Kaydetmek ister misiniz?", "Yeni Belge", MessageBoxButtons.YesNoCancel);
if (dr == DialogResult.Yes) // Eğer gelen cevap Evet ise
{
// Farklı Kaydet Menüsüne yönlendir.
saveAsToolStripMenuItem_Click(sender, e);
}
else if (dr == DialogResult.Cancel)
return;
}
Application.Exit();
}
{
if (Degisim) //Değişim varsa
{
DialogResult dr = MessageBox.Show(Baslik_DosyaAdi + " belge değişti. Kaydetmek ister misiniz?", "Yeni Belge", MessageBoxButtons.YesNoCancel);
if (dr == DialogResult.Yes) // Eğer gelen cevap Evet ise
{
// Farklı Kaydet Menüsüne yönlendir.
saveAsToolStripMenuItem_Click(sender, e);
}
else if (dr == DialogResult.Cancel)
return;
}
Application.Exit();
}
Devamı Gelecek ....
Böyle bir çalışma değil hizmet için size ÇOK Teşekkür Ederim;Gerçekten böyle bir başlangıç rehberine ihtiyacım vardı.Kubilay Doğan
YanıtlaSil