-
it was not a request Eros, then i would have posted into support.
Currently some other Array-related stuff storming through my brains... a tiny little testscript to try out associative arrays - what i'm currently playing with -
...script removed/ improved below-
-
This to decode CBMSG - as far as it is known. 200 have a name - a and few are occupied twice
Code:
#MINVERSION 1.9.15.0
Type t_associative_Array
pKeys As DWord
pBuckets As DWord
AddElement As Function
Free As Function
GetUBound As Function
GetBucket As Function
GetPtr As Function
End Type
Function t_associative_Array.AddElement(ByVal key As String, _
ByVal bucket As String _
) As Long
If HEAP_Size(Me.pKeys) Then
DWord lKey(HEAP_Size(Me.pKeys)/4) At Me.pKeys
If Array Scan lKey Ptr, = key Then
' key not available
Return 0
EndIf
EndIf
Me.pKeys = HEAP_ReAllocByStr( Me.pKeys, HEAP_Get(Me.pKeys) & MKDWD$(HEAP_AllocByStr(key)) )
Me.pBuckets = HEAP_ReAllocByStr( Me.pBuckets, HEAP_Get(Me.pBuckets) & MKDWD$(HEAP_AllocByStr(bucket)) )
Function = HEAP_Size(Me.pKeys)/4
End Function
Function t_associative_Array.Free() As Long
Local i As Long
If HEAP_Size(Me.pKeys) >= 4 Then
DWord lKey(HEAP_Size(Me.pKeys)/4) At Me.pKeys
DWord lBucket(UBound(lKey)) At Me.pBuckets
For i = 1 To UBound(lKey)
HEAP_Free( lKey(i), lBucket(i) )
Next
HEAP_Free(Me.pKeys, Me.pBuckets)
EndIf
Function = 0
End Function
Function t_associative_Array.GetUbound() As Long
Function = HEAP_Size(Me.pKeys)/4
End Function
Function t_associative_Array.GetBucket(ByVal key As String) As String
' returns stored data
Local lPos As Long
If HEAP_Size(Me.pKeys) >= 4 Then
DWord lKey(HEAP_Size(Me.pKeys)/4) At Me.pKeys
DWord lBucket(UBound(lKey)) At Me.pBuckets
lPos = Array Scan lKey Ptr, = key
EndIf
If lPos Then Function = HEAP_Get(lBucket(lPos))
End Function
Function t_associative_Array.GetPtr(ByVal key As String) As DWord
' returns pointer of stored data
Local lPos As Long
If HEAP_Size(Me.pKeys) >= 4 Then
DWord lKey(HEAP_Size(Me.pKeys)/4) At Me.pKeys
lPos = Array Scan lKey Ptr, = key
If lPos Then
DWord lBucket(lPos) At Me.pBuckets
Function = lBucket(lPos)
EndIf
EndIf
End Function
' --------------------------------------------
' test
Uses "console" , "UI"
Dim cbMessage As t_associative_Array
cbMessage.AddElement(%WM_ACTIVATE, "%WM_ACTIVATE")
cbMessage.AddElement(%WM_ACTIVATEAPP, "%WM_ACTIVATEAPP")
cbMessage.AddElement(%WM_AFXFIRST, "%WM_AFXFIRST")
cbMessage.AddElement(%WM_AFXLAST, "%WM_AFXLAST")
cbMessage.AddElement(%WM_APP, "%WM_APP")
cbMessage.AddElement(%WM_APPCOMMAND, "%WM_APPCOMMAND")
cbMessage.AddElement(%WM_ASKCBFORMATNAME, "%WM_ASKCBFORMATNAME")
cbMessage.AddElement(%WM_CANCELJOURNAL, "%WM_CANCELJOURNAL")
cbMessage.AddElement(%WM_CANCELMODE, "%WM_CANCELMODE")
cbMessage.AddElement(%WM_CAPTURECHANGED, "%WM_CAPTURECHANGED")
cbMessage.AddElement(%WM_CHANGECBCHAIN, "%WM_CHANGECBCHAIN")
cbMessage.AddElement(%WM_CHANGEUISTATE, "%WM_CHANGEUISTATE")
cbMessage.AddElement(%WM_CHAR, "%WM_CHAR")
cbMessage.AddElement(%WM_CHARTOITEM, "%WM_CHARTOITEM")
cbMessage.AddElement(%WM_CHILDACTIVATE, "%WM_CHILDACTIVATE")
cbMessage.AddElement(%WM_CLEAR, "%WM_CLEAR")
cbMessage.AddElement(%WM_CLOSE, "%WM_CLOSE")
cbMessage.AddElement(%WM_COMMAND, "%WM_COMMAND")
cbMessage.AddElement(%WM_COMMNOTIFY, "%WM_COMMNOTIFY")
cbMessage.AddElement(%WM_COMPACTING, "%WM_COMPACTING")
cbMessage.AddElement(%WM_COMPAREITEM, "%WM_COMPAREITEM")
cbMessage.AddElement(%WM_CONTEXTMENU, "%WM_CONTEXTMENU")
cbMessage.AddElement(%WM_COPY, "%WM_COPY")
cbMessage.AddElement(%WM_COPYDATA, "%WM_COPYDATA")
cbMessage.AddElement(%WM_CREATE, "%WM_CREATE")
cbMessage.AddElement(%WM_CTLCOLORBTN, "%WM_CTLCOLORBTN")
cbMessage.AddElement(%WM_CTLCOLORDLG, "%WM_CTLCOLORDLG")
cbMessage.AddElement(%WM_CTLCOLOREDIT, "%WM_CTLCOLOREDIT")
cbMessage.AddElement(%WM_CTLCOLORLISTBOX, "%WM_CTLCOLORLISTBOX")
cbMessage.AddElement(%WM_CTLCOLORMSGBOX, "%WM_CTLCOLORMSGBOX")
cbMessage.AddElement(%WM_CTLCOLORSCROLLBAR, "%WM_CTLCOLORSCROLLBAR")
cbMessage.AddElement(%WM_CTLCOLORSTATIC, "%WM_CTLCOLORSTATIC")
cbMessage.AddElement(%WM_CUT, "%WM_CUT")
cbMessage.AddElement(%WM_DEADCHAR, "%WM_DEADCHAR")
cbMessage.AddElement(%WM_DELETEITEM, "%WM_DELETEITEM")
cbMessage.AddElement(%WM_DESTROY, "%WM_DESTROY")
cbMessage.AddElement(%WM_DESTROYCLIPBOARD, "%WM_DESTROYCLIPBOARD")
cbMessage.AddElement(%WM_DEVICECHANGE, "%WM_DEVICECHANGE")
cbMessage.AddElement(%WM_DEVMODECHANGE, "%WM_DEVMODECHANGE")
cbMessage.AddElement(%WM_DISPLAYCHANGE, "%WM_DISPLAYCHANGE")
cbMessage.AddElement(%WM_DRAWCLIPBOARD, "%WM_DRAWCLIPBOARD")
cbMessage.AddElement(%WM_DRAWITEM, "%WM_DRAWITEM")
cbMessage.AddElement(%WM_DROPFILES, "%WM_DROPFILES")
cbMessage.AddElement(%WM_ENABLE, "%WM_ENABLE")
cbMessage.AddElement(%WM_ENDSESSION, "%WM_ENDSESSION")
cbMessage.AddElement(%WM_ENTERIDLE, "%WM_ENTERIDLE")
cbMessage.AddElement(%WM_ENTERMENULOOP, "%WM_ENTERMENULOOP")
cbMessage.AddElement(%WM_ENTERSIZEMOVE, "%WM_ENTERSIZEMOVE")
cbMessage.AddElement(%WM_ERASEBKGND, "%WM_ERASEBKGND")
cbMessage.AddElement(%WM_EXITMENULOOP, "%WM_EXITMENULOOP")
cbMessage.AddElement(%WM_EXITSIZEMOVE, "%WM_EXITSIZEMOVE")
cbMessage.AddElement(%WM_FONTCHANGE, "%WM_FONTCHANGE")
cbMessage.AddElement(%WM_GETDLGCODE, "%WM_GETDLGCODE")
cbMessage.AddElement(%WM_GETFONT, "%WM_GETFONT")
cbMessage.AddElement(%WM_GETHOTKEY, "%WM_GETHOTKEY")
cbMessage.AddElement(%WM_GETICON, "%WM_GETICON")
cbMessage.AddElement(%WM_GETMINMAXINFO, "%WM_GETMINMAXINFO")
cbMessage.AddElement(%WM_GETOBJECT, "%WM_GETOBJECT")
cbMessage.AddElement(%WM_GETTEXT, "%WM_GETTEXT")
cbMessage.AddElement(%WM_GETTEXTLENGTH, "%WM_GETTEXTLENGTH")
cbMessage.AddElement(%WM_HANDHELDFIRST, "%WM_HANDHELDFIRST")
cbMessage.AddElement(%WM_HANDHELDLAST, "%WM_HANDHELDLAST")
cbMessage.AddElement(%WM_HELP, "%WM_HELP")
cbMessage.AddElement(%WM_HOTKEY, "%WM_HOTKEY")
cbMessage.AddElement(%WM_HSCROLL, "%WM_HSCROLL")
cbMessage.AddElement(%WM_HSCROLLCLIPBOARD, "%WM_HSCROLLCLIPBOARD")
cbMessage.AddElement(%WM_ICONERASEBKGND, "%WM_ICONERASEBKGND")
cbMessage.AddElement(%WM_IDLE, "%WM_IDLE, %WM_NULL")
cbMessage.AddElement(%WM_INITDIALOG, "%WM_INITDIALOG")
cbMessage.AddElement(%WM_INITMENU, "%WM_INITMENU")
cbMessage.AddElement(%WM_INITMENUPOPUP, "%WM_INITMENUPOPUP")
cbMessage.AddElement(%WM_INPUT, "%WM_INPUT")
cbMessage.AddElement(%WM_INPUTLANGCHANGE, "%WM_INPUTLANGCHANGE")
cbMessage.AddElement(%WM_INPUTLANGCHANGEREQUEST, "%WM_INPUTLANGCHANGEREQUEST")
cbMessage.AddElement(%WM_KEYDOWN, "%WM_KEYDOWN, %WM_KEYFIRST")
cbMessage.AddElement(%WM_KEYLAST, "%WM_KEYLAST, %WM_UNICHAR")
cbMessage.AddElement(%WM_KEYUP, "%WM_KEYUP")
cbMessage.AddElement(%WM_KILLFOCUS, "%WM_KILLFOCUS")
cbMessage.AddElement(%WM_LBUTTONDBLCLK, "%WM_LBUTTONDBLCLK")
cbMessage.AddElement(%WM_LBUTTONDOWN, "%WM_LBUTTONDOWN")
cbMessage.AddElement(%WM_LBUTTONUP, "%WM_LBUTTONUP")
cbMessage.AddElement(%WM_MBUTTONDBLCLK, "%WM_MBUTTONDBLCLK")
cbMessage.AddElement(%WM_MBUTTONDOWN, "%WM_MBUTTONDOWN")
cbMessage.AddElement(%WM_MBUTTONUP, "%WM_MBUTTONUP")
cbMessage.AddElement(%WM_MDIACTIVATE, "%WM_MDIACTIVATE")
cbMessage.AddElement(%WM_MDICASCADE, "%WM_MDICASCADE")
cbMessage.AddElement(%WM_MDICREATE, "%WM_MDICREATE")
cbMessage.AddElement(%WM_MDIDESTROY, "%WM_MDIDESTROY")
cbMessage.AddElement(%WM_MDIGETACTIVE, "%WM_MDIGETACTIVE")
cbMessage.AddElement(%WM_MDIICONARRANGE, "%WM_MDIICONARRANGE")
cbMessage.AddElement(%WM_MDIMAXIMIZE, "%WM_MDIMAXIMIZE")
cbMessage.AddElement(%WM_MDINEXT, "%WM_MDINEXT")
cbMessage.AddElement(%WM_MDIREFRESHMENU, "%WM_MDIREFRESHMENU")
cbMessage.AddElement(%WM_MDIRESTORE, "%WM_MDIRESTORE")
cbMessage.AddElement(%WM_MDISETMENU, "%WM_MDISETMENU")
cbMessage.AddElement(%WM_MDITILE, "%WM_MDITILE")
cbMessage.AddElement(%WM_MEASUREITEM, "%WM_MEASUREITEM")
cbMessage.AddElement(%WM_MENUCHAR, "%WM_MENUCHAR")
cbMessage.AddElement(%WM_MENUCOMMAND, "%WM_MENUCOMMAND")
cbMessage.AddElement(%WM_MENUDRAG, "%WM_MENUDRAG")
cbMessage.AddElement(%WM_MENUGETOBJECT, "%WM_MENUGETOBJECT")
cbMessage.AddElement(%WM_MENURBUTTONUP, "%WM_MENURBUTTONUP")
cbMessage.AddElement(%WM_MENUSELECT, "%WM_MENUSELECT")
cbMessage.AddElement(%WM_MOUSEACTIVATE, "%WM_MOUSEACTIVATE")
cbMessage.AddElement(%WM_MOUSEFIRST, "%WM_MOUSEFIRST, %WM_MOUSEMOVE")
cbMessage.AddElement(%WM_MOUSEHOVER, "%WM_MOUSEHOVER")
cbMessage.AddElement(%WM_MOUSELAST, "%WM_MOUSELAST")
cbMessage.AddElement(%WM_MOUSELEAVE, "%WM_MOUSELEAVE")
cbMessage.AddElement(%WM_MOUSEWHEEL, "%WM_MOUSEWHEEL")
cbMessage.AddElement(%WM_MOVE, "%WM_MOVE")
cbMessage.AddElement(%WM_MOVING, "%WM_MOVING")
cbMessage.AddElement(%WM_NCACTIVATE, "%WM_NCACTIVATE")
cbMessage.AddElement(%WM_NCCALCSIZE, "%WM_NCCALCSIZE")
cbMessage.AddElement(%WM_NCCREATE, "%WM_NCCREATE")
cbMessage.AddElement(%WM_NCDESTROY, "%WM_NCDESTROY")
cbMessage.AddElement(%WM_NCHITTEST, "%WM_NCHITTEST")
cbMessage.AddElement(%WM_NCLBUTTONDBLCLK, "%WM_NCLBUTTONDBLCLK")
cbMessage.AddElement(%WM_NCLBUTTONDOWN, "%WM_NCLBUTTONDOWN")
cbMessage.AddElement(%WM_NCLBUTTONUP, "%WM_NCLBUTTONUP")
cbMessage.AddElement(%WM_NCMBUTTONDBLCLK, "%WM_NCMBUTTONDBLCLK")
cbMessage.AddElement(%WM_NCMBUTTONDOWN, "%WM_NCMBUTTONDOWN")
cbMessage.AddElement(%WM_NCMBUTTONUP, "%WM_NCMBUTTONUP")
cbMessage.AddElement(%WM_NCMOUSEMOVE, "%WM_NCMOUSEMOVE")
cbMessage.AddElement(%WM_NCPAINT, "%WM_NCPAINT")
cbMessage.AddElement(%WM_NCRBUTTONDBLCLK, "%WM_NCRBUTTONDBLCLK")
cbMessage.AddElement(%WM_NCRBUTTONDOWN, "%WM_NCRBUTTONDOWN")
cbMessage.AddElement(%WM_NCRBUTTONUP, "%WM_NCRBUTTONUP")
cbMessage.AddElement(%WM_NCXBUTTONDBLCLK, "%WM_NCXBUTTONDBLCLK")
cbMessage.AddElement(%WM_NCXBUTTONDOWN, "%WM_NCXBUTTONDOWN")
cbMessage.AddElement(%WM_NCXBUTTONUP, "%WM_NCXBUTTONUP")
cbMessage.AddElement(%WM_NEXTDLGCTL, "%WM_NEXTDLGCTL")
cbMessage.AddElement(%WM_NOTIFY, "%WM_NOTIFY")
cbMessage.AddElement(%WM_NOTIFYFORMAT, "%WM_NOTIFYFORMAT")
cbMessage.AddElement(%WM_PAINT, "%WM_PAINT")
cbMessage.AddElement(%WM_PAINTCLIPBOARD, "%WM_PAINTCLIPBOARD")
cbMessage.AddElement(%WM_PAINTICON, "%WM_PAINTICON")
cbMessage.AddElement(%WM_PALETTECHANGED, "%WM_PALETTECHANGED")
cbMessage.AddElement(%WM_PALETTEISCHANGING, "%WM_PALETTEISCHANGING")
cbMessage.AddElement(%WM_PARENTNOTIFY, "%WM_PARENTNOTIFY")
cbMessage.AddElement(%WM_PASTE, "%WM_PASTE")
cbMessage.AddElement(%WM_PENWINFIRST, "%WM_PENWINFIRST")
cbMessage.AddElement(%WM_PENWINLAST, "%WM_PENWINLAST")
cbMessage.AddElement(%WM_POWER, "%WM_POWER")
cbMessage.AddElement(%WM_POWERBROADCAST, "%WM_POWERBROADCAST")
cbMessage.AddElement(%WM_PRINT, "%WM_PRINT")
cbMessage.AddElement(%WM_PRINTCLIENT, "%WM_PRINTCLIENT")
cbMessage.AddElement(%WM_QUERYDRAGICON, "%WM_QUERYDRAGICON")
cbMessage.AddElement(%WM_QUERYENDSESSION, "%WM_QUERYENDSESSION")
cbMessage.AddElement(%WM_QUERYNEWPALETTE, "%WM_QUERYNEWPALETTE")
cbMessage.AddElement(%WM_QUERYOPEN, "%WM_QUERYOPEN")
cbMessage.AddElement(%WM_QUERYUISTATE, "%WM_QUERYUISTATE")
cbMessage.AddElement(%WM_QUEUESYNC, "%WM_QUEUESYNC")
cbMessage.AddElement(%WM_QUIT, "%WM_QUIT")
cbMessage.AddElement(%WM_RBUTTONDBLCLK, "%WM_RBUTTONDBLCLK")
cbMessage.AddElement(%WM_RBUTTONDOWN, "%WM_RBUTTONDOWN")
cbMessage.AddElement(%WM_RBUTTONUP, "%WM_RBUTTONUP")
cbMessage.AddElement(%WM_RENDERALLFORMATS, "%WM_RENDERALLFORMATS")
cbMessage.AddElement(%WM_RENDERFORMAT, "%WM_RENDERFORMAT")
cbMessage.AddElement(%WM_SETCURSOR, "%WM_SETCURSOR")
cbMessage.AddElement(%WM_SETFOCUS, "%WM_SETFOCUS")
cbMessage.AddElement(%WM_SETFONT, "%WM_SETFONT")
cbMessage.AddElement(%WM_SETHOTKEY, "%WM_SETHOTKEY")
cbMessage.AddElement(%WM_SETICON, "%WM_SETICON")
cbMessage.AddElement(%WM_SETREDRAW, "%WM_SETREDRAW")
cbMessage.AddElement(%WM_SETTEXT, "%WM_SETTEXT")
cbMessage.AddElement(%WM_SETTINGCHANGE, "%WM_SETTINGCHANGE, %WM_WININICHANGE")
cbMessage.AddElement(%WM_SHOWWINDOW, "%WM_SHOWWINDOW")
cbMessage.AddElement(%WM_SIZE, "%WM_SIZE")
cbMessage.AddElement(%WM_SIZECLIPBOARD, "%WM_SIZECLIPBOARD")
cbMessage.AddElement(%WM_SIZING, "%WM_SIZING")
cbMessage.AddElement(%WM_SPOOLERSTATUS, "%WM_SPOOLERSTATUS")
cbMessage.AddElement(%WM_STYLECHANGED, "%WM_STYLECHANGED")
cbMessage.AddElement(%WM_STYLECHANGING, "%WM_STYLECHANGING")
cbMessage.AddElement(%WM_SYNCPAINT, "%WM_SYNCPAINT")
cbMessage.AddElement(%WM_SYSCHAR, "%WM_SYSCHAR")
cbMessage.AddElement(%WM_SYSCOLORCHANGE, "%WM_SYSCOLORCHANGE")
cbMessage.AddElement(%WM_SYSCOMMAND, "%WM_SYSCOMMAND")
cbMessage.AddElement(%WM_SYSDEADCHAR, "%WM_SYSDEADCHAR")
cbMessage.AddElement(%WM_SYSKEYDOWN, "%WM_SYSKEYDOWN")
cbMessage.AddElement(%WM_SYSKEYUP, "%WM_SYSKEYUP")
cbMessage.AddElement(%WM_TABLET_FIRST, "%WM_TABLET_FIRST")
cbMessage.AddElement(%WM_TABLET_LAST, "%WM_TABLET_LAST")
cbMessage.AddElement(%WM_TCARD, "%WM_TCARD")
cbMessage.AddElement(%WM_THEMECHANGED, "%WM_THEMECHANGED")
cbMessage.AddElement(%WM_TIMECHANGE, "%WM_TIMECHANGE")
cbMessage.AddElement(%WM_TIMER, "%WM_TIMER")
cbMessage.AddElement(%WM_UNDO, "%WM_UNDO")
cbMessage.AddElement(%WM_UNINITMENUPOPUP, "%WM_UNINITMENUPOPUP")
cbMessage.AddElement(%WM_UPDATEUISTATE, "%WM_UPDATEUISTATE")
cbMessage.AddElement(%WM_USER, "%WM_USER")
cbMessage.AddElement(%WM_USERCHANGED, "%WM_USERCHANGED")
cbMessage.AddElement(%WM_VKEYTOITEM, "%WM_VKEYTOITEM")
cbMessage.AddElement(%WM_VSCROLL, "%WM_VSCROLL")
cbMessage.AddElement(%WM_VSCROLLCLIPBOARD, "%WM_VSCROLLCLIPBOARD")
cbMessage.AddElement(%WM_WINDOWPOSCHANGED, "%WM_WINDOWPOSCHANGED")
cbMessage.AddElement(%WM_WINDOWPOSCHANGING, "%WM_WINDOWPOSCHANGING")
cbMessage.AddElement(%WM_WTSSESSION_CHANGE, "%WM_WTSSESSION_CHANGE")
cbMessage.AddElement(%WM_XBUTTONDBLCLK, "%WM_XBUTTONDBLCLK")
cbMessage.AddElement(%WM_XBUTTONDOWN, "%WM_XBUTTONDOWN")
cbMessage.AddElement(%WM_XBUTTONUP, "%WM_XBUTTONUP")
Function TBMain()
Dim hDlg As Long
Dialog New Pixels, 0, "look - a window!", _
0, 0, 640, 480, _
%DS_CENTER | %WS_OVERLAPPEDWINDOW | %WS_CAPTION | %WS_THICKFRAME, _
%WS_EX_CLIENTEDGE _
To hDlg
Dialog Show Modal hDlg, Call cb_Main
PrintL "key to end"
WaitKey
End Function
CallBack Function cb_Main()
' now what happens?
PrintL "&H" & Hex$(CBMSG, 4), cbMessage.GetBucket(CBMSG)
End Function