2.4.16 PopupMenu

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

Данный класс соответствует выпадающему меню. Основная сложность объектов данного класса состоит в том, что такое меню не получается записать стандартным путем, то есть через Record > Window Declarations. Этот объект просто так не видится. Более того, в большинстве случаев можно обойтись и без описания объектов данного класса. Основным действием, выполняемым контекстным меню является активация меню с последующим выбором пункта. Данную задачу с успехом выполняет метод PopupSelect AnyWin-класса. Но тем не менее иногда нужно проверять и какие-то особенности работы данного меню, как и в нашем тесткейсе. Для начала разберемся, как это контекстное меню записывается. Во-первых, добавим во фрейм объявление диалога для тестирования PopupMenu нашего тестируемого приложения. В файле TestApp.inc добавим строчки:

Code

[+] window TestApp_Controls dPopupMenu
	[ ] tag "Popup Menu"
	[ ] parent wTestApp
	[ ] 
	[+] TextField edtTextField
		[ ] tag "Text field"
	[+] PushButton btnButton
		[ ] tag "Button"

 

Теперь в этом же файле опишем наше контекстное меню. Описывается оно как и обычное меню, но появляются некоторые особенности. Итак, описание имеет вид:

Code

[+] winclass TestAppPopupMenu : PopupMenu
	[ ] 
	[+] POINT Point
		[ ] tag "$PopupMenu/({Point.x}, {Point.y})"
		[ ] 
		[+] MenuItem TheItem
			[ ] tag "The item"
		[+] MenuItem TheAcceleratorItem
			[ ] tag "The accelerator item"
		[+] Menu TheCascadeItem
			[ ] tag "The cascade item"
                            ...............................................
		[+] MenuItem ThePopupMenu
			[ ] tag "The popup menu"
		[+] MenuItem Check
			[ ] tag "Check"
		[+] MenuItem Uncheck
			[ ] tag "Uncheck"
		[+] MenuItem TheCheckItem
			[ ] tag "The check item"
		[+] MenuItem Enable
			[ ] tag "Enable"
		[+] MenuItem Disable
			[ ] tag "Disable"
		[+] MenuItem TheEnableItem
			[ ] tag "The enable item"
		[ ] 

 

А теперь обратите внимание на наличие переменной Point и тега $PopupMenu/({Point.x}, {Point.y}). Причем все элементы меню и тег объявлены внутри блока, начинающегося с объявления переменной. Как видно из описания, данное контекстное меню идентифицируется по координатам. Это координаты положения курсора. А объявление находится внутри блока, в заглавии которого находится POINT Point, чтобы значения переменной Point были доступны для тега и всех дочерних элементов. Это одна из особенностей объявления выпадающих меню. Более того приведенный пример объявления является достаточно общим случаем. Большинство контекстных меню объявляется подобным образом. Теперь осталось добавить выпадающие меню к нужным элементам управления. В нашем случае, это текстовое поле и кнопка Button. В итоге диалоговое окно PopupMenu объявляется следующим образом:

Code

[+] window TestApp_Controls dPopupMenu
	[ ] tag "Popup Menu"
	[ ] parent wTestApp
	[ ] 
	[+] TextField edtTextField
		[ ] tag "Text field"
		[ ] 
		[ ] TestAppPopupMenu Popup
	[+] PushButton btnButton
		[ ] tag "Button"
		[ ] 
		[ ] TestAppPopupMenu Popup

 

Выпадающие меню добавлены как дочерние элементы объектов, нажатие на которые активирует контекстное меню.

 

А теперь перейдем к написанию кода шага. Откроем диалог PopupMenu:

Code

		[ ] wTestApp.Menu.ThePopupMenu.Pick()
		[+] with dPopupMenu
			[+] if( !.Exists() )
				[ ] Error("Popup Menu dialog didn't appear")

 

А дальше рассмотрим повнимательнее описание шага. От нас требуется реализация одних и тех же действий для кнопки и для текстового поля. Причем в текстовом поле контекстное меню вызывается нажатием правой кнопки мыши, а на кнопке – нажатием левой кнопки мыши. Пожалуй, в этом и состоит главное отличие. Соответственно, данный шаг можно реализовать в цикле с двумя итерациями. Варьирируемыми параметрами выступают элементы управления, на которых будет вызываться контекстное меню, а также номер кнопки мыши, которой это контекстное меню активируется. Итак, паре окон dPopupMenu.edtTextField,dPopupMenu.btnButton соответствуют индексы кнопок мыши 2, 1. Цикл реализуем следующим образом:

Code

		[ ] iValue = 3
		[+] for each wCtrl in {dPopupMenu.edtTextField,dPopupMenu.btnButton}
			[ ] 
			[ ] iValue--
			..........................................

 

Как видно, у цикла будет 2 захода. На первом заходе используется поле dPopupMenu.edtTextField и номер кнопки 2. На втором заходе dPopupMenu.btnButton и номер кнопки 1. То есть то, что нужно. Теперь начнем выбирать пункты контекстного меню. Первым делом сделаем обычный выбор пункта. Выше указывалось, что для этих целей у AnyWin есть метод PopupSelect. Но по умолчанию он осуществляет вызов контекстного меню нажатием правой кнопки мыши, а в одном из случаев нужно сделать клик левой кнопкой. На самом деле способ вызова меню определяется опцией OPT_MENU_INVOKE_POPUP ( выставляется в Options > Agent > Other в поле Events used to invoke popup menus ). Таким образом мы можем настроить данную опцию так, чтобы вначале срабатывал правый клик мышью, а затем левый. При этом все все равно вызывается метод PopupSelect. Итак, реализуется данное действие следующим кодом:

Code

		[ ] iValue = 3
		[+] for each wCtrl in {dPopupMenu.edtTextField,dPopupMenu.btnButton}
			[ ] 
			[ ] iValue--
			..........................................

			[+] with wCtrl
				[ ] dPopupMenu.SetActive()
				[ ] wCtrl.SetFocus()
				[ ] Print("Checking popup for {wCtrl} window")
				[ ] 
				[ ] sValue = Agent.GetOption (OPT_MENU_INVOKE_POPUP)
				[ ] Agent.SetOption (OPT_MENU_INVOKE_POPUP, "")
				[ ] 
				[+] do
					[ ] .PopupSelect(5,5,"The item")
				[+] except
					[ ] Agent.SetOption (OPT_MENU_INVOKE_POPUP, sValue)
					[ ] return
				[ ] Agent.SetOption (OPT_MENU_INVOKE_POPUP, sValue)
				[ ] 
				[+] if( !dMsg.Exists(2) )
					[ ] Error("No message appears")
				[ ] 
				[ ] dMsg.TypeKeys("")
				[ ] 

 

Обратите внимание, что сам вызов PopupSelect помещен в блок для перехвата исключений. При этом, в случае генерации исключения, все равно восстанавливается предыдущее значение опции OPT_MENU_INVOKE_POPUP.

 

А теперь сделаем более явный выбор пункта меню. Вот так:

Code

		[ ] iValue = 3
		[+] for each wCtrl in {dPopupMenu.edtTextField,dPopupMenu.btnButton}
			[ ] 
			[ ] iValue--
			..........................................

			[+] with wCtrl
				..........................................

				[ ] dPopupMenu.SetActive()
				[ ] wCtrl.SetFocus()
				[ ] 
				[ ] .Click(iValue,5,5)
				[ ] .Popup.Point = {5,5}
				[ ] .Popup.Check.Pick()
				[ ] 

 

Как было уже сказано выше, тег для данного меню выражается через координаты, по которым находится курсор мыши. Координаты нам известны (мы явно указываем место клика). Далее осталось эти координаты перенести в свойство Point, что мы и сделали. После этого меню видится нормально и мы можем выбрать пункт меню, что предыдущим кодом мы показали. Дальнейшие действия все однотипны и основываются на использовании стандартных свойств пунктов меню, таких как bChecked,bEnabled. Поэтому оставшийся код приведем целиком.

Code

		[ ] iValue = 3
		[+] for each wCtrl in {dPopupMenu.edtTextField,dPopupMenu.btnButton}
			[ ] 
			[ ] iValue--
			..........................................

			[+] with wCtrl
				..........................................

				[ ] dPopupMenu.SetActive()
				[ ] wCtrl.SetFocus()
				[ ] 
				[ ] .Click(iValue,5,5)
				[ ] .Popup.Point = {5,5}
				[+] if( !.Popup.TheCheckItem.bChecked )
					[ ] Error("Item The Check Item wasn't checked",FALSE)
				[ ] .Popup.Uncheck.Pick()
				[ ] 
				[ ] dPopupMenu.SetActive()
				[ ] wCtrl.SetFocus()
				[ ] 
				[ ] .Click(iValue,5,5)
				[ ] .Popup.Point = {5,5}
				[+] if( .Popup.TheCheckItem.bChecked )
					[ ] Error("Item The Check Item wasn't unchecked",FALSE)
				[ ] 
				[ ] .Popup.Disable.Pick()
				[ ] 
				[ ] dPopupMenu.SetActive()
				[ ] wCtrl.SetFocus()
				[ ] 
				[ ] .Click(iValue,5,5)
				[ ] .Popup.Point = {5,5}
				[+] if( .Popup.TheEnableItem.bEnabled )
					[ ] Error("Item The Enable Item isn't disabled",FALSE)
				[ ] 
				[ ] .Popup.Enable.Pick()
				[ ] 
				[ ] dPopupMenu.SetActive()
				[ ] wCtrl.SetFocus()
				[ ] 
				[ ] .Click(iValue,5,5)
				[ ] .Popup.Point = {5,5}
				[+] if( !.Popup.TheEnableItem.bEnabled )
					[ ] Error("Item The Enable Item isn't enabled",FALSE)
		[ ] 
		[+] if( !dPopupMenu.Exit() )
			[ ] Error("Failed to exit from Popup menu dialog")

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


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