Kamis, 18 Juni 2020

Macam-Macam (Bentuk) Perulangan Pada Gambas (Do, For, Repeat, While, Loop, Each, Until, Wend, Next, Break, Continue)


Ada tiga bentuk perulangan pada Pemrogaman Gambas berdasarkan jenis perintahnya, yaitu : Do, For, Repeat, While.

*** Perulangan Do ***
Perintah perulangan Do diakhiri dengan Loop.
Pada dasarnya perulangan Do strutukrnya sama dengan While dan Repeat.

Contoh menggunakan While:

Public Sub Main()

 Dim a As Integer = 1

 Do While a <= 5
    Print "Ngopi Mbak"; a
    Inc a
 Loop
End

Hasil:
Ngopi Mbak 1
Ngopi Mbak 2
Ngopi Mbak 3
Ngopi Mbak 4
Ngopi Mbak 5
Contoh mirip perulangan Repeat

Public Sub Main()

 Dim b As Integer
 b = 3
 Do
    Print "Nasi Goreng"; b
    Inc b
 Loop Until b = 6
End

Hasil:
Nasi Goreng 3
Nasi Goreng 4
Nasi Goreng 5
Nasi Goreng 6

*** Perulangan For ***
Perintah perulangan For diakhiri dengan perintah Next.

For – To – Next
Merupakan perulangan meningkat, yakni dari angka kecil ke angka besar.

Public Sub Main()
   Dim n As Byte
   For n = 5 To 10
     Print “Ke-” & n
   Next

End

Hasil:
Ke-5
Ke-6
Ke-7
Ke-8
Ke-9
Ke-10

For – DownTo – Next
Merupakan perulangan menurun, yakni dari angka besar ke angka kecil.

Public Sub Main()
   Dim z As Byte
   For z = 6 DownTo 2
     Print “Angka-” & z
  Next

End

Hasil:
Angka-6
Angka-5
Angka-4
Angka-3
Angka-2

Peringatan!
Perlu diketahui dan hati-hati saat menggunakan perulangan For-DownTo jika angka terkecilnya adalah Nol, maka akan terjadi perulangan terus-menerus jika tidak ada kondisi yang menghentikannya.

Public Sub Main()
   Dim s As Byte
   For s = 3 DownTo 0
     Print s
     ‘Perintah menghentikan perulangan
     If s = 0 Then Break
   Next

End

Hasil:
3
2
1
0


For – Each – Next
Merupakan perulangan untuk yang umumnya untuk menampilkan data array.

Public Sub Main()

   Dim n As Short
   Dim nama As String[] = ["Wagimin", "Paijo", "Wiwik", "Sulastri"]
   For Each nama
     Print "Nama ke-" & n & ": " & nama[n]
     Inc n
   Next

End

Hasil:
Nama ke-0: Wagimin
Nama ke-1: Paijo
Nama ke-2: Wiwik
Nama ke-3: Sulastri

Nb: “n” digunakan sebagai index array.


*** Perulangan Repat ***
Perintah perulangan Repeat diakhiri dengan Until
Pada perulangan ini, kontrol/ekspresi diletakkan di akhir

Public Sub Main()

   Dim t As Integer
   Repeat
     Print Timer
   Until Timer > 10

End


*** Perulangan While ***
Perintah perulangan While diakhiri dengan Wend.

Public Sub Main()
 
 Dim a As Integer

 a = 1

 While a <= 10
    Print "Assalamualaikum"; a
    Inc a
 Wend
End

 *** Perulangan Procedure ***
Merupakan perulangan klasik yang menggunakan procedure untuk melakukan perulangan
Public Sub Main()
   Prosedurku(0)
End


Private Sub Prosedurku(Angka As Byte)
   If Angka < 4 Then
      Print "Angka ke-" & Angka
      Inc Angka
      Prosedurku(Angka)
   Endif
End
*** Catatan ***
Dalam perulangan juga terdapat kontrol berupa perintah Break untuk menghentikan perulangan, dan Continue untuk mengabaikan. *tidak berlaku untuk perulangan procedure.

Contoh Break:

Public Sub Main()

 Dim v As Short
 For v = 0 To 10
      Print "Bismillaahirrohmanirrokhiim " & v
      If v = 3 Then Break
   Next

End
Hasil:
Bismillaahirrohmanirrokhiim 0
Bismillaahirrohmanirrokhiim 1
Bismillaahirrohmanirrokhiim 2
Bismillaahirrohmanirrokhiim 3
Contoh Continue
Public Sub Main()

 Dim v As Short
 For v = 2 To 5
      If v = 3 Then Continue
      Print "Alhamdulillaah " & v
   Next

End
Hasil:
Alhamdulillaah 2
Alhamdulillaah 4
Alhamdulillaah 5
Perhatikan bahwa angka 3 diatas hilang
Nb: Letak perintah Break/Continue (sebelum/sesudah Print) berpengaruh pada hasil.


Semoga bermanfaat.

Senin, 27 April 2020

Kejanggalan Event ComboBox_Click Dipengaruhi Oleh Penentuan Nilai ComboBox.Text Pada Event Form_Open ~Tutorial Gambas


Hal yang tak terduga yang penulis temukan saat menggunakan object ComboBox untuk tugas tertentu, yaitu dalam satu sisi penulis menentukan nilai list ComboBox pada event Form_Open, lalu menentukan juga nilai yang ditampilkan dari salah satu item tersebut (pada Form_Open). Sedangkan dalam sisi lain penulis juga menulis program pada event ComboBox_Click untuk melakukan tugas tertentu saat data list pada ComboBox dipilih. Diluar dugaan (penulis), code program pada event ComboBox_Click itu juga dijalankan pada penentunan nilai ComboBox pada event Form_Open. Artinya ComboBox_Click dieksekusi saat form dijalankan pertama kali.
Contoh:
Buat Form sperti berikut


Code pada Class:

' Gambas class file

Public Sub Form_Open()

   ComboBox1.List = ["f", "r", "g", "y"]
   ComboBox1.Text = "g"
   'disini nilai ComboBox1_Click sudah dijalankan

   'ditandai dengan terisinya nilai pada TextBox1.Text

End

Public Sub ComboBox1_Click()

   If ComboBox1.Text = "f" Then
     TextBox1.Text = "f"
   Else If ComboBox1.Text = "r" Then
     TextBox1.Text = "r"
   Else If ComboBox1.Text = "g" Then
     TextBox1.Text = "g"
   Endif

End

hasil dari eksekusi diatas nilai pada TextBox1.Text langsung terisi saat Form pertamakali dieksekusi/ditampilkan. Padahal mestinya TextBox1.Text akan terisi saat ComboBox1 diClick.
Entah ini salah satu bug atau memang dibuat seperti itu. Percobaan ini dilakukan di Gambas 3.8.4

Rabu, 11 Maret 2020

Menyimpan File Gambar Ke Database MySql Tipe Data Blob dan Menampilkannya Kembali ~Tutorial Gambas


Menyimpan file disini sebenarnya bisa berupa berbagai macam file seperti gambar (jpg/jpeg, bmp, gif, dll), pdf, doc, dll. Ada 3 cara yang umum dilakukan oleh pemrogam untuk menyimpan data file ke dalam database, yakni:

Cara 1 : Hanya menyimpan data lokasi/path file.
Cara ini sangat mudah dan hemat memori pada database. Kelemahannya adalah proses banckup memerlukan usaha yang tidak sederhana dalam mengatur/memrogammnya.

Cara 2 : Mengenkrip/encode data file (berdasarkan data biner).
Cara ini biasanya dilakukan oleh pemrogam yang belum tahu cara menyimpan data file (biner) sehingga mengakali dengan cara merubah data biner ke format yang mudah dimasukkan kedalam database (metode encrypt). Biasanya menggunakan enkrip Base64. Cara ini adalah yang paling lambat daripada dua cara disini dalam proses penyimpanan dan menampilkannya kembali.

Cara 3 : Menyimpan file berdasarkan data binarinya.
Cara ini yang biasanya banyak dicari oleh pemrogram pada bahasa program yang dikuasainya. Metode akan lebih lambat dari cara 1 dan lebih cepat dari cara 2. Cara ke 3 inilah akan dibahas pada tutorial ini.

Misal telah dibuat database.
Nama database = tesmasukkanfile
Nama Table = tesblob (hanya punya 1 kolom)
Nama Kolom = gambar (tipe data MEDIUMBLOB)

Contoh modul untuk koneksi ke database dengan nana “Dataku”.

' Gambas module file

Public db As New Connection


Public Function Koneksi() As Boolean

   With db
     .Close
     .Type = "mysql"
     .Host = "localhost"
     .Login = "root"
     .Password = "passwordku"
     .Name = "tesmasukkanfile"
     .Open
   End With
   Return True
   Catch
     Message.Warning("tidak terhubung kedatabase", "Ok")
   Return False

End


Memasukkan file gambar (jpg) ke database MySql

' Gambas module file

Public Sub Main()

   Dim DataGambar As String
   Dataku.Koneksi
   DataGambar = File.Load(System.User.Home &/ "Coba.png")
   ‘Sama dengan /home/pengguna/Coba.png. Boleh juga ambil dari direktori lain
   Dataku.db.Exec("INSERT INTO tesblob VALUES(&1)", DataGambar)

End


Mengembalikan/menampilkan gambar dari database Mysql

' Gambas module file

Public Sub Main()

   Dim Rs As Result
   Dataku.Koneksi
   Rs = Dataku.db.Exec("SELECT gambar FROM tesblob LIMIT 1")
   ‘Data yang diambil diletakkan di /tmp. Boleh juga diletakkan di direktori/folder lain
   File.Save("/tmp/datayangdiambil.png", Rs!gambar)
   ‘Setelah diletakkan di /tmp, kemudian ditampilkan
   Desktop.Open("/tmp/datayangdiambil.png", True)
   ‘Menghapus file data gambar tersebut
   Kill "/tmp/datayangdiambil.png"

End


Mudah-mudahan dapat dipahami.

Senin, 09 Maret 2020

Mengenal Perintah Desktop.Open untuk Membuka / Mengeksekusi File Pada Pemrogaman Gambas


Membuka file disini tidak sama dengan perintah seperti “Stream = Open [Path As String] For [Read/Write/Watch]” yang umumnya ditujukkan untuk memanipulasi file maupun mengambil isi (data) dari file. Desktop.Open berfungsi untuk membuka/menampilkan/mengeksekusi file melalui aplikasi yang sudah dijadikan sebagai standar/default pembukanya, seperti file jpg/jpeg/bitmap yang mungkin aplikasi default pembukanya “Eye of MATE”/Shotwell/dll; file odt/doc/dll aplikasi default pembukanya LibreOffice Writer/wps/dll.
Membuka dengan cara ini sama halnya membukan file dengan perintah “xdg-open <path>” pada terminal

Rumus perintah: Desktop.Open(Path/Url As String, Wait As Boolean)

Contoh membuka file dari penyimpanan lokal:

' Gambas module file

Public Sub main()

   Desktop.Open("/home/username/Pictures/gambarku.jpg", True)

End

Nb:
Nilai True untuk menahan tampilan sampai pengguna menutup aplikasi pembukanya. Jika seandainya diberi nilai False maka anda tidak akan sempat melihat file yang dibuka dari aplikasi pembukanya karena file akan dibuka kemudian ditutup secara cepat. Adapaun nilai Boolean untuk menahan aplikasi pembukanya, secara default adalah False.

Selasa, 03 Maret 2020

Mengenal Penggunakan WeekDay Untuk Mengenali Nama Hari Tiap Tanggal (Date) ~Tutorial Gambas


Perintah WeekDay digunakan untuk mengenali hari tiap tanggal saat menggunakan Date/Now.
Pada dasarnya WeekDay merupakan nilai kembalian yang berupa angka (integer) yang jumlahnya sama dengan jumlah hari (7 hari / Senin – Minggu) yang mana angka tersebut dimulai dari 0 sampai dengan 6 yang bisa digunakan untuk mewakili hari suatu tanggal.
Secara umum pengenalan hari menggunakan (nilai) WeekDay sebagai berikut:
WeekDay(Now) = 0 = Ahad
WeekDay(Now) = 1 = Senin
WeekDay(Now) = 2 = Selasa
WeekDay(Now) = 3 = Rabu
WeekDay(Now) = 4 = Kamis
WeekDay(Now) = 5 = Jum’at
WeekDay(Now) = 6 = Sambtu

Rumus WeekDay: WeekDay(Date as Date) As Integer
Contoh dasar:

‘Gambas modul file

Public Sub Main()

   Print WeekDay(Now)
   ‘Jika “Now” adalah tanggal “03/03/2020” maka hasilnya = 2 (selasa)
  Print WeekDay(“03/04/2020”)
   ‘Hasilnya = 3 (rabu). Ingat format dasar Date adalah mm/dd/yyyy (bulan/hari/tahun)
   ‘03 (bulan), 04 (hari), 2020 (tahun)
   Print WeekDay(“03/05/2020”)
   ‘hasilnya = 4 (kamis)

End

Contoh penerapan pada program

‘Gambas modul file

Public Sub Main()

   Dim NamaHari As String[]
   Dim Tanggal As Date
   NamaHari = [“Minggu”, “Senin”, “Selasa”, “Rabu”, “Kamis”, “Jumat”, “Sabtu”]
   Tanggal = “03/05/2020”
   ‘Kalau di Indonesia fomatnya 05/03/2020 (hh/bb/tttt)

   Print "Ini adalah Hari " & NamaHari[WeekDay(Tanggal)] & " Tanggal " & Format(Tanggal, "dd/mm/yyyy")

End

Hasil: Ini adalah Hari Kamis Tanggal 05/03/2020

Format tanggal:
d = day = hari
m = mounth = bulan
t = year = tahun

Sabtu, 18 Januari 2020

Cara Membuat Tanggal/Waktu RealTime/Berjalan Pada TextBoxt Gambas


Pelajari contoh skrip berikut untuk membuat Tanggal/Waktu secara realtime:
Buat Form sederhana yang hanya terdiri dari object TextBox


‘ Gambas class file

Public Sub Form_Open()

   ‘Jika tidak ada perintah “Show” maka program akan gagal
   ‘menampilkan Form karena ditunda oleh perulangan
   ‘penampilan waktu/tanggal (WaktuRealtime).
   Me.Show
   WaktuRealtime(1)

End

Public Sub Form_Close()

  WaktuRealtime(0)

End

Private Sub WaktuRealtime(n As Byte)

  Dim Hari As String[] = ["Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Ahad"]
   If n = 1 Then
     Wait 1
     TextBox1.Text = Hari[WeekDay(Now)] & ", " & Format(Now, "dd/mm/yyy hh:nn:ss")
     WaktuRealtime(1)
   Endif
   Catch
   ‘Jika tidak dipasang perintah Catch maka akan muncul error,
   ‘kecuali pada Form_Close dipasang perintah “Quit”

End
 

Jumat, 10 Januari 2020

Cara Mengatasi “ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction” Pada MySQL


Error pada judul diatas disebabkan ada proses transaksi yang menggantung yang biasanya disebabkan mendisable AUTOCOMMIT (autocommit = 0).
Berdasarkan pengalaman penulis saat medisable autocommit (tanpa menggunakan procedure), mengalami seperti itu meski di akhir transaksi diakhiri perintah COMMIT. Setelah browsing untuk mencari penyelesaiannya akhirnya masalah tersebut bisa diatasi. Secara singkat caranya berikut:
melihat proses yang sedang berjalan.
MariaDB [tes]> show processlist
Temukan proses yang statusnya “Sleep”. Lalu matikan/kill proses.
MariaDB [tes]> kill <id proses>