11.07.2015 Views

101 Tech Tips - Visual Studio Magazine - One-Stop Source Shop

101 Tech Tips - Visual Studio Magazine - One-Stop Source Shop

101 Tech Tips - Visual Studio Magazine - One-Stop Source Shop

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>101</strong> TECH TIPSFor <strong>Visual</strong> <strong>Studio</strong> DevelopersVB3, VB4, VB5, VB6Level: BeginningTweak the Key and Mouse EventsMany VB objects have KeyDown, KeyUp, MouseDown, MouseUp,and MouseMove events. They’re unique in one respect: They havebuilt-in limitations on what they’re able to do. You often need tocoordinate these events with things outside their immediatescope to use them effectively. For example, you might need yourapp to perform a repetitive action while a mouse button is down.The MouseDown event fires only once—when the button isclicked—so you can’t determine the mouse state outside theMouseDown event easily. Handle these situations by using avariable with sufficient scope to address the required code. Forexample, if you’re coding all the mouse-oriented functionalitywithin the form that contains the control in question, declare aform-level Boolean variable and use it to track the mouse’s state.Set the variable to True when the MouseDown event fires, and toFalse when the MouseUp event fires. When your code executes,have it check the mouse state by testing the variable’s currentvalue. The Mouse events then maintain the variable’s state automatically,and you can track the variables’, hence the mouse, statefrom outside the mouse events.VB5, VB6Level: Advanced—Ron Schwarz, Hart, Mich.Get Dynamic Array InformationUse the GetSafeArrayInfo function to rip the lid off a SAFEARRAY.It allows the caller to identify the number of dimensions andnumber of elements for each dimension (among other things).Element information for each dimension is stored in a one-basedsubarray of SAFEARRAYBOUND structures (rgsabound):Public Type SAFEARRAYBOUND' # of elements in the array dimensioncElements As Long' lower bounds of the array dimensionlLbound As LongEnd TypePublic Type SAFEARRAY' Count of dimensions in this array.cDims As Integer' Flags used by the SafeArray' routines documented below.fFeatures As Integer' Size of an element of the array.' Does not include size of' pointed-to data.cbElements As Long' Number of times the array has been' locked without corresponding unlock.cLocks As Long' Pointer to the data.' Should be sized to cDims:pvData As Long' <strong>One</strong> bound for each dimension.rgsabound() As SAFEARRAYBOUNDEnd TypePrivate Declare Sub CopyMemory Lib "kernel32" Alias _"RtlMoveMemory" (ByVal lpDest As Long, ByVal _lp<strong>Source</strong> As Long, ByVal nBytes As Long)' Pointer to the variants data itemDim lpData As Long' the VARTYPE member of the VARIANT structureDim VType As IntegerConst VT_BYREF As Long = &H4000&' Exit if no array suppliedIf Not IsArray(TheArray) Then Exit FunctionWith ArrayInfo' Get the VARTYPE value from the first 2 bytes' of the VARIANT structureCopyMemory ByVal VarPtr(VType), ByVal _VarPtr(TheArray), 2' Get the pointer to the array descriptor' (SAFEARRAY structure)' NOTE: A Variant's descriptor, padding &' union take up 8 bytes.CopyMemory ByVal VarPtr(lpData), ByVal _(VarPtr(TheArray) + 8), 4' Test if lpData is a pointer or a pointer to' a pointer.If (VType And VT_BYREF) 0 Then' Get real pointer to the array descriptor' (SAFEARRAY structure)CopyMemory ByVal VarPtr(lpData), ByVal _lpData, 4' This will be zero if array not' dimensioned yetIf lpData = 0 Then Exit FunctionEnd If' Fill the SAFEARRAY structure with the array' info' NOTE: The fixed part of the SAFEARRAY' structure is 16 bytes.CopyMemory ByVal VarPtr(ArrayInfo.cDims), _ByVal lpData, 16' Ensure the array has been dimensioned before' getting SAFEARRAYBOUND informationIf ArrayInfo.cDims > 0 Then' Size the array to fit the # of boundsReDim .rgsabound(1 To .cDims)' Fill the SAFEARRAYBOUND structure with' the array infoCopyMemory ByVal VarPtr(.rgsabound(1)), _ByVal lpData + 16, _ArrayInfo.cDims * Len(.rgsabound(1))' So caller knows there is information' available for the array in output' SAFEARRAYGetSafeArrayInfo = TrueEnd IfEnd WithEnd Function—Monte Hansen, Ripon, Calif.Public Function GetSafeArrayInfo(TheArray As _Variant, ArrayInfo As SAFEARRAY) As Boolean'===================================================' Fills a SAFEARRAY structure for the array.' TheArray: The array to get information on.' ArrayInfo: The output SAFEARRAY structure.' RETURNS: True if the array is instantiated.'===================================================6 Supplement to <strong>Visual</strong> <strong>Studio</strong> <strong>Magazine</strong> SEPTEMBER 2001

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!