Steve Groner
asked on
Listboxes and SendMessage API
Can somone send me some sample code to allow me to additems and itemdata to a listbox using the SendMessage API call. I would like to add the item, and item data in the same loop, can someone help me. I need this urgently. Thanks
ASKER
Not the code I am looking for. I was told that when adding alot of record to a list box, like 10,00 plus items that using sendmessage would be faster. MrMick had answered a question like this previously, but it was only for the adding itemdata. This fuction should only use the sendmessage command, also do I need to set the redraw to off until it is completed. I know I am a little off on the original question but I will upgrade the points to 100.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks
ASKER
MikeP, the rtlmovememory function does not exist, perhaps you can tell me wher eit is, I tried the code exactly as you have it and it does not work. Help...
Sorry, the correct declare is:
Private Declare Function MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (Dest As Any, src As Any, size As Long) As Long
BTW: It won't make any differense if you are using .AddItem or LB_ADDSTRING, cause.AddItem calls directly LB_ADDSTRING. The important part of the optimization is LB_INITSTORAGE and disabling the redresh
Private Declare Function MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (Dest As Any, src As Any, size As Long) As Long
BTW: It won't make any differense if you are using .AddItem or LB_ADDSTRING, cause.AddItem calls directly LB_ADDSTRING. The important part of the optimization is LB_INITSTORAGE and disabling the redresh
ASKER
MikeP did you test this code before you sent it. When I use this code now, it acts as though it is doing something but nothing ever appears in the list, how do you turn on and off the refresh. I do not know. Here is the code I am using.
Dim sSQL As String
Dim rs As rdoResultset
Dim retcode As Long
Dim p As Long
Dim sName As String
sSQL = "Select * from apps ORDER BY LastName;"
Set rs = cn.OpenResultset(sSQL, rdOpenDynamic, rdConcurRowVer)
SendMessage list1.hwnd, LB_INITSTORAGE, 10000, 200000
Do Until rs.EOF
sName = rs!LastName + ", " + rs!FirstName
MoveMemory p, sName, Len(sName)
retcode = SendMessage(list1.hwnd, LB_ADDSTRING, 0, p)
SendMessage list1.hwnd, LB_SETITEMDATA, retcode, CLng(rs!Unique)
rs.MoveNext
Loop
Set rs = Nothing
Dim sSQL As String
Dim rs As rdoResultset
Dim retcode As Long
Dim p As Long
Dim sName As String
sSQL = "Select * from apps ORDER BY LastName;"
Set rs = cn.OpenResultset(sSQL, rdOpenDynamic, rdConcurRowVer)
SendMessage list1.hwnd, LB_INITSTORAGE, 10000, 200000
Do Until rs.EOF
sName = rs!LastName + ", " + rs!FirstName
MoveMemory p, sName, Len(sName)
retcode = SendMessage(list1.hwnd, LB_ADDSTRING, 0, p)
SendMessage list1.hwnd, LB_SETITEMDATA, retcode, CLng(rs!Unique)
rs.MoveNext
Loop
Set rs = Nothing
You lock the window update when you pass the listbox handle, and unlcok it when you pass null:
LockWindowUpdate(List1.hwn d) 'Lock
LockWindowUpdate(vbNull) 'Unlock
LockWindowUpdate(List1.hwn
LockWindowUpdate(vbNull) 'Unlock
Dim p as long
Dim x as long
CopyMemory p, "Item1", len(Item1)
X = SendMessage(List1.hwnd, LB_ADDITEM, 0, p)
SendMessage List1.hwnd, LB_SETITEMDATA, X, value
you can do the same in vb, but much more easier:
list1.additem "item"
list1.itemdata(list1.newin