Makale Özeti

Geliştirilen projeler, küçük yada büyük boyutu ne olursa olsun, ister büyük bir veritabanını yöneten ticari bir set, ister kendiniz için hazırladığınız ufak bir oyun programı yada bir holdingin e-ticaret portalı olsun her durumda proje geliştirme zamanının dışında değiştirilebilcek bazı bilgilere ihtiyacı vardır.

Makale

Geliştirilen projeler, küçük yada büyük boyutu ne olursa olsun, ister  büyük bir veritabanını yöneten ticari bir set, ister kendiniz için hazırladığınız ufak bir oyun programı yada bir holdingin e-ticaret portalı olsun her durumda proje geliştirme zamanının dışında değiştirilebilcek bazı bilgilere ihtiyacı vardır. Aksi halde ihtiyaçları tam olarak karşılayamayacak ya da en ufak bir değişiklik gerektiğinde kodlar açılacak,değiştirilecek tekrar derlenip dağıtılacak. Gereksiz zaman ve belkide maliyet kullanımı. Peki bunu önlemek için ne yapacağız..  Kurulum yapılacak ortama göre, yada kullanıcıların bazı isteklerine göre alınacak bilgileri yani projemizin bazı ayarlarını bir şekilde saklayıp, gerektiğinde oradan okuyarak kullanmalıyım. Hepimizin bildiği her eve lazım metin belgesi J yada yerine göre veritabanına yazıp ordan okumak genel olarak bilinen ve bazen çok uğraştırıcı yöntemler.Peki şöyle bir şey olsa.. Ben bazı ayarlarımı biryerde saklasam ve çoğu zaman kod yazmaya bile ihtiyaç duymadan benim programım direk oradan okuyarak anlasa nerde ne yapması gerektiğini.. Ve bu ayarları değiştirdiğimde yeniden derlemeye gerek kalmadan istediğim güncelleme sağlansa. İşte bu ayarları saklayacağımız yer uygulama klasörümüz altında oluşturacağımız  uygulama konfigurasyon dosyası (UygulamaAdi.exe.Config). Ve bu ayarları projemize bağlamamızı sağlayan yapı ise dinamik özellikler (dynamic properties).  Şimdi bunlarla ilgili biraz bilgi edinerek nasıl kullandğımızı inceleyelim.
 

Dynamic Özellikler Ve Konfigürasyon Dosyası
Dinamik özellikler uygulamanızın birçok bileşeninin bazı özelliklerinin değerini derlenmiş olan kod dışındaki bir konfigürasyon dosyasından almamızı sağlar. O halde bir bileşenin özelliklerini dinamik olarak ayarlayabilmek için bu ayarları bir konfigurasyon dosyasına yazmalı, ve bunu okuyarak uygulayacak kodu programımıza eklemeliyiz. Kullanılan konfigürasyon dosyası web tabanlı uygulamalarda Web.Config ismiyle karşımıza çıkarken, windows tabanlı uygulamalarda da benzer şekilde UygulamaAdı.Config olarak görünür. Uygulamalardaki bütün formlar ve bileşenler de değiştiremeyeceğimiz benzer konfigurasyon dosyalarını kullanırlar. Bu dosyaların içinde saklayacağımız ayarlar XML olarak bulunurlar.  Örneğin projemizdeki timer1 nesnemizin özelliklerini sakladığımız bir konfigürasyon dosyası aşağıdaki gibi olacaktır. 

  <configuration>

    <appSettings>

     <add key=timer1.Interval" value="60000" />

     <add key=timer1.Enabled" value="True" />

    </appSettings>

  </configuration>

Şimdi ufak bir örnek proje ile dinamik özellikleri ve konfigürasyon dosyasını nasıl kullandığımızı inceleyelim.

Kullanılacak Dinamik Özelliklerin Hazırlanması

Visual studio içinde File > New > Project ile gelen pencerede proje tipi olarak “Visual basic Project” template olarakda “Windows Application” seçelim. Projemizin adını “Login” vererek örnek projemizi ekleyelim. Ve şekildeki gibi kontrollerimizi yerleştirelim.


Label1.text=”Kullanıcı adı”

TextBox1.Name=Kullanici_txt

Label2.Text=”Firma No”

Textbox2.Name=”FirmaNo_txt”

Label3.Text=”Parola”

Textbox3.Name=”Parola_txt”

Şimdi Dinamik özelliklerini ayarlamak üzere FirmaNo_txt isimli textboxımızı seçelim, ve Properties penceresinde DynamicPropertiesi yanındaki (+) ile genişletelim. Açılan kısımdaki Advanced özelliğinin yanındaki butona ()  tıkladığımızda Dynamic Properties penceresi açılır aşağıdaki şekilde olduğu gibi. 

Burda yapmak istediğimiz şey programın yönetim kısmında değiştirebileceğimiz bazı bilgileri  FirmaNo_txt textboxımızın bazı özelliklerine  dinamik olarak atayabileceğimiz bağlantıları oluşturmak.  Mesela yönetici, firma numarasını değiştirilemesin,yada sadece benim yazdığım firmaya giriş yapılabilsin şeklinde yönlendirebilir projeyi. Şimdi bu bağlantıları gerçekleştirelim.

- Properties kısmında Enabled özelliğini seçerek KeyMapping kısmına FirmaNo_Enabled yazalım.

- Yine Properties kısmında Text özelliğini seçerek KeyMapping kısmına FirmaNo_Text yazalım. Ok diyerek değişikliklerimizi onaylayalım.

Dinamik özellik bağlantılarımız görsel olarak anlattığımız şekilde yapabileceğimiz gibi kod kısmındada şu şekilde yapabiliriz.

 

Public configurationAppSettings As System.Configuration.AppSettingsReader = New System.Configuration.AppSettingsReader

 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

  Visual Basic

  Me.Timer1.Enabled = CType(configurationAppSettings.GetValue _

             ("ZamanAyari", GetType(System.Boolean)), Boolean)

  Me.Timer1.Interval = CType(configurationAppSettings.GetValue _

             ("Sure", GetType(System.Int32)), Integer)

  MsgBox("Süreniz : " & Timer1.Interval / 60000 & " dk.")

 End Sub

 

Ve Parola textboxımızla ilgili de örnek olması bakımından yazılan parolanın görünmesinin seçilebileceği bir bağlantı düşünebiliriz…

Son olarak projemize bir Timer nesnesi ekleyerek daha önce yaptığımız gibi dinamik properties penceremizi açalım. Ve properties bölümünde Enabled seçerek KeyMapping e ZamanAyari, Intervali seçerek KeyMappinge Sure yazalım. Bu işlemlerden sonra Timer1 nesnemizin properties penceresi aşağıdaki gibi görünecektir.

         

Şekilde görünen Advanced sekmesinin altındaki değerler bizim eklediğimiz Dinamik Özelliklerdir. Artık buradanda istediğimizde değiştirebilizi. Ayrıca Interval ve Enabled özelliğininin yanında görülen köçük yeşil işaret bu özelliklerin dinamik olarak değiştiğini gösterir.

Unutmadan ; projeyi çalıştırdığımızda Timer1 nesnemizin değerini kontrol edebilmek için formumuzun Load eventına aşağıdaki kodu ekleyelim.

 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

  MsgBox("Süreniz : " & Timer1.Interval / 60000 & " dk.")

 End Sub

 

Installer Class ile Konfigurasyon Dosyası Eklenmesi

Installer class bize kurulum aşamasında çalıştırabileceğimiz kodları ekleyebileceğimiz bir ortam sunar. Bu konudan bir önceki makalemde “Kurulum aşamasında veritabanı ekleme” konusunu anlatırken bahsetmiştik. Orada Installer Classı  projemizin veritabanını,tablelarını, procedurelerini eklemek için kullanmıştık. Şimdi ise kurulum aşamasında aldığımız bilgileri konfigürasyon dosyamıza yazmak için kullanacağız.

Daha önce eklediğimiz login projemize Add New Item dialog kutusundan,  Installer Class ı seçerek ekleyelim clasımızı.  Ve aşağıdaki kodlarımızı içine ekleyelim.

 

Kurulum aşamasında çalışacak kod örneğimiz.

 Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary)

  MyBase.Install(stateSaver)

  Setup projesindeki CustomActionData özelliğinden gelen değerleri alır.

  Dim FrmnoEnb As String = "TRUE"

  Dim FrmnoTxt As String = Me.Context.Parameters.Item("FRMTXT")

  Dim ZmnAyar As String = "TRUE"

  Dim Sure As String = 10 * 60000

 

  Gelen cevaba göre değerlerimizi daha önce bağladığımız dinamik özelliğin

  okuyabileceği veri tipine çevirmeliyiz.

  burda Enabled özelliği boolean olduğu için Boolean tipine çevirmeliyiz

  If UCase(Me.Context.Parameters.Item("FRMENB")) = UCase("EVET") Then

   FrmnoEnb = "TRUE"

  ElseIf UCase(Me.Context.Parameters.Item("FRMENB")) = UCase("HAYIR") Then

   FrmnoEnb = "FALSE"

  End If

 

  If UCase(Me.Context.Parameters.Item("ZMNAYAR")) = UCase("EVET") Then

   ZmnAyar = "TRUE"

  ElseIf UCase(Me.Context.Parameters.Item("ZMNAYAR")) = UCase("HAYIR") Then

   ZmnAyar = "FALSE"

  End If

 

  Interval için 1000 değeri 1 sn yi göstereceğinden dk olarak hesaplamak için

  dk sayısını 60000 ile çarpmalıyız.

 

  If Me.Context.Parameters.Item("SURE") <> "" Then

   If IsNumeric(Me.Context.Parameters.Item("SURE")) Then

    Sure = CInt(Me.Context.Parameters.Item("SURE")) * 60000

   End If

  End If

 

  If FrmnoEnb = "" Then

   Throw New InstallException("No arguments specified")

  End If

  If FrmnoTxt = "" Then

   Throw New InstallException("No arguments specified")

  End If

  If ZmnAyar = "" Then

   Throw New InstallException("No arguments specified")

  End If

  If Sure = "" Then

   Throw New InstallException("No arguments specified")

  End If

 

 

  Konfigürasyon dosyamızın yolunu belirlemek için reflection kullanırız.

  Dim Asm As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly

  Dim FileInfo As System.IO.FileInfo = New System.IO.FileInfo(Asm.Location + ".config")

  If Not FileInfo.Exists Then

   Throw New InstallException("Missing config file")

  End If

 

  Konfigürasyon dosyamızı açarız.

  Dim XmlDocument As New System.Xml.XmlDocument

  XmlDocument.Load(FileInfo.FullName)

 

  Doğru Node-u bularak istediğimiz değerleri ekleriz.

  Dim Node As System.Xml.XmlNode

  Dim FoundIt As Boolean = False

  For Each Node In XmlDocument.Item("configuration").Item("appSettings")

   If Node.Name = "add" Then

    If Node.Attributes.GetNamedItem("key").Value = "FirmaNo_Enabled" Then

     Node.Attributes.GetNamedItem("value").Value = FrmnoEnb

     FoundIt = True

    End If

   End If

   If Node.Name = "add" Then

    If Node.Attributes.GetNamedItem("key").Value = "FirmaNo_Text" Then

     Node.Attributes.GetNamedItem("value").Value = FrmnoTxt

     FoundIt = True

    End If

   End If

   If Node.Name = "add" Then

    If Node.Attributes.GetNamedItem("key").Value = "ZamanAyari" Then

     Node.Attributes.GetNamedItem("value").Value = ZmnAyar

     FoundIt = True

    End If

   End If

   If Node.Name = "add" Then

    If Node.Attributes.GetNamedItem("key").Value = "Sure" Then

     Node.Attributes.GetNamedItem("value").Value = Sure

     FoundIt = True

    End If

   End If

  Next Node

 

  If Not FoundIt Then

   Throw New InstallException("Config file did not contain a ServerName section")

  End If

 

  Yeni konfigürasyon dosyamızı kaydederiz.

  XmlDocument.Save(FileInfo.FullName)

 End Sub

 

Konfigürasyon dosyamızı eklerken kullanacağımız kod içinde gerekli yerlere açıklamalarını yazdığım için tekrar açıklamıyorum.

Setup Projesinin Oluşturulması

Projemizin içinde bulunduğu solutionda Add > New Solution ile gelen pencerede Setup and Deployement proje tipini ve Setup Project templatini seçerek setup projemizi ekleyelim. 

File System Editorde Application Folder üzerine sağ tıklayarak Add Project Output ile gelen pencerede Primary Output olarak projemizi (Login) seçerek ekleyelim.


Kurulum Kullanıcı Arabirimini Oluşturma (User Interface) 

- Solution explorer da Setup projemiz seçili iken View > Editor > User Interface ile User Interface penceremizi açalım.

- Start nodu altındaki Instal üzerine sağ tıklayarak Add Dialog ile gelen dialog kutusundan TextBox(A) yı seçiyoruz ve ok ile ekliyoruz..

- TextBox(A) üzerinde sağ tıklayarak Installation folderin üzerine gelene kadar Move up ile yukarı taşıyoruz.

- Ve TextBoxımız seçili iken properties penceresi üzerinde aşağıdaki gibi olacak şekilde  gerekli değişiklikleri yapıyoruz.

 

 

 

 

Kurulum Dosyasına Installer Classı ekleme

- Solution explorer da Setup projemiz seçili iken View > Editor > Custom Actions ile gelen Custom Actions penceresinde Custom Actions nodu üzerine sağ tıklayarak Add Custom Action ile gelen diyalog kutusundan Application Folder altındaki  Primary output from Sample (Active) i seçerek ok ile ekliyoruz.

 

Şimdi yapmamız gereken ise bir önceki User interface bölümünde eklediğimiz TextBoxlardan alacağımız bilgileri Installer Classımıza gönderecek bağlantıyı sağlamak.

Bunun için;  Install nodu altındaki Primary output from Sample (Active)  seçili iken Properties penceresinde CustomActionData özelliğini şu şekilde yapmak:

 

/FRMENB=[FRMENB] /FRMTXT=[FRMTXT] /ZMNAYAR=[ZMNAYAR] /SURE=[SURE]

 

Tabi bu adımı diğer Primary output from Sample (Active)  leri seçerekte tekrarlamalıyız (Commit,Rollback ve Uninstal altındaki)

 

Buradaki yapı herbir text kutusu için /FRMENB=[FRMENB] şeklinde.  Eşitliğin ilk tarafı installer class içinde alacağımız değişkeni, ikinci tarafı ise User Interface bölümünde eklediğimiz TextBox1in Edit1Property özelliğine yazdığımız değer. Birden fazla text kutusu göndermek içinse aralara boşluk koyuyoruz. Ve eğer text kutusunda alacağımız değer içeriğindede boşluk olabilecekse değişkeni tırnak içinde yazmalıyız. Yani “[FRMENB]” şeklinde.

Artık setup projemisi build menüsünü kullanarak derleyebiliriz. Setupımızı oluştuğu dizin altından çalıştırdığımızda gelen kurulum aşamalarından biri kullanıcıdan ayarlarımızı alacağımız User Interface ile eklediğimiz kısım şu şekilde karşımıza çıkar.

 

 

      Gerekli değişiklikleri yaparak kurulumu tamamladığımızda projemizi kurduğumuz klasör altına bakarsak ProjeAdi.exe.config isimli konfigurasyon dosyamızı görürüz. Bunun içeriği Xml yapısında saklanır ve aşağıdaki gibidir. 

 

<?xml version="1.0" encoding="utf-8"?>

<configuration>

  <appSettings>

    <add key="FirmaNo_Enabled" value="FALSE" />

    <add key="FirmaNo_Text" value="011" />

    <add key="Sure" value="600000" />

    <add key="ZamanAyari" value="TRUE" />

  </appSettings>

</configuration>

 

     İşte bu ayarları kullanarak istediğimiz zaman projemiz içindeki formlarda,bileşenlerde istediğimiz değişiklikleri yaparak, yeniden derlemeye ihtiyaç duymadan güncellemelerimizi yapabiliriz. Tabi bunun için çok detaylı bir yönetim kısmı oluşturulmalı. Bizim bu makalemizde oluşturduğumuz sadece örnek olması bakımından setup dosyası içine yerleştirilmiş olarak bir konfigürasyon dosyası oluşturmak. Bunu benzer şekilde bir yönetim projesi oluşturarak daha detaylı olarak yapabiliriz.  Projemizde dinamik olarak kullanılması gereken birçok ayarı bu dosyada saklayabiliriz.. Veritabanı bağlantı bilgileri gibi mesela. Connection stringimizi burda saklayarak istediğimiz zaman değişiklik yapıp derlemeden kullanabiliriz. Tabi güvenlikle ilgili önlemlerimizi aldıktan sonra J

Projemizi çalıştırdığımızda karşımıza gelecek ekran ise aşağıdaki gibi olacaktır.
 

 

Firma no alanı Enabled değil, Texti =011 yazılmış, timer1 nesnemiz kullanımda ve 10 dk olarak zamanlandığını belirten mesaj kutusu çıkar karşımıza.