Senin, 15 November 2010

Generic In VB.NET

karena lagi seru2nya nobar bareng teman2 mengenai topik Generic dengan C++ yang bisa bikin mual karena penggunaan tanda * dan ** (a.k.a. Pointer).

berikut ini bentuk sederhananya dengan menggunakan bahasa pemrograman VB yang terdapat dalam .NET Platform.

berikut ini ceritanya:

misalkan kita ingin membuat fungsi untuk melakukan pertukaran data, dengan fungsi seperti berikut ini:

Sub Swap(ByRef a As Integer, ByRef b As Integer)
        Dim temp As Integer = a
        a = b
        b = temp
End Sub

fungsi diatas bisa kita gunakan untuk mempertukarkan 2 buah data yang bertipe integer. seperti contoh penggunaan berikut ini:

Dim a, b As Integer
a = 2
b = 5
Console.WriteLine("A = {0}, B = {1}", a, b)
Swap(a, b)
Console.WriteLine("A = {0}, B = {1}", a, b)

pertanyaannya, bagaimana jika kita ingin mempertukarkan data yang bertipe double, atau string ?. jika dengan pendekatan di atas, maka harus didefinisikan fungsi-fungsi yang sama yang bersesuaian dengan tipe data yang diinginkan (istilahnya: method overloading)

namun, untuk membuat proses tersebut menjadi lebih mudah, bisa digunakan Generic Method, sehingga definisi fungsi cukup dilakukan 1x saja, kemudian bisa digunakan untuk jenis tipe data apa saja.  berikut ini fungsi swap dalam bentuk Generic:

Sub SwapGeneric(Of T)(ByRef x1 As T, ByRef x2 As T)
        Dim temp As T = x1
        x1 = x2
        x2 = temp
End Sub

perhatikan perbedaan yang ada antara Swap dengan SwapGeneric, di SwapGeneric, fungsi tersebut tidak memberitahukan secara spesifik apa tipe data yang akan dipertukarkan, tapi dibuat Generic dengan menggunakan T yang nantinya T tersebut akan digantikan oleh tipe data yang diinginkan pada saat fungsi SwapGeneric ini digunakan. berikut ini contoh penggunaannya:

- mempertukarkan 2 buah data integer

Dim a, b As Integer
a = 2
b = 5
Console.WriteLine("A = {0}, B = {1}", a, b)
SwapGeneric(Of Integer)(a, b)
Console.WriteLine("A = {0}, B = {1}", a, b)


- mempertukarkan 2 buah data double

Dim c, d As Double
c = 10.2
d = 5.5
Console.WriteLine("C = {0}, D = {1}", c, d)
SwapGeneric(Of Double)(c, d)
Console.WriteLine("C = {0}, D = {1}", c, d)


- mempertukarkan 2 buah data string

Dim e, f As String
e = "Saya"
f = "Dia"
Console.WriteLine("E = {0}, F = {1}", e, f)
SwapGeneric(Of String)(e, f)
Console.WriteLine("E = {0}, F = {1}", e, f)

bisa dilihat, dengan fungsi yang sama, bisa digunakan untuk mempertukarkan data dengan tipe data apa saja. bahkan untuk class seperti yang ditunjukkan pada contoh berikut ini:

Dim p1 As New Point(10, 2)
Dim p2 As New Point(5, 6)
Console.WriteLine("Before:")
Console.WriteLine("P1 -> " & p1.ToString())
Console.WriteLine("P2 -> " & p2.ToString())
SwapGeneric(Of Point)(p1, p2)
Console.WriteLine("After:")
Console.WriteLine("P1 -> " & p1.ToString())
Console.WriteLine("P2 -> " & p2.ToString())

dengan definisi class Point adalah sebagai berikut:

Public Class Point
    Public Property X As Integer
    Public Property Y As Integer
    Public Sub New(ByVal x As Integer, ByVal y As Integer)
        Me.X = x
        Me.Y = y
    End Sub
    Public Overrides Function ToString() As String
        Return String.Format("X = {0}, Y = {1}", X, Y)
    End Function
End Class

selain membuat method Generic, kita juga bisa membuat class Generic, seperti contoh struktur data Stack Generic berikut ini:

Public Class StackGeneric(Of T)

    Dim data As New List(Of T)

    Public Sub New()
        data.Clear()
    End Sub

    Public Function Count() As Integer
        Return data.Count
    End Function

    Public Sub Push(ByVal s As T)
        data.Add(s)
    End Sub

    Public Function Pop() As T
        Dim s As T = data(data.Count - 1)
        data.RemoveAt(data.Count - 1)
        Return s
    End Function

    Public Function Top() As T
        Return data(data.Count - 1)
    End Function

End Class

sama seperti T pada method Generic, di sini T juga baru akan ditentukan tipe datanya nanti pada saat penggunaan. dan berikut ini contoh penggunaan dari class di atas:

‘ membuat object StackGeneric –> Of Integer
Dim stack1 As New StackGeneric(Of Integer)()

Console.WriteLine(stack1.Count())

stack1.Push(1)
stack1.Push(2)
stack1.Push(3)
stack1.Push(4)
stack1.Push(5)

Console.WriteLine(stack1.Count())

Console.WriteLine("Elemen Stack:")
While stack1.Count > 0
    Console.WriteLine(stack1.Pop())
End While

dan karena sifatnya yang Generic, kita juga bisa mendefinisikan stack of string seperti contoh berikut ini:

Dim stack2 As New StackGeneric(Of String)()
Console.WriteLine(stack2.Count())
stack2.Push("Satu")
stack2.Push("Dua")
stack2.Push("Tiga")
stack2.Push("Empat")
stack2.Push("Lima")
Console.WriteLine(stack2.Count())
Console.WriteLine("Elemen Stack:")
While stack2.Count > 0
    Console.WriteLine(stack2.Pop())
End While

 

ok, semoga bermanfaat.

Rgds
Adi

Sabtu, 06 November 2010

Demo Praktek - Program Membuat Menu Pesanan Makanan Pada Restoran

Program berikut ini ditulis dengan menggunakan VB 2010.

berikut ini screenshot rancangan form nya:

image

dan berikut ini tampilan sewaktu mode Run:

image

program sudah didesain sangat fleksibel, sehingga penambahan menu makanan, menu minuman dan menu bonus bisa dilakukan dengan mudah tanpa perlu banyak mengedit source code program. hal yang perlu dilakukan untuk setiap penambahan menu yang baru adalah:

1. penamaan terhadap kontrol checkbox nama menu, label harga, dan textbox jumlah pesanan baru tersebut.
format:
checkbox –> chkXXX
label –> lblXXX
textbox –> txtXXX

2. daftarkan pada jendela properties event pada event CheckedChanged untuk checkbox yang baru tersebut agar menggunakan event handler CheckedChanged yang sudah ada.
image

ok, source code program dapat didownload dari Sini.
semoga bermanfaat

Rgds
Adi

Sabtu, 30 Oktober 2010

Access Modifier VB.NET Version

ketika bekerja dengan paradigma OO, access modifier merupakan salah satu point penting yang harus diperhatikan ketika menulis code. dengan menggunakan access modifier, programmer bisa membatasi type yang ditulis (apakah class, method, property, field, etc.) dapat diakses dari mana saja.

sama seperti C#, untuk VB.NET, access modifier yang dapat digunakan juga ada 5, yaitu: Public, Friend, Protected, Private dan Protected Friend

berikut ini penjelasan dari masing-masing access modifier:

1. Public

type yang menggunakan access modifier ini membuat type tersebut bisa diakses tanpa pembatasan apapun. secara default.

2. Friend

type yang menggunakan access modifier ini membuat type tersebut bisa diakses selama dalam satu assembly yang sama. assembly di sini berarti sebuah dll.

Friend ini merupakan access modifier default yang digunakan untuk class yang tidak menuliskan access modifiernya secara explicit.

Friend lebih terbatas dari Public.

3. Protected

type yang menggunakan access modifier ini membuat type tersebut hanya bisa diakses dari type yang bersangkutan dan turunan dari type yang bersangkutan.

Protected lebih terbatas dari Friend.

4. Private

type yang menggunakan access modifier ini membuat type tersebut hanya bisa diakses dari type yang bersangkutan.

private merupakan access modifier yang paling secure. semua type yang dilabeli access modifier private membuat type tersebut tidak dapat diakses dari luar type yang bersangkutan.

5. Protected Friend

access modifier ini merupakan pengabungan dari dari Protected dan Friend. dengan menggunakan access modifier ini, maka sebuah type dapat diakses dari dalam class yang bersangkutan, atau dari turunan class yang bersangkutan atau dalam satu assembly yang sama.

ok, semoga bermanfaat

Rgds
Adi

Access Modifier C# Version

ketika bekerja dengan paradigma OO, access modifier merupakan salah satu point penting yang harus diperhatikan ketika menulis code. dengan menggunakan access modifier, programmer bisa membatasi type yang ditulis (apakah class, method, property, field, etc.) dapat diakses dari mana saja.

untuk C#, access modifier yang dapat digunakan ada 5, yaitu: public, internal, protected, private dan protected internal

berikut ini penjelasan dari masing-masing access modifier:

1. public

type yang menggunakan access modifier ini membuat type tersebut bisa diakses tanpa pembatasan apapun. secara default, enumeration dan interface menggunakan access modifier ini.

2. internal

type yang menggunakan access modifier ini membuat type tersebut bisa diakses selama dalam satu assembly yang sama. assembly di sini berarti sebuah dll.

internal lebih terbatas dari public.

3. protected

type yang menggunakan access modifier ini membuat type tersebut hanya bisa diakses dari type yang bersangkutan dan turunan dari type yang bersangkutan.

protected lebih terbatas dari internal.

4. private

type yang menggunakan access modifier ini membuat type tersebut hanya bisa diakses dari type yang bersangkutan. merupakan access modifier default yang digunakan untuk variable (field) dan method.

private merupakan access modifier yang paling secure. semua type yang dilabeli access modifier private membuat type tersebut tidak dapat diakses dari luar type yang bersangkutan.

5. protected internal

access modifier ini merupakan pengabungan dari dari protected dan internal. dengan menggunakan access modifier ini, maka sebuah type dapat diakses dari dalam class yang bersangkutan, atau dari turunan class yang bersangkutan atau dalam satu assembly yang sama.

ok, semoga bermanfaat

Rgds
Adi

Rabu, 27 Oktober 2010

Source Code Praktek Mengenai Topik Menu

sesuai dengan janji saya, berikut ini source dari topik menu yang dibahas pada praktek hari selasa tgl 26/10/2010. silahkan download dari link Ini

dan semoga bermanfaat,

 

Rgds
Adi

Minggu, 24 Oktober 2010

Create Koneksi Antara VB.NET (a.k.a B#) dengan Database SQL Server

untuk bisa bekerja dengan database dari program vb.net, langkah pertama yang harus dilakukan adalah dengan membentuk koneksi antara program dengan database servernya. pada artikel ini, database yang digunakan adalah SQL Server 2008 dengan nama database yang akan digunakan adalah OMS dan untuk user SQL Servernya yang akan digunakan adalah sa dengan sandi misalkan juga sa.

karena database yang digunakan adalah SQL Server, namespace yang akan kita manfaatkan adalah namespace System.Data.SqlClient. object class yang bertanggung jawab untuk membentuk koneksi dengan database adalah object bertipe SqlConnection.

object SqlConnection sendiri dalam membentuk koneksi ke database SQL Server memerlukan parameter yang disebut sebagai ConnectionString. ConnectionString ini sendiri adalah sebuah string yang berisi parameter-parameter yang dibutuhkan untuk membentuk koneksi itu sendiri. adapun parameter-parameter tersebut adalah:

Data Source atau Server –> menyatakan nama komputer / ip address komputer di mana database SQL Servernya berada. jika database berada satu mesin dengan aplikasi, anda bisa menggunakan localhost\<sql server instance name> atau (local)\<sql server instance name>  atau .\<sql server instance name>
untuk mengecek sql server instance name, bisa dilakukan via menu sql server configuration manager seperti yang ditunjukkan pada gambar berikut.

image

image

pada laptop saya, sql server instance name yang digunakan adalah SQL2008

Initial Catalog atau Database –> menyatakan nama database yang akan diambil / digunakan dari mesin database SQL Server yang sudah berhasil dicontact. pada artikel ini database yang akan digunakan bernama OMS.

image

Integrated Security = True | SSPI atau UID = <UserID>; PWD = <Password> –> digunakan untuk memberitahukan cara program akan melakukan koneksi ke database SQL Server, dalam hal ini ada 2 teknik yang bisa digunakan, yaitu dengan menggunakan Windows Authentication yakni dengan menggunakan account windows (via Integrated Security = True | SSPI), atau dengan menggunakan SQL Server Authentication yakni dengan menggunakan account sql server yang sudah disediakan (via UID = <UserID>; PWD = <Password>).

ok, berikut ini detail bagaimana kode proses pembentukan koneksi ke database sql server via vb.net

misalkan rancangan programnya seperti berikut ini:

image

untuk proses pembentukan koneksi, sedikitnya ada dua pendekatan yang bisa digunakan, yaitu:

Early Open – Late Closed

contoh code ditunjukkan pada sample code berikut ini:

' import namespace yang dibutuhkan
Imports System.Data.SqlClient

Public Class Form1

    ' buat object bertipe SqlConnection
    Dim conn As SqlConnection = Nothing
    ' bentuk string ConnectionString
    ' jika menggunakan windows auth.
    Dim connString As String = _
              "Data Source = .\sql2008; Initial Catalog = OMS; Integrated Security = True"
    ' jika menggunakan sql server auth.
    'Dim connString2 As String = _
    '          "Data Source = .\sql2008; Initial Catalog = OMS; UID = sa; PWD = sa"

    ' Early open via constructor
    Public Sub New()
        InitializeComponent()
        ' create object SqlConnection dengan melewatkan parameter 
        ' yang dibutuhkan via ConnectionString
        ' jika menggunakan windows auth.
        conn = New SqlConnection(connString)
        ' atau
        ' jika menggunakan sql server auth.
        'conn = New SqlConnection(connString2)
        ' open koneksinya
        conn.Open()
        ' tampilkan state dari koneksi
        ' jika berhasil dibuka, maka akan tercetak Status Koneksi: Open
        Me.lblStatus.Text = String.Format("Status Koneksi: {0}", conn.State.ToString())
    End Sub

    ' late closed via event FormClosed
    Private Sub Form1_FormClosed(ByVal sender As Object, _
            ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        ' menutup koneksi jika ada yang sedang terbuka
        If conn IsNot Nothing Then conn.Close() : conn.Dispose()
    End Sub

End Class

Open When Needed – Closed As Soon As Possible

contoh code ditunjukkan pada sample code berikut ini:

' import namespace yang dibutuhkan
Imports System.Data.SqlClient

Public Class Form1

    ' buat object bertipe SqlConnection
    Dim conn As SqlConnection = Nothing
    ' bentuk string ConnectionString
    ' jika menggunakan windows auth.
    Dim connString As String = _
           "Data Source = .\sql2008; Initial Catalog = OMS; Integrated Security = True"
    ' jika menggunakan sql server auth.
    'Dim connString2 As String = _
    '        "Data Source = .\sql2008; Initial Catalog = OMS; UID = sa; PWD = sa"

    ' open when needed - close ASAP (As Soon As Possible)
    Private Sub btnOpenThenClosed_Click(ByVal sender As System.Object, _
                       ByVal e As System.EventArgs) Handles btnOpenThenClosed.Click
        ' create koneksi on demand
        conn = New SqlConnection(connString)
        conn.Open() ' open koneksi yang sudah terbentuk
        ' cetak status koneksi terkini
        Me.lblStatus.Text = String.Format("Status Koneksi: {0}", conn.State.ToString())
        Application.DoEvents()
        ' biarkan sistem idle selama 3 detik
        ' anda bisa menggantinya dengan proses-proses yang ingin dikerjakan
        System.Threading.Thread.Sleep(3000)
        ' close koneksi
        conn.Close()
        ' dispose koneksi
        conn.Dispose()
        ' cetak status koneksi terkini
        Me.lblStatus.Text = String.Format("Status Koneksi: {0}", conn.State.ToString())
    End Sub

End Class

Penggunaan Using

dengan menggunakan Using … End Using, programmer tidak perlu dipusingkan lagi dengan proses penutupan dan penghapusan object yang sudah tidak digunakan secara manual, karena hal tersebut akan otomatis akan ditangani oleh Using. syarat object yang bisa dipasang dengan Using … End Using adalah object yang mengimplementasikan interface IDisposable seperti object bertipe SqlConnection yang digunakan dicontoh ini. berikut bentuk perubahan code nya:

' import namespace yang dibutuhkan
Imports System.Data.SqlClient

Public Class Form1

    ' buat object bertipe SqlConnection
    Dim conn As SqlConnection = Nothing
    ' bentuk string ConnectionString
    ' jika menggunakan windows auth.
    Dim connString As String = _
            "Data Source = .\sql2008; Initial Catalog = OMS; Integrated Security = True"
   
    ' open when needed - close ASAP (As Soon As Possible)
    Private Sub btnOpenThenClosed_Click(ByVal sender As System.Object, _
                     ByVal e As System.EventArgs) Handles btnOpenThenClosed.Click
        ' create koneksi on demand
       Using conn = New SqlConnection(connString)
            conn.Open() ' open koneksi yang sudah terbentuk
            ' cetak status koneksi terkini
            Me.lblStatus.Text = String.Format("Status Koneksi: {0}", conn.State.ToString())
            Application.DoEvents()
            ' biarkan sistem idle selama 3 detik
            ' anda bisa menggantinya dengan proses-proses yang ingin dikerjakan
            System.Threading.Thread.Sleep(3000)
        End Using
        ' dengan penggunaan Using,
        ' programmer tidak perlu lagi menutup koneksi secara manual
        ' proses penutupan dan penghapusan object dari memori akan diurus
        ' oleh Using
        ' cetak status koneksi terkini
        Me.lblStatus.Text = String.Format("Status Koneksi: {0}", _
                            If(conn IsNot Nothing, conn.State.ToString(), "Nothing"))
    End Sub

End Class

Menggunakan MySetting properties untuk menyimpan ConnectionString

cara-cara yang dipakai pada code sebelumnya masih menggunakan penulisan ConnectionString secara hardcode. hal ini suatu saat akan menimbulkan keribetan tersendiri apabila suatu saat terjadi pemindahan server database ke lokasi dengan alamat yang berbeda dengan alamat yang digunakan saat ini. untuk itu kita bisa menyimpan string ConnectionString ke dalam file app.config via settingan properties dibagian Setting pada My Project Properties, seperti yang ditunjukkan pada gambar di bawah ini.

image

dengan menuliskan connectionstring ke dalam file app.config akan membuat proses perubahan terhadap nilai parameter dalam connectionstring lebih mudah untuk dimodifikasi, karena tidak perlu lagi menggantinya langsung dengan cara mengedit code, cuma perlu mengedit file app.config dari aplikasi yang bersangkutan saja.

image

perubahan terhadap code hanya terjadi pada proses pemanggilan connectionString saja, yaitu dengan memanggil dari object MySetting, seperti ditunjukkan oleh code di bawah ini:

' import namespace System.Data.SqlClient
Imports System.Data.SqlClient

Public Class Form1

    ' buat object bertipe SqlConnection
    Dim conn As SqlConnection = Nothing

    ' open when needed - close ASAP (As Soon As Possible)
    Private Sub btnOpenThenClosed_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOpenThenClosed.Click
        ' create koneksi on demand
        ' dengan menggunakan ConnectionString via MySetting Property
        Using conn = New SqlConnection(My.MySettings.Default.ConnString) 
            conn.Open() ' open koneksi yang sudah terbentuk
            ' cetak status koneksi terkini
            Me.lblStatus.Text = String.Format("Status Koneksi: {0}", conn.State.ToString())
            Application.DoEvents()
            ' biarkan sistem idle selama 3 detik
            ' anda bisa menggantinya dengan proses-proses yang ingin dikerjakan
            System.Threading.Thread.Sleep(3000)
        End Using
        ' dengan penggunaan Using,
        ' programmer tidak perlu lagi menutup koneksi secara manual
        ' proses penutupan dan penghapusan object dari memori akan diurus
        ' oleh Using
        ' cetak status koneksi terkini
        Me.lblStatus.Text = String.Format("Status Koneksi: {0}", _
                            If(conn IsNot Nothing, conn.State.ToString(), "Nothing"))
    End Sub

End Class

Membentuk string ConnectionString Secara Runtime

dan selain menggunakan cara-cara di atas, kita juga bisa membentuk string ConnectionString secara runtime via object SqlServerConnectionStringBuilder.

untuk sample pada aplikasi ini, kita akan menyesuaikan rancangan aplikasinya menjadi seperti di bawah ini:

image image

dan code programnya adalah sebagai berikut:

' import namespace yang dibutuhkan
Imports System.Data.SqlClient

Public Class Form1

    ' buat object bertipe SqlConnection
    Dim conn As SqlConnection = Nothing
    ' buat object SqlConnectionStringBuilder
    Dim connString As SqlConnectionStringBuilder = Nothing

    Public Sub New()
        InitializeComponent()
        Me.cboAuthType.SelectedIndex = 0
    End Sub

    Private Sub cboAuthType_KeyPress(ByVal sender As Object, _
      ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles cboAuthType.KeyPress
        e.Handled = True
    End Sub

    Private Sub cboAuthType_SelectedIndexChanged(ByVal sender As System.Object, _
                 ByVal e As System.EventArgs) Handles cboAuthType.SelectedIndexChanged
        If Me.cboAuthType.SelectedIndex = 0 Then
            Me.txtUserID.Enabled = False
            Me.txtPassword.Enabled = False
        Else
            Me.txtUserID.Enabled = True
            Me.txtPassword.Enabled = True
        End If
    End Sub

    Private Sub btnOpen_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles btnOpen.Click
        Try
            ' validasi
            If Me.txtServerName.Text.Trim().Equals("") Then _
                Throw New Exception("Isi Server Name Please ...")
            If Me.txtDatabaseName.Text.Trim().Equals("") Then _
                Throw New Exception("Isi Database Name Please ...")
            ' membentuk object ConnectionString secara run time
            ' via object SqlConnectionStringBuilder
            connString = New SqlConnectionStringBuilder()
            With connString
                .DataSource = Me.txtServerName.Text.Trim()
                .InitialCatalog = Me.txtDatabaseName.Text.Trim()
                If Me.cboAuthType.SelectedIndex = 0 Then
                    .IntegratedSecurity = True
                Else
                    .UserID = Me.txtUserID.Text.Trim()
                    .Password = Me.txtPassword.Text.Trim()
                End If
            End With
            ' membentuk koneksi
            conn = New SqlConnection(connString.ToString())
            conn.Open() ' open koneksi
            ' cetak status koneksi terkini
            Me.lblStatus.Text = String.Format("Status Koneksi: {0}", conn.State.ToString())
        Catch ex As Exception
            connString = Nothing
            conn = Nothing
            MessageBox.Show(ex.Message, Me.Text, _
                                             MessageBoxButtons.OK, MessageBoxIcon.Information)
        End Try
    End Sub

    Private Sub btnClosed_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles btnClosed.Click
        ' tutup koneksi
        If conn IsNot Nothing Then conn.Close() : conn.Dispose()
        ' cetak status koneksi terkini
        Me.lblStatus.Text = String.Format("Status Koneksi: {0}", _
                            If(conn IsNot Nothing, conn.State.ToString(), "Nothing"))
    End Sub

End Class

untuk C#, anda tinggal menyesuaikan sintaks yang digunakan pada artikel ini dengan sintaks dari bahasa C#.

ok, sekian dari saya, semoga bermanfaat bagi semua.

Rgds
Adi

Jumat, 22 Oktober 2010

Demo File => Contoh Source Code Praktek Bahasa Pemrograman IV

ok, sesuai dengan janji saya, berikut ini merupakan link untuk download source code dari program yang dibahas pada  pertemuan ke-3 praktek bahasa pemrograman IV di STMIK – Mikroskil Medan Lab 7 Jam 19.00 – 21.00 materi pemrograman file dengan vb.net

source code program bisa didownload dari link berikut ini (ditulis dengan menggunakan vb 2010)

semoga bermanfaat,

Rgds
Adi

Rabu, 20 Oktober 2010

Mengakses Method Suatu Form dari Form lain (SDI Form)

ok, melanjuti postingan blog yang sebelumnya, kalau dipostingan sebelumnya, kondisi Form1 dan Form2 adalah Form1 sebagai MDIContainer dan Form2 sebagai Child Form dari Form1. muncul pertanyaan, gimana jika Form1 dan Form2 sama-sama merupakan SDI Form (Form1 bukan merupakan MDI Container), jika tetap menggunakan pendekatan yang ada dipostingan sebelumnya, ternyata teknik yang diterapkan menjadi tidak sukses alias gagal. untuk menanggulanginya, bisa digunakan Delegate untuk membypass method yang akan diakses dari Form2. lengkap nya bisa dilihat pada bagian bawah ini:

clip_image002

clip_image004

Code Program.cs

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

Code Form1.cs

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        // delegate dan method yang akan diassign ke delegate
        public delegate void SetTextDelegate(string s);
        public void OnSetText(string s) { this.Text = s; }

        // delegate dan method yang akan diassign ke delegate
        public delegate string GetTextDelegate();
        public string OnGetText() { return "This Is Text From Form 1"; }

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 form = new Form2();
            form.Show();
        }

    }
}

Code Form2.cs

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        // mendelegasikan delegate yang sudah dicreate dari Form1
        Form1.SetTextDelegate setText =
                 new Form1.SetTextDelegate((Form1.ActiveForm as Form1).OnSetText);
        Form1.GetTextDelegate getText =
                 new Form1.GetTextDelegate((Form1.ActiveForm as Form1).OnGetText);

        private void button1_Click(object sender, EventArgs e)
        {
            // mengakses variable  delegate yang sudah dipersiapkan.
            setText("This Text is Set From Form 2");
            this.Text = getText();
        }
    }
}

sedangkan untuk VB.NET, karena defaultnya semua form ada instance staticnya, untuk mengakses method pada Form1 dari Form2 dapat dilakukan dengan lebih mudah, yaitu dengan memanggil static instance defaultnya, seperti yang ditunjukkan pada potongan code di bawah ini

Potongan Code Form2

Me.Text = Form1.GetText()
Form1.SetText(“Hello Form1 Set From Form2”)

Ok, Semoga Bermanfaat

Rgds
Adi

Mengakses Method Suatu Form dari Form lain

langsung saja, misalkan ada sebuah aplikasi dengan rancangan form seperti berikut ini:

Form1

image

Form2

image

pada rancangan di atas, Form1 bertindak sebagai sebuah MDIForm, sedangkan Form2 adalah Child Form dari Form1.

untuk agar Form2 sebagai Form Child dari Form1 bisa mengakses method yang disediakan di Form1, method dari Form1 tersebut harus dimarked sebagai public method. dan cara aksesnya dapat dilihat pada source code di bawah ini (C#).

Source Code Program.cs

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

Source Code Form1.cs

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // method dengan access public pada Form1
        public string GetText()
        {
            return "Hello Get From Form1";
        }

        // method dengan access public pada Form1
        public void SetText(string s)
        {
            this.Text = s;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 form = new Form2();
            form.MdiParent = this;
            form.Show();
        }
    }
}

Source Code Form2

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // mengakses method public dari Form1
            this.Text = (Form1.ActiveForm as Form1).GetText();
            (Form1.ActiveForm as Form1).SetText("Hello Form1 Set From Form2");
        }
    }
}

sedangkan untuk VB.NET, karena defaultnya semua form ada instance staticnya, untuk mengakses method pada Form1 dari Form2 dapat dilakukan dengan lebih mudah, yaitu dengan memanggil static instance defaultnya, seperti yang ditunjukkan pada potongan code di bawah ini

Potongan Code Form2

Me.Text = Form1.GetText()
Form1.SetText(“Hello Form1 Set From Form2”)

Ok, Semoga Bermanfaat

Rgds
Adi

Sabtu, 16 Oktober 2010

Aplikasi Sederhana Count Down Timer

berikut ini aplikasi sederhana untuk count down. bisa digunakan untuk melakukan count down untuk selang waktu tertentu.

bisa didownload exe nya di link berikut ini

http://rapidshare.com/files/425356509/Count_Down_Timer.exe

aplikasi ini membutuhkan .NET Framework 4.0.

bentuk screen shot aplikasi adalah sebagai berikut:

image

untuk menggunakan aplikasi ini, gunakan tombol2 pada keyboard:

1. tombol Up Key – untuk menambah waktu count down

2. tombol Down Key – untuk mengurangi waktu count down

3. tombol Enter – untuk memulai proses count down

4. tombol Esc – untuk menghentikan proses count down

5. tombol Del – untuk reset timer count down

6 Alt + F4 – menutup aplikasi

 

dan berikut ini source code aplikasi dalam C# dan VB:

C#

using System;
using System.Drawing;
using System.Media;
using System.Windows.Forms;

namespace Count_Down_Timer
{
    public partial class FrmCountDown : Form
    {

        double lama;
        bool play;
        DateTime selesai;
        DateTime mulai;
        System.Timers.Timer timer = new System.Timers.Timer();
        System.Timers.Timer timer2 = new System.Timers.Timer();

        public FrmCountDown()
        {
            InitializeComponent();
            lama = 0;
            this.TopMost = true;
            this.Left = Screen.PrimaryScreen.WorkingArea.Width - this.Width;
            this.Top = 0;
            timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
            timer2.Elapsed += new System.Timers.ElapsedEventHandler(timer2_Elapsed);
        }

        void timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            this.lblTimer.Visible = !this.lblTimer.Visible;
        }

        void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (selesai == mulai)
            {
                SystemSounds.Beep.Play();
                timer2.Start();
                play = false;
                timer.Stop();
            }
            else
            {
                selesai = selesai.AddMilliseconds(-100);
                TimeSpan selisih = selesai - mulai;
                if (selisih.Minutes < 5) this.lblTimer.ForeColor = Color.Red;
                this.lblTimer.Text = string.Format("{0}:{1}.{2}",
                    selisih.Minutes.ToString("00"),
                    selisih.Seconds.ToString("00"),
                    (selisih.Milliseconds / 100).ToString("0"));
            }
        }

        private void FrmCountDown_KeyDown(object sender, KeyEventArgs e)
        {
            if (play && e.KeyCode == Keys.Escape)
            {
                play = false;
                timer.Stop();
                lama = 0;
            }
            else if (!play && e.KeyCode == Keys.Up)
            {
                if (lama < 60) lama += 1;
                this.lblTimer.Text = string.Format("{0}:00.0", lama.ToString("00"));
            }
            else if (!play && e.KeyCode == Keys.Down)
            {
                if (lama > 0) lama -= 1;
                this.lblTimer.Text = string.Format("{0}:00.0", lama.ToString("00"));
            }
            else if (!play && e.KeyCode == Keys.Delete)
            {
                timer2.Stop();
                this.lblTimer.Visible = true;
                this.lblTimer.Text = "00:00.0";
                lama = 0;
                this.lblTimer.ForeColor = Color.Blue;
            }
            else if (e.KeyCode == Keys.Enter)
            {
                mulai = DateTime.Now;
                selesai = mulai.AddMinutes(lama);
                play = true;
                timer.Start();
            }
        }

    }
}

 

VB.NET

Public Class FrmCountDown

    Private lama As Double
    Private play As Boolean
    Private selesai As DateTime
    Private mulai As DateTime
    Private timer As New System.Timers.Timer()
    Private timer2 As New System.Timers.Timer()
   
    Public Sub New()
        InitializeComponent()
        lama = 0
        Me.TopMost = True
        Me.Left = Screen.PrimaryScreen.WorkingArea.Width - Me.Width
        Me.Top = 0
        AddHandler timer.Elapsed,
            Sub()
                If selesai = mulai Then
                    Media.SystemSounds.Beep.Play()
                    timer2.Start()
                    play = False
                    timer.Stop()
                Else
                    selesai = selesai.AddMilliseconds(-100)
                    Dim selisih As TimeSpan = selesai - mulai
                    If (selisih.Minutes < 5) Then Me.lblTimer.ForeColor = Color.Red
                    Me.Invoke(
                        Sub()
                            Me.lblTimer.Text = String.Format("{0}:{1}.{2}",
                                                 selisih.Minutes.ToString("00"),
                                                 selisih.Seconds.ToString("00"),
                                                 (selisih.Milliseconds / 100).ToString("0"))
                        End Sub, New Object() {})
                End If
            End Sub
        AddHandler timer2.Elapsed,
            Sub()
                Me.lblTimer.Visible = Not Me.lblTimer.Visible
            End Sub
    End Sub

    Private Sub FrmCountDown_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        If play AndAlso e.KeyCode = Keys.Escape Then
            play = False
            timer.Stop()
            lama = 0
        ElseIf Not play AndAlso e.KeyCode = Keys.Up Then
            If lama < 60 Then lama += 1
            Me.lblTimer.Text = String.Format("{0}:00.0", lama.ToString("00"))
        ElseIf Not play AndAlso e.KeyCode = Keys.Down Then
            If lama > 0 Then lama -= 1
            Me.lblTimer.Text = String.Format("{0}:00.0", lama.ToString("00"))
        ElseIf Not play AndAlso e.KeyCode = Keys.Delete Then
            timer2.Stop()
            Me.lblTimer.Visible = True
            lama = 0
            Me.lblTimer.Text = "00:00.0"
            Me.lblTimer.ForeColor = Color.Blue
        ElseIf e.KeyCode = Keys.Enter Then
            mulai = DateTime.Now
            selesai = mulai.AddMinutes(lama)
            play = True
            timer.Start()
        End If
    End Sub

End Class

 

anda dapat mengembangkan aplikasi ini lebih lanjut lagi dan semoga bermanfaat,

 

Rgds
Adi

Mudahnya Membuat Code Snippet di VS 2010

kadang kala, kita sering dilibatkan dengan proses penulisan code yang sama secara berulang-ulang. untuk menghindari atau setidaknya mengurangi proses berulang tersebut, anda bisa memanfaatkan fasilitas snippet yang disediakan oleh Visual Studio (VS). snippet sesungguhnya adalah sebuah file xml dengan akhiran .snippet yang isinya adalah format struktur xml pembentuk snippet itu sendiri. dengan menggunakan snippet, kita bisa menggunakan shortcut untuk menghasilkan code-code yang perlu diketik berulang-ulang tersebut.

pada VS 2010, sudah disediakan sebuah extensions untuk memudahkan proses pembuatan snippet ini, anda cukup mendownload dan memasangnya ke dalam VS anda, seperti yang ditunjukkan oleh gambar-gambar berikut ini:

image

buka extension manager dari menu tools > extension manager

kemudian cari Snippet Designer

image

kemudian restart VS anda, setelah itu anda sudah bisa menggunakan snippet designer ini untuk membuat sebuah code snippet dengan mudah, seperti yang ditunjukkan oleh gambar-gambar berikut ini:

pilih / blok code program yang akan dijadikan code snippet. klik kanan pada code yang diblok tersebut, kemudian klik kanan, trus pilih export as snippet

image

image

ada beberapa properties yang bisa diisi, antara lain: shortcut yang merupakan key yang akan digunakan nantinya untuk menggunakan code snippet ini. Imports yang digunakan untuk mengimport namespace yang dibutuhkan. References yang digunakan untuk mengikutkan library file yang dibutuhkan.

dan langkah terakhir, simpan code snippet ini dengan akhiran .snippet

dan untuk menggunakannya, bisa dilakukan dengan:

ketik shortcut kemudian tekan tab, dalam contoh ini:

msge + <tab>

atau

ketik shortcut? kemudian tab + tab untuk melihat list code snippet yang ada, dalam contoh ini:

msge? + <tab> + <tab>

image

Nb. Teknik yang sama bisa digunakan untuk C# jg.

ok, semoga bermanfaat.

Rgds
Adi

Minggu, 10 Oktober 2010

Mengakses Method Form MDI dari Form Lain

Pada VB.NET, untuk mengakses kontrol atau method yang ada disebuah form lain, dapat dilakukan dengan mudah, karena sudah disediakannya static class dari tiap form yang bersangkutan. namun, hal ini tidak kita jumpai ketika kita bekerja dengan memanfaatkan bahasa C#. namun hal ini bukan berarti kita tidak bisa mengakses kontrol atau method dari form lain ketika bekerja dengan bahasa C#, tapi  dengan sedikit usaha, kontrol atau method tersebut tetap bisa kita akses jg dengan menggunakan bahasa C#. berikut ini contohnya:

image

image

Form1 adalah sebuah MDI Form, memiliki MenuStrip yang digunakan untuk memanggil object dari Form2. serta memiliki StatusStrip dengan kontrol ProgressBar di dalamnya. serta sebuah kontrol Timer.

image

Form2 adalah form yang akan difungsikan sebagai child form bagi Form1.

berikut ini code dari Form1:

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void newToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var form = new Form2();
            form.MdiParent = this;
            form.Show();
        }

        int min, max;

        // method dgn akses public agar bisa dipanggil dari luar
        public void RunProgressStatusBar(int min, int max)
        {
            this.min = min;
            this.max = max;
            this.timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (min <= max)
            {
                this.lblAngka.Text = min.ToString();
                this.pBar.Value = min++;
            }
            else
                this.timer1.Stop();
        }
    }
}

 

dan, berikut ini code dari Form2:

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int min = Convert.ToInt32(this.textBox1.Text);
            int max = Convert.ToInt32(this.textBox2.Text);
            // memanggil method RunProgressStatusBar kepunyaan MDI dari Child Form
            (Form1.ActiveForm as Form1).RunProgressStatusBar(min, max);
        }
    }
}

Rgds
Adi

Jumat, 08 Oktober 2010

Cek Status Tombol CapsLock, NumLock dan ScrollLock

pada VB.NET untuk melakukan pengecekan apakah tombol CapsLock, Numlock dan ScrollLock dalam posisi On atau Off bisa dilakukan dengan mudah dengan memanfaatkan namespace My yang sudah disediakan.

berikut ini contoh pengecekan tersebut dalam VB.NET:

Module Module1
    Sub Main()
        Console.WriteLine("CapsLock Is ON: {0}", My.Computer.Keyboard.CapsLock)
        Console.WriteLine("NumLock Is ON: {0}", My.Computer.Keyboard.NumLock)
        Console.WriteLine("ScrollLock Is ON: {0}", My.Computer.Keyboard.ScrollLock)
    End Sub
End Module

dalam C#, karena tidak disediakan, kita bisa menggunakan beberapa pendekatan yang berbeda untuk melakukan hal yang sama.

yang berikut ini bisa digunakan untuk console app dan win app dalam c#:

using System;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        // an unmanaged function that retrieves the states of each key
        [DllImport("user32.dll",
            CharSet = CharSet.Auto,
            ExactSpelling = true,
            CallingConvention = CallingConvention.Winapi)]
        public static extern short GetKeyState(int keyCode);

        static void Main(string[] args)
        {
            // get the state and store it as bool
            bool capsLock = (((ushort)GetKeyState(0x14)) & 0xffff) != 0;
            bool numLock = (((ushort)GetKeyState(0x90)) & 0xffff) != 0;
            bool scrollLock = (((ushort)GetKeyState(0x91)) & 0xffff) != 0;
            // show the status
            Console.WriteLine("CapsLock Is ON: {0}", capsLock);
            Console.WriteLine("NumLock Is ON: {0}", numLock);
            Console.WriteLine("ScrollLock Is ON: {0}", scrollLock);

            // managed code
            bool cekCapsLock = Console.CapsLock;
            bool cekNumLock = Console.NumberLock;
            Console.WriteLine("CapsLock Is ON: {0}", cekCapsLock);
            Console.WriteLine("NumLock Is ON: {0}", cekNumLock);
        }
    }
}

mulai dari .NET Framework versi 2.0, selain menggunakan cara di atas, bisa jg menggunakan class Control.IsKeyLocked seperti yang ditunjukkan pada code berikut ini:

Capslock

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            this.lblCapsLock.Text = "CAPS LOCK: " + Control.IsKeyLocked(Keys.CapsLock);
            this.lblNumLock.Text = "NUM LOCK: " + Control.IsKeyLocked(Keys.NumLock);
            this.lblScrollLock.Text = "SCROLL LOCK: " + Control.IsKeyLocked(Keys.Scroll);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.lblCapsLock.Text = "CAPS LOCK: " + Control.IsKeyLocked(Keys.CapsLock);
            this.lblNumLock.Text = "NUM LOCK: " + Control.IsKeyLocked(Keys.NumLock);
            this.lblScrollLock.Text = "SCROLL LOCK: " + Control.IsKeyLocked(Keys.Scroll);
        }
    }
}

Nb. teknik pengecekan seperti yang dilakukan oleh C# juga bisa diterapkan dengan sedikit penyesuaian penulisan code pada code di VB.NET

Rgds
Adi

Senin, 04 Oktober 2010

Me

I, Me and MySelf.

Minggu, 03 Oktober 2010

Ternyata, Konversi String Menjadi Integer Tidak Mudah ;-)

Pertama, mari kita lihat dulu versi dalam program C# berikut ini:

using System;
using System.Globalization;

namespace CS_Konversi_Ke_Integer
{
class Program
{
static void Main(string[] args)
{
// definisi variable int
int angka = 1250;
// konversi menjadi string dengan
// format pemisah ribuan

string s = angka.ToString("#,##0");
Console.WriteLine(
"int diconvert menjadi string => {0}", s);
// tampilkan
// konversi kembali menjadi int
// angka = Convert.ToInt32(s);
// ternyata membangkitkan exception –
// Input String was not in a correct format

// supaya tidak exception, ganti dengan
// int.Parse –>
// jika yakin konversi akan selalu benar

// angka = int.Parse(s,
NumberStyles.AllowThousands,
CultureInfo.GetCultureInfo("en-US"));

// atau
// int.TryParse –>
// jika tidak yakin konversi akan selalu benar

if(!int.TryParse(s,
NumberStyles.AllowThousands,
CultureInfo.GetCultureInfo("en-US"),
out angka))
Console.WriteLine("Konversi Gagal ...");
// tampilkan
Console.WriteLine(
"string diconvert menjadi int => {0}", angka);
Console.ReadKey();
}
}
}


kedua, mari kita lihat versi VB.NET nya:



Imports System.Globalization

Module Module1
Sub Main()
' definisi variable integer
Dim angka As Integer = 1250
' konversi menjadi string dengan format pemisah ribuan
Dim s As String = angka.ToString("#,##0")
' tampilkan
Console.WriteLine( _
"int diconvert menjadi string => {0}", s)
' konversi kembali menjadi integer
' angka = Convert.ToInt32(s)
' membangkitkan exception -
' Input String was not in a correct format

' supaya tidak exception, ganti dengan
' Integer.Parse –>
' jika yakin konversi akan selalu benar

angka = Integer.Parse(s, _
NumberStyles.AllowThousands, _
CultureInfo.GetCultureInfo("en-US"))
' atau
' Integer.TryParse –>
' jika tidak yakin konversi akan selalu benar

If Not Integer.TryParse(s, _
NumberStyles.AllowThousands, _
CultureInfo.GetCultureInfo("en-US"), angka) Then
Console.WriteLine("Konversi Gagal ...")
End If
' tapi bisa disederhanakan dengan memanggil
' fungsi CInt seperti berikut ini:

angka = CInt(s)
' tampilkan
Console.WriteLine( _
"string diconvert menjadi int => {0}", angka)
Console.ReadKey()
End Sub
End Module


output dari program di atas adalah:



Konversi string to int


VB.NET memberikan kemudahan kepada programmer dalam mengerjakan coding tasknya ^^. tentunya anda tetap bisa menggunakan cara advanced seperti yang digunakan oleh C#.



Semoa Bermanfaat




Rgds


Adi




Rabu, 29 September 2010

Visual Basic 2010 a.k.a VB 10 a.k.a VBx

Visual Basic tidak dapat dipungkiri merupakan salah satu bahasa pemrograman yang digunakan untuk memproduksi aplikasi yang memiliki kepopuleran yang sangat tinggi. Visual Basic sendiri lahir pada tahun 1991. Ini berarti sampai saat ini, bahasa ini telah berusia 19 tahun (hem.. sebuah pencapaian yang luar biasa – bisa exist sampai saat ini).

VB 10 merupakan rilis pertama dari strategi co-evolution yang digencarkan oleh Microsoft saat ini. visi dari coevolution ini adalah untuk menyelaraskan agar baik VB atau pun C# diharapkan memiliki fitur yang seimbang.

VB 10 didesain untuk membantu developer lebih produktif lagi dengan menyediakan fitur-fitur yang bisa meringkas banyaknya kode program yang harus diketikkan pada sebuah program.

berikut ini beberapa fitur baru yang dikenalkan pada rilis ke 10 dari Visual Basic:

1. Implicit Line Continuation

perintah dalam VB adalah berorientasi baris, dimana sintaks yang digunakan kebanyakan menggunakan kata-kata dalam bahasa inggris sehingga mudah untuk dimengerti. tapi hal ini kadang kala menyebabkan programmer harus menuliskan perintah yang panjang. nah, selama ini untuk membuat sebuah perintah yang panjang agar dapat lebih mudah untuk dibaca tanpa perlu banyak melakukan scrolling layar, programmer akan memecah baris perintah tersebut menjadi beberapa baris perintah dengan memisahkan baris tersebut secara logic dengan menggunakan karakter underscore ( _ ). nah, di versi 10 ini, pemakaian karakter underscore tersebut menjadi optional untuk sebagian kasus karena compiler VB versi 10 saat ini sudah dapat membedakan apakah beberapa baris perintah tersebut merupakan sebuah rangkaian perintah tunggal atau merupakan beberapa perintah yang terpisah.

Contoh:

Code Pada VB 9:

Dim data() As Integer = _
New Integer() { _
1, _
2, _
3 _
}


Code pada VB 10:




Dim data() As Integer =

            New Integer() {


                1,


                2,


                3


            }




beberapa skenario di mana karakter underscore boleh ditiadakan adalah:



- setelah penulisan attribut <Extension()>



- setelah tanda ( (kurung buka) pada saat deklarasi method



- setelah tanda , (koma) pada penulisan parameter



- sebelum tanda ) (kurung tutup) pada saat deklarasi method



- setelah tanda = (sama dengan)



- setelah tanda <%= (tag pembuka untuk ekspresi embedded)



- setelah tanda & (ampersand) pada penulisan XML Literal



- sebelum tanda %> (tag penutup untuk ekspresi embedded)



- dan pada tanda-tanda seperti yang ditampilkan pada gambar berikut ini:



Implicit Line Continuation 



2. Statement Lambda



lambda secara sederhana dapat diartikan sebagai fungsi yang didefinisikan di dalam fungsi yang lain.



VB 9 mengenalkan lambda expressions dengan keyword Function




Dim cust() as Customer = ….



Array.FindAll(cust, Function(c) c.Country = “Indonesia”)




lambda expressions memberikan cara yang lebih ringkas dan kompak untuk mengekspresikan logic secara lokal tanpa perlu memecahnya menjadi beberapa method yang saling berkaitan. sebagai contoh, berikut ini adalah bentuk sample code yang sama seperti contoh di atas, namun tanpa menggunakan lambda expressions




Dim query = Array.FindAll(cust, AddressOf Filter)





Function Filter(ByVal c as Customer) As Boolean



     Return c.Country = “Indonesia”



End Function




tapi sayangnya, lambda expressions yang dikenalkan dan digunakan dalam VB 9 mengharuskan sebuah lambda expressions untuk mengembalikan sebuah nilai, sehingga untuk penggunaan seperti kasus berikut:




Array.ForEach(cust, Function(c) Console.WriteLine(c.Country)



 




akan menyebabkan terjadinya error seperti berikut:



'Compile error: "Expression does not produce a value."


Console.WriteLine adalah sebuah prosedur, sehingga tidak mengembalikan sebuah nilai, yang mana akan menyebabkan compiler membangkitkan pesan kesalahan. untuk deal dengan situasi ini, VB 10 kemudian mengenalkan Statement Lambdas, yaitu lambda yang dapat berisi satu atau lebih statement.



sehingga code yang error di atas dapat kita ubah menjadi:




Array.ForEach(cust, Sub(c) Console.WriteLine(c.Country)



 




code di atas dapat berjalan dengan baik.



contoh lain penggunaan statement lambdas:



Array.ForEach(cust, Sub(c)
Console.WriteLine("Country Name:")
Console.WriteLine(c.Country)
End Sub)


statement lambdas ini juga dapat digunakan untuk membangun Event Handler secara dinamis, seperti yang ditunjukkan pada contoh berikut.



AddHandler b.Click, Sub(sender As Object, e As EventArgs)
MsgBox("Button Clicked")
'Ketikkan code selanjutnya
End Sub


dan anda juga dapat mengkombinasikan statement lambdas ini dengan fitur relaxed delegates yang sudah tersedia di VB 9. (red. delegate adalah type safe pointer to functions, yang dapat digunakan untuk mengeksekusi beberapa method sekaligus). kombinasi ini menghasilkan signature event yang lebih sederhana seperti ditunjukkan pada code berikut ini:



AddHandler b.Click, Sub()
MsgBox("Button Clicked")
'ketikkan code selanjutnya
End Sub


relaxed delegate memungkinkan anda untuk menghilangkan parameter pada event handler.



VB 10 juga menambahkan support untuk multi-line function lambdas.



Dim query = cust.Where(Function(c)
'Return only customers that have not been saved
'insert more complex logic here
Return c.ID = -1
End Function)


aspek menarik lainnya dari statement lambdas ini adalah cara yang digunakan untuk beririsan dengan fitur anonymous delegates yang diperkenalkan pada VB 9. anonymous delegates terjadi ketika compiler VB meng-infers sebuah tipe delegate berdasarkan signature method dari sebuah function lambdas.



Dim method = Function(product As String)
If product = "Paper" Then
Return 4.5 'units in stock
Else
Return 10 '10 of everything else
End If
End Function

MsgBox(method("Paper"))


pada code di atas, compiler akan mengenerate sebuah delegate secara otomatis dengan bentuk seperti berikut ini:



Delegate Function $compilerGeneratedName$(product As String) As Double


ini yang disebut dengan anonymous delegate, karena delegate tersebut hanya kelihatan di sisi compiler, karena memang delegate tersebut digenerate oleh compiler sendiri, bukan pada code yang ditulis oleh programmer. perhatikan bahwa compiler meng-infers return type nya dengan tipe double. karena tipe ini yang paling dominan.



tapi kita juga diperkenankan untuk menuliskan return type dari anonymous delegate tersebut seperti bentuk berikut ini:



'Notice the "As Single"
Dim method = Function(product As String) As Single
If product = "Paper" Then
Return 4.5 'units in stock
Else
Return 10 '10 of everything else
End If
End Function


atau



Dim method As Func(Of String, Single) =
Function(product)
If product = "Paper" Then
Return 4.5 'units in stock
Else
Return 10 '10 of everything else
End If
End Function


3. Auto-Implemented Properties



dalam VB, properties adalah member dari class yang digunakan untuk mengexpose state dari object agar dapat diakses dari luar dari class yang bersangkutan. bentuk deklarasi properties yang digunakan sampai dengan VB 9 adalah seperti berikut ini:



Private _country As String
Property Country As String
Get
Return _country
End Get
Set(ByVal value As String)
_country = value
End Set
End Property


jika dilihat, 9 baris perintah di atas digunakan untuk membuat hanya satu buah properties. dengan penulisan seperti ini, jika kita harus mendeklarasikan banyak properties sekaligus, akan menyebabkan programmer harus mengetikkan kode program yang hampir mirip seperti di atas secara berulang-berulang. hal ini tentunya tidak efisien. nah, pada VB 10, dikenalkanlah fitur auto-implemented properties untuk mempermudah proses pembuatan properties seperti di atas menjadi berbentuk one line of code seperti code berikut ini:




Public Property Country As String



 




pada kasus ini, compiler akan secara otomatis mengenerate Getter, Setter dan Backing Fields. nama dari backing fields akan selalu dimulai dengan tanda underscore diikuti oleh nama dari property yang ada, dalam contoh ini akan menjadi _Country



anda juga bisa langsung menginisialisasikan sebuah nilai awal saat mendeklarasikan sebuah property seperti ditunjukkan pada contoh berikut:




Public Property ID As Integer = –1



 




dan walaupun sudah disediakan auto-implemented properties ini, anda juga masih bisa menggunakan cara deklarasi property dengan menggunakan cara yang disediakan oleh VB 9. hal ini diperlukan misalnya untuk property yang memerlukan proses yang kompleks seperti melakukan pengecekan.



4. Collection Initializers



ketika menggunakan object yang bertipe collection, untuk mempopulasi data inisialisasi ke dalam object yang bersangkutan biasanya digunakan dengan memanggil method Add dari object collection yang bersangkutan, seperti yang ditunjukkan pada contoh berikut:




Dim data As New List(Of String)



data.Add(“Satu”)

data.Add(“Dua”)


data.Add(“Tiga”)





tidak ada yang salah dari code di atas, namun kita harus melakukan proses populasi data dengan memanggil method Add secara berulang-ulang. nah, pada VB 10, dikenalkan sebuah fitur yaitu collection initializers yang mengizinkan anda untuk memberikan nilai inisialisasi ke object collection dengan lebih ringkas dan mudah, seperti yang ditunjukkan pada code berikut ini:




Dim data As New List(Of String) From {“Satu”, “Dua”, “Tiga”}



 




compiler VB secara otomatis akan memanggil method Add untuk mempopulasikan setiap data yang ada.



collection initializers dapat digunakan terhadap semua data type yang memenuhi requirement berikut ini:





  • dapat melakukan iterasi terhadap data type tersebut dengan menggunakan For Each statement. hal ini bisa dilakukan terhadap semua data type yang mengimplementasikan interface IEnumerable.




  • data type tersebut memiliki constructor default (constructor tanpa parameter) yang dapat diakses.




  • data type tersebut memiliki method yang bernama Add yang dapat diakses.




contoh lain:




Dim lookupTable As New Dictionary(Of Integer, String) From {

          {1, “One”},


          {2, “Two”},


          {3, “Three}


}




anda juga dapat menyediakan custom implementasi method Add dengan menggunakan extension method, seperti ditunjukkan pada contoh code berikut:



<Extension()>
Sub Add(ByVal source As IList(Of Customer),
ByVal id As Integer,
ByVal name As String,
ByVal city As String)

source.Add(New Customer With
{
.ID = id,
.Name = name,
.City = city
})
End Sub


method ini mengextend data type apa saja yang mengimplementasikan IList(Of Customer) dan kemudian mengizinkan anda menggunakan sintaks collection initializer seperti berikut:



Dim list = New List(Of Customer) From
{
{1, "Jon", "Redmond"},
{2, "Bob", "Seattle"},
{3, "Sally", "Toronto"}
}


collection initializers ini juga dapat anda gunakan pada saat anda menginisialisasikan sebuah nilai saat menggunakan auto-implemented properties.



5. Array Literals



VB 10 juga menyediakan cara pendekatan baru yang lebih memudahkan ketika anda bekerja dengan menggunakan array.



pada VB 9, array bisa dibuat dengan pendekatan seperti berikut:




Dim numbers() As Integer = New Integer() {1, 2, 3, 4, 5}



 




dengan menggunakan array literals, penulisan sintaks di atas bisa disingkat menjadi:




Dim numbers = {1, 2, 3, 4, 5}



 




array literal dibuat dengan meletakkan elemen yang akan dimasukkan ke dalam array dengan menggunakan tanda kurung kurawal, dan membiarkan compiler menginfers data type yang cocok untuk digunakan secara otomatis. untuk keperluan ini, harus dipastikan nilai dari Option Strict adalah On.



array literals juga dapat digunakan untuk array multi-dimensi dan jagged array, seperti yang ditunjukkan pada code berikut ini:




‘ 2-dimensional array

Dim matrix = {{1, 0}, {0,1}}



‘ jagged array

Dim jagged = {({1, 0}), ({0, 1, 2})}



 




6. Dynamic Language Runtime



7. Generic Variance



8. Improved Optional Parameters



9. Embed Interop Types



10. Multi Targeting



5 fitur baru selanjutnya (dari no. 6 s/d 10) akan kita bahas di kesempatan yang lain.



selain fitur-fitur baru yang dikenalkan pada VB 10, IDE VB  10 juga mengalami peningkatan kemampuan yang banyak. seperti:





  • Navigate To




  • Highlight References




  • Generate From Usage




  • Better IntelliSense (Substring matching, camel-case lookup, suggestion mode – usefull for “test first” style of development)




  • Multi-Monitor Support




  • Zooming




    Semoga Bermanfaat




      Rgds

      Adi