Aplikasi berjendela hampir selalu membutuhkan percakapan singkat dengan penggunanya, misalnya konfirmasi keluar, pemilihan berkas, dan pengisian data kecil. Topik ini membahas tiga sarannya, yaitu MessageBox untuk pesan dan pertanyaan, OpenFileDialog untuk memilih berkas, serta form kustom yang ditampilkan sebagai dialog lewat ShowDialog. Setelah membaca topik ini, ketiga bentuk dialog dapat dibangun dan hasil keputusan penggunanya dapat dibaca dengan benar.
Modal, modeless, dan keputusan pengguna#
Dialog adalah jendela yang ditampilkan untuk mengambil keputusan atau masukan tertentu, dan perbedaan utamanya terletak pada cara muncul. Dialog modal ditampilkan dengan ShowDialog sehingga form pemanggil menjadi tidak aktif sampai dialog ditutup, sedangkan jendela modeless ditampilkan dengan Show dan keduanya tetap aktif bersamaan. Konfirmasi dan pengisian data yang wajib diselesaikan lebih dahulu menggunakan dialog modal, karena alur program harus menunggu keputusannya.
Hasil keputusan pengguna dikembalikan sebagai nilai enumerasi DialogResult, misalnya OK, Cancel, Yes, atau No. Nilai inilah yang diperiksa pemanggil setelah dialog tertutup, sehingga pemisahan tugasnya jelas. Dialog bertugas mengumpulkan pilihan, sedangkan form utama yang memutuskan tindakan berikutnya. Pola ini berlaku sama pada MessageBox, dialog umum bawaan, dan form kustom.
MessageBox.Show dan DialogResult#
MessageBox.Show menampilkan kotak pesan siap pakai tanpa perlu merancang form. Bentuk paling lengkapnya menerima empat argumen, yaitu teks pesan, judul jendela, pilihan tombol dari MessageBoxButtons, dan ikon dari MessageBoxIcon. Metode ini mengembalikan DialogResult sesuai tombol yang ditekan pengguna, dan nilai itulah yang diperiksa setelahnya.
' tidak-dijalankan
Dim jawaban As DialogResult = MessageBox.Show(
"Simpan perubahan sebelum keluar?", "Konfirmasi",
MessageBoxButtons.OKCancel, MessageBoxIcon.Question)
If jawaban = DialogResult.OK Then
' proses penyimpanan dikerjakan di sini
End IfPilihan tombolnya mencakup OK, OKCancel, YesNo, YesNoCancel, dan RetryCancel, sedangkan ikonnya antara lain Information, Warning, Question, dan Error. Satu hal yang sering tertukar adalah sumber nilai pembanding. MessageBox.Show mengembalikan nilai dari enumerasi DialogResult, sehingga pembanding yang benar adalah DialogResult.OK atau DialogResult.Yes, dan bukan MessageBoxButtons.Yes yang hanya berperan sebagai argumen.
Memilih berkas dengan OpenFileDialog#
OpenFileDialog menampilkan kotak dialog pemilihan berkas bawaan Windows, lengkap dengan penelusuran folder dan penapis ekstensinya. Penapis diatur lewat properti Filter dengan format pasangan deskripsi dan pola yang dipisahkan karakter garis vertikal (|). Penggunaan diakhiri dengan ShowDialog, dan bila hasilnya DialogResult.OK, berkas terpilih tersedia pada properti FileName.
' tidak-dijalankan
pemilih.Filter = "Gambar PNG (*.png)|*.png|Semua berkas (*.*)|*.*"Baris tersebut memuat dua pasangan. Pasangan pertama menampilkan label Gambar PNG dan hanya meloloskan berkas berakhiran .png, sedangkan pasangan kedua menampilkan label Semua berkas tanpa penapisan. Pola ini diperluas dengan mudah, misalnya pola *.txt;*.md untuk menerima beberapa ekstensi dalam satu label. Secara bawaan, dialog juga menolak nama berkas yang tidak ada karena CheckFileExists bernilai true, sehingga hasil OK hampir selalu menunjuk berkas yang sungguh tersedia.
Form kustom sebagai dialog#
Apabila masukan yang diminta lebih dari sekadar tombol, bentuk dialognya dirakit sendiri sebagai kelas Form lalu ditampilkan dengan ShowDialog. Kelas dialog berikut meminta ulasan singkat. Kode berjalan di Windows melalui Visual Studio atau dotnet run, sedangkan di lingkungan kerja tanpa layar, kode hanya diperiksa kompilasinya.
' tidak-dijalankan
Imports System.Drawing
Imports System.Windows.Forms
Public Class DialogUlasan
Inherits Form
Private labelJudul As New Label()
Private inputUlasan As New TextBox()
Private tombolSimpan As New Button()
Private tombolBatal As New Button()
Sub New()
Text = "Ulasan Aplikasi"
FormBorderStyle = FormBorderStyle.FixedDialog
MinimizeBox = False
MaximizeBox = False
StartPosition = FormStartPosition.CenterParent
ClientSize = New Size(320, 160)
labelJudul.Text = "Tulis ulasan singkat:"
labelJudul.Location = New Point(16, 15)
labelJudul.Size = New Size(288, 23)
inputUlasan.Multiline = True
inputUlasan.Location = New Point(16, 42)
inputUlasan.Size = New Size(288, 60)
tombolSimpan.Text = "Simpan"
tombolSimpan.Location = New Point(150, 116)
tombolSimpan.Size = New Size(75, 28)
tombolSimpan.DialogResult = DialogResult.OK
tombolBatal.Text = "Batal"
tombolBatal.Location = New Point(231, 116)
tombolBatal.Size = New Size(75, 28)
tombolBatal.DialogResult = DialogResult.Cancel
AcceptButton = tombolSimpan
CancelButton = tombolBatal
Controls.Add(labelJudul)
Controls.Add(inputUlasan)
Controls.Add(tombolSimpan)
Controls.Add(tombolBatal)
End Sub
ReadOnly Property TeksUlasan As String
Get
Return inputUlasan.Text
End Get
End Property
End ClassSifat dialognya ditandai oleh beberapa baris konstruktor. FormBorderStyle.FixedDialog membuat jendela tidak dapat diubah ukurannya, MinimizeBox dan MaximizeBox dimatikan, serta StartPosition.CenterParent menempatkan dialog di tengah pemanggilnya. Dua tombol diberi nilai properti DialogResult, dan pengaturan ini membuat pemilihannya otomatis, yaitu menutup dialog modal lalu mengembalikan nilai tersebut tanpa satu baris kode di dalam handler. Properti AcceptButton dan CancelButton menambahkan dukungan tombol Enter dan Esc, sedangkan isinya dibaca pemanggil melalui properti TeksUlasan.
Berkas berikut adalah form pemanggil yang menggunakan ketiga jenis dialog sekaligus.
' tidak-dijalankan
Imports System.Drawing
Imports System.Windows.Forms
Public Class FormUtama
Inherits Form
Private WithEvents tombolUlasan As New Button()
Private WithEvents tombolBuka As New Button()
Private WithEvents tombolKeluar As New Button()
Private labelInfo As New Label()
Sub New()
Text = "Demo Dialog"
ClientSize = New Size(340, 150)
tombolUlasan.Text = "Tulis ulasan"
tombolUlasan.Location = New Point(20, 20)
tombolUlasan.Size = New Size(300, 28)
tombolBuka.Text = "Pilih berkas teks"
tombolBuka.Location = New Point(20, 56)
tombolBuka.Size = New Size(300, 28)
tombolKeluar.Text = "Keluar"
tombolKeluar.Location = New Point(20, 92)
tombolKeluar.Size = New Size(300, 28)
labelInfo.Text = "Belum ada hasil."
labelInfo.Location = New Point(20, 126)
labelInfo.Size = New Size(300, 20)
Controls.Add(tombolUlasan)
Controls.Add(tombolBuka)
Controls.Add(tombolKeluar)
Controls.Add(labelInfo)
End Sub
Private Sub TombolUlasanDiklik(sender As Object, e As EventArgs) Handles tombolUlasan.Click
Using dialog As New DialogUlasan()
If dialog.ShowDialog(Me) = DialogResult.OK Then
labelInfo.Text = dialog.TeksUlasan
End If
End Using
End Sub
Private Sub TombolBukaDiklik(sender As Object, e As EventArgs) Handles tombolBuka.Click
Dim pemilih As New OpenFileDialog()
pemilih.Title = "Pilih berkas teks"
pemilih.Filter = "Berkas teks (*.txt)|*.txt|Semua berkas (*.*)|*.*"
If pemilih.ShowDialog(Me) = DialogResult.OK Then
labelInfo.Text = pemilih.FileName
End If
End Sub
Private Sub TombolKeluarDiklik(sender As Object, e As EventArgs) Handles tombolKeluar.Click
Dim jawaban As DialogResult = MessageBox.Show(
"Tutup aplikasi ini?", "Konfirmasi",
MessageBoxButtons.YesNo, MessageBoxIcon.Question)
If jawaban = DialogResult.Yes Then
Close()
End If
End Sub
End ClassKetiga handler mengikuti pola yang sama, yaitu menampilkan dialog, memeriksa DialogResult, lalu membaca hasilnya bila keputusannya positif. Pada dialog kustom, ShowDialog(Me) mengembalikan nilai yang ditetapkan tombolnya, sehingga isi ulasan hanya dibaca ketika pengguna menekan Simpan. Blok Using membungkus dialog kustom karena form yang ditampilkan dengan ShowDialog tidak dibuang otomatis, sedangkan pemanggilan Close() pada handler Keluar mengakhiri loop pesan dan menutup aplikasi.
Kesalahan umum#
Tiga kesalahan berikut paling sering terjadi saat bekerja dengan dialog.
- Memanggil
Showalih-alihShowDialoguntuk dialog kustom. Program langsung melanjutkan baris berikutnya tanpa menunggu, sehingga hasil yang dibaca masih kosong. Untuk alur yang menunggu keputusan, gunakanShowDialog. - Lupa menetapkan
DialogResultpada tombol dialog kustom. Dialog tidak tertutup ketika tombol ditekan, atau tertutup tanpa nilai yang dapat diperiksa pemanggil. Isi properti tersebut pada tombol Simpan dan tombol Batal. - Membandingkan hasil
MessageBox.Showdengan anggotaMessageBoxButtons. Keduanya adalah enumerasi yang berbeda dan compiler menolaknya. Pembanding yang benar adalah anggotaDialogResultsepertiDialogResult.Yes.
Ringkasan#
- Dialog modal ditampilkan dengan
ShowDialogdan menghentikan interaksi form pemanggil sampai ditutup, sedangkan hasil keputusannya berupa enumerasiDialogResult. MessageBox.Showmenampilkan pesan dengan pilihan tombol dan ikon, lalu mengembalikanDialogResultsesuai tombol yang ditekan.OpenFileDialogmenampilkan pemilih berkas bawaan, dengan penapis ekstensi diatur lewat propertiFilterberformatdeskripsi|pola.- Dialog kustom adalah kelas
FormdenganFixedDialog, tombol ber-DialogResult, serta properti pembaca isian, dan form yang ditampilkan denganShowDialogsebaiknya dibungkusUsing.
Referensi#
- Dialog boxes in Windows Forms — Microsoft Learn — Gambaran umum dialog pada Windows Forms.
- How to display dialog boxes for Windows Forms — Microsoft Learn — Panduan menampilkan dialog dan membaca hasilnya.
- MessageBox Class — Microsoft Learn — Referensi kotak pesan bawaan.
- MessageBox.Show Method — Microsoft Learn — Daftar overloads dan nilai kembaliannya.
- DialogResult Enum — Microsoft Learn — Anggota enumerasi hasil dialog.
- OpenFileDialog Class — Microsoft Learn — Referensi dialog pemilihan berkas.
- FileDialog.Filter Property — Microsoft Learn — Format string penapis berkas.
- Form.ShowDialog Method — Microsoft Learn — Menampilkan form sebagai dialog modal.
- Form.AcceptButton Property — Microsoft Learn — Penetapan tombol Enter pada form.