I уже описал , как вручную выровнять поля с помощью диалога Размер объекта и положение. Теперь я написал скрипт Sikuli для автоматизации этого использования диалога. Я успешно использовал скрипт, чтобы сложить около 70 новых полей под уже сложенными.
Чтобы использовать этот скрипт, скопируйте и вставьте его содержимое в Sikuli IDE. Откройте Crystal Reports и найдите поле внизу существующего стека. Убедитесь, что новое поле, которое вы хотите добавить в конец стека, существует и отображается на экране. Выберите поле внизу стека. Затем переключитесь на Sikuli и нажмите Ctrl R , чтобы запустить скрипт. Он переключится на Crystal Reports и откроет диалоговое окно «Размер и положение», прочитает существующие значения для поля в нижней части стека и закроет диалоговое окно. Теперь у вас есть 1,5 секунды (настраивается), чтобы выбрать новое поле, нажав на него. Теперь скрипт снова откроет диалоговое окно «Размер и положение» и установит X, Y, Ширина и Высота так, чтобы выбранное поле было расположено под предыдущим. В частности, X, Width и Height установлены на то же поле, что и поле выше, а Y установлен так, как я описал в мой другой ответ . Вы можете изменить конфигурационную переменную VERTICAL_SPACE_BETWEEN_FIELDS
, чтобы добавить пробел между каждым полем или заставить их перекрываться, если хотите.
Сценарию требуется около 5 секунд, чтобы выровнять одно поле. Если это слишком медленно, вы можете попробовать уменьшить время или удалить некоторые из вызовов wait()
. Я добавил вызовы wait()
, потому что сценарий иногда копировал или вставлял неправильное значение, если оно выполнялось слишком быстро.
Одна приятная особенность этого скрипта в том, что он цепной. Сразу после его завершения вновь выровненное поле все равно будет выделено. Поэтому, если у вас есть другое поле, которое вы хотите добавить под этим полем, вы можете просто запустить сценарий снова с помощью Ctrl R и подготовиться к щелчку на следующем поле в середине. Если вы планируете многократную цепочку, вы можете увеличить 1 в range(1)
и добавить wait(<num_of_seconds>)
ниже mainAction()
, чтобы скрипт автоматически повторялся. Просто помните, что создание цепочки требует, чтобы следующее поле для добавления было видно на экране, поэтому вы можете выбрать его с помощью мыши.
Я сохранил файл сценария как «Выравнивание полей в Crystal Reports.sikuli».
# Crystal Reports: stack prompt-selected field under start-selected field
VERTICAL_SPACE_BETWEEN_FIELDS = 0.000
WAIT_TIME_FOR_USER_SELECT_NEW_FIELD = 1.5
def mainAction():
# read size and position of bottom of stack
above = dict()
openSizeAndPositionDialog()
above['x'] = copySelectedText()
moveToNextField(2)
above['y'] = copySelectedText()
moveToNextField()
above['width'] = copySelectedText()
moveToNextField(2)
above['height'] = copySelectedText()
print("above", above)
wait(0.05)
type(Key.ESC)
# calculate size and position of next field in stack
new_field = dict()
new_field['x'] = above['x']
new_field['y'] = str(float(above['y']) + float(above['height']) + VERTICAL_SPACE_BETWEEN_FIELDS)
new_field['width'] = above['width']
new_field['height'] = above['height']
print("new field", new_field)
waitForUserToSelectNewField()
# set size and position of next field
openSizeAndPositionDialog()
paste(new_field['x'])
moveToNextField(2)
paste(new_field['y'])
moveToNextField()
paste(new_field['width'])
moveToNextField(2)
paste(new_field['height'])
wait(0.1)
type(Key.ENTER)
def openSizeAndPositionDialog():
type(Key.ALT + "a" + "z")
wait(0.05)
def copySelectedText():
type("c", KeyModifier.CTRL)
wait(0.05)
return Env.getClipboard()
def moveToNextField(numTimes=1):
for i in range(numTimes):
type(Key.TAB)
wait(0.05)
def waitForUserToSelectNewField():
# I'll do it without the popup, because switching to the popup and then closing it is a pain
wait(WAIT_TIME_FOR_USER_SELECT_NEW_FIELD)
#popup("select the new field to align under the old one, then press OK")
#wait(0.2)
App.focus("Crystal Reports")
wait(0.2) # give you time to release CTRL, which would interfere with the script
for i in range(1):
mainAction()