Menggunakan library .NET di VB 6

Posted by Kamarudin • 4 minute read • Comments

Ini postingan lama sebenarnya, jawaban sy untuk salah satu pertanyaan member di forum i-bego.

Sy posting kembali disini untuk tujuan dokumentasi saja, mana tau suatu saat sy butuhkan.

Untuk contoh kasusnya adalah kita akan mengambil salah satu project open source yg bernama QRCode Library dibuat menggunakan C#, dan dengan sedikit modifikasi library .NET ini akan bisa kita gunakan untuk VB 6.

Tapi sebelumnya kita lihat dulu apa itu QR Code ???

QR Code (abbreviated from Quick Response Code) is the trademark for a type of matrix barcode (or two-dimensional code) first designed for the automotive industry. More recently, the system has become popular outside the industry due to its fast readability and large storage capacity compared to standard UPC barcodes. The code consists of black modules (square dots) arranged in a square pattern on a white background. The information encoded can be made up of four standardized kinds (“modes”) of data (numeric, alphanumeric, byte/binary, Kanji), or through supported extensions, virtually any kind of data.

Sumber : http://en.wikipedia.org/wiki/QR_code

Contoh QR Code

Oke langsung saja download QRCode Library, untuk contoh disini sy menggunakan C# 2005

1. Aktifkan terlebih dulu project QRCode Library

2. klik kanan Project (QRCodeLib) -> Properties, aktifkan tab Application kemudian klik tombol Assembly Information … kemudian aktifkan pilihan Make assembly COM-Visible

3. Aktifkan tab Build kemudian aktifkan pilihan Register for COM interop

4. Mendaftarkan file ThoughtWorks.QRCode.dll dan ThoughtWorks.QRCode.tlb menggunakan tool RegAsm.exe yg ada di folder NET Framework

C:\Windows\Microsoft.NET\Framework\v2.0.50727

Contoh saya menggunakan dot NET Framework 2, adapun perintahnya seperti berikut :

regasm ThoughtWorks.QRCode.dll /tlb: ThoughtWorks.QRCode.tlb /codebase

Sampai disini QRCode Library sudah bisa diakses dari VB 6

Sekarang kita lihat sample asli dari QRCode Library

Dari sample tersebut kode (C#) untuk melakukan encode sebuah data bertipe string menjadi gambar dengan format QR Code adalah seperti berikut :

private void btnEncode_Click_1(object sender, EventArgs e)
{
    if (txtEncodeData.Text.Trim() == String.Empty)
    {
        MessageBox.Show("Data must not be empty.");
        return;
    }

    QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
    String encoding = cboEncoding.Text ;
    if (encoding == "Byte") {
        qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
    } else if (encoding == "AlphaNumeric") {
        qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.ALPHA_NUMERIC;
    } else if (encoding == "Numeric") {
        qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.NUMERIC;
    }
    try {
        int scale = Convert.ToInt16(txtSize.Text);
        qrCodeEncoder.QRCodeScale = scale;
    } catch (Exception ex) {
        MessageBox.Show("Invalid size!");
        return;
    }
    try {
        int version = Convert.ToInt16(cboVersion.Text) ;
        qrCodeEncoder.QRCodeVersion = version;
    } catch (Exception ex) {
        MessageBox.Show("Invalid version !");
    }

    string errorCorrect = cboCorrectionLevel.Text;
    if (errorCorrect == "L")
        qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L;
    else if (errorCorrect == "M")
        qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
    else if (errorCorrect == "Q")
        qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.Q;
    else if (errorCorrect == "H")
        qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H;

    Image image;
    String data = txtEncodeData.Text;
    image = qrCodeEncoder.Encode(data);
    picEncode.Image = image;
}

Sedangkan untuk versi VB 6nya sy buat sesimple mungkin

Private Sub cmdEncode_Click()
    Dim qrEncoder As New QRCodeEncoder

    qrEncoder.QRCodeEncodeMode = ENCODE_MODE.ENCODE_MODE_BYTE
    qrEncoder.QRCodeScale = 4
    qrEncoder.QRCodeVersion = 7
    qrEncoder.QRCodeErrorCorrect = ERROR_CORRECTION.ERROR_CORRECTION_M

    picEncode.Picture = qrEncoder.Encode(txtEncodeData.Text) ' error : Invalid procedure call or argument
End Sub

tapi hasilnya malah error ‘Invalid procedure call or argument’ :frowning:, dan berdasarkan hasil pengamatan sementara, menurut sy penyebab errornya adalah karena method Encode adalah method yg dioverload sedangkan method overload belum disupport oleh VB 6.

public virtual Bitmap Encode(String content)
public virtual Bitmap Encode(String content, Encoding encoding)

Jadi sy putuskan untuk menambahkan method baru dengan nama EncodeVB6, kemudian mengganti perintah

picEncode.Picture = qrEncoder.Encode(txtEncodeData.Text)

menjadi

picEncode.Picture = qrEncoder.EncodeVB6(txtEncodeData.Text)

Kode lengkap method EncodeVB6

public virtual Bitmap EncodeVB6(String content)
{
    if (QRCodeUtility.IsUniCode(content))
    {
        return Encode(content, Encoding.Unicode);
    }
    Else
    {
        return Encode(content, Encoding.ASCII);
    }
}

Horeeeeee gubrakk, ternyata…. masih error :frowning: ‘Type mismatch’

picEncode.Picture = qrEncoder.EncodeVB6(txtEncodeData.Text) ' error : Type mismatch

dari pesan errornya sudah jelas karena properties Picture bertipe StdPicture sedangkan method EncodeVB6 bertipe Bitmap dan di VB 6 enggak ada tipe Bitmap :frowning:, tapi untungnya :blush: ada method ImageToIPicture yg diambil dari class Support (namespace Microsoft.VisualBasic.Compatibility.VB6) sehingga method EncodeVB6nya kita revisi menjadi :

public virtual object EncodeVB6(String content)
{
    if (QRCodeUtility.IsUniCode(content))
    {
        return Microsoft.VisualBasic.Compatibility.VB6.Support.ImageToIPicture(Encode(content, Encoding.Unicode));
    }
    Else
    {
        return Microsoft.VisualBasic.Compatibility.VB6.Support.ImageToIPicture(Encode(content, Encoding.ASCII));
    }
}

Sampai disi permasalah method EncodeVB6 sudah selesai :blush:

Terakhir kita akan melakukan proses decode

dan kita lihat dulu kode aslinya (c#)

private void btnDecode_Click(object sender, EventArgs e)
{
    try
    {
        QRCodeDecoder decoder = new QRCodeDecoder();
        String decodedString = decoder.decode(new QRCodeBitmapImage(new Bitmap(picDecode.Image)));

        txtDecodedData.Text = decodedString;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

Dari kode diatas jelas tidak bisa langsung dikonversi ke VB 6 karena VB 6 tidak mendukung pemanggilan constructor class yg mempunyai parameter.

Tapi ada baiknya kita lihat dulu constructor class QRCodeBitmapImage yg ternyata membutuhkan objek Bitmap pada saat dipanggil.

///
<summary> /// Constructor
/// </summary>
///Bitmap image/param>
public QRCodeBitmapImage(Bitmap image)
{
    this.image = image;
}

Solusinya kita akan menambahkan costructor default (constructor tanpa parameter)

// default constructor
Public QRCodeBitmapImage()
{
}

trus untuk melewatkan objek Bitmap ke class QRCodeBitmapImage kita akan menambahkan property baru misal dengan nama SetBitmap, adapun kodenya seperti berikut :

public virtual Bitmap SetBitmap
{
    set { image = value; }
}

Properties SetBitmap diatas bertipe Bitmap, tapi sayang di VB 6 belum ada padanan tipe datanya jadi kita akan menggunakan tipe Object, kemudian untuk mengkonversi ke tipe Bitmap kita menggunakan method IPictureToImage yg diambil dari class Support (namespace Microsoft.VisualBasic.Compatibility.VB6)

public virtual object SetBitmap
{
    set { image = (System.Drawing.Bitmap)Microsoft.VisualBasic.Compatibility.VB6.Support.IPictureToImage(value); }
}

Setelah itu baru kita bisa melakukan konversi dengan aman di VB 6

Private Sub cmdDecode_Click()
    Dim decoder As New QRCodeDecoder

    Dim decodedString As String

    Dim qrCodeImage As New QRCodeBitmapImage
    qrCodeImage.SetBitmap = picEncode.Picture

    decodedString = decoder.decodeVB6(qrCodeImage)

    MsgBox "Hasil decode : " & vbCrLf & decodedString, vbInformation, "Informasi"
End Sub

Yuph akhirnya selesai juga :blush:

Selamat MENCOBA :blush:

Comments