Tuesday, August 23, 2011

PictureBox Yang Diberi Theme/Style - Visual Basic 6

Menjelaskan mengenai cara memberi theme pada object PictureBox - Apabila kita memperhatikan pada posting sebelumnya mengenai ToolBar, TabStrip, TreeView, dan ListView XP Style Tanpa Kode, maka kita akan melihat jelas object TabStrip yang memiliki theme. Nah, object TabStrip tersebut umumnya (tidak selalu) membutuhkan beberapa PictureBox dalam melakukan tugasnya, yang menjadi persoalan sekarang PictureBox tersebut apabila digunakan bersamaan dengan TabStrip akan memiliki perbedaan warna yang mencolok dan ini menyebabkan rancangan GUI yang kurang baik, bagaimana kita mengatasi permasalahan ini? Perhatikan gambar Setting Winrar di bawah ini:

Setidaknya ada dua cara untuk memberi mengatasi masalah PictureBox di atas, pertama memberi theme pada PictureBox, alternatif yang kedua adalah Fake Gradient dengan menyelaraskan warna PictureBox dengan warna TabStrip yang gradient.

Expand Code...

'--------------------------------------------------------------------------------------------------- 
'Author: Jottum -- Simpan kode di bawah ini pada module --
'---------------------------------------------------------------------------------------------------
Option Explicit

'API Declarations.

Private Type
RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Private Const
LF_FACESIZE = 32

Private Type
FONTSLOG
flfHeight As Long
flfWidth As Long
flfEscapement As Long
flfOrientation As Long
flfWeight As Long
flfItalic As Byte
flfUnderline As Byte
flfStrikeOut As Byte
flfCharSet As Byte
flfOutPrecision As Byte
flfClipPrecision As Byte
flfQuality As Byte
flfPitchAndFamily As Byte
flfFaceName As String * LF_FACESIZE
End Type

Private Declare Function
GetDC Lib "user32" _
(ByVal hwnd As Long) As Long

Private Declare Function
ReleaseDC Lib "user32" _
(ByVal hwnd As Long, ByVal hDC As Long) As Long

Private Declare Function
GetClientRect Lib "user32" _
(ByVal hwnd As Long, lpRect As RECT) As Long

Private Declare Function
InflateRect Lib "user32" _
(lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long

Declare Function
GetDesktopWindow Lib "user32" _
() As Long

Private Declare Function
DrawEdge Lib "user32" _
(ByVal hDC As Long, qrc As RECT, ByVal edge As Long, _
ByVal grfFlags As Long) As Long

Private Declare Function
DrawText Lib "user32" _
Alias "DrawTextA" (ByVal hDC As Long, ByVal lpStr As String, _
ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long

Private Declare Function
BitBlt Lib "gdi32" _
(ByVal hdcDest As Long, ByVal xDest As Long, ByVal yDest As Long, _
ByVal nWidth As Long, ByVal nHeight As Long, ByVal hdcSrc As Long, _
ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

Private Declare Function
DrawFocusRect Lib "user32" _
(ByVal hDC As Long, lpRect As RECT) As Long


'Theme API Declarations.

Private Declare Function
GetThemeFont Lib "uxtheme.dll" ( _
ByVal hTheme As Long, _
ByVal hDC As Long, _
ByVal iPartId As Long, _
ByVal iStateId As Long, _
ByVal iPropId As Long, _
tLogFont As FONTSLOG) As Long

Private Declare Function
OpenThemeData Lib "uxtheme.dll" _
(ByVal hwnd As Long, ByVal pszClassList As Long) As Long

Private Declare Function
IsThemeActive Lib "uxtheme.dll" _
() As Boolean

Private Declare Function
CloseThemeData Lib "uxtheme.dll" _
(ByVal hTheme As Long) As Long

Private Declare Function
DrawThemeBackground Lib "uxtheme.dll" _
(ByVal hTheme As Long, ByVal lHdc As Long, _
ByVal iPartId As Long, ByVal iStateId As Long, _
pRect As RECT, pClipRect As RECT) As Long

Private Declare Function
DrawThemeText Lib "uxtheme.dll" _
(ByVal hTheme As Long, ByVal hDC As Long, ByVal iPartId As Long, _
ByVal iStateId As Long, ByVal pszText As Long, _
ByVal iCharCount As Long, ByVal dwTextFlag As Long, _
ByVal dwTextFlags2 As Long, pRect As RECT) As Long

Private Declare Function
GetThemeRect Lib "uxtheme.dll" ( _
ByVal hTheme As Long, _
ByVal iPartId As Long, _
ByVal iStateId As Long, _
ByVal iPropId As Long, _
ByRef pRect As RECT) As Long

'Types, Enums and Constants...

'Tab constants.
Private Enum ThemeTabParts
TAB_TABITEM = 1
TAB_TABITEMLEFTEDGE = 2
TAB_TABITEMRIGHTEDGE = 3
TAB_TABITEMBOTHEDGE = 4
TAB_TOPTABITEM = 5
TAB_TOPTABITEMLEFTEDGE = 6
TAB_TOPTABITEMRIGHTEDGE = 7
TAB_TOPTABITEMBOTEDGE = 8
TAB_PANE = 9
TAB_BODY = 10
End Enum

Private Enum
ThemeTabItemStates
TIS_NORMAL = 1
TIS_HOT = 2
TIS_SELECTED = 3
TIS_DISABLED = 4
TIS_FOCUSED = 5
End Enum

Private Enum
ThemeTabItemLeftEdgeStates
TILES_NORMAL = 1
TILES_HOT = 2
TILES_SELECTED = 3
TILES_DISABLED = 4
TILES_FOCUSED = 5
End Enum

Private Enum
ThemeTabItemRightEdgeStates
TIRES_NORMAL = 1
TIRES_HOT = 2
TIRES_SELECTED = 3
TIRES_DISABLED = 4
TIRES_FOCUSED = 5
End Enum

Private Enum
ThemeTabItemBotEdgeStates
TIBES_NORMAL = 1
TIBES_HOT = 2
TIBES_SELECTED = 3
TIBES_DISABLED = 4
TIBES_FOCUSED = 5
End Enum

Private Enum
ThemeTopTabItemStates
TTIS_NORMAL = 1
TTIS_HOT = 2
TTIS_SELECTED = 3
TTIS_DISABLED = 4
TTIS_FOCUSED = 5
End Enum

Private Enum
ThemeTopTabItemLeftEdgeStates
TTILES_NORMAL = 1
TTILES_HOT = 2
TTILES_SELECTED = 3
TTILES_DISABLED = 4
TTILES_FOCUSED = 5
End Enum

Private Enum
ThemeTopTabItemRightEdgeStates
TTIRES_NORMAL = 1
TTIRES_HOT = 2
TTIRES_SELECTED = 3
TTIRES_DISABLED = 4
TTIRES_FOCUSED = 5
End Enum

Private Enum
ThemeTopTabItemBotEdgeStates
TTIBES_NORMAL = 1
TTIBES_HOT = 2
TTIBES_SELECTED = 3
TTIBES_DISABLED = 4
TTIBES_FOCUSED = 5
End Enum

'DrawTabThemeBackground() constants.
Public Const DTTB_HIDEPANE = True
Public Const
DTTB_SHOWPANE = False 'Default if omitted
Public Const DTTB_SHOWERRMSG = True
Public Const
DTTB_HIDERRMSG = False 'Default if omitted
Public Const DTTB_HIDEBODY = True 'Default is False, show the body

'IsThemed() constant.
Public Const IT_SHOWERRMSG = True

'Miscellaneous
Private Const DT_LEFT = &H0
Private Const DT_TOP = &H0
Private Const DT_CENTER = &H1
Private Const DT_RIGHT = &H2
Private Const DT_VCENTER = &H4
Private Const DT_BOTTOM = &H8&
Private Const DT_SINGLELINE = &H20

Private Const
TMT_FONT = 210

'\DrawEdge
Private Const BDR_RAISEDOUTER = &H1
Private Const BDR_SUNKENOUTER = &H2
Private Const BDR_RAISEDINNER = &H4
Private Const BDR_SUNKENINNER = &H8

Private Const
BDR_OUTER = &H3
Private Const BDR_INNER = &HC
Private Const BDR_RAISED = &H5
Private Const BDR_SUNKEN = &HA

Private Const
EDGE_RAISED = (BDR_RAISEDOUTER Or BDR_RAISEDINNER)
Private Const EDGE_SUNKEN = (BDR_SUNKENOUTER Or BDR_SUNKENINNER)
Private Const EDGE_ETCHED = (BDR_SUNKENOUTER Or BDR_RAISEDINNER)
Private Const EDGE_BUMP = (BDR_RAISEDOUTER Or BDR_SUNKENINNER)

Private Const
BF_LEFT = &H1
Private Const BF_TOP = &H2
Private Const BF_RIGHT = &H4
Private Const BF_BOTTOM = &H8

Private Const
BF_TOPLEFT = (BF_TOP Or BF_LEFT)
Private Const BF_TOPRIGHT = (BF_TOP Or BF_RIGHT)
Private Const BF_BOTTOMLEFT = (BF_BOTTOM Or BF_LEFT)
Private Const BF_BOTTOMRIGHT = (BF_BOTTOM Or BF_RIGHT)
Private Const BF_RECT = (BF_LEFT Or BF_TOP Or BF_RIGHT Or BF_BOTTOM)
' --/
'
'Public

'*******************************************************************************************************
'********************************************
'********************* Function DrawTabThemeBackground
'**
'*
'* Author: Jottum
'* Date : 07/15/2007 (mm/dd/yyyy)
'* Site : http://www.uitdeschriften.com/files/VB6
'*
'* The function DrawTabThemeBackground draws a Tab pane, body, pane and body, or a fake tab on any
'* object with a DC.
'*
'* Usage example:
'* ï؟½ï؟½ï؟½ï؟½ï؟½ï؟½ï؟½ï؟½ï؟½ï؟½ï؟½ï؟½ï؟½ï؟½
'* DrawTabThemeBackground Me 'Draws on object Me, Pane + Body, no Error Messages.
'*
'* DrawTabThemeBackground Picturebox1, DTTB_HIDEPANE 'Draws on Picturebox1, just the gradient, not the pane
'*
'* DrawTabThemeBackground Form2, , DTTB_SHOWERRMSG 'Draws Pane + Body on Form2 and displays errors (If any).
'* __________________
'* End Usage example:
'*
'* Note:
'* ï؟½ï؟½ï؟½ï؟½ï؟½
'* This is just an example function to show how UxTheme.Dll can be used from VB6.
'* _________
'* End Note:
'*
'* Syntax:
'* ï؟½ï؟½ï؟½ï؟½ï؟½ï؟½ï؟½
'* DrawTabThemeBackground Object, Flag, Flag, Header 'Any object with a hDc property.
'* '1st True is gradient only (Body).
'* Or '2nd True is show errors. (If any)
'* '3rd fakes a tab control.
'* DrawTabThemeBackground Object
'*
'* Returns: True or False, this enables you to check by code if executed successful.
'*
'* If DrawTabThemeBackground(Me, DTTB_SHOWPANE, DTTB_SHOWERRMSG, "Fake Tab", DTTB_HIDEBODY) then
'*
'* 'Magic coding here.
'*
'* Else
'*
'* 'Perform a miracle. ;)
'*
'* End If
'* ___________
'* End Syntax:
'*
'**
'*********************
'********************************************
'*******************************************************************************************************

Public Function
DrawTabThemeBackground(Obj As Object, _
Optional lBodyOnly As Boolean = False, _
Optional ShowErrMsg As Boolean = False, _
Optional TabTitle As String = vbNullString, _
Optional lNoBody As Boolean = False) As Boolean

On Error GoTo
ThemeError 'Catch errors.

Dim
hTheme As Long 'Declare local variables
Dim lR As Long
Dim
tR As RECT
Dim tR2 As RECT
Dim tTextR As RECT
Dim cControl As Control
Dim lTmp As Long
Dim
strLength As Long

If
lBodyOnly And lNoBody Then
Err.Raise 520, _
"DrawTabThemeBackground", _
"Error in function call, check parameters: " & _
vbCrLf & vbCrLf & " lBodyOnly and lNoBody are both true. " & _
vbCrLf
End If

'The only reason you can cause this problem is the design of this function,
'which in this case is a feature and not a bug. ;) It gives me the chance
'to demonstrate Error Raising in user functions.
'
'I could have taken a little different aproach in function design or just
'validate the other variables passed, and act accordingly.
'
'For example if TabTitle <> vbNullString, the developer wants to fake a
'Tab Control and that *has* to have a Tab pane. In any other situation
'I could have used the first True and set the conflicting variable to False.
'
'When the developer looks at the form at runtime, he'll notice the Tab isn't
'what he expected it to be. He can now do two things, say the function sucks
'and move on, or look at the way he's calling it... <g>
'
'Error raising can be usefull if your function isn't generating any errors
'as far as the compiler's concern, but to you as developer and therefore the
'enduser. But let's get on with it.

If
ThemeSysFont <> vbNullString Then

On Error Resume Next
Obj.Font.Name = ThemeSysFont 'Or it looks real bad!... well,
On Error GoTo 0 'to me that is of course... ;)

End If

GetClientRect Obj.hwnd, tR 'Get the drawing area rectangle

If Not
TabTitle = vbNullString Then 'Some calculating...

tR.Top = 165 / Screen.TwipsPerPixelY 'Top margin
tR.Left = 135 / Screen.TwipsPerPixelX 'Left margin
tR.Right = tR.Right - (120 / Screen.TwipsPerPixelX) 'Right margin
tR.Bottom = tR.Bottom - (650 / Screen.TwipsPerPixelY) 'Button margin below the Tab.

tR2.Top = 150 / Screen.TwipsPerPixelY 'Tab text.
tR2.Left = 135 / Screen.TwipsPerPixelX
tR2.Bottom = 435 / Screen.TwipsPerPixelY
tR2.Right = (Obj.TextWidth(TabTitle) / Screen.TwipsPerPixelX) + 24
tR.Top = tR.Top + (tR2.Bottom - tR2.Top) - 2 ' Make some space for header.

strLength = (Obj.TextWidth(TabTitle) / Screen.TwipsPerPixelX)
'Get length of TabTitle.
End If

If
IsThemed_(Obj.hwnd) Then 'Check for theme presence

Obj.Cls 'Clear Objects surface.
Obj.AutoRedraw = True 'Make sure AutoRedraw = True
Obj.BackColor = vbButtonFace 'Should be default with a Tab
'Control.
hTheme = OpenThemeData(Obj.hwnd, StrPtr("Tab")) 'Open with correct theme item

If Not
lBodyOnly Then 'They want the gradient...

If
TabTitle = vbNullString Then '...but not to fake a tab.

tR.Top = tR.Top + 1 'Zero doesn't paint the top and
tR.Left = tR.Left + 1 'left borders on a visible part
'of Obj.
End If

lR = DrawThemeBackground(hTheme, Obj.hDC, _
TAB_PANE, _
TIS_NORMAL, _
tR, tR) 'Draw the Tab Pane (No gradient
'background)

If Not
lNoBody Then


InflateRect tR, -3, -3 'Adjust the rectangle size, to
'Draw the Tab body (Gradient)
'inside the Tab Pane.
lR = DrawThemeBackground(hTheme, Obj.hDC, _
TAB_BODY, _
TIS_NORMAL, _
tR, tR) 'Draw Tab body (Gradient
End If 'background)

Else

If Not
lNoBody Then

lR = DrawThemeBackground(hTheme, Obj.hDC, _
TAB_BODY, _
TIS_NORMAL, _
tR, tR) 'Draw Tab body (Gradient
'background)
End If

End If

InflateRect tR2, 0, 1 'A little adjustment ...

If Not
TabTitle = vbNullString Then

lR = DrawThemeBackground(hTheme, Obj.hDC, _
TAB_TOPTABITEM, _
TIBES_SELECTED, _
tR2, tR2) 'Draw Tab Header

lR = DrawThemeBackground(hTheme, Obj.hDC, _
TAB_TOPTABITEMRIGHTEDGE, _
TTIRES_SELECTED, _
tR2, tR2) 'Draw Tab Header Right Edge

lR = DrawThemeBackground(hTheme, Obj.hDC, _
TAB_TOPTABITEMLEFTEDGE, _
TILES_SELECTED, _
tR2, tR2) 'Draw Tab Header Left Edge

tR2.Top = tR2.Top + 4 'A little smuggling ...

lR = DrawThemeText(hTheme, _
Obj.hDC, _
TAB_TOPTABITEM, _
TTIBES_SELECTED, _
StrPtr(TabTitle), _
-1, _
DT_CENTER Or DT_VCENTER, _
0, _
tR2) 'Draw the text.


End If

CloseThemeData hTheme 'Release Handle
DrawTabThemeBackground = True 'Success, return True.

Exit Function

Else
'Draw legacy fake tab.

GetClientRect Obj.hwnd, tR 'Get the drawing area rectangle

tR.Top = 120 / Screen.TwipsPerPixelY 'Top margin
tR.Left = 120 / Screen.TwipsPerPixelX 'Left margin
tR.Right = (Obj.Width / Screen.TwipsPerPixelX) - (215 / Screen.TwipsPerPixelX) 'Right margin
tR.Bottom = tR.Bottom - (630 / Screen.TwipsPerPixelY) 'Button margin below the Tab.

tR2.Top = 135 / Screen.TwipsPerPixelY 'Tab text.
tR2.Left = 120 / Screen.TwipsPerPixelX
tR2.Bottom = 465 / Screen.TwipsPerPixelY
tR2.Right = (Obj.TextWidth(TabTitle) / Screen.TwipsPerPixelX) + 25
tR.Top = tR.Top + (tR2.Bottom - tR2.Top) '- 2 ' Make some space for header.

DrawEdge Obj.hDC, tR, EDGE_RAISED, BF_RECT

If Not
TabTitle = vbNullString Then

DrawEdge Obj.hDC, tR2, EDGE_RAISED, BF_RIGHT

DrawEdge Obj.hDC, tR2, EDGE_RAISED, BF_LEFT

DrawEdge Obj.hDC, tR2, EDGE_RAISED, BF_TOP

'Since whe're only drawing the borders, the legacy fake Tab is fully
'Transparent. With the below function, I'm smuggling a little again
'by copying a small part just below the frame top edge and draw it
'over the frame top edge where the caption will be drawn.

lR = BitBlt(Obj.hDC, tR2.Left + 2, tR2.Bottom - 1, strLength + 15, tR2.Left + 3, _
Obj.hDC, tR2.Left + 2, tR2.Bottom + 1, vbSrcCopy)

tR2.Right = tR2.Right - 8
tR2.Top = tR2.Top + 6

DrawText Obj.hDC, TabTitle, Len(TabTitle), tR2, vbButtonText

End If

DrawTabThemeBackground = True

Exit Function

End If

ThemeError:

DrawTabThemeBackground = False 'Function failed...

If
ShowErrMsg Then

If
MsgBox("An Error occurred in Function DrawTabThemeBackground: " & vbCrLf & vbCrLf & _
"Return value" & vbTab & ": " & Str$(lR) & vbCrLf & _
"Error number" & vbTab & ": " & Err.Number & vbCrLf & _
"Error description" & vbTab & ": " & Err.Description & " " & vbCrLf & _
"Error Object" & vbTab & ": " & Obj.Name & vbCrLf & _
"Error source" & vbTab & ": " & Err.Source & vbCrLf & vbCrLf & _
"Would you like to try to continue executing this function? ", _
vbExclamation + vbYesNo) = vbYes Then

Resume Next

Else

Resume
AllNotSoWell

End If

Else

Resume
AllNotSoWell

End If

AllNotSoWell:

Exit Function

End Function

'*******************************************************************************************************
'********************************************
'********************* FUNCTION ISTHEMED_
'**
'*
'* Author: Jottum
'* Date : 07/15/2007 (mm/dd/yyyy)
'* Site : http://www.uitdeschriften.com/files/VB6
'*
'* The function IsThemed_ checks if there's any theming going on, if so it tries to get a
'* handle from the function OpenThemeData. If this succeeds the hTheme variable contains
'* that handle, otherwise it's 0. (If it's 0 you can't use the theming functions.)
'*
'* Usage example:
'* ï؟½ï؟½ï؟½ï؟½ï؟½ï؟½ï؟½ï؟½ï؟½ï؟½ï؟½ï؟½ï؟½ï؟½
'* If IsThemed_([hWnd], [bShowErrorMessage]) then
'*
'* 'Draw/Do theme stuff
'*
'* Else
'*
'* 'Draw/Do legacy stuff
'*
'* End If
'* ______________
'* Usage example:
'*
'* Note:
'* ï؟½ï؟½ï؟½ï؟½ï؟½
'* - I renamed the function from IsThemed to IsThemed_ and declared it private to avoid any
'* possible conflicts with an existing, equally named public declared function. If you would
'* like to have this function globally available, Copy and Paste the entire function to one
'* of your .BAS modules, change Private to Public and remove all Underscores (6 of them... I think;).
'*
'* - You can now call IsThemed() from anywhere in your application.
'*
'* - The hWnd parameter is optional, the default is the Desktop's. Me.hWnd is just an example,
'* any valid hWnd - or none at all, it'll fetch the desktop's - will do.
'* _________
'* End Note:
'*
'* The IT_SHOWERRMSG (bShowErrorMessage) parameter is optional, the default is False which means
'* it doesn't show the errors (if any) it traps. It could be useful - for example when debuging
'* unexpected behavior in your application, or while still developing - to set it to true.
'*
'* Syntax:
'* ï؟½ï؟½ï؟½ï؟½ï؟½ï؟½ï؟½
'* Dim bShowErrorMessage As Boolean 'If declared Public in a module, you can
'* 'set this flag application wide
'* Dim bReturnValue As Boolean
'*
'* bShowErrorMessage = True
'*
'* bReturnValue = IsThemed([ANY_VALID_HWND], [bShowErrorMessage])
'*
'* Or 'No hWnd, static show Error Messages.
'*
'* bReturnValue = IsThemed( , [IT_SHOWERRMSG])
'*
'* Or 'hWnd and show Error Messages
'*
'* bReturnValue = IsThemed([ANY_VALID_HWND], [IT_SHOWERRMSG])
'*
'* Or 'hWnd, no Error Messages
'*
'* If IsThemed_([ANY_VALID_HWND]) Then ....
'*
'* Or 'Use all defaults (Desktop hWnd),
'* ,no Error Messages
'* If IsThemed_() Then ....
'* ___________
'* End Syntax:
'*
'**
'*********************
'********************************************
'*******************************************************************************************************

Public Function
IsThemed_(Optional hwnd As Long = 0, Optional ShowErrMsg As Boolean = False) As Boolean

On Error GoTo
ThemeError 'Catch errors, like calling a DLL 'Catch errors...
'function and no DLL in sight. (W2K ?)
Dim hTheme As Long 'Declare variable for Theme Handle

If
IsThemeActive() Then 'Aha, theming! Now try to get a handle.

If
hwnd = 0 Then 'But first make sure we've got a valid
'hWnd passed, and if not get the
hwnd = GetDesktopWindow 'Desktop's

End If

hTheme = OpenThemeData(hwnd, StrPtr("Status")) 'Any pszClasslist item will do, I
'just picked "Status" at random.
If (hTheme <> 0) Then 'We've got a handle

CloseThemeData hTheme 'Release handle.
IsThemed_ = True 'Return Success.

Exit Function
'We don't want to bump into
'ThemeError. ;)
Else

IsThemed_ = False 'Can't get a handle, so nothing is open.

Exit Function
'Let's split!

End If

Else

IsThemed_ = False 'No theming!

Exit Function
'Let's split here too!

End If

ThemeError:

IsThemed_ = False 'Don't forget to set flag to false.

If
ShowErrMsg Then '... display MessageBox with Error

MsgBox "An Error occurred in Function IsThemed_: " & vbCrLf & vbCrLf & _
"Error number" & vbTab & ": " & Err.Number & vbCrLf & _
"Error description" & vbTab & ": " & Err.Description & " " & vbCrLf & _
"Error source" & vbTab & ": " & Err.Source & vbCrLf & vbCrLf & _
"Code execution has stopped for this call. ", vbExclamation

End If

Resume
AllNotSoWell

AllNotSoWell:

Exit Function

End Function

'See WhatIsThemeFont just below.

Public Function
ThemeSysFont() As String

Dim
lHwnd As Long
Dim
lHdc As Long
Dim
lKind As Long
Dim
lState As Long

lHwnd = GetDesktopWindow
lHdc = GetDC(lHwnd)
lKind = 4 '4 = PB_GROUPBOX
lState = 1 '1 = PBS_NORMAL

ThemeSysFont = WhatIsThemeFont("Button", lHwnd, lHdc, lKind, lState)

ReleaseDC lHwnd, lHdc

End Function

'This function needs more attention. Will do that later.
'
'WhatIsThemeFont will return just a string containing the
'font name, not the font object.

Public Function
WhatIsThemeFont(pszClassListItem As String, lHwnd As Long, lHdc As Long, iPartId As Long, iState As Long) As String

On Error Resume Next

Dim
tLogFont As FONTSLOG
Dim hTheme As Long

If
IsThemed_(lHwnd) Then

hTheme = OpenThemeData(lHwnd, StrPtr(pszClassListItem))

If
hTheme <> 0 Then

GetThemeFont hTheme, lHdc, iPartId, iState, TMT_FONT, tLogFont

If
tLogFont.flfFaceName <> "" Then

WhatIsThemeFont = tLogFont.flfFaceName

Else

WhatIsThemeFont = "MS Sans Serif" 'Just to be safe.

End If

CloseThemeData hTheme

Else

WhatIsThemeFont = "MS Sans Serif"

'Not good if you get here, so show a message.

MsgBox "An Error occured retrieving a theme handle from OpenThemeData(): " & vbCrLf & vbCrLf & _
" - Function" & vbTab & ": WhatIsThemeFont " & vbCrLf & _
" - Module " & vbTab & ": DrawTabBckgrnd.bas ", vbCritical

End If

Else

WhatIsThemeFont = "MS Sans Serif" 'Default on any none themed OS, this is
'the dirty way, I know. :)
End If

On Error GoTo
0 'Reset normal error trapping

End Function

Contoh penggunaan:
Private Sub Form_Load() 
DrawTabThemeBackground Picture1 'memberi theme pada PictureBox
End Sub

Apakah pekerjaan kita selesai sampai disini? Tidak! setidaknya ada pekerjaan lagi yang harus dilakukan, pertama: melakukan transparansi terhadap object Frame, kedua: melakukan transparansi terhadap object OptionButton dan CheckBox. Mungkin pada posting selanjutnya.
READ MORE - PictureBox Yang Diberi Theme/Style - Visual Basic 6

Just One Click - LaVolpes Manifest Creator - Tools VB6

Tools VB6 ini - [VB6] XP/Vista/Win7 Manifest Creator - diambil dari sebuah Thread milik LaVolpe yang terdapat di situs VBForums - Setelah beberapa kali mencoba Manifest Creator yang dibuat oleh LaVolpe ternyata hasilnya sangat baik dan memuaskan dengan adanya fitur merger terhadap file resource yang telah ada. Walaupun demikian dalam penggunaannya sedikit merepotkan, terutama jika Anda memiliki banyak project yang harus ditambahkan manifest resouce. Akhirnya saya berinisiatif untuk merubahnya menjadi sebuah Add-Ins, sehingga sekarang memiliki fitur tambahan 'Just One Click'.

Download: LaVolpe's Manifest Creator.

Cara menggunakan:
  1. Ekstrak file, double klik install.bat untuk meregistrasikan komponen
  2. Buka project baru, atau project yang telah Anda buat.
  3. Klik menu Add-Ins >> ManifestCreator >> Create Manifest.
Ucapan terima kasih kepada LaVolpe yang telah membuat tools yang sangat bermanfaat ini.
READ MORE - Just One Click - LaVolpes Manifest Creator - Tools VB6

Monday, July 25, 2011

Software Flying-Fox 1.0 Ini Menggunakan Engine Google Transl

Ini merupakan software Kamus Bahasa Inggris Indonesia, database kamus ini menggunakan google translate, software yang menggunakan database google translate umumnya dinamakan dengan Google Translate Client, mungkin software ini merupakan salah satunya. Mengenai kemampuannya, tentu saja sama dengan Google Translate, Ia dapat menerjemahkan satu kata, satu frase atau satu kalimat. Ia, saya beri nama dengan Flying-Fox 1.0, laksana seekor rubah lincah yang dapat terbang kesana kemari.

Proses Instalasi
Proses instalasi kamus ini sangat sederhana, ia tidak menggunakan InnoSetup Installer, hanya menggunakan file .bat biasa. Sehingga bisa disebut sebagai software semi portable dan bisa dijalankan dari Flashdisk.

Cara Menggunakan
  1. Jalankan Flying-Fox 10
  2. Buka dokumen berbahasa inggris, bisa dari word, wordpad, notepad, browser, dll.
  3. Double klik, untuk menterjemahkan satu kata dan gunakan blok & copy untuk menterjemahkan satu frase atau satu kalimat.

Software Kamus Bahasa Inggris Flying-Fox 1.0
[Download Flying-Fox 1.0]
READ MORE - Software Flying-Fox 1.0 Ini Menggunakan Engine Google Transl

Hanya 1 Baris Untuk Validasi Angka - Visual Basic 6

Di bawah ini merupakan kode untuk memvalidasi angka pada sebuah TextBox, maksudnya pada objek TextBox tersebut hanya memperbolehkan angka saja. Kodenya sangat sederhana, hanya satu baris saja yaitu: KeyAscii = IIf((KeyAscii > 47 And KeyAscii < 58) Or KeyAscii = 8, KeyAscii, 0)

Contoh penggunaan:
Private Sub Text1_KeyPress(KeyAscii As Integer) 
KeyAscii = IIf((KeyAscii > 47 And KeyAscii < 58) Or KeyAscii = 8, KeyAscii, 0)
End Sub

Kode di atas tentu saja bisa dikembangkan lebih baik, misalnya untuk angka di belakang koma, dsb.
READ MORE - Hanya 1 Baris Untuk Validasi Angka - Visual Basic 6

Cara Termudah Memperoleh Decimal Symbol - Visual Basic 6

Ini bisa dikatakan sebagai cara termudah untuk memperoleh decimal symbol dari regional setting, adapun kodenya adalah sebagai berikut:
Public Function GetDecimalSymbol() As Integer 
'akan memperoleh 44 untuk koma (,) dan 46 untuk (.) dan lain sebagainya.
GetDecimalSymbol = Asc(Mid$(1 / 2, 2, 1))
End Function
Apabila digabungkan dengan posting sebelumnya, maka dapat diperoleh validasi entry untuk numeric yang memperbolehkan angka di belakang koma, tapi bagaimana cara menggabungkannya?
READ MORE - Cara Termudah Memperoleh Decimal Symbol - Visual Basic 6

Saturday, July 23, 2011

Skin Form Yang Mengagumkan Ini milik Leandro Ascierto

Selain Codejock dan Active Skin, skin form yang dibuat oleh Leandro Ascierto (argentina) ini layak sekali untuk dipertimbangkan. Memiliki banyak contoh skin, kurang lebih ada 16 skin. Apabila kita belum puas dengan tampilannya, kita bisa membuat custom skin, karena projectnya (terpisah) dilengkapi dengan fasilitas editor untuk membuat custom skin.

Skin form (open source dan lengkap beserta contohnya) dapat Anda download di: http://www.leandroascierto.com.
Selain skin form, di situs miliknya, kita akan mendapati resource-resource berupa uc(User Control) yang berkualitas.

READ MORE - Skin Form Yang Mengagumkan Ini milik Leandro Ascierto

Wednesday, June 22, 2011

Membaca Struktur Table dan Menerapkannya Dalam GUI

Setelah bepanjang lebar membicarakan Addins, maka sekarang kita akan menerapkannya dalam sebuah project yang bermanfaat (jika dilanjutkan memprogramnya) yaitu: generator database yang sangat sederhana (hanya untuk MS Access saja, untuk database lainnya, silakan modifikasi kodenya). Project ini hanya akan mengenerate GUI-nya saja (tanpa kode), adapun jika jika ingin menambahkan kode-kode yang sesuai Anda dapat merujuk pada tautan di samping, menambah kode pada module (tentu saja setelah dimodifikasi dan disesuaikan).

Langkah-Langkah:
  • Buat project Addin
  • Masukan kode-kode di bawah ini:
Kode pada frmAddin:
Public VBInstance As VBIDE.VBE 
Public Connect As Connect

Option Explicit

Dim
strCon As String

Private Sub
cboTables_Click()
Set cat = New ADOX.Catalog
Set cat.ActiveConnection = DBase
Dim c As ADOX.Column
lstAll.Clear
For Each c In cat.Tables(GetTabelValidName(cboTables.Text)).Columns
lstAll.AddItem c.Name
Next
If
lstAll.ListCount > 0 Then lstAll.ListIndex = 0
Set cat = Nothing
End Sub

Private Function
GetTabelValidName(strName As String) As String
Dim
s() As String
s =
Split(strName, " : ")
GetTabelValidName = s(1)
End Function

Private Sub
cmdConnect_Click()
On Error GoTo ErrHandler
strCon = getADOConnectionString()
If strCon = "" Then Exit Sub
txtCon.Text = strCon
If OpenDataBase(strCon) = True Then
FillComboWithTables
End If
Exit Sub
ErrHandler:
MsgBox Err.Number & vbNewLine & Err.Description, vbExclamation + vbOKOnly, "Connection Error"
lstAll.Clear
cboTables.Clear
End Sub

Private Function
FillComboWithTables()
Set cat = New ADOX.Catalog
Set cat.ActiveConnection = DBase
Dim i As Integer
cboTables.Clear
lstAll.Clear
For i = 0 To cat.Tables.Count - 1
If cat.Tables(i).Type <> "SYSTEM TABLE" And cat.Tables(i).Type <> "ACCESS TABLE" Then
If
cat.Tables(i).Type = "TABLE" Then
cboTables.AddItem "Table : " & cat.Tables(i).Name
Else
cboTables.AddItem "query : " & cat.Tables(i).Name
End If
End If
Next i
Set
cat = Nothing
End Function

Private Sub
Command1_Click()
AddFormAndControls Replace(GetTabelValidName(cboTables.Text), " ", "_"), GetTabelValidName(cboTables.Text)
End Sub

Private Function
AddFormAndControls(f As String, c As String)

On Error Resume Next

Dim
frm As VBIDE.VBComponent
Dim ctl As VBControl
Dim frmCurrent As VBForm
Dim i As Integer, x As Integer, y As Integer, k As Integer
Set
frm = VBInstance.ActiveVBProject.VBComponents.Add(vbext_ct_VBForm)
Set frmCurrent = VBInstance.SelectedVBComponent.Designer

For i =
0 To lstAll.ListCount - 1
'kode di bawah ini untuk menambah TextBox
Set ctl = frmCurrent.VBControls.Add("VB.TextBox")
With ctl
.Properties("Name") = "txt" & Replace(lstAll.List(i), " ", "_")
If i = 0 Then
.Properties("Top") = 500
x = 500
Else
x = x +
400 'spasi (jarak) untuk TextBox
End If
.Properties("Top") = x
.Properties("Left") = 2500
.Properties("Width") = 4000
.Properties("Height") = 330
.Properties("Text") = lstAll.List(i)
'.properties dan lain-lain, disesuaikan kebutuhan
End With
If i =
lstAll.ListCount - 1 Then
y = x +
2000 'Form Height
k = x + 900 'CommandButton Top
End If
'kode di bawah ini untuk menambah label
Set ctl = frmCurrent.VBControls.Add("VB.Label")
With ctl
.Properties("Name") = lstAll.List(i)
.Properties("Top") = x
.Properties("Left") = 465
.Properties("Width") = 2000
.Properties("Height") = 255
.Properties("Caption") = lstAll.List(i)
.Properties("BackStyle") = 0 'transparent
'.properties dan lain-lain, disesuaikan kebutuhan
End With
Next
Set
ctl = frmCurrent.VBControls.Add("VB.CommandButton")
With ctl
.Properties("Name") = "cmdUpdate"
.Properties("Top") = k
.Properties("Left") = 5040
.Properties("Width") = 1455
.Properties("Height") = 375
.Properties("Caption") = "&Update"
'.properties dan lain-lain, disesuaikan kebutuhan
End With
Set
ctl = frmCurrent.VBControls.Add("VB.CommandButton")
With ctl
.Properties("Name") = "cmdCancel"
.Properties("Top") = k
.Properties("Left") = 3480
.Properties("Width") = 1455
.Properties("Height") = 375
.Properties("Caption") = "&Cancel"
'.properties dan lain-lain, disesuaikan kebutuhan
End With
InsertOCX "{2CDCDF4C-4914-4DBC-99CB-12359BE472E1}"
Set ctl = frmCurrent.VBControls.Add("Liner.cLiner")
With ctl
.Properties("Top") = k - 300
.Properties("Left") = -5
.Properties("Width") = 7000
.Properties("Height") = 30
End With
With
frm
.Properties("Name") = "frm" & f
.Properties("Width") = 7155
.Properties("Caption") = c
.Properties("Height") = y
End With
'--------------------------------------------------------------------------------------------------
'tambahkan kontrol lain-lain ThirdParty OCX
'tambahkan pula kode-kode yang sesuai
'maaf, belum dibuatkan....
'--------------------------------------------------------------------------------------------------
End Function

Public Function
InsertOCX(ProgID As String) As Boolean
On Error GoTo
ErrHandler
'Add OCX
VBInstance.ActiveVBProject.AddToolboxProgID ProgID
InsertOCX = True
Exit Function
ErrHandler:
InsertOCX = False
End Function

Kode pada modDatabase:
Option Explicit 

Public
DBase As New ADODB.Connection
Public cat As ADOX.Catalog

Function
OpenDataBase(sFilename As String) As Boolean
'// Membuat koneksi ke database
Set DBase = New ADODB.Connection
With DBase
.CursorLocation = adUseClient
.Open "Provider= Microsoft.Jet.OLEDB.4.0;Persist security info=False;Data Source=" & sFilename & ";Jet OLEDB:Database;"
End With
OpenDataBase = True
End Function
Kode pada modDataLinks: silakan copy dan pastekan dari tautan di samping module data links.

READ MORE - Membaca Struktur Table dan Menerapkannya Dalam GUI

Merubah Nama Menu Add-Ins Yang Akan Ditampilkan - VB6 Add-In

Untuk merubah caption sub menu (Addin yang dibuat sendiri) yang ditampilkan di bawah menu Add-Ins, maka ikutilah langkah-langkah berikut:
  • Buatlah project Add-Ins dengan cara klik menu File >> New Project >> pada kotak dialog New Project pilihlah template/project Addin
  • Secara default akan terbentuk satu project dengan dua component, masing-masing frmAddIn dan Connect
  • Klik kanan Connect, dan pilihlah menu View Code
  • Carilah di bawah ini (yang terdapat pada Connect):

    If ConnectMode = ext_cm_External Then 
'Used by the wizard toolbar to start this wizard
Me.Show
Else
Set
mcbMenuCommandBar = AddToAddInCommandBar("My AddIn")
'sink the event
Set Me.MenuHandler = VBInstance.Events.CommandBarEvents(mcbMenuCommandBar)
End If
  • Gantilah menu My Addin di atas dengan nama menu yang Anda Inginkan.
  • Selanjutnya Compile dan lakukan register jika perlu.
READ MORE - Merubah Nama Menu Add-Ins Yang Akan Ditampilkan - VB6 Add-In

Sedikit Tentang Code Module dan Object Member - VB6 Add-Ins

Dalam sebuah code module (editor tempat kita menulis kode di VB6), maka berapapun banyaknya kode yang kita tulis (puluhan baris sampai puluhan ribu baris), kode tersebut dapat diklasifikasikan menjadi lima unsur saja, Adapun yang kelima unsur tersebut, diantaranya:
  1. Variable
  2. Constanta
  3. Method (Sub, Function, Event Procedure)
  4. Events
  5. dan terakhir Property.
Dari kelima di atas, maka semuanya memiliki scope (jangkauan akses), adapun scope hanya ada 3 saja (berapapun banyaknya kode yang kita tulis), berturut-turut:
  1. Private
  2. Public
  3. Friend
Jadi, jika bukan private maka public atau friend, jika bukan public maka private atau friend, dst. Untuk membuktikannya, buatlah project Add-ins, tambahkan satu ListBox (dengan nama default saja List1)
Public VBInstance As VBIDE.VBE 
Public Connect As Connect

Option Explicit

Private Sub
OKButton_Click()
EnumAllMembers
End Sub

Private Function
EnumAllMembers()
Dim m As Member
Dim t As String
List1.Clear
For Each m In VBInstance.SelectedVBComponent.CodeModule.Members
Select Case m.Type
Case vbext_MemberType.vbext_mt_Const
t = "Constanta"
Case vbext_MemberType.vbext_mt_Event
t = "Event"
Case vbext_MemberType.vbext_mt_Method
t = "Method"
Case vbext_MemberType.vbext_mt_Property
t = "Property"
Case vbext_MemberType.vbext_mt_Variable
t = "Variable"
End Select
List1.AddItem "Nama: " & m.Name & vbTab & vbTab & "Type: " & t & vbTab & vbTab & "Scope: " & m.Scope
Next
End Function
Walaupun kode di atas tampak sederhana, akan tetapi ia akan sangat berguna, kira-kira untuk apa?
READ MORE - Sedikit Tentang Code Module dan Object Member - VB6 Add-Ins

Sunday, May 22, 2011

Manifest Injector - 1 kali Klik Untuk XP Style - Tools VB6

Setelah kita memahami cara menambah module, menambahkan kode, mengubah Startup Object, maka sekarang kita akan membuat sebuah tools sederhana yang bermanfaat dan akan banyak digunakan yaitu Manifest Injector sebuah generator kode sederhana.
Langkah-langkah:
  • Buat project Add-Ins
  • Hapus frmAddIns (form default saat membuat project Addins)
  • Tambahkan kode-kode di bawah ini:
-modAddIns
Public VBInstance As VBIDE.VBE
Public Connect As Connect

Option Explicit

Public Sub OKButton_Click()
AddResource 'and sure, some code too..
End Sub

Private Function AddResource() As Boolean

Dim newResourcee As VBComponent
Dim PathName As String

PathName = GetName(VBInstance.ActiveVBProject.Filename, PathNameOnly)
On Error GoTo ErrHandler
If Not IsProjectSaved Then
MsgBox "Simpan terlebih dahulu projectnya!", vbInformation, "Project belum disimpan"
Exit Function
End If
FileCopy App.Path & "\XP.manifest.res", PathName & "\XP.manifest.res"
Set newResourcee = VBInstance.ActiveVBProject.VBComponents.AddFile(PathName & "\XP.manifest.res")
InsertXPCode
AddModule "modManifestRes", "Public Declare Sub InitCommonControls Lib " & Chr(34) & "comctl32.dll" & Chr(34) & "()"
Exit Function

ErrHandler:

MsgBox Err.Description, vbCritical, "Warning"

End Function

Private Function IsProjectSaved() As Boolean
IsProjectSaved = Not (VBInstance.ActiveVBProject.Filename = "")
End Function

Private Sub InsertXPCode()

Dim CD As CodePane
Dim CM As CodeModule
Dim strName As String
strName = GetStartUpName
If GetStartUpName <> "Sub Main" Then
Set CD = VBInstance.ActiveVBProject.VBComponents(strName).CodeModule.CodePane
Set CM = VBInstance.ActiveVBProject.VBComponents(strName).CodeModule

Dim frm As VBIDE.VBForm

With VBInstance
With .ActiveVBProject.VBComponents(strName)

Set frm = .Designer
If .Type = vbext_ct_VBMDIForm Then
If Not IsExistProc("MDIForm_Initialize", CD) Then
MakeProcedure "Initialize", "MDIForm", CM
End If
CM.InsertLines CD.CodeModule.ProcBodyLine("MDIForm_Initialize", vbext_pk_Proc) + 1, " InitCommonControls"
ElseIf .Type = vbext_ct_VBForm Then
If Not IsExistProc("Form_Initialize", CD) Then
MakeProcedure "Initialize", "Form", CM
End If
CM.InsertLines CD.CodeModule.ProcBodyLine("Form_Initialize", vbext_pk_Proc) + 1, " InitCommonControls"
End If
End With
End With
Else
Set CD = VBInstance.ActiveVBProject.VBComponents(GetSubMain).CodeModule.CodePane
Set CM = VBInstance.ActiveVBProject.VBComponents(GetSubMain).CodeModule
CM.ReplaceLine CM.Members("main").CodeLocation, "Sub Main()" & vbCrLf & " InitCommonControls"
End If

End Sub

Private Function IsExistProc(Procname As String, oCodePane As CodePane) As Boolean
Dim i As Integer
For i = 1 To oCodePane.CodeModule.CountOfLines
If oCodePane.CodeModule.ProcOfLine(i, vbext_pk_Proc) <> "" Then
If Procname = oCodePane.CodeModule.ProcOfLine(i, vbext_pk_Proc) Then
IsExistProc = True
Exit For
End If
End If
Next i
End Function

Private Function MakeProcedure(EventName, ObjectName, oCodeModule As CodeModule)
oCodeModule.CreateEventProc EventName, ObjectName
End Function

Private Function GetStartUpName() As String
On Error GoTo ErrHandler
GetStartUpName = VBInstance.ActiveVBProject.VBComponents.StartUpObject.Name
Exit Function
ErrHandler:
GetStartUpName = "Sub Main"
End Function

Private Function GetSubMain() As String
Dim v As VBComponent
Dim l As Long, s As String
For Each v In VBInstance.ActiveVBProject.VBComponents
With v
If .Type = vbext_ct_StdModule Then
l = v.CodeModule.CountOfLines
If l > 0 Then
s = v.CodeModule.Lines(1, l)
If InStr(1, s, "sub main()", vbTextCompare) > 0 Then
GetSubMain = v.Name
Exit Function
End If
End If
End If
End With
Next
End Function

Private Function AddModule(ModulName As String, Optional strCode As String) As Boolean

Dim newModule As VBComponent

On Error GoTo ErrHandler

Set newModule = VBInstance.ActiveVBProject.VBComponents.Add(vbext_ct_StdModule)
With newModule
.Name = ModulName
.CodeModule.AddFromString strCode
End With
Exit Function

ErrHandler:

MsgBox Err.Description

End Function

  • Tambahkan module ini, gantilah namanya menjadi modFileAndDirectory
  • Ganti seluruh kode yang terdapat pada Connect.dsr dengan kode di bawah:
Connect.dsr
Option Explicit

Public FormDisplayed As Boolean
Public VBInstance As VBIDE.VBE
Dim mcbMenuCommandBar As Office.CommandBarControl
'Dim mfrmAddIn As New frmAddIn
Public WithEvents MenuHandler As CommandBarEvents 'command bar event handler

'Sub Hide()
'
' On Error Resume Next
'
' FormDisplayed = False
' mfrmAddIn.Hide
'
'End Sub

Sub Show()

' On Error Resume Next

' If mfrmAddIn Is Nothing Then
' Set mfrmAddIn = New frmAddIn
' End If

Set modAddIns.VBInstance = VBInstance
Set modAddIns.Connect = Me
' FormDisplayed = True
' mfrmAddIn.Show
OKButton_Click
End Sub

'------------------------------------------------------
'this method adds the Add-In to VB
'------------------------------------------------------
Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)
On Error GoTo error_handler

'save the vb instance
Set VBInstance = Application

'this is a good place to set a breakpoint and
'test various addin objects, properties and methods
Debug.Print VBInstance.FullName

If ConnectMode = ext_cm_External Then
'Used by the wizard toolbar to start this wizard
Me.Show
Else
Set mcbMenuCommandBar = AddToAddInCommandBar("XP-Theme")
'sink the event
Set Me.MenuHandler = VBInstance.Events.CommandBarEvents(mcbMenuCommandBar)
End If

If ConnectMode = ext_cm_AfterStartup Then
If GetSetting(App.Title, "Settings", "DisplayOnConnect", "0") = "1" Then
'set this to display the form on connect
Me.Show
End If
End If

Exit Sub

error_handler:

MsgBox Err.Description

End Sub

'------------------------------------------------------
'this method removes the Add-In from VB
'------------------------------------------------------
Private Sub AddinInstance_OnDisconnection(ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom() As Variant)
On Error Resume Next

'delete the command bar entry
mcbMenuCommandBar.Delete

'shut down the Add-In
If FormDisplayed Then
SaveSetting App.Title, "Settings", "DisplayOnConnect", "1"
FormDisplayed = False
Else
SaveSetting App.Title, "Settings", "DisplayOnConnect", "0"
End If

' Unload mfrmAddIn
' Set mfrmAddIn = Nothing
Set modAddIns.VBInstance = Nothing
Set modAddIns.Connect = Nothing

End Sub

Private Sub IDTExtensibility_OnStartupComplete(custom() As Variant)
If GetSetting(App.Title, "Settings", "DisplayOnConnect", "0") = "1" Then
'set this to display the form on connect
Me.Show
End If
End Sub

'this event fires when the menu is clicked in the IDE
Private Sub MenuHandler_Click(ByVal CommandBarControl As Object, handled As Boolean, CancelDefault As Boolean)
Me.Show
End Sub

Function AddToAddInCommandBar(sCaption As String) As Office.CommandBarControl
Dim cbMenuCommandBar As Office.CommandBarControl 'command bar object
Dim cbMenu As Object

On Error GoTo AddToAddInCommandBarErr

'see if we can find the Add-Ins menu
Set cbMenu = VBInstance.CommandBars("Add-Ins")
If cbMenu Is Nothing Then
'not available so we fail
Exit Function
End If

'add it to the command bar
Set cbMenuCommandBar = cbMenu.Controls.Add(1)
'set the caption
cbMenuCommandBar.Caption = sCaption

Set AddToAddInCommandBar = cbMenuCommandBar

Exit Function

AddToAddInCommandBarErr:

End Function

  • Compile Project dan Register.
  • Tambahkan XP.manifest.res (XP.manifest.res adalah resource manifest yang telah dicompile menggunakan RC.EXE) bisa Anda download disini.
  • Satukah XP.manifest.res dengan DLL yang berasal dari project yang telah dicompile tadi.
  • Jika ingin langsung menggunakan, download project jadinya di bawah ini:

READ MORE - Manifest Injector - 1 kali Klik Untuk XP Style - Tools VB6

Menguji Kode Project Add-Ins Tanpa Compile - Add-Ins VB6

Menjelaskan mengenai cara menguji kode yang terdapat pada sebuah Addins tanpa compile - Apabila kita hanya bermaksud menguji, melihat kinerja serta men-debug sebuah project Addins tanpa bermaksud mengcompilenya menjadi sebuah DLL, maka yang harus kita lakukan adalah menjalankan (run) project Addin tersebut dengan mengklik tombol run atau tombol keyboard F5 (biarkan), selanjutnya buka Aplikasi baru (terpisah dari project Addin yang telah dijalankan) dan buatlah sebuah project baru (Standard Exe misalnya), klik menu Add-Ins, maka pada sub menu akan terdapat menu My Addin.

Efek samping menjalankan project addins tanpa compile:
  1. MessageBox (apabila project addins tersebut menampilkan MessageBox) tidak akan tampil ke depan.
  2. Kecepatan eksekusi kode berkurang antara 25 - 100 kali (sangat signifikan)
  3. dan lain sebagainya.
READ MORE - Menguji Kode Project Add-Ins Tanpa Compile - Add-Ins VB6

Menambah Module Yang Disertai Kode Melalui VB6 Add-Ins

Menjelaskan mengenai cara menambah module melalui Visual Basic 6 Add-Ins - Sebelumnya saya telah memposting mengenai cara menambah Form, Menu, CommandButton, menambah referensi komponen OCX dan DLL melalui pemrograman Add-Ins, maka untuk melengkapi mengenai cara membuat robot software atau generator code tentulah harus dapat menambahkan Module, Class, UserControl, Resource, dsb.

Untuk menjalankan kode di bawah, ikuti langkah-langkah berikut:
  1. Buat project Add-Ins baru dengan cara Klik File, klik New Project, klik Addin
  2. Gantilah seluruh kode yang terdapat pada frmAddin dengan kode di bawah
  3. Lakukan compile dengan cara klik File, klik Make MyAddin.dll
  4. Simpan project, dan tutuplah aplikasi Visual Basic 6

Public VBInstance As VBIDE.VBE 
Public Connect As Connect

Option Explicit

Private Sub
CancelButton_Click()
Connect.Hide
End Sub

Private Sub
OKButton_Click()
AddModule "moDatabase", ConnectionCode
End Sub

Public Function
AddModule(ModulName As String, Optional strCode As String) As Boolean

Dim
newModule As VBComponent

On Error GoTo
ErrHandler

Set
newModule = VBInstance.ActiveVBProject.VBComponents.Add(vbext_ct_StdModule)
With newModule
.Name = ModulName
.CodeModule.AddFromString strCode
End With
Exit Function

ErrHandler:

MsgBox Err.Description

End Function

Private Function
ConnectionCode() As String
Dim
sMsg As String
sMsg = sMsg & "" & vbCrLf
sMsg = sMsg & "Public conn As ADODB.Connection" & vbCrLf
sMsg = sMsg & "" & vbCrLf
sMsg = sMsg & "Public Function OpenDatabase(Filename As String) As Boolean" & vbCrLf
sMsg = sMsg & "" & vbCrLf
sMsg = sMsg & " Dim c As String" & vbCrLf
sMsg = sMsg & " " & vbCrLf
sMsg = sMsg & " On Error GoTo ErrHandler" & vbCrLf
sMsg = sMsg & " " & vbCrLf
sMsg = sMsg & " c = " & Chr(34) & "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " & Chr(34) & " & Filename" & vbCrLf
sMsg = sMsg & " " & vbCrLf
sMsg = sMsg & " Set conn = New ADODB.Connection" & vbCrLf
sMsg = sMsg & " conn.ConnectionString = c" & vbCrLf
sMsg = sMsg & " conn.Open" & vbCrLf
sMsg = sMsg & " " & vbCrLf
sMsg = sMsg & " OpenDatabase = True" & vbCrLf
sMsg = sMsg & " Exit Function" & vbCrLf
sMsg = sMsg & "" & vbCrLf
sMsg = sMsg & "ErrHandler:" & vbCrLf
sMsg = sMsg & " " & vbCrLf
sMsg = sMsg & " OpenDatabase = False" & vbCrLf
sMsg = sMsg & " " & vbCrLf
sMsg = sMsg & "End Function" & vbCrLf
ConnectionCode = sMsg
End Function

Untuk mengakses MyAddin.dll, buka project baru klik Add-in Addin Manager.... klik My Add-in, selanjutnya tekanlah tombol OK dan lihatlah hasilnya.
READ MORE - Menambah Module Yang Disertai Kode Melalui VB6 Add-Ins

Friday, April 22, 2011

Module Untuk Memperoleh Nama File, Extension, Path - VB6

Karena bingung memberi judul, akhirnya judulnya seperti di atas. Module ini digunakan untuk memperoleh (return/get) nama dari PathName lengkap, apakah yang akan diambil extensionnya saja, filenamenya saja, path tanpa filename. Adapun kodenya sebagai berikut:
Option Explicit 

Public Enum
eFilename
ExtentionOnly = 0 'contoh .exe, .zip, dll
FileNameOnly = 1 'update.exe, notify.exe, file.zip
PathNameOnly = 2 'c:\program files\anti virus
WithOutExtention = 3 'update, notify (tanpa .exe)
End Enum

Public Function
GetName(Filename As String, str As eFilename) As String
Dim
vArray As Variant, sDelimiter As String, e As String, v() As String
If
Filename = "" Then Exit Function
Select Case
str
Case ExtentionOnly
sDelimiter = "."
Case FileNameOnly
sDelimiter = "\"
Case PathNameOnly
vArray = Split(Filename, "\")
GetName = Mid(Filename, 1, Len(Filename) - Len(vArray(UBound(vArray))) - 1)
Exit Function
Case
WithOutExtention
vArray = Split(Filename, "\")
e = vArray(UBound(vArray))
v() = Split(e, ".")
GetName = v(0)
Exit Function
End Select
vArray = Split(Filename, sDelimiter)
GetName = vArray(UBound(vArray))
End Function
Contoh penggunaan kode di atas:
Private Sub Command1_Click() 
msgbox GetName ("C:\Program Files\UI\Update.exe",FileNameOnly) 'jika ingin memperoleh filenamenya saja, dll.
End Sub
READ MORE - Module Untuk Memperoleh Nama File, Extension, Path - VB6

Mematikan (Disable) Check Spelling TextArea

Setelah selesai membahas mengenai cara membuat TextArea sederhana yang hanya melibatkan beberapa attribute/property yakni rows, cols, align, dan name, sekarang kita akan membahas mengenai cara mematikan atau men-disable-kan fasilitas Check Spelling. Apa yang dimaksud dengan Fasilitas Check Spelling pada TextArea itu?
Mengapa pada kondisi tertentu check spelling ini harus kita disable-kan? Perlu diketahui, Check Spelling adalah fasilitas yang membantu kita mengecek ejaan sehingga terhindar dari kesalahan penulisan. Tetapi bagaimana jika bahasa yang sedang kita tulis tidak didukung oleh fasilitas ini (misalnya menggunakan bahasa daerah)? yang terjadi adalah sebagian atau banyak dari tulisan akan digarisbawahi dengan warna merah. Nah, pada kondisi ini terdapat dua pilihan, menggunakan Check Spelling atau tidak. Manakah yang Anda pilih? hmm.. sepertinya Anda memilih untuk mematikan/men-disable fasilitas Check Spelling ini.

Untuk mendisable check spelling ini, kita hanya perlu menambahkan satu property/attribute yaitu spellchek=false. Property spellcheck ini memiliki data type Boolean, jadi kita hanya dapat mengisi dua nilai saja, antara TRUE dan FALSE.

Catatan: Fasilitas Check Spelling ini hanya ada pada browser tertentu.
READ MORE - Mematikan (Disable) Check Spelling TextArea

Thursday, April 14, 2011

Kamus Inggris - Menambahkan Database - Bagian ke-7

Kamus Inggris - Menambahkan Database merupakan kelanjutan dari bagian ke-6.
Database kamus ini, kosakatanya berjumlah 23623 (dua puluh tiga ribu lebih). dalam format text sehingga bisa dengan mudah diakses dan ditambah kosakatanya. Database kamus ini diambil dari gKamus (Kamus Bahasa Inggris Indonesia Open Source). Beberapa modul/kode pada
bagian ke-7 ini diambil dari Putra VB (disitus miliknya Anda dapat belajar VB6 dan VB.Net). Untuk kedua Author situs tersebut saya ucapkan terima kasih. Selanjutnya ...

Pada bagian ke-8 kita akan menambahkan databasenya, dengan demikian project ini sudah bisa kita gunakan, dengan fitur bug disana-sini, sederhana, dan tampilan yang kurang enak dipandang (tentu saja, setidaknya untuk sementara), bagaimana mengenai kecepatan pencariannya? saya kira tidak perlu diragukan.

Tujuan pada bagian ke-
Menambahkan database, sehingga kamus ini sudah bisa kita gunakan.

Langkah-langkah
  • Download terlebih dahulu databasenya [Download Database]
  • Satukan file database (en-id.txt) ke dalam folder database
  • Buatlah module baru dan berinama modData
  • Tambahkan 1 TextBox (Text3) dan 1 ListBox (List2)
  • Tambahkan beberapa kode di bawah ini:
Kode-kode
'tambahkan kode di bawah ke dalam form frmMain 
Private Sub Form_Load()
BukaData App.Path & "\database\en-id.txt", List2
End Sub

Private Sub
List1_Click()
Text3.Text = List1.Text
End Sub

Private Sub
List2_Click()
If List2.ListIndex <> -1 Then
Text2.Text = Replace(DataEn(List2.ListIndex), vbTab, " = ")
End If
End Sub

Private Sub
Text1_DblClick()
Text3.Text = Trim(Text1.SelText)
End Sub

Private Sub
Text3_Change()
Dim i As Integer
If
Text3.Text = "" Then
List2.ListIndex = -1
Text2.Text = ""
Exit Sub
End If
i =
List2.ListIndex
If List2.Text = "" Then List2.ListIndex = i
Dim
retValue As Long
retValue = SendMessage(List2.hWnd, LB_FINDSTRING, -1, ByVal Text3.Text)
If retValue > -1 Then
List2.TopIndex = retValue
Else
List2.TopIndex = i
End If
List2.ListIndex = List2.TopIndex
End Sub

Kode di bawah ini masukan ke dalam module modData
Option Explicit 

Public Declare Function
SendMessage Lib "user32" Alias "SendMessageA" ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Public Const
LB_ADDSTRING = &H180
Public Const LB_FINDSTRING = &H18F
Public Const LB_FINDSTRINGEXACT = &H1A2

Public
DataEn() As String
Public
LokasiData As String

Sub
BukaData(FileName As String, lst As ListBox)
Dim Temp As String
Dim i As Long
lst.Parent.Visible = False
Open
FileName For Binary As #1
Temp = Space$(LOF(1))
Get #1, , Temp
Close #1

Temp = Replace(Temp, vbCrLf & "" & vbCrLf, vbCrLf)
DataEn = Split(Temp, vbCrLf)

lst.Clear

For i =
0 To UBound(DataEn) - 1
SendMessage lst.hWnd, LB_ADDSTRING, 0, ByVal CStr(Split(DataEn(i), vbTab)(0))
Next
lst.ListIndex = 0
lst.Parent.Visible = True
End Sub

Uji Coba
  • Compile terlebih dahulu projectnya
  • Jalankan melalui Windows Explorer
  • Ketikan kosakata inggris pada TextBox pencarian (Text3), Anda lihat sekarang kamus ini dapat mencari kosakata dengan sangat cepatnya
Catatan
Pada bagian download terdapat file .exe, sebagai perbandingan saja.
Sampai disini apakah ada pertanyaan? sepertinya tidak ada, maka kita lanjutkan pada bagian ke-8
READ MORE - Kamus Inggris - Menambahkan Database - Bagian ke-7

Kamus Inggris - Splash Screen, Apakah Kegunaannya - Bagian 8

Kamus Inggris - Splash Screen, Apakah Kegunaannya merupakan kelanjutan dari bagian ke-7.
Dengan ditambahkannya database, maka pada saat dijalankan aplikasi akan memiliki jeda (Time Lag). Hal ini disebabkan aplikasi tersebut harus me-load terlebih dahulu kosakatanya, disinilah kita akan membutuhkan apa yang biasa disebut dalam pemrograman dengan Splash Screen/Form. Splash screen berguna untuk memberitahukan user bahwa aplikasi yang kita buat baik-baik saja, bukan hang. Selain itu splash screen bisa dianggap sebagai ciri khas dari aplikasi yang Anda buat, mengenai hal ini kreatifitas Anda sangat diperlukan.

Tujuan pada Bagian ke-8
Cara menampilkan splash screen dengan benar

Langkah-langkah
  • Klik menu project >> Add Form
  • Pilih Splash Screen, selanjutnya klik OK
  • Tambahkan (ganti) kode yang terdapat dalam modMain, tepat kode yang berada pada method Sub Main()
Kode-kode
Pada bagian modMain seperti yang telah disebutkan pada bagian ke-4 gantilah kode di bawah ini:
Sub Main()   
InitCommonControls
frmMain.Show
End Sub
sehingga menjadi:
Sub Main()   
InitCommonControls 'XP Style inisialisasi
frmSplash.Show 'tampilkan splash form terlebih dahulu
frmSplash.Refresh 'refresh agar tampilannya benar
Load frmMain 'load seluruh kode dalam tampilan utama
frmMain.Show 'tampilkan form utama
Unload frmSplash 'tutup splash form
End Sub
Uji Coba
  • Compile terlebih dahulu
  • Jalankan melalui Windows Explorer
  • Sekarang aplikasi akan menampilkan splash screen terlebih dahulu
READ MORE - Kamus Inggris - Splash Screen, Apakah Kegunaannya - Bagian 8

Kamus Inggris - Advance Form Center - Bagian ke-9

Kamus Inggris - Advance Form Center merupakan kelanjutan dari bagian ke-8.
Pada bagian ke-9 ini kita akan menambahkan modul form center dan module registry. Module form center berguna untuk menyimpan form di tengah layar, dalam hal ini kita akan menggunakan advance form center. Diberi kata advance, karena ia memiliki beberapa keistimewaan, yaitu:
  • Menampilkan form di tengah layar hanya untuk pertama kali saja,
  • Pada kali kedua ditampilkan dan seterusnya, posisi form akan diambil dari nilai yang terdapat pada registry
  • Tidak terpengaruh oleh tingginya taskbar, sehingga ia akan berada benar-benar di tengah layar.
Module registry selain digunakan untuk module form center, ia akan digunakan juga dalam setting-setting, opsi, dan konfigurasi aplikasi ini.

Tujuan pada Bagian ke-9
  • Menambahkan modul form center agar aplikasi ditampilkan tepat di tengah layar.
  • Menambahkan modul registry untuk keperluan setting/konfigurasi, dan opsi.
Langkah-langkah
  • Buatlah modul baru dan beri nama modForm, copy dan pastekan kode ini.
  • Buatlah modul baru dan beri nama modRegistry, copy dan pastekan kode ini.
Kode-kode
Gantilah kode di bawah ini (terdapat pada frmMain):
Private Sub Form_Load()  
BukaData App.Path & "\database\en-id.txt", List2
End Sub
Sehingga menjadi:
Private Sub Form_Load() 
GetPositionsFromRegistry Me 'ini untuk posisi form yang diambil dari registry
BukaData App.Path & "\database\en-id.txt", List2
End Sub
Tambahkan kode di bawah ini pada frmMain:
Private Sub Form_Unload(Cancel As Integer) 
SavePositionsInRegistry Me ' menyimpan posisi ke dalam registry
End Sub
Uji Coba
  • Compile terlebih dahulul projectnya, Jalankan melalui Windows Explorer. Pada saat pertama kali dijalankan aplikasi akan berada tepat di tengah layar. Selanjutnya geser (drag) aplikasi kamus dan tutuplah, buka kembali, maka sekarang ia akan tampil seperti pada posisi terakhir kali ia ditutup.
Sampai disini mungkin tidak ada pertanyaan, baiklah terima kasih. Kita lanjutkan pada bagian yang ke-10.
READ MORE - Kamus Inggris - Advance Form Center - Bagian ke-9

Tuesday, March 22, 2011

Kamus Inggris - Tutorial Cara Membuatnya

Agaknya prosedur-prosedur fungsi yang saya kumpulkan sudah lumayan walaupun tidak bisa disebut banyak, daripada prosedur-prosedur tersebut kurang bermanfaat dan menganggur, lebih baik kita gunakan untuk merakit software-software kecil. Lalu darimana kita memulainya...

Beberapa hal...
Prosedur-prosesedur fungsi yang telah saya tuliskan sebagian kecil berasal dari copy paste (tanpa modifikasi), sebagian kecil ide/dibuat sendiri, dan sebagian besar merupakan hasil copy yang selanjutnya dimodikasi kemudian dijalankan, untuk memastikan apakah ia bisa berjalan dengan baik. Prosedur-prosedur yang telah dimodifiksi tersebut diusahakan agar tidak memiliki dependency (ketergantungan) secara langsung terhadap objek maupun variable-variable yang bersifat publik, tujuan utamanya adalah agar memiliki sifat mudah digunakan kembali, mudah dicopypastekan, mudah di-encapsulate dalam bentuk dll atau ocx. Disamping itu ia akan menjadi prosedur dari pemrograman modular yang baik (jika tidak dijadikan dll atau ocx). Dengan demikian, kita dapat memisahkan bagian demi bagian dengan mudah, dan terhindar dari kerumitan kode karena melihatnya secara keseluruhan.

Untuk siapa tutorial ini?
Pemula, untuk pemula saja, karena saya pun seorang pemula. Jadi, jika seorang pemula bingung melihat kode, kemungkinan saya pun sama, jadi kita sama-sama belajar.

Selanjutnya...
Untuk membuat software-software kecil, ada beberepa tools yang harus kita kumpulkan dan miliki. Beberapa tools tersebut diantaranya memang harus dimiliki seperti InnoSetup (tools installer) dan sebagainya, dan sebagian lagi optional, hanya sebagai pelengkap untuk memudahkan dan mempercepat pekerjaan seperti MZ-Tools dan sebagainya (banyak). kita bahas saja sambil berjalan.

Software kecil apa yang akan kita buat?
Kamus Inggris Indonesia sederhana, karena yang tidak sederhana sudah banyak bertebaran di internet, walaupun sederhana, tetapi saya akan membagikannya menjadi beberapa puluh bagian (part).

Darimana databasenya?
Kebetulan saya memiliki beberapa database kamus inggris berasal dari software-software open source salah satunya dari gkamus, Kambing (bukan hewan) singkatan dari Kamus Bahasa Indonesia Inggris, dan lain sebagainya, terdiri dari puluhan ribu kosakata. Jika Anda ingin memilikinya, silakan kunjungi situsnya.
READ MORE - Kamus Inggris - Tutorial Cara Membuatnya

Monday, March 14, 2011

Kamus Inggris - Membuat Project Baru - Bagian Ke-2

Kamus Inggris - Membuat Project Baru merupakan kelanjutan dari Bagian ke-1.
Selanjutnya untuk membuat software menggunakan VB6, yang harus kita lakukan adalah membuat project baru.

Tujuan:
  • Membuat project baru menggunakan VB6
  • Menambahkan kemampuan copy text yang berasal dari Clipboard
Langkah-langkah:
  • Buat project baru
  • Tambahkan 2 TextBox, 1 ListBox, 1 Timer
  • Rubahlah property Interval pada Timer1 = 1
  • Ganti nama Project1 menjadi prjKamus
  • Ganti nama Form1 menjadi frmMain
  • Modifikasi ukuran-ukurannya, sehingga terlihat seperti gambar di bawah.
  • Simpanlah dalam folder, beri nama folder itu dengan Project Kamus Inggris
Kode-kode:
'simpan (copy dan pastekan) kode di bawah ini dalam frmMain 
Option Explicit

Dim
strFromClipboard As String

Private Sub
Timer1_Timer()
Dim s As String
s =
Clipboard.GetText
If s <> strFromClipboard Then
strFromClipboard = s
Text1.Text = strFromClipboard
End If
End Sub
Uji Coba:
  • Jalankan project yang baru kita buat dengan cara menekan tombol F5 atau mengklik tombol start yang terdapat pada toolbar VB6.
  • Copy sembarang text, maka text yang telah dicopy tadi secara otomatis akan masuk ke dalam Text1


READ MORE - Kamus Inggris - Membuat Project Baru - Bagian Ke-2

Kamus Inggris - Handle Error 521 dan Parse Text - Bagian 3

Kamus Inggris - Handle Error 521 merupakan kelanjutan dari Bagian ke-2.
Ternyata kode yang sangat sedikit yang terdapat pada bagian ke-2 menyisakan bug, terkadang ia memunculkan error yaitu Error Number = 521 Error Description = "Unable to open clipboard"

Tujuan pada bagian ke-3:
  • Meng-handle dan mengkoreksi Error 521
  • Mem-parse text dan menambahkannya ke dalam objek ListBox
  • Memfilter hanya karakter yang valid untuk diterjemahkan
Langkah-langkah:
  • Singkat saja, ganti seluruh kode yang terdapat pada bagian ke-1 (Error 521) dengan kode yang terdapat pada bagian kode-kode.
Kode-kode:
Option Explicit 

Private Declare Function
EmptyClipboard Lib "user32" ) As Long 'API Function
Dim strFromClipboard As String

'---------------------------------------------------------------------------------
' Copy text dari clipboard dan masukan ke dalam objek TextBox
' dengan men-trigger secara kontinyu menggunakan bantuan timer
'---------------------------------------------------------------------------------
Private Sub Timer1_Timer()

On Error GoTo
ErrHandler 'apabila error loncat ke Handle Error

Dim s As String

s =
Clipboard.GetText 'baris ini terkadang error |Error Number = 521|

If s
<> strFromClipboard Then
ParsingText s, List1
strFromClipboard = s
Text1.Text = strFromClipboard
End If

Exit Sub

ErrHandler:
'Handle Error
If Err.Number = 521 Then 'Can't open the clipboard
Text1.Text = ""
EmptyClipboard 'paksa kosongkan clipboard dengan Fungsi API
Resume Next 'loncat lagi ke baris atas dan lanjutkan eksekusi membaca kode)
End If

End Sub

'--------------------------------------------------------------------------------
' dua event List1_Click() dan Text_DblClick()
' dengan kode sementara, hanya untuk mengecek dan melihat hasilnya saja
'--------------------------------------------------------------------------------
Private Sub List1_Click()
Text2.Text = "Menterjemahkan : " & List1.Text & " ==> ke dalam bahasa Inggris"
End Sub

Private Sub
Text1_DblClick()
Text2.Text = "Menterjemahkan : " & Text1.SelText & " ==> ke dalam bahasa Inggris"
End Sub

'---------------------------------------------------------------------------------
' Fungsi untuk Parse uraikan) kalimat ke dalam text dan masukan ke ListBox
'---------------------------------------------------------------------------------
Private Sub ParsingText(s As String, lst As ListBox)

Dim
strText As String
Dim
y() As String
Dim i As Integer
Dim b As String

lst.Clear
strText = s
strText = Replace(strText, " ", vbCrLf)
y = Split(strText, vbCrLf)

For i =
LBound(y) To UBound(y)
b = Trim(y(i))
If IsValidWord(b) Then
lst.AddItem y(i)
End If
Next

End Sub

'-------------------------------------------------------------------------------
' Fungsi untuk memfilter karakter yang tidak valid diterjemahkan
'-------------------------------------------------------------------------------
Private Function IsValidWord(s As String) As Boolean

Dim x As String
Dim z As String

z =
"= - , . % *" 'tambahkan karakter tidak valid untuk diterjemahkan disini
x = s
If
Len(x) = 0 Then Exit Function
If
InStr(1, z, s) > 0 Then Exit Function
IsValidWord = True

End Function

'-------------------------------------------------------------------------------
' == End All Of Code ==
'-------------------------------------------------------------------------------
Uji Coba:
Jalankan, copy sembarang text dan klik sembarang item yang terdapat pada ListBox, apabila berhasil maka gambarnya seperti yang ada di samping [ScreenShot]

Mas, saya mau bertanya, apakah ini sedang membuat software Kamus Bahasa Inggris atau sedang membuat Rencana Pelaksaan Pembelajaran (RPP)?
READ MORE - Kamus Inggris - Handle Error 521 dan Parse Text - Bagian 3

Kamus Inggris - XP Style Manifest Dalam EXE - Bagian Ke-4

Kamus Inggris - XP Style Manifest Dalam EXE merupakan sambungan dari bagian ke-3.
Agar aplikasi yang kita buat memiliki theme XP style, maka cara yang termudah adalah menambahkan file manifest. Di antara beberapa cara menambahkan file manifest, maka menambahkannya langsung melalui file exe dianggap cara yang paling elegant, mengapa demikian? karena user tidak akan pernah melihat file manifest tersebut, baik file manifest dengan atribute normal, maupun manifest dengan atribute hidden (hidden file).

Tujuan pada bagian ke-4:
  • Menanam file manifest ke dalam exe, agar aplikasi memiliki theme XP Style.
  • Menjadikan Sub Main sebagai Startup Object
Langkah-langkah:
  • Buatlah manifest resource, jika tidak mau repot membuat manifest resource, Anda bisa mendownloadnya di sini.
  • Pada aplikasi VB6, klik Project >> Add File...
  • Tambahkan manifest resource file yang telah Anda buat atau Anda download tadi.
  • Buat module baru dan beri nama modMain (mod adalah prefix untuk module)
  • Tambahkan fungsi API InitCommonControls (akan dibahas pada bagian kode-kode)
  • Jadikan Sub Main() sebagai Startup Object
Kode-kode:
'simpan kode di bawah pada module modMain 
Option Explicit

Public Declare Sub
InitCommonControls Lib "Comctl32" )

Sub
Main()
InitCommonControls
frmMain.Show
End Sub
Uji Coba:
  • Compile Project (Klik File >> Make Kamus Inggris.exe)
  • Jalankan Kamus Inggris.exe melalui Windows Explorer, sekarang Anda lihat bahwa Kamus Inggris.exe memiliki theme XP Style.
Catatan:
Selain untuk aplikasi ini, menanam resource manifest juga bisa digunakan untuk aplikasi-aplikasi yang dibuat menggunakan Visual Basic 6.0 agar memiliki theme XP Style. Semoga bermanfaat.
READ MORE - Kamus Inggris - XP Style Manifest Dalam EXE - Bagian Ke-4

Saturday, March 5, 2011

Nadzom Bahar Rojaz: Jawaban Soal Latihan No. 6

وَمُفْرَدًا يَأتِي وَيَأتِي جُمْلَهْ ... حَاوِيَةً مَعْنَى الّذِي سِيْقَتْ لَهْ
وَمُفْرَدَنْ يَأتِيْ وَيَأتِي جُمْلَهْ ... حَاوِيَتَنْ مَعْنَى لْلَذِيْ سِيْقَتْ لَهْ
وَمُفْرَدَنْ- يَأتِيْ وَيَأ-تِي جُمْلَهْ ... حَاوِيَتَنْ -مَعْنَى لْلَذِيْ- سِيْقَتْ لَهْ
مَفَاعِلُنْ - مُسْتَفْعِلُنْ - مَفْعُوْلُنْ ... مُفْتَعِلُنْ - مُسْتَفْعِلُنْ - مَفْعُوْلُنْ
المخبونة - السالمة - المقطوعة ... المطويّة - السالمة - المقطوع

READ MORE - Nadzom Bahar Rojaz: Jawaban Soal Latihan No. 6

Nadzom Bahar Rojaz: Jawaban Soal Latihan No. 7

وَإِنْ تَكُنْ إِيَّاهُ مَعْنًى اكْتَفَى ... بِهَا كَنُطْقِي الله حَسْبِي وَكَفَى
وَإِنْ تَكُنْ إِيْيَاهُ مَعْنَن كْتَفَى ... بِهَا كَنُطْقِ لْلاهُ حَسْبِي وَكَفَى
وَإِنْ تَكُنْ- إِيْيَاهُ مَعْ-نَن كْتَفَى ... بِهَا كَنُطْ-قِ لْلاهُ حَسْ-بِي وَكَفَى
مَفَاعِلُنْ - مُسْتَفْعِلُنْ - مَفَاعِلُنْ ... مَفَاعِلُنْ - مُسْتَفْعِلُنْ - مُفْتَعِلُنْ
المخبونة - السالمة - المخبونة ... المخبونة - السالمة - المطويّ

READ MORE - Nadzom Bahar Rojaz: Jawaban Soal Latihan No. 7

Nadzom Bahar Rojaz: Jawaban Soal Latihan No. 8

وَالمُفْرَدُ الجَامِدُ فَارِغٌ وَإِنْ ... يُشْتَقَّ فَهْوَ ذُو ضَمِيْرٍ مُسْتَكِنْ
وَلْمُفْرَدُ لْجَامِدُ فَارِغُنْ وَإِنْ ... يُشْتَقْقَ فَهْوَ ذُو ضَمِيْرِنْ مُسْتَكِنْ
وَلْمُفْرَدُ لْ-جَامِدُ فَا-رِغُنْ وَإِنْ ... يُشْتَقْقَ فَهْ-وَ ذُو ضَمِيْ-رِنْ مُسْتَكِنْ
مُسْتَفْعِلُنْ - مُفْتَعِلُنْ - مَفَاعِلُنْ ... مُسْتَفْعِلُنْ - مَفَاعِلُنْ - مُسْتَفْعِلُنْ
السالمة - المطويّة - المخبونة ... السالمة - المخبونة - الصحيح

READ MORE - Nadzom Bahar Rojaz: Jawaban Soal Latihan No. 8

Nadzom Bahar Rojaz: Jawaban Latihan Soal No. 9

وَأَبْرِزَنْهُ مُطْلَقًا حَيْثُ تَلاَ ... مَا لَيْسَ مَعْنَاهُ لَهُ مُحَصَّلاَ
وَأَبْرِزَنْهُ مُطْلَقَنْ حَيْثُ تَلاَ ... مَا لَيْسَ مَعْنَاهُ لَهُو مُحَصْصَلاَ
وَأَبْرِزَنْ-هُ مُطْلَقَنْ-حَيْثُ تَلاَ ... مَا لَيْسَ مَعْ-نَاهُ لَهُو-مُحَصْصَلاَ
مَفَاعِلُنْ - مَفَاعِلُنْ - مُفْتَعِلُنْ ... مُسْتَفْعِلُنْ - مُفْتَعِلُنْ - مَفَاعِلُنْ
المخبونة - المخبونة - المطويّة ... السالمة - المطويّة - المخبون

READ MORE - Nadzom Bahar Rojaz: Jawaban Latihan Soal No. 9

Nadzom Bahar Rojaz: Jawaban Latihan Soal No. 10

وَأَخْبَرُوا بِظَرْفِ أوْ بِحَرْفِ جَرْ ... نَاوِيْنَ مَعْنَى كَائِنٍ أَوِ اسْتَقَرْ
وَأَخْبَرُوْ بِظَرْفِ أَوْ بِحَرْفِ جَرْ ... نَاوِيْنَ مَعْنَى كَائِنِنْ أَوِ سْتَقَرْ
وَأَخْبَرُوْ-بِظَرْفِ أَوْ-بِحَرْفِ جَرْ ... نَاوِيْنَ مَعْ-نَى كَائِنِنْ-أَوِ سْتَقَرْ
مَفَاعِلُنْ - مَفَاعِلُنْ - مَفَاعِلُنْ ... مُسْتَفْعِلُنْ - مُسْتَفْعِلُنْ - مَفَاعِلُنْ
المخبونة - المخبونة - المخبونة ... السالمة - السالمة - المخبون
READ MORE - Nadzom Bahar Rojaz: Jawaban Latihan Soal No. 10

VB6 Code - AutoFit TextBox.Text Caranya?

Yang dimaksud dengan AutoFit TextBox.Text disini adalah menyesuaikan ukuran huruf yang terdapat dalam objek TextBox agar sesuai dengan lebar textbox. Perhatikan gambar di bawah ini:
Pada mulanya text melebihi lebar textbox
menjadi:
Sekarang text sesuai dengan lebar textbox
Pada gambar di atas objek TextBox-nya lebih dari satu, sehingga prosedurnya harus dipanggil satu persatu menggunakan kode di bawah ini:

Option Explicit 
 '----------------------------------------------------------------------- 
'http://khoiriyyah.blogspot.com 
'By Asep Hibban Ibnu Surur) 
'----------------------------------------------------------------------- 
 
Private Sub Command1_Click() 
    Dim ctl As Object 
    For Each ctl In Me.Controls 
        If TypeName(ctl) = "TextBox" Then 
            AutoFitTextBox ctl 
        End If 
    Next 
End Sub 
Selengkapnya bisa Anda download pada link di bawah ini:

READ MORE - VB6 Code - AutoFit TextBox.Text Caranya?

Nadzom Bahar Rojaz: Jawaban Soal Latihan No. 5

وَالخَبَرُ الجُزْءُ المُتِمُّ الفَائِدَهْ ... كَالله بَرٌّ والأَيَادِي شَاهِدَهْ
وَلْخَبَرُ لْجُزْءُ لْمُتِمْمُ لْفَائِدَهْ ... كَلْلاهُ بَرْرُنْ وَلأَيَادِيْ شَاهِدَهْ
وَلْخَبَرُ لْ-جُزْءُ لْمُتِمْ-مُ لْفَائِدَهْ ... كَلْلاهُ بَرْ-رُنْ وَلأَيَا-دِيْ شَاهِدَهْ
مُفْتَعِلُنْ - مُسْتَفْعِلُنْ - مُسْتَفْعِلُنْ ... مُسْتَفْعِلُنْ - مُسْتَفْعِلُنْ - مُسْتَفْعِلُنْ
المطويّة - السالمة - الصحيحة ... السالمة - السالمة - الصحيح

READ MORE - Nadzom Bahar Rojaz: Jawaban Soal Latihan No. 5

Nadzom Bahar Rojaz: Jawaban Soal Latihan No. 4

وَرَفَعُوْا مُبْتَدَاءً بِالإِبْتِدَا ... كَذَاكَ رَفْعُ خَبَرٍ بِالمُبْتَدَا
وَرَفَعُوْ مُبْتَدَئَنْ بِلإِبْتِدَا ... كَذَاكَ رَفْعُ خَبَرِنْ بِلْمُبْتَدَا
وَرَفَعُوْ- مُبْتَدَئَنْ- بِلإِبْتِدَا ... كَذَاكَ رَفْ-عُ خَبَرِنْ-بِلْمُبْتَدَا
فَعِلَتُنْ - مُفْتَعِلُنْ - مُسْتَفْعِلُنْ ... مَفَاعِلُنْ - فَعِلَتُنْ - مُسْتَفْعِلُنْ
المخبولة - المطويّة - الصحيحة ... المخبونة - المخبولة - الصحيح

READ MORE - Nadzom Bahar Rojaz: Jawaban Soal Latihan No. 4