Кнопка (PushButton), казалось бы, один из самых простых элементов управления, тоже может доставить хлопоты. В этом посте мы рассмотрим случаи, когда не срабатывает метод Click() и способы решения этой проблемы.

Например, в режиме записи скрипта нажимаем на кнопку и останавливаем запись. Предположим, что SilkTest записал следующее:

wTestDialog.SetActive ()
wTestDialog.btnButton.Click ()

Однако при воспроизведении этого скрипта могут появиться проблемы. Например, после нажатия на кнопку окно wTestDialog становится неактивным и "прячется" за каким-то другим окном. Может возникнуть и другая проблема: скрипт просто не сможет нажать на кнопку. В таком случае SilkTest может зависнуть надолго, ожидая окончания работы метода Click(), однако нажатие так и не осуществится.

В большинстве случаев такая проблема решается благодаря параметру bRawEvent метода Click(). По умолчанию SilkTest использует стандартный механизм сообщений Windows для осуществления операции нажатия на кнопку. Однако если установить параметр bRawEvent равным TRUE, то нажатие будет осуществлено с использованием низкоуровневого механизма. Ниже приведен пример модифицированного скрипта, который работает более стабильно.

wTestDialog.SetActive ()
wTestDialog.btnButton.Click (null, null, null, true)


Первые три параметра (кнопка мыши и координаты нажатия) мы не меняем, а последний параметр устанавливаем равным true.

Другой метод заключается в использовании методов PressMouse() и ReleaseMouse(). Эти методы, так же как параметр bRawEvent, в большинстве случаев не используются. Однако если обычный метод Click() (в том числе с включенным параметром bRawEvent) не справляются с нажатием, можно использовать их. Пример нажатия на кнопку приведен ниже.

wTestDialog.SetActive ()
wTestDialog.btnButton.PressMouse ()
wTestDialog.btnButton.ReleaseMouse ()


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

wTestDialog.btnButton.DragMouse (1, 10, 10, 10, 10)

Первый параметр задает номер кнопки мыши (1 - левая кнопка), далее следуют координиаты X и Y откуда и куда перетаскивать объект. Так как нам никуда его перетаскивать не нужно, координаты одинаковые для обоих случаев.

Теперь осталось все это красиво оформить, чтобы каждый раз не использовать метод DragMouse() со всеми его параметрами. Для этого создадим новый winclass, который будет наследоваться от стандартного класса PushButton и переопределим ему метод Click(). Чтобы не хардкодить координаты нажатия мы их будем брать размеры кнопки и щелкать в ее ценре. Выглядеть это будет так:

[+] winclass MyPushButton : PushButton
 [+] void Click (in INTEGER iButton NULL optional, in INTEGER iX NULL optional, in INTEGER iY NULL optional)
  [+] if(IsNull(iButton))
  [ ] iButton = 1
  [+] if(IsNull(iX))
   [ ] iX = this.Rect.xSize/2
  [+] if(IsNull(iY))
   [ ] iY = this.Rect.ySize/2
  [ ] this.DragMouse (iButton, iX, iY, iX, iY)


Как видно из кода, все параметры метода Click() опциональные и могут быть опущены. В этом случае нажатие будет произведено в цетре кнопки левой клавишей мыши.

Для того, чтобы оставлять комментарии, вы должны войти под своим логином.