Что нового

[Элементы GUI] Сортировка GUICtrlListView_SortItems в сторонней программе

cobain31

Новичок
Сообщения
10
Репутация
0
Добрый день!
Помогите пожалуйста разобраться почему не работает сортировка _GUICtrlListView_SortItems во внешней программе (например оснастка MMC)
Взял пример из справки, упростил его максимально, всё работает:
Код:
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>

Global $g_idListView


    GUICreate("ListView Sort", 300, 200)
    $g_idListView = GUICtrlCreateListView("Column1|Col2|Col3", 10, 10, 280, 180, -1)
    GUICtrlCreateListViewItem("Строка 4|5|ещё_a", $g_idListView)
    GUICtrlCreateListViewItem("Строка 5|4.50 |ещё_c", $g_idListView)
    GUICtrlCreateListViewItem("Строка 5|4.0 |ещё_c", $g_idListView)
    GUICtrlCreateListViewItem("Строка 3|23|ещё_e", $g_idListView)
    GUICtrlCreateListViewItem("Строка 2|0.34560 |ещё_d", $g_idListView)
    GUICtrlCreateListViewItem("Строка 1|1.0 |ещё_b", $g_idListView)
    GUICtrlCreateListViewItem("Строка 1|0.1 |ещё_b", $g_idListView)
    GUICtrlCreateListViewItem("Строка 1|10|ещё_b", $g_idListView)

    GUISetState(@SW_SHOW)

	  _GUICtrlListView_RegisterSortCallBack($g_idListView)
	  Sleep (2000)
	  _GUICtrlListView_SortItems($g_idListView, 1)
	  Sleep (2000)
	  _GUICtrlListView_UnRegisterSortCallBack($g_idListView)
    GUIDelete()


А вот так не работает:
Код:
#include <GuiListView.au3>
Opt("TrayIconDebug", 1)
   $objMMC = ObjCreate("MMC20.Application")
   $objMMC.Load("lusrmgr.msc")
   $objMMC.UserControl = 1
If WinWait("[CLASS:MMCMainFrame]", '', 10) = 0 Then Exit
$objDoc = $objMMC.Document
$objSN = $objDoc.ScopeNamespace
$objRoot = $objDoc.RootNode
$objNode = $objSN.GetChild($objRoot)
$objNode = $objSN.GetChild($objNode)
$objView = $objDoc.ActiveView
$objView.ActiveScopeNode = $objNode

$hWnd = ControlGetHandle ("[CLASS:MMCMainFrame]", "", 12786)

_GUICtrlListView_RegisterSortCallBack($hWnd)
Sleep (2000)
_GUICtrlListView_SortItems($hWnd, 1)
Sleep (2000)
_GUICtrlListView_UnRegisterSortCallBack($hWnd)


При том что если в последнем коде _GUICtrlListView_SortItems заменить на _GUICtrlListView_SimpleSort, то сортировка работает (но очень медленно с большими объёмами данных, поэтому и решил попробовать другую функцию):
Код:
#include <GuiListView.au3>
Opt("TrayIconDebug", 1)

   $objMMC = ObjCreate("MMC20.Application")
   $objMMC.Load("lusrmgr.msc")
   $objMMC.UserControl = 1
If WinWait("[CLASS:MMCMainFrame]", '', 10) = 0 Then Exit
$objDoc = $objMMC.Document
$objSN = $objDoc.ScopeNamespace
$objRoot = $objDoc.RootNode
$objNode = $objSN.GetChild($objRoot)
$objNode = $objSN.GetChild($objNode)
$objView = $objDoc.ActiveView
$objView.ActiveScopeNode = $objNode

$hWnd = ControlGetHandle ("[CLASS:MMCMainFrame]", "", 12786)

Sleep (2000)
_GUICtrlListView_SimpleSort ($hWnd, True, 1)
Sleep (2000)
_GUICtrlListView_SimpleSort ($hWnd, False, 1)
Sleep (2000)


П.с. или может гуру подскажут как на OLE Automation сделать сортировку через LVM_SORTITEMS/LVN_COLUMNCLICK :-[
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Код:
#include <GuiHeader.au3>

$sTitle = "lusrmgr"
$hCtrl = ControlGetHandle ($sTitle, "", "SysHeader321")
$aRect = _GUICtrlHeader_GetItemRect($hCtrl, 1)
$iX = $aRect[0] + ($aRect[2] - $aRect[0]) / 2
$iY = $aRect[1] + ($aRect[3] - $aRect[1]) / 2
ControlClick($sTitle, "", $hCtrl, "", 1, $iX, $iY)
 
Автор
C

cobain31

Новичок
Сообщения
10
Репутация
0
InnI сказал(а):
Код:
#include <GuiHeader.au3>

$sTitle = "lusrmgr"
$hCtrl = ControlGetHandle ($sTitle, "", "SysHeader321")
$aRect = _GUICtrlHeader_GetItemRect($hCtrl, 1)
$iX = $aRect[0] + ($aRect[2] - $aRect[0]) / 2
$iY = $aRect[1] + ($aRect[3] - $aRect[1]) / 2
ControlClick($sTitle, "", $hCtrl, "", 1, $iX, $iY)
Умный в гору не пойдёт, умный гору обойдёт :laugh:
Блин ну Вы меня прям расстроили, я несколько дней долбал сортировку, уже из принципа решил попросить помощи чтоб её добить. Как мне теперь дальше жить то?)
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
cobain31
Вы почти добрались, чутка не дошли: Сортируем по имени

Код:
$objView.ActiveScopeNode = $objNode ;продолжим после этой строки


Local $oColumns = $objView.Columns
Local Const $SortOrder_Ascending	= 0
Local Const $SortOrder_Descending	= 1
For $oColumn In $oColumns
	ConsoleWrite($oColumn.Name & @CRLF)
	If $oColumn.Name = 'Имя' Then
		$oColumn.SetAsSortColumn($SortOrder_Descending)
		ExitLoop
	EndIf
Next


https://msdn.microsoft.com/en-us/library/aa814602(v=vs.85).aspx
 
Автор
C

cobain31

Новичок
Сообщения
10
Репутация
0
inververs, вот жеж блин! А я вдоль и поперёк до дыр перечитывал методы View Object :wall_brake: Еще думаю ну как же так, почему нет сортировки то, не может такого быть :-X
Спасибо!!! :smile:
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
cobain31
Пожалуйста, обращайтесь, тут всегда помогут :smile:
 
Автор
C

cobain31

Новичок
Сообщения
10
Репутация
0
inververs сказал(а):
cobain31
Пожалуйста, обращайтесь, тут всегда помогут :smile:
Ну я стараюсь уж в совсем крайних случаях обращаться, когда сам захожу в полный тупик :smile:
:thumbs_up:
 
Верх