|
|||||||
|
|
|
|||||
|
|
|||||||
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
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ı
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
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.
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
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.
Bu özellik False ise Dim komutu ile türetilen MDI Child formlar Load komutu ile
belleğe gizli olarak yüklenebilir.
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
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
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.