|
Title: Visual Basic [ T I P S ] Post by: Vatsal on December 26, 2005, 09:36:37 AM Visual Basic [ T I P S ]
Capitalizing the First Letter of Each Word in a String Dim sNew as String Dim sOld as String sNew = StrConv$(sOld, vbProperCase) Determining if Your App is Already Running If App.PrevInstance Then Msgbox "Application already running" End End If Creating a Desktop Shortcut to a Web Site Dim sUrl As String Dim sFile As String Dim lFile As Long lFile = FreeFile sUrl = "URL=http://www.TheScarms.com" ' ' See my shell link program to determine the desktop path. ' sFile = "C:\Windows\desktop\TheScarms.url" Open sFile For Output As lFile Print #lFile, "[InternetShortcut]" Print #lFile, sUrl Give Users More Icons With Your App Resource files expose any contained icons to Windows. By adding a resource file containing icons to your application and compiling, the user can select any of those icons to display in a shortcut to your application. Can't Create What Object Ever get this error (error 429) and wonder what object? Use this code to wrap your calls to CreateObject. It will return the name of the object that could not be created. Public Function fCreateObject(sID as String) as Object On Error Goto ErrHhandler Set fCreateObject = VBA.CreateObject(sID) Exit Function ErrHandler: Err.Raise Err.Number, "fCreateObject", Err.Description & ": '" & sID & "'" End Function Create a VB Add-In to Close all Open Windows in the VB IDE You can create a VB Add-In to close all the open windows in the VB development environment with a single click. Open a new VB project of type Add-In. Enter this code in the load event of frmAddIn. Press F2 to open the Object Browser, highlight the Connect class, right click it, and edit the Description field to change the name and description of your add-in. Also, search the entire project and replace all occurrences of "My Add-In" with whatever you decide to call it. Change the project's properties as desired. Make the DLL then you can add your add-in from the Add-In Manager. Dim w As Window For Each w In VBInstance.Windows If (w.Type = vbext_wt_CodeWindow Or _ w.Type = vbext_wt_Designer) And _ w.Visible Then w.Close End If Next A Better DoEvents Putting DoEvents in loops to make your app responsive to user input is a common but expensive practice. Use GetInputState instead. GetInputState returns 1 when a mouse is clicked or key pressed. It has much less overhead and can be called every so often as need be. When an input event occurs, then call DoEvents. Private Declare Function GetInputState Lib "user32" () As Long Dim bUserCancel As Boolean Private Sub cmdCancel_Click() bUserCancel = True End Sub Private Sub cmdGo_Click() Dim lCtr As Long bUserCancel = False For lCtr = 0 To 1000000 ' ' A long loop that may need to be interupted. ' If lCtr Mod 100 Then If GetInputState() <> 0 Then ' ' A mouse or keyboard event occured. ' DoEvents If bUserCancel Then Exit For End If End If Next End Sub Center a Form Accounting for the Taskbar and Other Appbars Center your forms based on the actual portion of the screen that is exposed. This method takes into account Window's taskbar and any other appbars such as toolbars that are docked to the edge of the screen. Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long Private Const SM_CXFULLSCREEN = 16 Private Const SM_CYFULLSCREEN = 17 Private Sub Form_Load() Dim lLeft As Long Dim lTop As Long With Me lLeft = (Screen.TwipsPerPixelX * (GetSystemMetrics(SM_CXFULLSCREEN) / 2)) - (.Width / 2) lTop = (Screen.TwipsPerPixelY * (GetSystemMetrics(SM_CYFULLSCREEN) / 2)) - (.Height / 2) .Move lLeft, lTop End With End Sub Use System Icons on your Forms Extract the standard system icons to use on your forms to make them look like typical Window's message boxes. Private Enum StandardIconEnum IDI_ASTERISK = 32516& IDI_EXCLAMATION = 32515& IDI_HAND = 32513& IDI_QUESTION = 32514 End Enum Private Declare Function LoadStandardIcon Lib "user32" _ Alias "LoadIconA" (ByVal hInstance As Long, _ ByVal lpIconNum As StandardIconEnum) As Long Private Declare Function DrawIcon Lib "user32" _ (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, _ ByVal hIcon As Long) As Long Call this code: Dim lIcon As Long Me.Cls lIcon = LoadStandardIcon(0&, lstIcon.ItemData(lstIcon.ListIndex)) Call DrawIcon(Me.hdc, 10&, 10&, lIcon) Load Textbox With More Than 64K of Data Get past the 64K limit imposed on the contents of a textbox with the SendMessage API. Note that this will work only in NT and Win2K. Private Const WM_SETTEXT = &HC Private Const WM_GETTEXT = &HD Private Const WM_GETTEXTLENGTH = &HE Private Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, lParam As Any) As Long Private Declare Function GetWindowTextLength Lib "user32" _ Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long Add a multi line textbox to your form. In form_load call this code: Dim lret As Long Dim s As String s = String(9000, "X") Me.Show lRet = SendMessage(txtlarge.hwnd, WM_SETTEXT, 0&, ByVal s) Debug.Print "WM_SETTEXT: " & lRet lRet = SendMessage(txtlarge.hwnd, WM_GETTEXTLENGTH, 0&, ByVal 0&) Debug.Print "WM_GETTEXTLENGTH: " & lRet In form_resize call this code: txtlarge.Move 0, 0, Me.ScaleWidth, Me.ScaleHeight Clear Structures With One Assignment You can quickly clear a user defined type without setting each subvariable. Private Type udtType SubVariable1 As Integer SubVariable2 As String SubVariable3 As Long End Type ' ' Dim variables of this type. ' Dim TypeVar1 As udtType Dim TypeVar2 As udtType ' ' A method in a class which clears the structure variable. ' Private Sub ClearData() Dim EmptyVar As udtType TypeVar1 = EmptyVar TypeVar2 = EmptyVar End Sub Get the Relative Path Between 2 Folders Private Function GetRelativePath(ByRef strRelativepath As String, _ ByVal strPathFrom As String, ByVal strPathTo As String) As Boolean Dim blnResult As Boolean Const MAX_PATH = 260 strRelativepath = Space$(MAX_PATH) ' ' Set dwAttr... to vbDirectory for directories, ' or 0 for files. ' blnResult = PathRelativePathToW(StrPtr(strRelativepath), _ StrPtr(strPathFrom), vbDirectory, StrPtr(strPathTo), 0) If blnResult Then strRelativepath = Left(strRelativepath, InStr(strRelativepath, vbNullChar) - 1) Else strRelativepath = "" End If GetRelativePath = blnResult End Function Private Sub Command1_Click() Dim strRelativepath As String If GetRelativePath(strRelativepath, "c:\temp", "c:\windows") Then Debug.Print strRelativepath Else Debug.Print "Error" End If End Sub Copy Large Arrays Faster You can copy arrays much faster with a simple API call: Private Declare Sub CopyMemory Lib "kernel32" _ Alias "RtlMoveMemory" (Dest As Any, _ Source As Any, ByVal Length As Long) Private Sub CopyArray() Dim lngbytes As Long Dim lngSrc(1 To 600000) As Long Dim lngDest(1 To 600000) As Long ' ' Number of bytes equals number of array ' elements times the element length. ' lngbytes = (UBound(lngSrc) - LBound(lngSrc) + 1) * Len(lngSrc(1)) ' ' Copy the array passing the address of the start to ' the destination and source arrays and the length ' of the arrays. ' Call CopyMemory(lngDest(LBound(lngDest)), lngSrc(LBound(lngSrc)), lngbytes) End Sub |