1.4 Использование Class Map и расширение встроенных классов

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

1.4.1 Использование Class Map

Class Map (Карта Классов) – это весьма полезный инструмент, который позволяет указать SilkTest-у, как работать с нестандартными классами в том случае, если эти классы соответствуют стандартным, но называются иначе. Особенно часто такая ситуация встречается в случае Delphi-приложений, в которых практически все классы определяются SilkTest-ом как нестандартные.

Чтобы это сделать откроем Class Map (Options – Class Map или Record – Window Declaration – Class Map), в поле Custom Class введем имя класса, который нам необходимо описать как стандартный, а в выпадающем списке справа Standard Class выберем стандартный класс, к которому мы хотим присоединить наш нестандартный класс.

Например, если на форме имеется элемент ListBox, то SilkTest будет его определять как CustomWin TListBox и, как следствие, работать с ним будет невозможно. Однако если в Class Map’e определить этот класс как ListBox, то все операции, которые можно производить с обычным ListView, станут доступны и для класса TListView. Однако так поступить можно не со всеми элементами (например, с классом GridControl это не поможет).

Обратите внимание: делать описание окон с помощью Record Window Declaration надо после того, как нестандартный класс примаплен к стандартному. Для проверки того, что вы сделали все правильно, откройте выберите пункт меню Record – Window Declaration, наведите курсор мыши на примапленный элемент и убедитесь, что в окне record Window Declaration его класс определяется не как CustomWin, а как класс, к которому вы его примапили. После этого можно записывать объявления окон.

Отдельного внимания заслуживает пункт Ignore в списке стандартных классов Class Map’a. Этот пункт предназначен для игнорирования какого-либо класса, или группы классов (в именах Custom Class’ов можно использовать символы групповой замены). После добавления такого соответствия добавленный класс будет проигнорирован и все элементы данного класса не попадут в описание окна.

В этом случае элементы данного класса не будут отображаться в списке элементов окна Window Declaration, однако их отображение можно включить, если в этом окне нажать кнопку Options, а затем включить опцию “Show ignored windows”. При включенной этой опции в колонке Identifier окна Window Declaration будет отображаться значение (Ignored).

Использовать данную возможность следует осторожно, так как можно “заигнорить” какой-нибудь важный класс. Если это просто элементы окна, то лучше оставить их как есть, а если элементы этого класса встречаются в середине иерархии объектов, то лучше воспользоваться корректировкой тегов и переместить все дочерние объекты на уровень вверх (подробнее об этом в главе “1.2.2 Работа с тегами (tags)”).

1.4.2 Расширение встроенных классов

Уже описанные в SilkTest-е стандартные классы имеют большое количество методов и свойств, которые позволяют работать с элементами управления. Однако, возможно, вам захочется иметь еще какие-то методы и свойства, доступные уже имеющимся классам. В этом случае вы можете выбрать один из способов:

  • переопределить стандартный класс
  • объявить новый класс, пронаследовав его от стандартного, а затем объявлять во фрейме объекты этого класса вместо стандартного

 

Конечно, можно добавлять эти методы и свойства в само определение класса (файл Program Files\Segue\SilkTest\winclass.inc), однако делать это не рекомендуется, так как можно потерять сделанные изменения во время переустановки SilkTest-а. Кроме того, эти изменения не будут доступны при переносе на другой компьютер.
Поэтому лучше создать отдельный inc-файл, в который заносить все подобные изменения и подключать его по мере необходимости.

В качестве примера рассмотрим стандартный класс ListView и его метод GetItemText, который возвращает значение ячейки по номеру строки, а также имеет необязательный параметр iColumn, который позволяет указать номер колонки, из которой извлекать текст. Было бы удобнее, если бы в качестве второго параметра передавался бы не номер колонки, а ее заголовок (особенно в случае, когда пользователь может настраивать расположение колонок).

Можно переопределить имеющийся метод GetItemText (как это сделать описано подробнее в главе “1.3.2 Методы (Methods)”), однако данный пример иллюстрирует создание нового метода для имеющихся классов, поэтому мы создадим новый метод GetItemTextByColumn. Этот метод будет возвращать строку, находящуюся в нужной нам ячейке, либо NULL в случае, если такая колонка не найдена.

Для этого в файле TestApp.inc, в котором хранится вся функциональность нашего примера, мы создадим следующее объявление:

Code

[-] winclass ListView : ListView

Это в том случае, если вы хотите переопределить имеющийся класс. Если же вы хотите создать новый класс и пронаследовать его от ListView, то необходимо написать:

Code

[-] winclass ListViewExt : ListView

И после этого изменить тип объектов ListView на ListViewExt. Мы рассмотрим первый вариант.

Итак, теперь необходимо написать новый метод. Выглядеть он будет так:

Code

[+] winclass ListView : ListView
	[+] STRING GetItemTextByColumn (in INTEGER iRow, in STRING sColumn)
		[ ] INTEGER iColumn = 0
		[ ] INTEGER i
		[ ] 
		[+] for i = 1 to this.GetColumnCount ()
			[+] if (this.GetColumnName (i) == sColumn)
				[ ] break
		[ ] 
		[+] if (iColumn != 0)
			[ ] return this.GetItemText (iRow, i)
		[+] else
			[ ] return NULL

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

Для примера посмотрите тесткейс Test_Overrided_Class из файла TestApp.t, который использует новый метод. В качестве тренировки переопределите стандартный класс TextField. Например, в случае если в поле несколько строк, извлечь их можно с помощью метода GetContents(), который возвращает список строк (LIST OF STRING). Напишите метод GetStringContent, который будет вместо списка строк возвращать строку, в которой строки поля будут разделены точкой с запятой (к примеру, если в поле введены три строки “раз”, “два”, “три”, то метод должен вернуть строку вида “раз;два;три”).


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