Dialog

MessageBox, OpenFileDialog, dan form kustom sebagai dialog aplikasi.

Daftar isi

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.

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.

vb Contoh: pertanyaan Simpan atau Batal
' 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 If

Pilihan 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.

vb Contoh: penapis dua kelompok berkas
' 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.

vb DialogUlasan.vb
' 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 Class

Sifat 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.

vb FormUtama.vb
' 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 Class

Ketiga 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.

  1. Memanggil Show alih-alih ShowDialog untuk dialog kustom. Program langsung melanjutkan baris berikutnya tanpa menunggu, sehingga hasil yang dibaca masih kosong. Untuk alur yang menunggu keputusan, gunakan ShowDialog.
  2. Lupa menetapkan DialogResult pada 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.
  3. Membandingkan hasil MessageBox.Show dengan anggota MessageBoxButtons. Keduanya adalah enumerasi yang berbeda dan compiler menolaknya. Pembanding yang benar adalah anggota DialogResult seperti DialogResult.Yes.

Ringkasan#

  • Dialog modal ditampilkan dengan ShowDialog dan menghentikan interaksi form pemanggil sampai ditutup, sedangkan hasil keputusannya berupa enumerasi DialogResult.
  • MessageBox.Show menampilkan pesan dengan pilihan tombol dan ikon, lalu mengembalikan DialogResult sesuai tombol yang ditekan.
  • OpenFileDialog menampilkan pemilih berkas bawaan, dengan penapis ekstensi diatur lewat properti Filter berformat deskripsi|pola.
  • Dialog kustom adalah kelas Form dengan FixedDialog, tombol ber-DialogResult, serta properti pembaca isian, dan form yang ditampilkan dengan ShowDialog sebaiknya dibungkus Using.

Referensi#