Windows Form’unu Yönetmek(ShowDialog-Show metodları)

Bir desktop uygulaması yazılırken uygulama içerisinde ana bir Form(Main Window) üzerinden birden fazla Form açıp kapatma ihtiyacımız doğar. İkinci formu açarken modal(kipli) veya modeless(kipsiz) pencere tipi kullanılır. Modal olarak açılmış pencereler, pencere kapatılmadığı sürece alttaki pencerelere erişime izin vermeyendir. Programlardaki “Dosya Aç” penceresi bu türden bir penceredir. Bu penceredeki işimizi bitirip pencereyi kapatmadığımız sürece programın diğer ekranlarına geçemeyiz. Modeless olarak tanımlanmış pencere tipinde ise ikinci pencere açıkken de alttaki pencereye erişilir (Non-Modal Windows). Word programındaki “Find and Replace” penceresi bu türden bir penceredir. Modal pencere tipini daha çok dialog window denilen iletişim kutuları için tercih ederiz. İletişim kutuları kullanıcıya bir uyarı vermek veya kullanıcıdan bilgi girişi almak için hazırlanmış özel pencerelerdir. Bir Main form üzerinde alt formları açmak için de Modeless pencere tipi yaygın olarak kullanılır ama bazen de Modal pencere tipi de tercih edilir. Peki bu durumda bu basit farkın dışında neye dikkat edilmelidir.
.NET Framework’te bir formu, Modal tipinde açmak için ShowDialog() metodu, Non-Modal tipinde açmak için de Show() metodu kullanılır.

Dim frmAbout as New Form()
frmAbout.ShowDialog()
Form frmAbout = new Form();
frmAbout.ShowDialog();

Bir formu modeless olarak açmak için de aşağıdaki gibi Show() metodu kullanılır.

Dim f1 As New Form()
f1.Show()
Form f1= new Form();
f1.Show();

Show() ve ShowDialog() metodları arasındaki diğer fark, Show() metodu geriye herhangi bir değer döndürmez. ShowDialog() metodu ise geriye DialogResult türünde değer döndürür. Bu da kullanıcının söz konusu iletişim penceresini nasıl kapattığı bilgisini yakalamamızı sağlar.
Bir diğer fark ise ana program, ShowDialog() ile formun açıldığı satırda ikinci form kapatılıncaya kadar bekler ardından diğer satırları işler.
Bunların dışında bu iki metod arasındaki en önemli fark, formlarını ShowDialog() metoduyla açmış kişilerin çok şikayetçi olduğu memory sorunudur. ShowDialog() metodunu kullandığınız desktop uygulaması çalıştığı sürece ve ek birşey yapmadığımız sürece memory’i acımasızca kullanılır. Çünkü ShowDialog() metodu, form kapatıldığı zaman otomatik olarak Dispose() metodunu çağırmaz. Show() durumunda ise form kapatıldığı zaman yani Close() metodu çağrıldığı zaman otomatik olarak Dispose() metodu da çağrılır. Bir modal dialog box’ı X işaretinden kapattığımızda aslında form kapatılmamış olur sadece formu hidden etmiş oluruz ve DialogResult property’si DialogResult.Cancel değerine set edilmiş olur. Bu yüzden programızda artık o dialog penceresine ihtiyacımızın kalmadığını düşündüğümüz durumda form nesnesinin Dispose() metodunu çağırmalıyızki memory üzerindeki kaynaklar temizlenmiş olsun.

Form2 f1 = new Form2();
if (f1.ShowDialog(this) == DialogResult.OK){
	//İşlem1
}
else{
	//İşlem2
}
'Form kapatıldıktan sonra Dispose etmeliyiz
f1.Dispose();
Dim f1 As New Form2()
If f1.ShowDialog(Me) = System.Windows.Forms.DialogResult.OK Then
	'İşlem1
Else
	'İşlem2
End If
'Form kapatıldıktan sonra Dispose etmeliyiz
f1.Dispose()

Ya da using pattern bloğu içerisinde işlem yapacağız.

using (Form2 f1 = new Form2())
{
if (ff1m.ShowDialog() == DialogResult.OK)
	//İşlem1
else
	//İşlem2
}
Using f1 As New Form2()
    If f1.ShowDialog() = DialogResult.OK Then
        //İşlem1
    Else
	//İşlem2
    End If
End Using

Windows Form’unu Yönetmek(ShowDialog-Show metodları)” üzerine 6 düşünce

  1. Gürkan Alkan

    Model ve modeless farkını arıyordum zira her yerde bulunan tanımlar değiller; bu açıdan çok güzel bir kaynak oldu benim için. Teşekkür ederim.

    Cevapla
  2. Süleyman Öztürk

    Evet gerçekten güzel bir çalışma olmuş Eline sağlık bende aradaki farkın ne olduğunu çözmeye çalışıyordum.Bilgi ve paylaşım için teşekkürler.

    Cevapla
  3. Bapha

    Üstadım emeğine sağlık.Form üzerinden başka bir forma ulaşabiliyordum ancak ulaştığım formdan önceki forma geri dönemiyordum.Paylaştığın bilgiler ve örnekler için çok teşekkürler.

    Cevapla
  4. Tayfun

    Merhaba,
    C# da SQL tabanlı bir uygulama yaptım.
    kullanıcılar giriş yaptığında 2. bir form açılıyor.
    Yetkisiz kullanıcı giriş yapınca açılan 2. formdaki bazı butonların kullanılmamasını istiyorum.

    SQL’de database ismi “stok” tablo ismi “kullanicilar” tablo satırları “id – kadi – ksifresi – kyetkisi”

    bana yardımcı olursanız çok sevinirim.

    Cevapla

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload CAPTCHA.