2013-06-20 8 views
1

У меня есть код для поиска и выбора элемента с именем «Win» в его названии. Но я должен изменить его для поиска элементов с «Win», «History», «Credits» или «#» в его имени и выбрать его. Благодаря!Выбор нескольких элементов в дереве

_GUICtrlTreeView_Expand(ControlGetHandle("[CLASS:HH Parent;TITLE:AutoIt Help]","", "[CLASS:SysTreeView32; INSTANCE:1]"),0, True) 
Global $hWnd = ControlGetHandle("[CLASS:HH Parent;TITLE:AutoIt Help]", "", "[CLASS:SysTreeView32; INSTANCE:1]") 
$searchText = "Win" 
$hItemFound = _GUICtrlTreeView_FindItem($hWnd, $searchText, True) 

While $hItemFound 
    _GUICtrlTreeView_SelectItem($hWnd, $hItemFound) 
    $next = _GUICtrlTreeView_GetNextVisible($hWnd, $hItemFound) 
    $hItemFound = _GUICtrlTreeView_FindItem($hWnd, $searchText, True, $next) 
    Sleep(1000) 
WEnd 

Я также попытался с помощью switch, но не будет работать:

Global $hWnd = ControlGetHandle("[CLASS:HH Parent;TITLE:AutoIt Help]", "", "[CLASS:SysTreeView32; INSTANCE:1]") 
$searchText = "Autoit" 
$hItemFound = _GUICtrlTreeView_FindItem($hWnd, $searchText, True) 
While $hItemFound 
    _GUICtrlTreeView_SelectItem($hWnd, $hItemFound) 
    $next = _GUICtrlTreeView_GetNextVisible($hWnd, $hItemFound) 

    $foundWinItem = _GUICtrlTreeView_FindItem($hWnd, "Win", True,$next) 
    $foundHistoryItem = _GUICtrlTreeView_FindItem($hWnd, "History", True,$next) 

    Switch $next 
    Case "Win" 
     $hItemFound = $foundWinItem 
    Case "History" 
     $hItemFound = $foundHistoryItem 
    EndSwitch 
WEnd 
+2

Я не уверен, что вы знаете, но я один из немногих людей, которые отвечают на вопросы о переполнении стека. Я также помогаю вам прямо сейчас на форумах autoit. Дублирование вашего вопроса через два не приведет вас никуда. Будьте терпеливы и перечитайте мой ответ на форумах autoit, поскольку вы внедрили это неправильно. – Matt

ответ

3

Ok, кажется индекс не то, что вы хотели основать его на как я ранее думал, как индекс относительно родителя.

Вместо этого просто выполните поиск вручную. Вот функция, которую я собираю, которая просто выполняет итерацию по каждому элементу и проверяет ее на «|» разделенный список строк.

#include <GUITreeview.au3> 
#include <Array.au3> 

Global $hWnd = ControlGetHandle("[CLASS:HH Parent;TITLE:AutoIt Help]", "", "[CLASS:SysTreeView32; INSTANCE:1]") 


For $it In _GUICtrlTreeView_FindAll($hWnd, "Win|History", True) 
    _GUICtrlTreeView_SelectItem($hWnd, $it) 
Next 

Func _GUICtrlTreeView_FindAll($hWnd, $sStrings, $fInStr = False) 
    Local $aRet[1] = [0], $hItem 

    Local $aStrings = StringSplit($sStrings, Opt("GUIDataSeparatorChar"), 3) 

    While 1 
     $hItem = _GUICtrlTreeView_GetNext($hWnd, $hItem) 
     If $hItem = 0 Then ExitLoop 

     $sText = _GUICtrlTreeView_GetText($hWnd, $hItem) 

     For $s In $aStrings 
      If ($fInStr And StringInStr($sText, $s)) Or $sText = $s Then 
       _ArrayAdd($aRet, $hItem) 
       $aRet[0] += 1 

       ExitLoop 
      EndIf 
     Next 
    WEnd 

    Return $aRet 
EndFunc ;==>_GUICtrlTreeView_FindAll 
+0

Я пробовал это, но он не будет выбирать элементы. – NullReferenceException

+0

@ пользователь2379805, работает здесь. Это очень быстро, хотя (менее половины секунды, чтобы выбрать все предметы), возможно, вам это не хватает. – Matt

+0

Я положил функцию 'Sleep', но он все равно не покажет, что он действительно выбирает элемент. Должен ли я использовать 'clickItem'? – NullReferenceException

Смежные вопросы