15 Nisan 2012 Pazar

C# 'da Dialog Boxes

Merhaba arkadaşlar. 
.NET Framework yapısındaki bu kontrolleri Windows işletim sistemlerinde zaten her gün hiç farkında olmadan kullanıyoruz. Bu yapıları projemize ekleyerek aslında birer pencere ekliyoruz. Bu hazır kontrollerin özelliklerini değiştirerek bize ne kadar kolaylıklar sağlayacağını göreceğiz. Bu hazır kontroller olmasaydı arkadaşlar gerçekten işimiz çok zor olacaktı. Şimdi bu kontrolleri incelemeden önce bir kaç konu üstünde durmak istiyorm.
Bir pencereyi ShowDialog ile açarsanız arkadaşlar, o pencereyi kapatmadan arkadaki pencerelere ulaşamazsınız. Adında da anlaşılacağı üzere kullanıcıyla diyalog kuruyor. Çünkü kullanıcıdan bir cevap istiyor. ShowDialog ile açılan bir pencere geriye DialogResult tipinde bir değer döner. Bu değeri karşılarken de DialogResult deyip nokta koyduğumuzda Enum 'ları sıralanacaktır. Bu Enum 'lardan Ok seçilirse bir değer seçilmiş demektir.
Projemde bir adet RichTextBox kullanıyorum. RichTextBox ile TextBox kontrollerinin en büyük farkı, RichTextBox yazdığımız yazıları RTF(RichTextFormat) formatında kaydetmemizi sağlar. Peki nedir bu RTF formatı? RichTextBox 'a yazdığımız yazıların rengini, fontunu(yazı tipi ve yazı size'ı) aynı şekilde bozmadan saklar. TextBox kontrolünde ise böyle bir seçenek yoktur. RichTextBox bu özelliği gerçekleştirirken aslında arka planda texti, XML olarak kaydeder.
Ayrıca RichTextBox kontrolünün bir çok hazır metodu vardır. Bu metodları da "Notepad yapımı" makalemde ayrıca ayrıntılı inceleyeceğiz.
Şimdi projemizin formunu dizayn etmeye başlayalım. Projeme ColorDialog, FontDialog, FolderBrowserDialog, OpenFileDialog, SaveFileDialog kontrollerinden birer adet atıyorum. Daha sonra aşağıdaki formu oluşturuyorum.


ColorDialog

        private void btnColor_Click(object sender, EventArgs e)
        {
            colorDialog1.AllowFullOpen = true;
            colorDialog1.FullOpen = true;

            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                rtbNotepad.SelectionColor = colorDialog1.Color;
            }
        }
AllowFullOpen, özelliği true ise ColorDialog penceresi, kendi renklerimizi tanımlamamıza olanak sunar. Bu olanak için CustomColor butonunu enable(erişilebilir) yapar. Bu butona basınca penceremiz genişler ve istediğimiz renk aralığını seçeriz. Eğer AllowFullOpen, false yaparsak bu buton erişilemez olur. 
FullOpen, özelliği ise AllowFullOpen özelliğinin aktif yaptığı butonun basılmış halini ColorDialog penceresinin ilk açılış zamanıyla birlikte getirmesidir. Bu nedenle AllowFullOpen  false ise FullOpen özelliğinin true olmasının bir manası yoktur.

FontDialog
        
        private void btnFont_Click(object sender, EventArgs e)
        {
            fontDialog1.ShowColor = true;
            fontDialog1.ShowEffects = false;

            if (fontDialog1.ShowDialog() == DialogResult.OK)
            {
                rtbNotepad.SelectionFont = fontDialog1.Font;
            }
        }
ShowColor, true ise FontDialog penceresinde, Color seçeneği de sunar.  
ShowEffects, true ise FontDialog penceresinde, Effects GroupBox 'ını gösterir. Peki nedir bu effects? Bize sadece altı çizili ve üstü çizili seçeneği sunar.

FolderBrowserDialog

        private void button1_Click(object sender, EventArgs e)
        {
            folderBrowserDialog1.RootFolder = Environment.SpecialFolder.MyDocuments;
            folderBrowserDialog1.ShowNewFolderButton = false;
            folderBrowserDialog1.Description = "Açıklama";

            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
            {
                string path = folderBrowserDialog1.SelectedPath;
            }
        }
FolderBrowserDialog, OpenFileDialog penceresine çok benzeyen bir penceredir. En büyük farkı, kullanıcının, OpenFileDiaolog penceresinde başlangıç dizininin (InitialDirectory) üst dizinine çıkabilmesidir.
RootFolderFolderBrowserDialog penceresi ilk açıldığında başlangıç olarak gözükmesini istediiğimiz dosya yoludur. En önemli özelliği kullanıcının, bu dizinin bir üst dizininie çıkamamasıdır. Yani kullanıcı, bu belirttiğimiz dizinin ve bu dizinin alt klasörlerinde gezinebilir.
ShowNewFolderButton, true ise kullanıcının, yeni dosya oluşturabilmesi için New Folder(Yeni Klasör Oluştur) butonu aktif olur. 
Description, yazdığımız string metin FolderBrowserDialog penceresinin üst kısmında görünür. Kullanıcıya bilgi vermek amaçlıdır.

OpenFileDialog

        private void btnOpen_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "Tüm dosyalar(*.*)|*.*|Metin dosyaları(*.txt)|*.txt";
            openFileDialog1.FilterIndex = 2;
            openFileDialog1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            openFileDialog1.SupportMultiDottedExtensions = true;
            openFileDialog1.Multiselect = true;

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string path = openFileDialog1.FileName;
                StreamReader rd = new StreamReader(path);
                rtbNotepad.Rtf = rd.ReadToEnd();
                rd.Close();
            }
        }
OpenFileDiaolog ve SaveFileDiaolog Pencerelerini özellikleri aynı olduğundan dolayı, bu özellikleri beraber anlatacağım.
Filter, OpenFileDialog penceresi açıldığında kullanıcının görmek isteyeceği dosya tipleridir. Syntax(kullanımı) yukarıdaki gibidir. | separator(ayırıcı) işareti ile bir birinden ayrılır. SaveFileDiaolog penceeresinde Kayıt Türünü gösterir. 
FilterIndex, int değer alır. OpenFileDialog penceresi açıldığında, Default olarak seçili gelen dosya uzantısıdır. Dikkat dikkat arkadaşlar. Bu index 1'den başlar. Kodda şuanda 2 seçili ise Metin Dosyaları seçili gelecektir. Fakat değiştirlebilir.
InitialDirectoryOpenFileDialog penceresi açıldığında, başlangıç olarak gözükmesini istediiğimiz dosya yoludur. FolderBrowserDialog 'dan en büyük farkı: Kullanıcının, bu belirttiğimiz başlangıç dizinin üst dizinlerine çıkabiliyor olmasıdır.
SupportMultiDottedExtensions, true ise OpenFileDialog penceresi, birden fazla uzantı verilmesini destekler. Peki arkadaşlar birden fazla uzantı mı olur? diye sorduğunuzu duyar gibiyim. Projenizde solution explorer penceresine bakarsanız, "Form1.Designer.cs" dosyasını göreceksiniz.
Multiselect, çoklu seçime olanak sağlar.  
AddExtension, SaveFileDialog penceresi için, FilterIndex tüm dosyaları göstermiyor da özellikle bir uzantıyı işaret ediyorsa, AddExtension true ise dosyamın adının sonuna kendiliğinden bu uzantıyı ekler. FilterIndex tüm dosyaları gösteriyorsa, AddExtension true olsa da sonuna ekleyecek uzantıyı belirtmediğimden dolayı kendiliğinden eklemeyecektir.

SaveFileDialog

        private void btnDosyaKaydet_Click(object sender, EventArgs e)
        {
            saveFileDialog1.Filter = "Gaffar Dosyaları(*.gaffar)|*.gaffar|Tüm dosyalar(*.*)|*.*";
            saveFileDialog1.AddExtension = true;
            saveFileDialog1.FilterIndex = 2;

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string path = saveFileDialog1.FileName;
                StreamWriter sw = new StreamWriter(path);
                sw.Write(rtbNotepad.Rtf);
                sw.Close();
            }
        }
Şimdi geldi programımızı çaılştırmaya. RichTextBox 'ıma textimi yazdım, fontunu ve rengi değişik bir şekilde. Daha sonra kaydetdim. Sonra kaydettiğim dosyayı bir Notepad yardımıyla açtım. O da ne? Karşıma anlamsın abuk subuk birşeyler geldi. Yoksa bir hatamız mı var? Hayır arkadaşlar. Bir hatamız yok. Yukarıda bir RTF formatından bahsetmiştik. İşte bu formatı Notepad desteklemediğinden dolayı RTF kodlarını bize gösterdi. Yani RTF formatının texte uygulanmış halini göstermedi. Textin RTF 'li halini dosyamızı MS Word dosyasıyla açarak

Bir başka makalede görüşmek üzere kendinize iyi bakın...

1 yorum: