2.4.10 TreeView

Назад Содержание Дальше

Объект класса TreeView древовидному списку. Данный вид объектов содержит ряд методов ,аналогичных спискам. В частоности это методы Select и DoubleSelect. И основная работа аналогична работе со списками за исключением того, что элементы TreeView могут быть узлами, содержащими подузлы. Реализация шага начинается как обычно:

Code

		[ ] wTestApp.Control.TreeView.Pick()
		[+] with dTreeView
			[+] if( !.Exists() )
				[ ] Error("Tree View window didn't appear")

 

 

Далее мы сгенерируем элементы древовидного списка и проверим, что сгенерируется 5 элементов, какждый из которых является подузлом предыдущего. Введем количество узлов и нажмем кнопку SetData.

Code

			[ ] .edtItem.sValue = "5"
			[ ] .btnSetData.Click()
			[ ] 

 

Далее приступим к проверке. Во-первых, нужно проверить. что сгенерируется 5 элементов. По аналогии со списками, количество элементов извлекается свойством iItemCount. Различия проявляются в следующем: в списках данное свойство отображает количество всех элементов. В древовидном списке данное свойство вернет только количество видимых элементов. Иными словами, если есть узел, содержащий подузлы, то эти подузлы не будут учтены, если данный узел свернут. Итак, проверим количество элементов:

Code

			[ ] iValue = .treeTheTreeView.iItemCount
			[+] if( iValue != 5 )
				[ ] Error("Tree View wasn't filled with required amount of items. Expected count: 5. Actual: {iValue}")

 

Далее, надо проверить правильность генерации имен. Имя элемента списка отражает его местоположение в иерархии. Например, если узел “1” содержит в себе узел “2”, то второй узел реально задается строкой “/1/2″. То есть косая черта является разделителем элементов в иерархии по аналогии с путями в UNIX. Поскольку каждый узел дерева может быть как в раскрытом, так и в схлопнутом состоянии, то для корректной работы нужно убедиться, в каком же состоянии находится нужный узел в данный момент. Для этого определен метод IsItemExpanded. Но в данном случае нам нужно только проверить, что у некоторого узла (кроме последнего) есть подузлы. Проверка на это может быть реализована различными способами. Например, можно использовать метод GetSubItemCount, который вернет количество подэлементов. В пустом узле таких элементов не найдется. Другой способ, это проверить на то, что данный узел может быть раскрыт. Для этого используется метод IsItemExpandable. Его мы и задействуем. Итак, у нас должно быть 5 элементов: “/1″, “/1/2″ , “/1/2/3″, “/1/2/3/4″ , “/1/2/3/4/5″. Все узлы, кроме последнего, должны содержать подузлы. Дополнительным условием является то, что каждый из узлов должен быть раскрыт. Если узел не раскрыт, то его нужно раскрыть принудительно. Это осуществляется методом Expand. У него есть соответствующий метод Collapse, который схлопывает узел. Таким образом, проверка имеет вид:

Code

			[ ] lsValue = .treeTheTreeView.lsContents
			[ ] sValue = ""
			[+] for( iValue = 1 ; iValue < 5 ; iValue++ )
				[ ] sValue = "{sValue}/{iValue}"
				[+] if( sValue != lsValue[iValue] )
					[ ] Error("Item #{iValue} has incorrect text. Expected: ""{sValue}"" . Actual: ""{lsValue[iValue]}"" ",FALSE)
				[ ] 
				[+] if( !.treeTheTreeView.IsItemExpandable(iValue) )
					[ ] Error("Item #{iValue} doesn't contain subitems",FALSE)
				[+] if( !.treeTheTreeView.IsItemExpanded(iValue) )
					[ ] Error("Item #{iValue} isn't expanded",FALSE)
					[ ] .treeTheTreeView.Expand(iValue)

 

Следующими действиями будет проверка на корректность различных способов раскрытия-сворачивания узлов. Они сводятся к следующей последовательности действий:

  • Выбрать узел
  • Нажать клавишу
  • Проверить, что элемент закрылся
  • Нажать другую клавишу
  • Проверить, что элемент раскрылся.
  • Перейти на другой элемент

Действия эти несложные и реализуются так:

Code

			[ ] .treeTheTreeView.Select("/1/2/3/4/5") // Выбираем 5-й узел дерева
			[+] if( .treeTheTreeView.sValue != "/1/2/3/4/5" ) // Проверяем корректность выбора
				[ ] Error("Unexpected item was selected: ""{.treeTheTreeView.sValue}"". Expected: ""/1/2/3/4/5"" ")
			[ ] 
			[ ] .TypeKeys("")  // Переходим на элемент выше по иерархии и схлопываем узел нажатием клавиши "Влево"
			[ ] 
			[+] if( .treeTheTreeView.sValue != "/1/2/3/4" ) // Проверяем правильность перехода
				[ ] Error("Unexpected item was selected: ""{.treeTheTreeView.sValue}"". Expected: ""/1/2/3/4"" ")
			[ ] 
			[ ] iValue = .treeTheTreeView.iValue
			[ ] 
			[+] if( .treeTheTreeView.IsItemExpanded( iValue ) ) // Проверяем, что элемент свернут
				[ ] Error("Node ""4"" wasn't collapsed",FALSE)
			[ ] 
			[ ] .TypeKeys("") // Разворачиваем узел нажатием клавиши "Вправо"
			[+] if( !.treeTheTreeView.IsItemExpanded( iValue ) ) // Проверяем, что узел развернут
				[ ] Error("Node ""4"" wasn't expanded",FALSE)
			[ ] 
			[ ] .TypeKeys("") // Переходим на 3-й элемент
			[ ] 
			[+] if( .treeTheTreeView.sValue != "/1/2/3" ) // Проверяем правильность перехода
				[ ] Error("Unexpected item was selected: ""{.treeTheTreeView.sValue}"". Expected: ""/1/2/3"" ")
			[ ] 
			[ ] iValue = .treeTheTreeView.iValue
			[ ] .treeTheTreeView.TypeKeys("<#Minus>") // Сворачиваем узел нажатием "-" 
			[+] if( .treeTheTreeView.IsItemExpanded( iValue ) ) // Прверяем, что узел свернут
				[ ] Error("Node ""3"" wasn't collapsed",FALSE)
			[ ] 
			[ ] .treeTheTreeView.TypeKeys("<#Plus>") // Разворачиваем узел нажатием клавиши "+"
			[+] if( !.treeTheTreeView.IsItemExpanded( iValue ) ) // Прверяем, что узел развернут
				[ ] Error("Node ""3"" wasn't expanded",FALSE)
			[ ] 
			[ ] .treeTheTreeView.DoubleSelect("/1/2") // Двойным щелчком (по аналогии со списками реализуется методом DoubleSelect) сворачиваем 2-й узел
			[+] if(.treeTheTreeView.sValue != "/1/2") // Проверяем, что узел свернут
				[ ] Error("Unexpected item selected. Expected: ""/1/2"" . Actual: ""{.treeTheTreeView.sValue}"" ")
			[ ] 
			[ ] iValue = .treeTheTreeView.iValue
			[ ] 
			[+] if( .treeTheTreeView.IsItemExpanded( iValue ) ) // Проверяем, что узел свернут
				[ ] Error("Node ""2"" wasn't collapsed",FALSE)

 

Остальное делается уже как обычно

Code

			[ ] ClickEnabledAndCheck( dTreeView , .treeTheTreeView )
			[ ] 
			[ ] .btnClearItems.Click()
			[+] if( .treeTheTreeView.iItemCount > 0 )
				[ ] Error("Tree View wasn't cleared.",FALSE)
			[ ] 
			[+] if( !.Exit() )
				[ ] Error("Unable to close Tree View dialog")
			[ ] 

 

Все, с данным шагом разобрались. Вообще, элемент управления TreeView как правило один из самых капризных. Например, не всегда видится корневой элемент. В этих случаях приходится переопределять некоторые стандартные методы. Затем, достаточно долго извлекается содержимое ( дольше, чем в том же ListView ). Но как правило данный элемент управления применяется не интенсивно. По крайней мере не так, как текстовые поля, кнопки и т.п. Поэтому подобные проблемы возникают не часто.


Назад Содержание Дальше