stmikbg-dot-com

Informasi Seputar IT

Archive for the ‘Visual Basic’


Sending Key antara vb.6 dan vb.net

Saat ini saya sudah mulai konsen untuk development software dilingkungan vb.net, dan sebelumnya saya masih menggunakan vb.6 environment, melihat perkembangan dunia komputer sekarang ini, dipicu sejak dirilisnya windows vista oleh microsoft kemudian microsoft merelease Os terbarunya yakni windows 7 jadi arah bisnis software kedepan akan mengalami perubahan base dan metode pemrograman.
Secara bisnis, aplikasi yg masih menggunakan core COM ataupun COM+ akan ketinggalan jauh, baik dari segi kompatibilitas dengan sistem operasi maupun dari segi teknologinya, yah mau tidak mau para pengembang software harus segera melakukan migrasi keframework yang lebih canggih, dan kebetulan framework yang saya pilih yakni .NET Framework, memang terhitung terlambat bagi saya untuk segera migrasi, tapi masih lebih baik daripada tidak sama sekali.

Saat melakukan migrasi code dari VB.6 ke VB.NET banyak sekali penyesuaian-penyesuaian yang harus saya lakukan, baik dari code maupun konsep dari pemerograman itu sendiri, contoh kecilnya seperti judul diatas, misalnya saat kita ingin memanfaatkan event keypress pada control textbox, jika key yang ditekan adalah tombol “ENTER” otomatis program akan mengirim key “TAB” untuk loncat kecontrol lainnya, tetapi jika selain dari itu aplikasi harus melakukan converting kehuruf besar (Misalnya ditekan huruf ‘a’ maka akan menjadi huruf ‘A’).

Dari permasalahan diatas, kita akan membandingkan codenya.

'VB.6 Code
Private Sub TxtKodeBarang_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
  SendKeys "{Tab}"
Else
  KeyAscii = Asc(UCase(Chr(KeyAscii)))
End If
End Sub

Bandingkan dengan kode VB.NET dibawah ini

Private Sub TxtKodeBarang_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtKodeBarang.KeyPress
        If Asc(e.KeyChar.ToString) = 13 Then
            SendKeys.Send(vbTab)
        Else
            e.KeyChar = UCase(e.KeyChar)
        End If
 End Sub

Sama sekali berbeda dari segi kode maupun konsepnya, dan masih banyak lagi konversi kode yang harus saya lakukan, yah pelan-pelan tapi pasti lah. Yuk Majulah Dunia IT Indonesia.

Generate SN dgn trigger CPU ID

Ide ini tercipta saat ngobrol santai bareng broklyn aka Piter salah seorang programer dari miSolusi, kemarin tim development berhasil mendapatkan deal disebuah perusahaan retail komputer untuk develop POSnya, nah setelah proses instalasi, ternyata software yang dikembangkan ini bisa diduplikasi kekomputer lain menggunakan Norton-GHOST, wah kalo seperti ini bisa-bisa aplikasi yang kita jual didistribusikan tanpa sepengetahuan kita. Akhirnya kami mencoba menganalisa kemungkinan proteksi yang bisa diimplementasikan. Akhirnya kami mengambil keputusan untuk menggunakan CPU ID sebagai patokan Serial Number Softwarenya, dengan metode seperti ini software tidak akan bisa diduplikasi kekomputer lainnya.

Ok, sekarang kita akan membahas bagaimana cara mendapatkan sebuah CPU ID menggunakan kode visual basic, dulu saya pernah memposting tentang WMI (Windows Management Instrument) karena sekarang code yang kita bahas menggunakan WMI untuk mendapatkan nilai dari CPU ID, Yah tidak mau berkata panjang lebar, langsung aja kita mengintip code programnya. Codenya seperti Dibawah ini, agak panjang soalnya saya langsung COPAS dari formnya, dipilah sendiri ya lagi malas :)

Private asCpuPaths() As String
Private m_objCPUSet As SWbemObjectSet
Private m_objWMINameSpace As SWbemServices
Option Explicit

Private Sub cmdDone_Click()
Unload Me
End Sub

Private Sub Form_Load()
Dim oCpu As SWbemObject 'WMI Object, in this case, local CPUs
Dim sPath As String, sCaption As String

Dim lElement As Long
ReDim asCpuPaths(0) As String

On Error GoTo ErrorHandler

'Get Default NameSpace, which will be the one for the local machine
Me.Move (Screen.Width - Me.Width) / 2, (Screen.Height - Me.Height) / 2
Set m_objWMINameSpace = GetObject("winmgmts:")
lstCPU.Clear

'Get CPU set
Set m_objCPUSet = m_objWMINameSpace.InstancesOf("Win32_Processor")
sCaption = m_objCPUSet.Count & " processor"
If m_objCPUSet.Count <> 1 Then sCaption = sCaption & "s"
sCaption = sCaption & " detected on this machine"
lblTitle.Caption = sCaption
'Populate list box with CPU names

For Each oCpu In m_objCPUSet
     With oCpu
        sPath = .Path_ & ""
            If sPath <> "" Then
                lstCPU.AddItem .Name
                'save path to array, so on machines with multiple CPUs,
                'each can be identified and their info loaded into text box

                lElement = IIf(asCpuPaths(0) = "", 0, UBound(asCpuPaths) + 1)
                ReDim Preserve asCpuPaths(lElement) As String
                asCpuPaths(lElement) = sPath
            End If
     End With
Next
If lstCPU.ListCount <> 0 Then lstCPU.ListIndex = 0
CleanUp:
 Set oCpu = Nothing
 Exit Sub
ErrorHandler:
 MsgBox "CPU Information could not be displayed due to the following error: " & Err.Description, , "WMI  Demo  Failed"
GoTo CleanUp
End Sub

Private Sub Form_Unload(Cancel As Integer)
Set m_objCPUSet = Nothing
Set m_objWMINameSpace = Nothing
End Sub

Private Sub lstCPU_Click()
Dim oCpu As SWbemObject
'Refer to SDK documentation for more detail about each of these properties
Dim sInfoString As String
On Error Resume Next
Set oCpu = m_objCPUSet(asCpuPaths(lstCPU.ListIndex))
With oCpu
    sInfoString = "Description: " & .Description & vbCrLf
    sInfoString = sInfoString & "Processor ID: " & .ProcessorID & vbCrLf
    sInfoString = sInfoString & "Status: " & .Status & vbCrLf
    sInfoString = sInfoString & "Manufacturer: " & .Manufacturer & vbCrLf
    sInfoString = sInfoString & "Availability: " & AvailabilityToString(.Availability) & vbCrLf
    sInfoString = sInfoString & "Load Percentage: " & .LoadPercentage & vbCrLf
    sInfoString = sInfoString & "Current Clock Speed: " & .CurrentClockSpeed & " MHz" & vbCrLf
    sInfoString = sInfoString & "Maximum Clock Speed: " & .MaxClockSpeed & vbCrLf
    sInfoString = sInfoString & "Level 2 Cache Size: " & .L2CacheSize & vbCrLf
    sInfoString = sInfoString & "Level 2 Cache Speed: " & .L2CacheSpeed & vbCrLf
    sInfoString = sInfoString & "Power Management Supported: " & .PowerManagementSupported
End With
txtCpu.Text = sInfoString
End Sub

'Conversions from code to string were developed
'based on information in WMI SDK documentation
Private Function AvailabilityToString(Code As Integer) As String
Dim sAns As String

Select Case Code
    Case 1, 2
        sAns = "Unknown"
    Case 3
        sAns = "Running/Full Power"
    Case 4
        sAns = "Warning"
    Case 5
        sAns = "In Test"
    Case 6
        sAns = "Not Applicable"
    Case 7
        sAns = "Power Off"
    Case 8
        sAns = "Off Line"
    Case 9
        sAns = "Off Duty"
    Case 10
        sAns = "Degraded"
    Case 11
        sAns = "Not Installed"
    Case 12
        sAns = "Install Error"
    Case 13
        sAns = "Power Save - Unknown"
    Case 14
        sAns = "Power Save - Low Power Mode"
    Case 15
        sAns = "Power Save - Standby"
    Case 16
        sAns = "Power Cycle"
    Case 17
        sAns = "Power Save - Warning"
    Case Else
        sAns = "Unknown"
End Select
AvailabilityToString = sAns
End Function

Incoming search terms:

  • proteksi aplikasi visual basic processorid
  • sn cpu

Binding Manual Combobox pada VB.Net

Kemarin saat developt software untuk versi .NET saya sempat kebingungan, mungkin karena masih tersihir dengan metode binding pada VB.6 Jadi saya hampir saja menggunakan gaya pemerograman VB.6 untuk memasukkan data item kedalam combo box. Ditengah perjalanan codeing saya langsung buntu, bagaimana tidak untuk pindah antar baris jika di VB.6 mudah sekali digunakan cukup menggunakan properties .MoveNext pada object recordset yang dimaksud kita langsung bisa membinding semua data kedalam combo. Untuk jelasnya bisa dilihat pada Code Dibawah ini

'Visual Basic 6.0 Style
'Using Recordset Object
StrCariPasien = "Select [Register Pasien],[Nomor Rekam Medik],[Nama Pasien],[Alamat],[Jenis Pengenal]," & _
                "[Nomor Pengenal],[Handphone],[Phone] From Pasien Where [Nama Pasien] Like '" & Trim(TxtSearch.Text) & "%'"
Set RsCariPasien = Nothing
Set RsCariPasien = New ADODB.Recordset
RsCariPasien.Open StrCariPasien, Conn, adOpenDynamic, adLockOptimistic
CboSearch.Clear
If RsCariPasien.RecordCount <> 0 Then

 'Looping sebanyak data yang ada
 With RsCariPasien
  .MoveFirst
  While Not .EOF
   CboSearch.AddItem Trim(.Fields("Nama Pasien").Value) & _
                     " [RM: " & Trim(.Fields("Nomor Rekam Medik").Value) & "] [Alamat: " & _
                     Trim(.Fields("Alamat").Value) & "] [Pengenal: " & _
                     Trim(.Fields("Jenis Pengenal").Value) & "-" & _
                     Trim(.Fields("Nomor Pengenal").Value) & "] [HP: " & _
                     Trim(.Fields("Handphone").Value) & "] [Phn: ]" & _
                     Trim(.Fields("Phone").Value) & " ?" & Trim(.Fields("Register Pasien").Value)
   .MoveNext
  Wend
 End With
End If

Sementara itu untuk VB.NET metode diatas tidaklah mungkin untuk dilakukan jika kita menggunakan ADO.NET karena arsitekturnya yang disconected. Berhari-hari saya mengalami kebuntuan ide hanya karena problem ini,tapi alhamdulillah secara tidak sengaja saya mendapatkan ide, kenapa Dataset yang saya buka tidak saya convert dulu keDatarow untuk memudahkan pindah antar baris? Berangkat dari ide diatas saya langsung membuat code dibawah ini

'VB.NET style
'Using Dataset and datarow

'Deklarasikan fungsi untuk buka dataset
'Fungsi ini bisa dipakai berkali-kali
Public Function OpenDataSet(ByVal SqlCommand As String) _
    As DataSet
        Dim Command As New MySqlCommand(SqlCommand, Koneksi)
        Dim Adapter As MySqlDataAdapter = New MySqlDataAdapter()
        Adapter.SelectCommand = Command

        Dim Ds As New DataSet
        Adapter.Fill(Ds)
        Return Ds
End Function

'Panggil fungsi opendataset dan masukkan data kedalam combo
Private Sub CboBaruKategori_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CboBaruKategori.Click
        dtKelompokData = New DataTable
        dtKelompokData = GetData("Insert Into `KelompokData` (`Keterangan`,`Jenis`) Values ('" & _
                                 Trim(CboKategori.Text) & "','Kategori')")

        dsKelompokData = New DataSet
        dsKelompokData = OpenDataSet("Select * From `KelompokData` Where `Jenis` = 'Kategori'")
        CboKategori.Items.Clear()

         'Looping sebanyak data yang ada
        For Each DataRow In dsKelompokData.Tables(0).Rows
            CboKategori.Items.Add(Trim(DataRow("Keterangan").ToString))
        Next
End Sub

Jika dilihat dari penggalan code diatas, dari segi arsitektur dan code program antaran VB.6 dan VB.NET sama sekali berbeda, Perhatikan code yang berwarna merah diatas, bisa dilihat perbedaan model loop pada VB.6 dan VB.NET, walaupun tujuannya sama yakni untuk membinding semua record yang diquery berdasarkan QueryString. Sekian tulisan singkt ini saya buat, semoga bisa membantu bagi rekan-rekan programer. Semoga Allah tetap menganugerahkan taufik dan hidayahnya bagi hatiku yang kotor ini :) .

Incoming search terms:

  • combo box on vb net
  • combo box pada vb net
  • combobox value in vb net
  • combobox vb
  • combobox vb adodb
  • Looping pada vb
  • vb net reset combobox

fungsi untuk mematikan komputer

Semalam saya dihubungi ma teman yang sekarang lagi menghindar dari gemerlapnya dunia sebut saja ustad shidiq. Beliau ini nun jauh disana, tapi biarpun begitu saya salut, biar dipedalaman sana tetap saja melakukan riset dan pengembangan perangkat lunak. Semoga beliau menjadi “programer yang islami” banyak menyumbang ide-idenya untuk kemajuan umat.

Yang ditanyakan tentang sebuah fungsi divisual basic yang bisa mematikan komputer secara otomatis jika aplikasi yang digunakan berhenti digunakan, misalnya sebut saja Sistim Informasi Akuntansi nah begitu SIA ini berhenti digunakan komputer juga akan otomatis shutdown. Semalam saya sarankan menggunakan shell ektension untuk mengeksekusi file shutdown.exe bawaannya windows.

ApID = Shell("shutdown.exe -s -t 00, 1")
AppActivate ApID

Tapi saya menyarankan untuk menggunakan Windows API karena lebih sederhana tapi powerfull. Untuk contoh kodenya seperti dibawah ini

'Sample project to shutdown windows or reboot computer
      'Will not work on windows NT OS

       Const EWX_LogOff As Long = 0
       Const EWX_SHUTDOWN = 1
       Const EWX_REBOOT = 2
       Const EWX_FORCE = 4
       Private Declare Function ExitWindows _
               Lib "User32" Alias "ExitWindowsEx" _
               (ByVal dwOptions As Long, ByVal dwReserved As Long) As Long

Private Sub
Command1_Click() 'Shut down windows ExitWindows EWX_SHUTDOWN, &HFFFFFFFF End Sub
Private Sub
Command2_Click() 'Reboot computer ExitWindows EWX_REBOOT, &HFFFFFFFF End Sub

Kode diatas contoh untuk melakukan shutdown, reboot dan logoff menggunakan visual basic 6.0, Untuk kode menggunakan VB.NET insya allah akan saya posting beberapa hari lagi berhubung lagi banyak kerjaan ini.

cara sederhana membaca hotkey (2)

Dari postingan sebelumnya by broklyn, setelah dicoba ternyata ada langkah yang lebih sederhana lagi, kita tetap menggunakan event keydown, tapi kali ini yang keydown even pada form, Bukan even keydown pada kontrol lainnya misalnya textbox, combobox atau lainnya.

Yang jadi permasalahan yakni jika kita menggunakan event keydown pada control lainnya selain form, tentu kita harus menunggu dulu control tersebut mendapatkan focus baru event keydown bisa dieksekusi, jika permasalahan seperti diatas akan timbul masalah yang lebih banyak lagi yakni kita harus membuat code sebanyak control yang ada, wah sungguh repot ya?

Jika menggunakan event keydown pada form, apa kita harus menunggu form untuk mendapatkan focus juga? Untuk masalah ini ada solusinya yakni kita set property KeyPreview menjadi True bisa diset langsung ataupun saat runtime ( event Form_Load ). Seperti pada kode dibawah ini

Private Sub Form_Load()
 DoEvents
 Me.Top = 0
 Me.Left = 2999
 Me.KeyPreview = True
End Sub

Dan pada form juga manfaatkan event keydown dan tuliskan code seperti dibawah ini

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
 If KeyCode = 113 Then
  CmdNew_Click
 ElseIf KeyCode = 114 Then
  CmdAdd_Click
 ElseIf KeyCode = 116 Then
  CmdOk_Click
 ElseIf KeyCode = 121 Then
  CmdHitung_Click
 End If
End Sub

Untuk daftar nilai integer tombol fungsi ( F1 s/d F12 ) antara lain :

'112 = F1
'113 = F2
'114 = F3
'115 = F4
'116 = F5
'117 = F6
'118 = F7
'119 = F8
'120 = F9
'121 = F10
'122 = F11
'123 = F12

Selamat mencoba, buat broklyn terima kasih atas idenya kemarin. Make a good code bro.