dRsrb Posted February 19, 2009 Posted February 19, 2009 (edited) Hi! I have a few problems regarding sorting a list. As I haven't found any examples that deal with sorting in "GUIOnEventMode" I have big problems to implement it in my app. I read a lot of threads, but all solutions deal with MessageLoop mode. I probably had never choose OnEvent mode. Hmmm... It's my 1st AutoIt app. As you can see in the example, the items of the list aren't sorted just once. The function "_ListViewSort()" is invoked several times (seemingly once for every item in the list). I mean that with dancing. The next thing I noticed is that some items disappear (replaced by other)! Just compare the code with your result after sorting the list for several times. expandcollapse popup#include <GUIConstantsEx.au3> #include <GuiListView.au3> #include <EditConstants.au3> AutoItSetOption('GUIOnEventMode', 1) AutoItSetOption('MustDeclareVars', 1) Global Const $ApplicationTitle = 'Test' Global $Main Global $ListView _Main() Func _Main() $Main = GUICreate($ApplicationTitle, 88, 186, -1, -1) GUISetOnEvent($GUI_EVENT_CLOSE, '_ExitApplication') $ListView = GUICtrlCreateListView('Text', 0, 0, 88, 186, $ES_READONLY) _GUICtrlListView_SetExtendedListViewStyle($ListView, $LVS_EX_INFOTIP) _GUICtrlListView_SetColumnWidth($ListView, 0, 66) GUICtrlRegisterListViewSort($ListView, '_ListViewSort') _GUICtrlListView_RegisterSortCallBack($ListView) _TestFunc_SetItem() GUISetState(@SW_SHOW) While True Sleep(1000) WEnd EndFunc Func _ExitApplication() If @GUI_WINHANDLE = $Main Then Exit 0 EndIf EndFunc Func _TestFunc_SetItem() GUICtrlCreateListViewItem('Test1', $ListView) GUICtrlCreateListViewItem('Test2', $ListView) GUICtrlCreateListViewItem('Test3', $ListView) GUICtrlCreateListViewItem('TEST1', $ListView) GUICtrlCreateListViewItem('TEST2', $ListView) GUICtrlCreateListViewItem('TEST3', $ListView) GUICtrlCreateListViewItem('Entry1', $ListView) GUICtrlCreateListViewItem('Entry2', $ListView) GUICtrlCreateListViewItem('Entry3', $ListView) EndFunc Func _ListViewSort() _GUICtrlListView_SortItems($ListView, GUICtrlGetState($ListView)) EndFunc Where is my error in reasoning? Should I rewrite my app to work in MessageLoop mode? Hmm... I'm very confused. EDIT: Just realized: It's the wrong forum. Sorry. Edited February 19, 2009 by dRsrb
qsek Posted March 2, 2009 Posted March 2, 2009 (edited) I would appreciate a solution too. I didnt had to do much with Listview sorting and Callback is still a bit over my MSDN knowledge.But i can guess that you either have to work with:GUICtrlRegisterListViewSort and use the internal LV functions (GUICtrlCreateListViewItem) for creating ItemsOR_GUICtrlListView_RegisterSortCallBack($ListView) with the new UDF functions (_GUICtrlListView_AddItem) and use GUICtrlSetOnEvent($ListView,"_ListViewSort") to call a function with _GUICtrlListView_SortItemsThe second Listview is just for demonstrating the option with GUICtrlRegisterListViewSort. normally there is a real sorting script inside the _ListViewSort function. Here just the order of the items are being switched.On the first LV i came so far that the arrows become visible and change but no sorting takes place.I believe the trick lays in the way callback works in OnEventMode.expandcollapse popup#include <GUIConstantsEx.au3> #include <GuiListView.au3> #include <WindowsConstants.au3> AutoItSetOption('GUIOnEventMode', 1) ;~ AutoItSetOption('MustDeclareVars', 1) Global Const $ApplicationTitle = 'Test' Global $Main Global $ListView _Main() Func _Main() $Main = GUICreate($ApplicationTitle, 404, 186, -1, -1) GUISetOnEvent($GUI_EVENT_CLOSE, '_ExitApplication') $ListView = GUICtrlCreateListView('Text', 0, 0, 200, 186,-1) $ListView2 = GUICtrlCreateListView('Text', 202, 0, 200, 186,-1) _GUICtrlListView_AddColumn($ListView , "0") _GUICtrlListView_AddColumn($ListView , "1") _GUICtrlListView_AddColumn($ListView , "2") _GUICtrlListView_AddColumn($ListView , "3") _GUICtrlListView_AddColumn($ListView2 , "0") _GUICtrlListView_AddColumn($ListView2 , "1") _GUICtrlListView_AddColumn($ListView2 , "2") _GUICtrlListView_AddColumn($ListView2 , "3") _TestFunc_SetItem($ListView) _TestFunc_SetItem($ListView2) GUICtrlSetOnEvent($ListView,"_ListViewSort") _GUICtrlListView_RegisterSortCallBack($ListView) GUICtrlRegisterListViewSort($ListView2, '_ListViewSort2') ;~ GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY") GUISetState(@SW_SHOW) While True Sleep(1000) WEnd EndFunc Func _ExitApplication() _GUICtrlListView_UnRegisterSortCallBack($ListView) If @GUI_WINHANDLE = $Main Then Exit 0 EndIf EndFunc Func _TestFunc_SetItem($iLV) For $i = 0 To 5 $iInde = _GUICtrlListView_AddItem($iLV, "test"&$i) _GUICtrlListView_SetColumnWidth($iLV, 0, $LVSCW_AUTOSIZE_USEHEADER) For $x = 1 To 3 _GUICtrlListView_AddSubItem($iLV, $iInde, Random(0,9,1)&Chr(Random(97,122,1))&"hmm", $x) _GUICtrlListView_SetColumnWidth($iLV, $x , $LVSCW_AUTOSIZE) Next next EndFunc Func _ListViewSort() Local $icol = GUICtrlGetState($ListView) ConsoleWrite("sorting col: "&$icol & @CRLF) _GUICtrlListView_SortItems($ListView, $icol) EndFunc Func _ListViewSort2() ; Return value Meaning ; -1 1st item should precede the 2nd. ; 0 No Change. ; 1 1st item should follow the 2nd. Return 1 EndFunc Edited March 2, 2009 by qsek Teamspeak 3 User Viewer - Quick and functional TS3 Query script, which shows online users.Cached Screenshot Deleter - Deletes older Fraps Screenshots if they exceed a specified limit.Unresolved Topics:Intercept and modify dragdrop text behaviour in scite
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now