C# ile programımızda ki ayarları saklama

Admin tarafından yazılmıştır. 20. Kasım 2008 15:28

Merhabalar :)

Bu yazımızda C# ile yazdığımız programımızda bir ayarlar menüsü olacak ve ayarlar'dan programımızın görsellik değerlerini beliryip kaydet dediğimizde bir ayarlar.ini dosyasında o bilgileri saklamasını sağlayacağız.Daha sonra programımı kapatıp tekrar açtığımızda Ana Formumuzda o dosyadaki bilgileri okuyup Form rengi , opacity-saydamlık değeri , başlık adı vs'nin kaydederken ki haliyle geldiğini göreceğiz.

Programın ana görünümü ve ayarlar formunun görünümü aşağıdaki gibidir.

c# ayar saklama c# ayarlar form

 

İşleme başlamadan önce AnaFormumuza 2 adet buton ekleyip  btnAyarlar ve btnDefaultAyarlar adında butonlarımız oluşturalım.Bundan sonra Projemize bir WindowsForm ekleyip adınada frmAyarlar diyelim.

Artık kodlama işine geçebiliriz :)

---------Ana Formumuz -----------------

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace SeasProgramAyarSaklama
{
    public partial class Form1 : Form
    {

        //formumuzun kapanma şeklini belirleyen bir tane bool nesne oluşturuyoruz.
        bool normalKapatilsinMi;


        public Form1()
        {
            InitializeComponent();
            //Formumuzun ctor'una yukarıda oluşturduğumuz bool tipine değeri atıyoruz.
            normalKapatilsinMi = true;
        }

        private void btnAyarlar_Click(object sender, EventArgs e)
        {
            frmAyarlar f = new frmAyarlar();
            f.ShowDialog();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //Formumuzun load olayına aşağıda oluşturduğumuz KayitliAyarlariGetir() metodunu çağırarak dosyamızdan ayarları okuyup formumuza uyarlıyor değerleri.ArkaplanRengi , Başlık adı , Saydamlık vs...
            KayitliAyarlariGetir();
        }

        //Anaprogramımız çalışacağında ayarları tuttuğumuz dosyadan bilgileri okuyan metodumuzu yazıyoruz.
        private void KayitliAyarlariGetir()
        {
            try
            {
                //okumak istediğimiz dosyanın yolunu tekrar belirtiyoruz.
                string dosyaYol = Environment.CurrentDirectory + "/ayarlar.ini";

                //Nesnemizi okumamız için yazarken eklemiş olduğumuz namespace'imizi burayada ekliyoruz.using System.IO;  ve nesnemizi oluşturuyoruz parametresinede okumak istediğimiz dosyanın adını veriyoruz.
                StreamReader sr = new StreamReader(dosyaYol);

                //Ayarlarımız okuyup hafızada tutmak için bir list tanımlıyoruz string tipinden.
                List<string> ayarlar = new List<string>();

                //ve daha sonra dosyamızı satır satır okuyoruz.Dosyamızdan okuduğumuz satırı okunanSatir değişkenine atıyoruz ve o nesneyi = karakteriyle bölüyoruz.Dosyamıztaki tüm satırlar key-value yani anahtar kelime ve değer türü sakladığı için okunanSatir.Split('=') ifadesinin 0.indeksi key , 1.indeksi value değerini getitir. okunanSatir.Split('=')[1] ifadesiyle okunan satırın value değerini alıyoruz.Yani eşittir işaretinin sol tarafı 0 sağ tarafı 1.
                string okunanSatir;
               
                //oluşturduğumuz sr'nesnesi ile dosyamısı realLine metoduyla satır satır okuyup okunanSatir değişkenine atıyoruz ve bu okuma işlemi satır sonuna kadar devam eder. !=null ifadesiyle boş değilse alt satırdaki işlemi yap demiş oluyoruz.
                while ((okunanSatir = sr.ReadLine()) != null)
                    //okuduğumuz satırı split ederek yukarıda açıkladığımız gibi = ifadesinin sağ tarafı olan 1 diye belittiğimiz değeri alıyoruz ve formumuzun ayarlarını eklediğimiz listemize ekliyoruz.
                    ayarlar.Add(okunanSatir.Split('=')[1]);

                //formumuzun başlığıını ayarlar listemizin 0 indeksinden alıyoruz.Böyle almamızın sebebi ayarları kayıt ederken ilk satırda ayarlar.ini dosyamızı açıp bakacak olursak ilk satırda FormBaslikAdi değerini görürüz.Zaten yukarıdaki while ile satır satır okuma yaparken biz split medotuyla bu okudğumuz satırı = sağ ve sol olarak okumak istediğimizden ='in sağ tarafı yani FormBaslikAdi'in değerini almak istediğimzin ilk satırı okuyacağız ve listemize ekleyeceğiz.List işlemleride 0'dan başlağıdından listemize ilk eklemiş olduğumuz FormBaslikAdi'ın değerini Anaprogramımızın başlık adıı belirtiyoruz.Bu işlemi ayarlar listemizin [] indeks değeriyle yapabiliriz.
                this.Text = ayarlar[0];

                //dosyamızda ikinci satırda YaziRenk bilgisi tutulduğundan buda ikinci satır olur.Fakat yukarıda açıkladığımız gibi listemize eklerken ilk eleman 0'dan başladığından yazı bilgiside listmemizde 1 indekse sahip eleman olmaktadır.Formumuzun yazı renginide burada belirtiyoruz.
                this.ForeColor = Color.FromName(ayarlar[1]);

                //formumzun backcolor yani arkaplan rengini belirtiyoruz.
                this.BackColor = Color.FromName(ayarlar[2]);

                //Formumuzun opacity yani parlaklık değerini okuyoruz.Buda ayarlar.ini dosyamızda 4'üncü satırda olduğudan okuma işlemi yaparken listemizin 3 indeksine sahiptir.
                //Opacity 0-1 arasında double değerler alır
                this.Opacity = Convert.ToDouble(ayarlar[3]) / 100;

                //normalKapatilsinMi bool türümüze okuduğumuz satırın = 'den sonraki değerini yazıyoruz.false yada true olacak.
                normalKapatilsinMi = Convert.ToBoolean(ayarlar[4]);
            }
            catch
            {
                //Yukarıdaki işlemleri yapamazsa program yani ayarlar dosyasını bir şekilde okuyamazsa kullanıcaya bilgi mesajı fırlatıyoruz.
                MessageBox.Show("Ayarlar dosyası bozuk olduğundan okuma işlemi yapılamadı");
            }
        }

        //Anaformumuzun Properties'den Events listesinden FormClosing olayı seçiyoruz.Bu event bize  isminden de anlaşılacağı gibi formumuz kapatılıyorken ki o efektli kapanma işini yapacak.Yavaş yavaş yok olacak diyebiliriz :)
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //bool tipindeki normalKapatilsinMi değeri true değilse işlemleri yapcak.
            if (!normalKapatilsinMi)
                while (this.Opacity > 0)
                {
                    this.Opacity -= 0.01;
                    this.Refresh();
                }
        }

        //Default Ayarlar butonuna tıkladığımızda ise programımızdaki nesnelerin özellikleri default hale gelecektir.Default Ayarları da Form1'in yani anaformumuzun Designer'ından alınmıştır.
        private void btnDefaultAyarlar_Click(object sender, EventArgs e)
        {
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.ClientSize = new System.Drawing.Size(481, 336);
            this.Text = "Form1";

            this.Opacity = 1;
            this.BackColor = Color.FromName("Control");
            this.ForeColor = Color.Black;
        }
    }
}

 

 ----------------frmAyarlar Formu----------------------

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace SeasProgramAyarSaklama
{
    public partial class frmAyarlar : Form
    {
        public frmAyarlar()
        {
            InitializeComponent();
        }

        private void frmAyarlar_Load(object sender, EventArgs e)
        {
            //Formumuza renk verdiğimiz comboBox'ımıza datasource yani form yüklendiğinde kaynak olacak veriyi yüklemek için kullnıyoruz.FormRenk nesnesine datasource olarak sistemde bulunan enum tipindeki renkleri getirmek için Enum sınıfının string[] (string dizi) döndüren metodunu kullanıyoruz.typeof diyip bir parantez açtıkdan sonra ise gitirip listelemek istediğimiz enum adını giriyoruz ve datasource olarak gösterdiğimiz nesnemize enum ın içindeki değerler yükleniyor.
            cmbFormRenk.DataSource = Enum.GetNames(typeof(KnownColor));

            //yukarıdaki işlemin aynısını formumuzdaki yazı renkerini belirleyen cmbYaziRenk nesnesi içinde yapıyoruz.Burayada aynı şekilde sistemde enum tipinde kayıtlı olan renkerleri listeleyeceğiz.
            cmbYaziRenk.DataSource = Enum.GetNames(typeof(KnownColor));

            //Ayarlar formu açıldığında görsellik açısından Load olayına isteidğimiz değeri seçili getirebiliriz.Enum'daki adını girerek.
            cmbFormRenk.Text = "LightGray";
            cmbYaziRenk.Text = "Black";
        }

       
        //Formumuzun arkaplan rengini değiştiren kontrolümüz//
        private void cmbFormRenk_SelectedIndexChanged(object sender, EventArgs e)
        {
            //Bazı sistemler windows'ta kayıtlı olan renkleri getirdiğinde yukarıdaki gibi yani Transparent rengi seçildiğinde exeception yani istisnai bir durum oluşturup hata mesajı fırlatmaktadır.Bu hatayı engellemek için eger formumuzun loadında cmbFormRenk nesnesinde Transparent rengi seçili değilse seçilen rengimizi alalım eger seçilen renk Transparent ise geçersiz bir renk benzeri bir hata mesajı verip değerini değiştirelim nesnenin
            //cmbFormRenk nesnesinden seçilen renk Transparent değilse aşağıdaki işlemi yap demiş oluyoruz. != ifadesininde değilse oldugunu unutmayalım.

            if (cmbFormRenk.Text != "Transparent")

                //this.BackColor diyerek şuanki formumuzun arka plan rengini Color struct'ının FromName metodunu kullanıp parametresine string bir değer olarak hangi rengi istediğimizi seçtikten sonra o değeri arkaplan rengi olarak formumuza atıyoruz.
                this.BackColor = Color.FromName(cmbFormRenk.Text);

                //Seçilen renk Transparent ise yukarıdaki işlemi saymıyoruz
            else
            {
                //hata mesajımızı verip seçilen değere tekrar LightGray değerini veriyoruz.
                MessageBox.Show("Transparet rengi geçersiz bir renk , farklı bir renk seçiniz");
                cmbFormRenk.Text = "LightGray";
            }
        }

        //formuzuun yazı rengini değiştiren nesne //
        private void cmbYaziRenk_SelectedIndexChanged(object sender, EventArgs e)
        {
            //formuzu this yani bu diye belirttikten sonra ForeColor ' a seçilen değeri atıyoruz.
            this.ForeColor = Color.FromName(cmbYaziRenk.Text);
        }

        //Yukarıdaki tüm işlemleri bir dosyaya yazmak için kullanacımız buton.Bu butona bastığımızda exe'mizin bulunduğu klasörde bir ini dosyası oluşturup buton'a basmadan önceki ayarları alıp bir dosyaya yazmasını sağlayacağız ki ayarlarımız kalıcı olsun.Şimdilik sadece nesnelerimiz değerlerini yazalım.Okuyma işini Ana Formumuzda yapacağız.
        private void btnAyarKaydet_Click(object sender, EventArgs e)
        {
            //Ayarları kaydet butonuna basıldığında Environment sınıfını seçip CurrentDirectory diyerek uygulamamızın bulunduğu klasörü belirtmiş oluyoruz. + "ayarlar.ini" diyerek de o belirttiğmiz klasörde ayarlar.ini adında bir dosya bulunmasını sağlıyacağız.
            string dosyaYol = Environment.CurrentDirectory + "/ayarlar.ini";

            //Formumuzdaki değerleri belirttiğmiz yolda bulunan dosyamıza yazmamız için bir adet StreamWriter nesnesi yaratmamız lazım.Bunun için ise yukarıda Namespace'lerimizi belirttiğimiz alana using System.IO; namespace'ini eklememiz yeterlidir.Namespace'mizi ekleyip sw adında nesnemizi örnekledikten sonra nesnemizin parametresine hangi dosya yoluna yazacagını parametre olarak yukarıda belirttiğimiz dosyaYol değişkenini atıyoruz.
            StreamWriter sw = new StreamWriter(dosyaYol);

            //oluşturduğumuz nesnenin writeLine metodunu kullanarak değerimizin anahtar kelimesini ve formumuzda bulunan değeride hemen yanına ekliyoruz.Formumuzdaki sıraya göre nesnelerimiz atarsak daha kolay olur karıştırmamış oluruz daha okuyacağız bunu :)
            //Aynı işlemleri tüm nesnelerimiz için yapalım.
            sw.WriteLine("FormBaslikAdi=" + txtBaslik.Text);
            sw.WriteLine("YaziRenk=" + cmbYaziRenk.Text);
            sw.WriteLine("FormRenk=" + cmbFormRenk.Text);
            sw.WriteLine("Saydamlik=" + tbSaydamlik.Value);
           
            //Soldurma efekti kullan isimli radiobuton seçiliyse yazılacak değeri belirtiyoruz.Değilse de mantıken normal seçilmiş gibi davranıp normalseçimi aktif yapıyoruz.
            if (rbEfekt.Checked)
                sw.WriteLine("NormalKapanma=false");
            else
                sw.WriteLine("NormalKapanma=true");

            //Değerleri yazmak için oluşturduğumuz nesnemisi kapatıyoruz.
            sw.Close();

            //Kaydetmenin başarılı bir şekilde olduğunu belirtip ayarlar formunu this.close diyip kapatıyoruz.
            MessageBox.Show("Ayarlarınız başarıyla kaydedildi");
            this.Close();

            //Proje dosyamızda bin/Debug'ın altına baktığınızda ayarlar.ini'yi görebilirsiniz.
        }
    }
}

Proje olarak indirmek için tıklayın

Evet yapacaklarımız bu kadar.Artık ufak çaplı projelerde işe yaracak bir ayar saklama işlemini gördük . Seviyorum basitliğinden dolayı :)

Bir sonraki yazımızda görüşmek üzere kendinize iyi bakın iyi günler


Serhat Taş

6 kişi tarafından 4.3 olarak değerlendirildi

  • Currently 4,333333/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler: ,

C# & .NET

Yorumlar

Yorum ekle


(Gravatar simgesini gösterecek)  

biuquote
  • Yorum
  • Canlı önizleme
Loading



Powered by BlogEngine.NET 1.4.5.0
Bu tema Mads Kristensen tarafından yapılmıştır ve Türkçeleştirilmesi Blog Engine Türkiye ekibi tarafından yapılmıştır.

Son Yorumlar

Comment RSS

Yasal Uyarı

Bu sitede sunulan tüm bilgi ve dökümanların kullanımından ve sitede yapılan kullanıcı yorumlarından (siyasi içerik,hakaret vb.) doğacak sorunlardan yazar sorumlu tutulamaz. 

İçeriğin kaynak belirtilmeden kopyalanması yasaktır !

SERHAT TAŞ

© Copyright 2010