Free Web Site - Free Web Space and Site Hosting - Web Hosting - Internet Store and Ecommerce Solution Provider - High Speed Internet
Search the Web

MDI FORMLAR

MDI formlar diğer formlardan daha farklı bir yapıya sahiptir. Bir MDI form oluşturmak ilk olarak Project menüsünden Add MDI Form seçeneği ile yapılır. Bu form oluşturulduktan sonra bu formun Child formları normal bir formun MDIChild özelliği True yapılarak oluşturulur. MDI forma Program Yöneticisini, MDI Child formada Program Gruplarını örnek verebiliriz.Bir MDI form MDI Child formları içinde barındırır. Yani bir nevi MDI form MDI Child formların masa üstü gibi davranır. MDI Child formlar ancak bir MDI form içerisinde bulunabilirler, ve bu form içerisinde simge durumuna küçültülebilir ve taşınabilirler.

            Bir örneği adım adım geliştirelim. Öncelikle yeni bir proje başlatın. Şu anda programa ait bir formun projede olması gerekiyor. Yeni bir MDI formu da Project menüsünden  Add MDI Form seçeneği ile oluşturalım. Projede bulunan Form1’in MDIChild özelliğini de True yaparak bir MDIChild oluşmasını sağlayalım. Ayrıca programın MDIForm’dan başlaması için de Project menüsünden Project Properties seçeneği ile açılan aşağıdaki pencerenin General kısmındaki Start Up Object seçeneğini MDIForm1 yapalım.

Programı bu haliyle çalıştırdığınızda yalnız MDIForm görülecektir. MDI Child formunda görülebilmesi  için MDIFORM_LOAD olayına

Private Sub MDIForm_Load

                        Form1.show

End Sub

kodunu ekleyin.

Bu MDIChild formların yenisini oluşturmak için yeni formlar oluşturulup MDIChild özellikleri True yapılabilir. Ancak eğer bu child formlar aynı kontrollere sahip olacaksa bu yeni formlar elimizdeki MDIChild formda türetilebilir. Bu iş için dim değimini şu şekilde kullanacağız.

           

            Dim formadı as New Orijinalform

Formadı         : Oluşturulacak yeni  formun adı.

Orijinalform   : Türetilecek Formun adı

Dim for as new form1

Komutuyla form1 formundan form isimli yeni bir form oluşturulabilir. Bu komut o formu oluşturur ancak görüntülemez. Görüntülemek içinde

           

Form.show

komutunu kullanacağız.

            Şimdi bu komutları kullanarak programımıza yeni formlar oluşturalım. Bunun için form1 üzerine yeni form captionlu bir komut düğmesi ve bu düğmenin click kodunada

            Private Sub Command1_click()

            Dim for as new form1

Form.show

End Sub

Kodlarını yazalım. Programı bu haliyle çalıştırıp aşağıdaki gibi bir görüntü elde edebilirsiniz.

Burada görüldüğü gibi Form1’den türetilen bütün formların Caption’ları Form1’dir. Bunu her form için arttırarak değiştirelim. Bu iş için Forms.Count özelliğini kullanacağız. Bu özellik programda bulunan bütün formların sayısını verir. Komut düğmesinin Click olayını şu şekle çevirelim.

Private Sub Command1_Click()

            Dim form As New form1

Form.show

Form.Caption = “Form” & (forms.Count-1)

End Sub

Forms.Count MDIForm dahil formların sayısını verdiği için bir eksiğini alarak Child formların sayısını bulmuş olduk.

Properties

ScrollBars

           

            Diğer formlardan farklı olarak MDI formlara kaydırma çubukları bu özellik vasıtasıyla verilebilir.

0: vbSBNone: Yok

1: vbVertical: Dikey

2: vbHorizontal: Yatay

3:vbBoth: Dikey ve yatay

ActiveForm

            Screen nesnesindeki ActiveForm özelliği gibidir. O anda aktif olan MDI Child formu bu özellik temsil eder.

            MDIForm1.ActiveForm.Print “Merhaba”

satırı ile o anda aktif olan MDI Child forma Merhaba yazılır.

MDI formun diğer özelliklerinin diğer kontrollerin özelliklerinden bir farkı yoktur. Yalnız menülerde bir farklılık vardır. MDI formun menüleri olabilir ancak bu menüler bir MDI Child menü yokken menü çubuğunda görülür. Eğer bir MDIChild form varsa o Child formun menüleri menü çubuğu yerine geçer. Ayrıca MDI Child formların menülerinin WindowList özelliği vardı. Bu özelliği örneğimizde formların listesini menüye eklemek için kullanalım. Örneğimizde Form1 için Pencere Caption’lu ve MnPEncere isimli, Windowlist özelliği True olan bir menü oluşturup çalıştıralım.

            Programı çalıştırıp yeni formlar ekledikçe bu formların başlıklarının Pencere menüsüne eklendiğimi göreceksiniz. Ve hiçbir koda ihtiyaç duymadan menüden bir formun seçildiğinde o formun aktif olduğunu da göreceksiniz.

            Şimdi de programı çalıştırıp komut düğmesi vasıtası ile birkaç form oluşturduktan sonra bütün Child formları kapatın. Ekranda sadece MDI formun kaldığını ve hiçbir menünün bulunmadığını göreceksiniz. Halbuki bu durumda dahi bazı işlemleri yapacak menülerin bulunması gerekir.

            MDI Formumuza da Caption’u Çıkış ve ismi de MNCikis olan bir menü oluşturun. Böylece bütün formlar kapatıldığında bu menü, menü çubuğunda görülecektir. Tabi ki çıkış işlemi için Menünün click olayına End kodunu koyun. Artık bütün MDI formlar kapandığında MDIForm için oluşturduğunuz menü, menü çubuğunda yerini alacaktır.

AutoShowChildren

            Bu özellik False ise Dim komutu ile türetilen MDI Child formlar Load komutu ile belleğe gizli olarak yüklenebilir.

Events

Unload

            MDI veya MDI Child formların Unload olayının normal bir formun unload olayından bir farkı yoktur. Ancak özel bir durum olarak bir MDI Child form kapatılmak istendiğinde formu bellekten çıkarmak yerine formu simge durumuna getirmek isteyebiliriz. O zaman MDI Child formun unload olayına Cancel = True yazarak formun bellekten çıkarılmasını önleyebiliriz. Aynı zamanda burada formu minimize durumuna getirecek kodu da yazmamız gerekecektir. Olması gereken kod şöyledir:

            Formadı.WindowState = 1 ‘minimize

            Cancel = True ‘kapatmayı iptal et

            Ancak eğer MDI Child formumuz örneğimizde olduğu gibi bir tek formdan türetilmişse kapatılmak istenen formun hangi form olduğunu bulmak yerine ME kelimesi kullanabiliriz. Bu kelime o anda aktif olan formun ismi yerine geçer.

            Yani Me.WindowState = 1 komutu ile o anki form hangisi olursa olsun bu formu minimize hale getirebiliriz.

            Örneğimizdeki Form1’in unload olayına aşağıdaki kodu yazarak form kapatılmak istendiğinde formun minimize hale gelmesini sağlayalım.

            Private Sub Form_Unload(cancel As Integer)

            Me.WindowState = 1

            Cancel = True

            End Sub

            Programımızı bu haliyle çalıştırırsanız artık MDI formların kapanmadığını, minimize durumuna geldiğini göreceksiniz. Ancak artık ana formu da kapatamayacaksınız. Çünkü ana formu (MDI form) kapatmak istediğinizde bu form çocuklarına kendilerini kapatmasını söyleyecektir. Bu durumda da yukarıda yazdığımız kod devreye girecek ve Cancel = True ile kapatma işlemi iptal edilecektir. O halde MDI formun kapatılması için MDI formun unload olayına veya QueryUnload olayına End kodunu yazmamız gerekecektir.

            Önce birinci yöntemi deneyelim. Yani MDI Formumuzun Unload olayına End kodunu yazalım.

            Private Sub MDIForm_Unload (Cancel As Integer)

                        End

            End Sub

            Programı çalıştırdığınızda işlemin başarılı olmadığını göreceksiniz. Yani MDI formun Unload olayındaki End koduna rağmen MDI form kapatılmak istendiğinde kapatılamamaktadır. Bunun sebebi Unload ve QueryUnload olaylarının meydana geliş sırasıdır. Bir MDI form kapatılmak istendiğinde meydana gelen olayların sırası şöyledir.

            MDIForm_QueryUnload

            Form _QueryUnload

            Form_Unload

            MDIForm_Unload

Bu sıralamadan görüldüğü gibi bir MDI form kapatılmak istendiğinde önce MDI formun QueryUnload olayı meydana gelir. Daha sonra MDI form Child formlarına kendilerini kapatmalarını söyler. Bu da Child formun QueryUnload olayını ve daha sonra da Unload olayını meydana getirir. Bu aşamalar geçildikten sonra yani Child formlasr kapatılmayı engellemedikleri takdirde artık MDI formun kapanmaması için bir sebep yoktur ve MDI formun Unload olayı meydana gelir.

            Bizim örneğimizde Child formların kapatılması yerine minimize edilmesi için gerekli kodu Child formun Unload olayına koyduğumuz için yani üçüncü aşamaya koyduğumuz için kapatılma iptal edilmekte ve kontrol MDI formun Unload olayına yani dördüncü aşamaya gelememektedir. O halde bizim MDI formu kapatmak için yazacağımız End kodunun dördüncü aşamadaki Unload olayına değil, birinci aşamada meydana gelen QueryUnload olayına yazmaktır.

            Private Sub MDIForm_QueryUnload (Cancel As Integer, UnloadMode As Integer)

                        End

            End Sub

Methods

Arrange

            Bu yöntem ile MDI form içindeki Child formlar düzenlenebilir. Şu dört değerden birini alır:

Sayısal

Sembolik

Anlamı

0

vbCascade

Minimize durumunda olmayan bütün Child formlar basamaklanır.

1

vbTileHorizontal

Minimize durumunda olmayan bütün Child formlar yatay olarak döşenir.

2

vbTileVertical

Minimize durumunda olmayan bütün Child formlar dikey olarak döşenir.

3

vbArrangeIcons

Minimize durumunda olmayan bütün Child formların simgeleri yerleştirilir.

MDIForm içindeki bütün formları yatay olarak döşemek için

            Mdiform1.Arrange 1

kullanılacağı gibi

Mdiform1.Arrange vbTileHorizontal

şeklinde de sembolik ismi ile kullanılabilir.

p class=MsoNormal style='text-align:justify'> 

            Örneğimizdeki Form1 Child formunun pencere menüsünü aşağıdaki gibi değiştirelim.

p class=MsoNormal style='text-align:justify'> 

Burada dört alt menünün de ismini MnArrange olarak verin ve sırasıyla index’lerini 0,1,2,3 yapın. Yani menü bir dizi olarak tanımlanmaktadır. Bu da kodumuzu daha kısaltacaktır. Şimdi menünün click olayına aşağıdaki kodu yazalım.

            Private Sub MnArrange_Click (index As Integer)

               Mdiform1.Arrange index

            End Sub

            Ayrıca bir MDI form üzerine bütün kontrolleri direk olarak yerleştiremezsiniz. MDI form üzerine PictureBox ve Panel3d kontrolü gibi Align özelliği olan kontroller yerleştirilebilir. Diğer kontroller ise ancak bu kontrollerin içine yerleştirilebilir. Ve bu iki kontrol formun masa üstünde yer işgal eder yani masa üstünü Child formlarla paylaşırlar. Bir MDI form üzerine bütün formu kaplayacak şekilde bir Panel yerleştirirseniz MDI Child formları ekranda göremeyeceksiniz.