Tuesday, May 29, 2012

Kamus Inggris - Merapikan Project - Bagian ke-5

Kamus Inggris - Merapikan Project merupakan kelanjutan dari bagian ke-4.
Mulai pada bagian yang ke-5 kita akan merapikan project telah dibuat. Yang dimaksud dengan merapikan project disini diantaranya: membuat folder-folder untuk form, module, class, ActiveX dan lain sebagainya.

Selain yang telah disebutkan di atas, biasakan pula meng-indent kode dengan baik, menulis variable, constanta dengan baik (menggunakan prefix standar untuk VB6) dalam hal ini mengacu pada Naming convention Untuk VB6.

Perlu diketahui, semua yang disebutkan tadi bukan merupakan keharusan, hanya sebaiknya dilakukan, Adapun tujuannya, agar project tersebut mudah dipelihara, diupdate dari versi 1.0 versi 2.0 dan selanjutnya, mudah dibaca alur logikanya, terutama jika suatu saat kita ingin mengupgradenya ke VB.NET.

Tujuan pada bagian ke-4
Merapikan project dengan membuat beberapa folder, yaitu: folder ActiveX (untuk menyimpan dll atau ocx), Form (untuk menyimpan form), Module (untuk menyimpan berbagai module), Resource (untuk menyimpan file manifest, sound, image, icon), Database (menyimpan file database kamus), Setup (untuk menyimpan hasil compile installer, disini yang akan digunakan adalah InnoSetup)

Langkah-langkah
  • Buka project Anda pada Windows Explorer, selanjutnya buatlah folder ActiveX, Form, Module, Resource, Database, Setup

  • Buka project Anda melalui Windows Explorer dengan cara mendobel klik prjKamus

  • Klik kanan frmKamus >> Save As dan simpanlah pada folder Form

  • Klik kanan modMain >> Save As dan simpanlah pada folder Module

  • Simpan file manifest (XP.manifest.res) pada folder Resource

  • Buka Windows Explorer, hapus seluruh file yang berada diluar folder yang telah kita buat, dan sisakan hanya dua yang tidak boleh dihapus yaitu prjKamus.vbp dan prjKamus.vbw

Kode-kode
Tidak Ada

Uji Coba
Double klik prjKamus.vbp yang terdapat dalam Windows Explorer, jika prosedur yang Anda tempuh benar maka ia tidak akan menampilkan pesan Error.

Catatan
Tidak Ada

Bersambung pada bagian ke-6 ...
READ MORE - Kamus Inggris - Merapikan Project - Bagian ke-5

Smart OCX Dependencies Finder - Reusable Module VB6

Tools atau tepatnya module reusable ini, sangat tepat bagi Anda yang sering membuat project-project demo yang melibatkan ocx, tujuannya agar kita tidak lupa menyertakan file ocx tersebut ke dalam project demo yang sedang dibuat, disamping itu module ini akan membuat tiga file Install.bat, UnInstall.bat, dan Readme.txt semuanya berjalan secara dinamis dan otomatis tentunya ini akan mempermudah pekerjaan Anda. (bagaimana jika dimodifikasi menjadi software Dipendencies Walker sederhana?).

Seperti yang kita ketahui, walaupun komponen ocx yang kita gunakan telah teregister dalam registry, akan tetapi file ocx-ocx tersebut tidak selalu berada pada folder %systemroot%\system32\, dan hal tersebut diperparah dengan seringnya kita meregister melalui contect menu (klik kanan melalui Windows Explorer) atau menggunakan tools-tools kecil tanpa mengkopi terlebih dahulu file-file ocx-nya ke dalam folder %systemroot%\system32\.

Kode utamanya adalah milik Waty Thierry, selanjutnya saya memodifikasinya sehingga menjadi Smart OCX Dependencies Finder.

'simpan kode di bawah dalam module, atau Anda buat menu Add-Ins agar mudah diakses 
' ---------------------------------------------------------------------------
' Programmer Name : Waty Thierry
' Web Site : www.geocities.com/ResearchTriangle/6311/
' E-Mail : waty.thierry@usa.net
' Date : 03/10/1999
' Time : 10:30
' ---------------------------------------------------------------------------
' Comments : List all DLL and OCX dependencies a
' process has
' Put declarations and function into a .bas module
' Call the function by passing an empty string array
' Then read back the answer from the same array:
' e.g., dim sArray() as string, iCtr as integer
' GetProcessModules sArray
' For ictr = 0 to ubound(sArray)
' Debug.print sArray(ictr)
' Next
' ---------------------------------------------------------------------------

Option Explicit

Private Const
MAX_MODULE_NAME32 = 255
Private Const MAX_PATH = 260
Private Const TH32CS_SNAPMODULE = &H8

Private Type
MODULEENTRY32
dwSize As Long
th32ModuleID As Long
th32ProcessID As Long
GlblcntUsage As Long
ProccntUsage As Long
modBaseAddr As Long
modBaseSize As Long
hModule As Long
szModule As String * 256
szExePath As String * MAX_PATH
End Type

Private Declare Function
CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function
Module32First Lib "kernel32" ByVal hSnapShot As Long, lpMe32 As MODULEENTRY32) As Long
Private Declare Function
Module32Next Lib "kernel32" ByVal hSnapShot As Long, lpMe32 As MODULEENTRY32) As Long
Private Declare Sub
CloseHandle Lib "kernel32" ByVal hPass As Long)
Private Declare Function RtlMoveMemory Lib "kernel32" ByVal pDest As Any, ByVal pSource As Any, ByVal ByteLen As Long) As Long
Private Declare Function
GetCurrentProcessId Lib "kernel32" ) As Long

Public Function
GetProcessModules(DependencyList() As String) As Boolean

Dim
Me32 As MODULEENTRY32
Dim lRet As Long
Dim
lhSnapShot As Long
Dim
pID As Long
Dim
iLen As Integer
Dim
sModule As String
pID = GetCurrentProcessId

ReDim
DependencyList(0) As String

lhSnapShot = CreateToolhelpSnapshot(TH32CS_SNAPMODULE, CLng(pID))

If
lhSnapShot = 0 Then
GetProcessModules = False
Exit Function
End If

Me32.dwSize = Len(Me32)

lRet = Module32First(lhSnapShot, Me32)

Do While
lRet

If
Me32.th32ProcessID = CLng(pID) Then

With
Me32
iLen = InStr(.szExePath, Chr(0))
If iLen = 0 Then
sModule = CStr(.szExePath)
Else
sModule = Left(.szExePath, iLen - 1)
End If

If
DependencyList(0) = "" Then
DependencyList(0) = sModule
Else
ReDim Preserve
_
DependencyList(UBound(DependencyList) + 1)

DependencyList(UBound(DependencyList)) = sModule
End If

End With

End If

lRet = Module32Next(lhSnapShot, Me32)
Loop

CloseHandle lhSnapShot
GetProcessModules = True
Exit Function
TheErr:
GetProcessModules = False
End Function

' === End modul milik Waty Thierry ===

'----------------------------------------------------------------------------
'Kode di bawah merupakan kode yang saya buat, Anda dapat memodifikasinya
'agar sesuai dengan kebutuhan Anda.
'kode ini akan membuat tiga file dan satu folder, secara berturut-turut
'file Install.bat, UnInstall.bat, Readme.txt dan terakhir folder ActiveX
'---------------------------------------------------------------------------

'Cek keberadaan file dan folder, kedua fungsi di bawah bisa dimodif dan dijadikan
'satu buah fungsi
Public Function IsFolderExist(FolderName As String) As Boolean
IsFolderExist = Dir$(FolderName, vbDirectory + vbHidden) <> "")
End Function

Public Function
IsFileExist(FileName As String) As Boolean
IsFileExist = Dir$(FileName, vbHidden + vbSystem + vbNormal) <> ""
End Function

'Fungsi untuk mendapatkan file dari path lengkap:
Public Function GetFileName(FileName As String) As String
Dim
str() As String
str = Split(FileName, "\")
GetFileName = str(UBound(str))
End Function

'Cek apakah masih dalam IDE VB6
Public Function IsInIDE() As Boolean
On Error GoTo
ErrHandler
Debug.Print 1 / 0
ErrHandler:
IsInIDE = Err
End Function

'------------------------------------------------------------------------------
'Buat tiga file Install.bat, UnInstall.bat, Readme.txt, dan folder ActiveX
'disini saya hanya memperbolehkan/memfilter ocx saja
'------------------------------------------------------------------------------

Public Sub
CreateOCXDependencies()
If Not IsInIDE Then Exit Sub

Dim
sArray() As String, iCtr As Integer, strMsg As String
GetProcessModules sArray

If Not
IsFolderExist(App.Path & "\ActiveX") Then
MkDir
App.Path & "\ActiveX"
End If

If
IsFileExist(App.Path & "\Install.bat") Then
Kill
App.Path & "\Install.bat"
End If

If
IsFileExist(App.Path & "\UnInstall.bat") Then
Kill
App.Path & "\UnInstall.bat"
End If

Open
App.Path & "\Install.bat" For Append As #1
Print #1, "Copy ActiveX\-.- %systemroot%\system32\"
For iCtr = 0 To UBound(sArray)
If InStr(1, LCase(sArray(iCtr)), "ocx") > 0 Then 'just ocx
FileCopy sArray(iCtr), App.Path & "\ActiveX\" & GetFileName(sArray(iCtr))
Print #1, "RegSvr32.exe " & Chr(34) & "%systemroot%\system32\" & GetFileName(sArray(iCtr)) & Chr(34) & " /s"
End If
Next
Print
#1, "cmd.exe"
Close #1

Open
App.Path & "\UnInstall.bat" For Append As #1
For iCtr = 0 To UBound(sArray)
If InStr(1, LCase(sArray(iCtr)), "ocx") > 0 Then 'just ocx
Print #1, "RegSvr32.exe " & Chr(34) & "%systemroot%\system32\" & GetFileName(sArray(iCtr)) & Chr(34) & " /s /u"
End If
Next
Print
#1, "cmd.exe"
Close #1
strMsg = "Sebelum menjalankan project ini, dobel klik file Install.bat terlebih dahulu, untuk meregister komponen-kompenen yang dibutuhkan"
If Not IsFileExist(App.Path & "\Readme.txt") Then
Open
App.Path & "\Readme.txt" For Append As #1
Print #1, strMsg
Close #1
End If
End Sub
Contoh penggunaan module diatas:
Private Sub Form_Load() 
CreateOCXDependencies 'hanya satu jajar kode saja untuk memanggilnya prosedur di atas
'kode selanjutnya ...
End Sub
READ MORE - Smart OCX Dependencies Finder - Reusable Module VB6

Kamus Inggris - Fasilitas Popup Windows - Bagian ke-6

Yang dimaksud dengan Popup Windows disini adalah aplikasi yang dapat tampil paling depan. Modul Popup Windows ini diambil dari software Kamus Bahasa Arab. Inti dari modul popup ini hanyalah satu jajar kode API yaitu SetForegroundWindow.

Tujuan pada bagian ke-6
Menambahkan fasilitas Popup Windows

Langkah-langkah
Tambahkan satu modul, selanjutnya gantilah namanya menjadi modForeGround.
Gantilah kode di bawah menjadi:
    If s <> strFromClipboard Then 
ParsingText s, List1
strFromClipboard = s
Text1.Text = strFromClipboard
pSetForegroundWindow hwnd 'ini untuk memanggil aplikasi agar dapat tampil paling depan
End If
Kode diatas terdapat pada:
Private Sub Timer1_Timer() 
Seperti yang telah dijelaskan pada bagian ke-3.

Kode-kode
Option Explicit 

Public Declare Function
FindWindow Lib "user32" Alias "FindWindowA" ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function
AttachThreadInput Lib "user32" ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long
Declare Function
GetForegroundWindow Lib "user32" ) As Long
Declare Function
GetWindowThreadProcessId Lib "user32" ByVal hwnd As Long, lpdwProcessId As Long) As Long
Declare Function
IsIconic Lib "user32" ByVal hwnd As Long) As Long
Declare Function
SetForegroundWindow Lib "user32" ByVal hwnd As Long) As Long
Declare Function
ShowWindow Lib "user32" ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Public Declare Function
BringWindowToTop Lib "user32" ByVal hwnd As Long) As Long

Public Const
SW_SHOW = 5
Public Const SW_RESTORE = 9
Public Const GW_OWNER = 4
Public Const GWL_HWNDPARENT = -8)
Public Const GWL_EXSTYLE = -20)
Public Const WS_EX_TOOLWINDOW = &H80
Public Const WS_EX_APPWINDOW = &H40000

Public Sub
pSetForegroundWindow(ByVal hwnd As Long)

Dim
lForeThreadID As Long
Dim
lThisThreadID As Long
Dim
lReturn As Long

If
hwnd <> GetForegroundWindow() Then
If
IsIconic(hwnd) Then
Call
ShowWindow(hwnd, SW_RESTORE)
Else
Call
ShowWindow(hwnd, SW_SHOW)
End If
lForeThreadID = GetWindowThreadProcessId(GetForegroundWindow, ByVal 0&)
lThisThreadID = GetWindowThreadProcessId(hwnd, ByVal 0&)
If lForeThreadID <> lThisThreadID Then
Call
AttachThreadInput(lForeThreadID, lThisThreadID, True)
lReturn = SetForegroundWindow(hwnd)
BringWindowToTop hwnd
Call AttachThreadInput(lForeThreadID, lThisThreadID, False)
Else
lReturn = SetForegroundWindow(hwnd)
BringWindowToTop hwnd
End If
End If

End Sub
Uji Coba
  • Compile terlebih dahulu projectnya
  • Jalankan aplikasi melalui Windows Explorer
  • Copy sembarang text, dari MSWord, Browser, dsb.
  • Jika prosedurnya benar, maka aplikasi tersebut akan tampil paling depan.

READ MORE - Kamus Inggris - Fasilitas Popup Windows - Bagian ke-6

Menyembunyikan TextBox dan ComboBox Caret Menggunakan VB6

Terkadang dalam sebuah aplikasi, kita membutuhkan kode untuk menyembunyikan caret yang terdapat dalam TextBox maupun ComboBox. Nah, bagaimana cara menyembunyikan caret yang terdapat dalam TextBox maupun ComboBox menggunakan Visual Basic 6.0 (VB6)? kode di bawah mungkin jawabannya:
'simpan kode di bawah pada modul 
Option Explicit

Private Declare Function
FindWindowEx Lib "user32" Alias "FindWindowExA" ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
'Public Declare Function HideCaret Lib "user32" ByVal hwnd As Long) As Long

'prosedur memperoleh handle edit yang terdapat dalam ComboBox
Public Function EditComboHWND(cmb As ComboBox) As Long
Dim r As Long
r =
FindWindowEx(cmb.hwnd, ByVal 0&, "Edit", vbNullString)
EditComboHWND = r
End Function
Contoh penggunaan:
'simpan kode ini pada Form 
Option Explicit

Private Sub
Combo1_GotFocus()
'sembunyikan caret yang terdapat dalam ComboBox
HideCaret EditComboHWND(Combo1)
End Sub

Private Sub
Text1_GotFocus()
'sembunyikan caret yang terdapat pada TextBox
HideCaret Text1.hwnd
End Sub
READ MORE - Menyembunyikan TextBox dan ComboBox Caret Menggunakan VB6