Что нового

[Элементы GUI] Не удаеться получить текст элемента SysTreeView32

jawello

Новичок
Сообщения
4
Репутация
0
Доброе время суток.

Задача: Пробежаться по все элементам SysTreeView32 и названия записать в файл.

Проблема: Не удается получить текст элемента. с помощью функции
Код:
ControlTreeView($WinTitle, "", "[CLASS:SysTreeView32; INSTANCE:44]", "GetText",$sItem,1)
. Возвращается пустая строка.

Код:
Код:
#include <GuiTreeView.au3>
$WinTitle="Transact SM Design Studio - sb - [Transact map - ""2741 - ToUpdateMainApplicantArrayIntegr""]"
WinActivate($WinTitle)
$hWnd = ControlGetHandle($WinTitle, "", "SysTreeView3244")
$nCoutItems=0
$hStart = _GUICtrlTreeView_GetFirstChild($hWnd, 0)

if $hStart = 0 Then
		MsgBox(64,"Не нашел окно",":(")
		
	endif
	;MsgBox(64,"Не нашел окно",$hStart)
$file = FileOpen("d:\test.txt", 1)

 _GUICtrlTreeView_SelectItem($hWnd, $hStart)

$flag=True
 While $hStart <> 0x00000000
        $nCoutItems+=1
        _GUICtrlTreeView_SelectItem($hWnd, $hStart)
        $sItem = ControlTreeView($WinTitle, "", "[CLASS:SysTreeView32; INSTANCE:44]", "GetSelected",1)
		;$lol=_GUICtrlTreeView_GetFocused($hWnd,2)
		$toFile=ControlTreeView($WinTitle, "", "[CLASS:SysTreeView32; INSTANCE:44]", "GetText",$sItem,1)
		MsgBox(64,"Look",$toFile)
        ;
		if $flag then
			FileWriteLine($file,$toFile)
		endif
		$hStart = _GUICtrlTreeView_GetNext($hWnd, $hStart)
		$flag= Not $flag
    WEnd

FileClose($file)

MsgBox(64,"Скрипт завершен", "lol")

Данный код успешно бежит по списку, и $sItem получает значения вида #0|#2. Но сообщения, в которых выводится $toFile - пустые.


снимки программы:
http://autoit-script.ru/index.php?action=downloads;sa=downfile&id=132


Как мне кажется, что каждый элемент SysTreeView является SysListView, соответственно необходимо как то обратиться с начала к нему, и уже потом выдергивать текст. Но это только предположение. Но в любом случае, как это сделать я не знаю. Программа из которой хочу вытащить данные очень специфичная и глючная.

начал эксперименты. и выяснил, что интересующий меня текст можно вытащить из RichEdit'а. Если выделить нужный элемент и нажать Enter, то появляется RichEdit (не могу пока понять как это все организованно программно, то ли он скрыт и при получении соответствующего сообщения выноситься на первый план, то ли он создается каждый раз при получении сообщения). Удалось вытащить значение одного элемента (уже думал, что проблема решена). В цикл вставить:
Код:
ControlSend($WinTitle, "", $hWnd,"{Enter}")
		$Focus=ControlGetFocus($WinTitle)
		$toFile=ControlGetText("","",$Focus)
ControlSend($WinTitle, "", $hWnd,"{Enter}")

и тогда в $toFile лежит значение. Но оно всегда одно и то же. И всегда это первый элемент или же любой другой, на который я тыкнул мышков во время исполнения скрипта.

спасибо большое за помощь.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
1. {CodeWarn}
2. большие картинки старайся обрамлять тэгом [thumb][/thumb]
 
Автор
J

jawello

Новичок
Сообщения
4
Репутация
0
если кому то интересно, то я нашел решение. правда кривоватое. но пока мне хватило.

как я понял, при выборе элемента динамически создается RichEdit и ComboBox (возможнок ComboBOx из RichEdit'ов, хотя мало вероятно). Выход был найден следующий. После выбора элемента, Systreeview посылался Enter, появлялся RichEdit, затем я вытаскивал указатель на объект, на котором находиться фокус, затем получал текст этого объекта. Но возникла сложность, если это делать программное, то фокус остается на одном и том же объекте и не переходит к следующему. Поэтому пришлось вставить код сворачивания, разворачивания окна. Работает это только при определенных изначальных условиях, но работает. Пока дальше разбираться не буду и не буду искать более элегантные способы решения. Но возможно вернусь к проблеме впоследствии. Если у кого-нибудь появятся идеи буду рад выслушать. спасибо.

Код:
#include <GuiTreeView.au3>
#include <GuiListView.au3>
#Include <WinAPIEx.au3>
#Include <GuiEdit.au3>
$WinTitle="Transact SM Design Studio - sberbank - [Transact map - ""2741 - ToUpdateMainApplicantArrayIntegr""]"
WinActivate($WinTitle)
$hWnd = ControlGetHandle($WinTitle, "", "SysTreeView3244")
$nCountItems=0
$hStart = _GUICtrlTreeView_GetFirstChild($hWnd, 0)

if $hStart = 0 Then
		MsgBox(64,"Не нашел окно",":(")
		
	endif
	
$file = FileOpen("d:\test.txt", 1)

 _GUICtrlTreeView_SelectItem($hWnd, $hStart)

$flag=True
 While $hStart <> 0x00000000
        $nCountItems+=1
        _GUICtrlTreeView_SelectItem($hWnd, $hStart)
        $sItem = _GUICtrlTreeView_GetSelection($hWnd) 
       if $flag then
			ControlSend($WinTitle, "", $hWnd,"{Enter}")
			sleep(500)
			$Focus=ControlGetFocus($WinTitle)
			$toFile=ControlGetText("","",$Focus)
			ControlSend($WinTitle, "", $hWnd,"{Enter}")
			WinMinimizeAll()
			WinActivate($WinTitle)
			if $nCountItems <20 Then
				$MsgAns=MsgBox(1,"Нажмите Cancel, если ниже нет текста",$toFile)
				if $MsgAns=2 Then
					Exit
				endif
			endif
			
			FileWriteLine($file,$toFile)
		endif
		$hStart = _GUICtrlTreeView_GetNext($hWnd, $hStart)
		$flag= Not $flag
    WEnd

FileClose($file)
;Shutdown(1)
MsgBox(64,"Скрипт завершен", "lol")


п.с. т.к. скрипт работает не на 100%, то первые 10ть итераций выводятся на экран в виде сообщения, и если сообщение пусто, то цикл необходимо прервать и запустить заново.
 
Автор
J

jawello

Новичок
Сообщения
4
Репутация
0
ни у кого идей нет?

изложение собственных мыслей мыслей:
просто проблема стала вновь. необходимо понять как работать с подобной структурой.
я так понимаю, там используется три элемента SysTreeView, RichEdit, SysListView или ComboBox. как определить не знаю. SysTreeView - основной элемент. все остальные создаются динамически при выборе пункта в systreeview. я не очень хорошо знаю winapi, но случайно нет ли стандартной структуры?
точного названия сейчас не скажу (autoit установлен на другой машине) но вроде как существует функция, которая возвращаем ComboBox из элемента SysTreeView. может кто подскажет что это и как это можно использовать?

нытье:
если удастся разобраться с этой проблемой, то долгий рутинный и глючный процесс станет гораздо проще. и людям разрабатывающие ПО для "зеленого" банка станет гораздо легче))) ПО, которое им приходится использовать для разработки оставляет желать лучшего!!! а autoit позволит сгладить его недостатки (недостатки - мягко сказано).

еще раз спасибо
 

vombat

Новичок
Сообщения
2
Репутация
0
Всем привет. Вопрос следующий:

Имеется диалог "Обзор папок", содержащий только лишь SysTreeView32, позволяющий выбрать необходимую директорию хранения (см. вложение). Проблема заключается в том, что выбор папок необходимо производить в зависимости от того, на каком элементе (папке в дереве) стоит фокус при открытии диалога. То есть - если при открытии диалога фокус стоит на папке "Папка1", то необходимо послать "Папка2"+нажать ОК. Если на папке "Папка2", то поставить фокус на "Папка1". А корень проблемы заключается в том, что в силу скудоумия своего и отсутствия опыта работы с AutoIt, я не могу получить значение, на каком элементе дерева стоит начальный фокус :(

Подскажите пожалуйста с решением этой задачи
 

Вложения

  • systreeview32.png
    systreeview32.png
    59.6 КБ · Просмотры: 18

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
vombat [?]
получить значение, на каком элементе дерева стоит начальный фокус
Код:
; полный путь
$FullPath = ControlTreeView("Обзор папок", "", "SysTreeView321", "GetSelected")
; разбиение по элементам
$Split = StringSplit($FullPath, "|")
; выделенный элемент
$Selected = $Split[$Split[0]]

ConsoleWrite($FullPath & @CRLF)
ConsoleWrite($Selected & @CRLF)
 

vombat

Новичок
Сообщения
2
Репутация
0
InnI, благодарю, работает. Несколько попыток выполнения скрипта ни к чему не привели, пока не пришло озарение о разрядности системы
 
Верх