Makale Özeti

Klasik herkese merhaba kelimemizle yeni makalemize başlayalım. Bu makalemde aslında bir çoğunuzun bildiği ama nasıl yapıldığını tam olarak bilmediği Windows Application uygulamalarında kullandığımız MDI Sayfalama tekniği olacaktır. Konumuza başlamadan MDI formlar hakkında önce bir takım açıklamalar ve diğer programlardan alıntı yaparak ne olduğunu daha pekiştirmek istiyorum.

Makale

Klasik herkese merhaba kelimemizle yeni makalemize başlayalım. Bu makalemde aslında bir çoğunuzun bildiği ama nasıl yapıldığını tam olarak bilmediği Windows Application uygulamalarında kullandığımız MDI Sayfalama tekniği olacaktır. Konumuza başlamadan MDI formlar hakkında önce bir takım açıklamalar ve diğer programlardan alıntı yaparak ne olduğunu daha pekiştirmek istiyorum. 

 

Günümüz bilgisayarlarının hemen hemen bir çoğunda çeşitli yazılımlar görürüz. Hastane yazılımları, otomasyon yazılımları, grafik işleme yazılımları ve benzeri yazılımlar. Bu tür yazılımlarda programların bir çok etkinliği olabilmektedir. Kayıt yapmak için yada var olan kayıtlar arasında işlemler yapabilmek için tek bir formun olduğu gibi, daha farklı işlemlerde kullanmamız gereken diğer formları örnek verebiliriz. Bunların hepsi MDI formlar yardımıyla yapılmaktadır. MDI form destekleri olmazsa bu tür yazılımların hakimiyeti zor olduğu kadar kullanıcıya kullanım kolaylığı da oldukça zorlaşacaktır. İsterseniz açıklamamızla ilgili bir takım programlardan sizlere örnek gösterelim.

 

 

İlk örneğimiz bir çok pc kullanıcısının özelliklede grafikle uğraşan kullanıcıların kullandığı Photoshop olsun. Programın orta alanında gördüğünüz siyah bölümü birazdan açıklayacağımız MDI formlara örnek olarak gösterebiliriz. Bu şekilde birden fazla formu MDI formda gösterebilir yada işlem yapabiliriz.

 

İkinci örneğimiz biraz daha geliştirilmiş olan bir MDI yapısı. Program bir çoğumuza tanıdık gelebilecek olan 3D Studio Max programıdır. Artık yavaş yavaş kendi uygulamamıza geçebiliriz.

 

Ben platform olarak Visual Studio 2005 platformunda uygulamamı gerçekleştiriyorum. Sizin içinse bir kısıtlama olmayacak J Uygulamamızın adı MDI Sayfalama olsun

 

Uygulamamızı oluşturduk açılan boş formumuzun özelliklerinden IsMdiContainer seçeneğini true yapalım ve ardından menu oluşturmak için MenuStrip nesnemizi kullanarak menüler oluşturalım.

 

 

Programımızın tasarım şekli şuanda hazır durumda. Geriye kalan taraf gerekli formların oluşturulması ve MDI formla ilişkilerinin sağlanması. Makalenin net anlaşılması için biraz detaylı anlatacağım. Çünkü maalesef MDI formlar üzerinde yeterli açıklama ve makale bulamadım. Sanırım detaylı bir anlatım bu açığı birazda olsa kapatır. Programımızdaki menülerin çalışması için Click eventlerini tetikleme yapmalıyız. Bunun için her birinin üzerine çift tıklamanız yeterli olacaktır. Eğer bir sorun oluşuyor ve bunu yapamıyorsanız işlev ekleyeceğiniz menüyü bir kez programınızın sağında mevcut olan property window penceresinin olaylar (event) kısmında bulunan click olaylarından tetikletin. Tetikleme işlemi bittiğinde programınız aşağıdakine benzer bir şekilde olacaktır.

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace MDI_Sayfalama

{

    public partial class Form1 : Form

    {      

        public Form1()

        {

            InitializeComponent();

        }

 

        private void ıLKFORMUMUZToolStripMenuItem_Click(object sender, EventArgs e)

        {

          

        }

 

        private void ıKINCIFORMUMUZToolStripMenuItem_Click(object sender, EventArgs e)

        {

          

        }

 

        private void uCUNCUFORMUMUZToolStripMenuItem_Click(object sender, EventArgs e)

        {

          

        }

 

        private void dORDUNCUFORMUMUZToolStripMenuItem_Click(object sender, EventArgs e)

        {

          

        }

 

        private void çIKIŞToolStripMenuItem_Click(object sender, EventArgs e)

        {

            Application.Exit();

        }

    }

}

 

Böylece menülerimiz artık aktif oldu. Programımız çalıştığında ve menüler tıklandığında herhangi bir bağlamamız olmadığı için normal olarak boş gözükecektir. İlk formumuzu oluşturmaya başlayabiliriz, formumuzun adı FrmIlkForm olsun. Açtığımız anda formumuzun property window penceresinde Start Position bölümünün Manuel olmasına dikkat edelim. Bu şekilde formumuza açılma komutu geldiğinde programımız nerede açılırsa açılsın form başlangıç kısmından açılacaktır ve karışıklık engellenecektir. İlk bağlantımızı yapmadan önce bazı açıklamalar yapmak istiyorum. Yazacağımız ilk ufak kod satırını normalde olması gereken şekilde yazacağım. Ama bu şekilde kullanmanın sakıncaları ileride mutlaka olacaktır. Daha sonra bu kod satırını iptal ederek daha farklı bir çalıştırma şekli oluşturacağız ve yazılımımız bir nebze daha iyi olacaktır.

 

private void ıLKFORMUMUZToolStripMenuItem_Click(object sender, EventArgs e)

{

   FrmIlkForm IlkSayfa = new FrmIlkForm();

   IlkSayfa.MdiParent = this;

   IlkSayfa.Show();

}

 

Programımızı açıklamak gerekirse. Daha önceden zaten oluşturduğumuz FrmIlkForm adlı formumuzu anaformumuzda kullanmamız için bilgisayar hafızasında yer açmamız ve çağırmamız gerekiyor bunun için new komutunu kullanarak bellekte yeni bir alan tahsis ettik ve formumuzu daha sonra çağırıp üzerinden işlemler yapabilmemiz için IlkSayfa adında bir değişken ismi tahsis ettik. Daha sonrada IlkSayfa adlı değişkenimizi temel alarak Windows Formumuzun MDI sayfalarında bağlantı kurulabilmesi için MdiParent özelliğini o an kullandığımız anaformun tamamına eşit gösterdik. Bunu matematiksel olarak anlatırsak ana küme ve alt küme olarak benzetebiliriz. Son satırdada IlkSayfa adlı değişkenimizden formumuzu açmak için Show() metodunu kullandık ve çalıştırdık. Sonuç aşağıdaki gibidir

 

Böylece ilk formumuz oluşmuş oldu. Yalnız ufak bir problemimiz olabilir. Menüye tek tıklamada new anahtar sözcüğünden yeni bir form oluşturuluyor ve bu form tekrar ana forma bağlanarak gösterime sunuluyor. Yani;

 

 

Buna benzer can sıkıcı bir olay söyleyebiliriz. Çözüm olarak bir takım çözümler aklımıza gelebilir. Belki ilk olarak açılan formumuzun Visible bölümünden formumuzu görünmez kılabiliriz diyebiliriz. Ama bu büyük bir hata olur. Çünkü bu menüye her tıklamada yeni bir form oluşacak bu form bilgisayarımızın hafızasında yer işgal edecek ve daha önceden yapılan işlemleri yine hafızada tutacaktır. Yani hem performans olarak kayıba hemde program içerisinde karışıklığa neden olacaktır. Peki o zaman ne yapabiliriz!. Burada her yazılımcının belki farklı bir önerisi olabilir benim önerim ise şöyle olacaktır. Programımızın anaformları belirli bir adet olacaktır yani bu formlar en fazla 20 adedi bile geçmeyecektir. Şahsen ben 100 adet formun ana sayfada kullanıldığını pek görmedim. Ama görsemde saygı duyarım J. Programımızda sadece dört tane form olmaktadır. Bu formların her birini anaprogramımızda bir değişken tahsis edip elimizde tutarsak ve menü her tıklandığında bu formların bellekteki yerler kontrol edilip form tekrardan açılmışsa, önceden açılan formu yok edip, tekrar yeniden bir form oluşturabiliriz. Böylece hem bellekten tasarruf edeceğiz hemde önceden yaptığımız ama üzerinde herhangi bir kayıt yapmadığımız işlemlerde yok edilip programı karmaşıklıktan kurtaracaktır.

Ilk formumuzu zaten oluşturmuştuk. Sırasıyla FrmIkinciForm, FrmUcuncuForm, FrmDorduncuForm ları oluşturalım. Ve aynı özellikleri verelim. Daha sonrada bu formları anaformumuzdan yeni bir alan adı tahsis etmeden sadece değişken olarak tanımlayalım.

 

public partial class Form1 : Form

{

   FrmIlkForm IlkSayfa;

   FrmIkinciForm IkinciSayfa;

   FrmUcuncuForm UcuncuSayfa;

   FrmDorduncuForm DorcuncuSayfa;

 

   public Form1()

   {

       InitializeComponent();

   }

 

  private void ıLKFORMUMUZToolStripMenuItem_Click(object sender, EventArgs e)

  {

           

  }

 

  private void ıKINCIFORMUMUZToolStripMenuItem_Click(object sender, EventArgs e)

  {

           

  }

 

Bu şekilde bir kullanımda. Formlarımız bellekte oldukça az bir yer işgal edecektir. Programımızın asıl satırlarına geçelim.

 

public partial class Form1 : Form

{

   FrmIlkForm IlkSayfa;

   FrmIkinciForm IkinciSayfa;

   FrmUcuncuForm UcuncuSayfa;

   FrmDorduncuForm DorcuncuSayfa;

 

   public Form1()

   {

      InitializeComponent();

   }

 

   private void ıLKFORMUMUZToolStripMenuItem_Click(object sender, EventArgs e)

   {

      IlkSayfa = new FrmIlkForm();

      IlkSayfa.MdiParent = this;

      IlkSayfa.Show();

   }

 

Diğer programımızdan farklı olmayan bir kullanım şekli oldu. Bu şekilde bir kullanımlı diğer programımızdan hiçbir farkı olamayacaktır yani formlar yine 2 3 4 şeklinde açılacaktır. Peki ne yapacağız!

 

public partial class Form1 : Form

{

   FrmIlkForm IlkSayfa;

   FrmIkinciForm IkinciSayfa;

   FrmUcuncuForm UcuncuSayfa;

   FrmDorduncuForm DorcuncuSayfa;

 

   public Form1()

   {

      InitializeComponent();

   }

 

   private void ıLKFORMUMUZToolStripMenuItem_Click(object sender, EventArgs e)

   {

       if (IlkSayfa != null) IlkSayfa.Dispose();         

       IlkSayfa = new FrmIlkForm();

       IlkSayfa.MdiParent = this;

       IlkSayfa.Show();

   }

 

Bu şekilde ufak bir kontrol işimizi görecektir. Bundan sonra yeni bir form açıldığında programımız daha önceki açılan formun değişken değerini kontrol edecektir. Değişkenin saklandığı bölgede bir değer tutuluyorsa bu değer hemen Dispose metoduyla yok edilecektir. Herhangi bir değer tutulmuyorsa zaten tehlike yok demektir. Formumuz ard arda formlar olmadan açılacaktır. Programımızı çalıştırın ve deneyin. Aynı metodu diğer formlarımızada uyguluyoruz. Tek fark diğer formlara uygularken her form için kontrol yazmamız gerekiyor.

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace MDI_Sayfalama

{

    public partial class Form1 : Form

    {

        FrmIlkForm IlkSayfa;

        FrmIkinciForm IkinciSayfa;

        FrmUcuncuForm UcuncuSayfa;

        FrmDorduncuForm DorcuncuSayfa;

 

        public Form1()

        {

            InitializeComponent();

        }

 

        private void ıLKFORMUMUZToolStripMenuItem_Click(object sender, EventArgs e)

        {

            if (IlkSayfa != null) IlkSayfa.Dispose();

            if (IkinciSayfa != null) IkinciSayfa.Dispose();

            if (UcuncuSayfa != null) UcuncuSayfa.Dispose();

            if (DorcuncuSayfa != null) DorcuncuSayfa.Dispose();

            IlkSayfa = new FrmIlkForm();

            IlkSayfa.MdiParent = this;

            IlkSayfa.Show();

        }

 

        private void ıKINCIFORMUMUZToolStripMenuItem_Click(object sender, EventArgs e)

        {

            if (IkinciSayfa != null) IkinciSayfa.Dispose();

            if (IlkSayfa != null) IlkSayfa.Dispose();

            if (UcuncuSayfa != null) UcuncuSayfa.Dispose();

            if (DorcuncuSayfa != null) DorcuncuSayfa.Dispose();

            IkinciSayfa = new FrmIkinciForm();

            IkinciSayfa.MdiParent = this;

            IkinciSayfa.Show();

        }

 

        private void uCUNCUFORMUMUZToolStripMenuItem_Click(object sender, EventArgs e)

        {

            if (IkinciSayfa != null) IkinciSayfa.Dispose();

            if (IlkSayfa != null) IlkSayfa.Dispose();

            if (UcuncuSayfa != null) UcuncuSayfa.Dispose();

            if (DorcuncuSayfa != null) DorcuncuSayfa.Dispose();

            UcuncuSayfa = new FrmUcuncuForm();

            UcuncuSayfa.MdiParent = this;

            UcuncuSayfa.Show();

        }

 

        private void dORDUNCUFORMUMUZToolStripMenuItem_Click(object sender, EventArgs e)

        {

            if (IkinciSayfa != null) IkinciSayfa.Dispose();

            if (IlkSayfa != null) IlkSayfa.Dispose();

            if (UcuncuSayfa != null) UcuncuSayfa.Dispose();

            if (DorcuncuSayfa != null) DorcuncuSayfa.Dispose();

            DorcuncuSayfa = new FrmDorduncuForm();

            DorcuncuSayfa.MdiParent = this;

            DorcuncuSayfa.Show();

        }

 

        private void çIKIŞToolStripMenuItem_Click(object sender, EventArgs e)

        {

            Application.Exit();

        }

    }

}

 

 

 

MDI form yapımızı bu şekilde örneklendirebiliriz. Bu makalemizinde sonuna geldik. İleride daha gelişmiş makalelerde buluşmak üzere hayallerinizle olun J