我正在使用Crystal Reports 2008开发一些报告(在oracle数据库上)。
我的设计/布局中有许多文本字段,我希望它们位于垂直堆栈中,而且之间没有空格。
使用Oracle报告我可以选择字段并执行align-> stackvertical,但在CR2008中似乎没有类似的选项
“对齐”选项包括顶部,中间,底部,基线,左侧,中心,权限,网格。没有一个能做我想做的事。
有一种简单的方法吗?或者我只需要手动定位它们? (也许使用对齐网格)
答案 0 :(得分:2)
我already described如何使用“对象大小和位置”对话框手动对齐字段。我现在编写了一个Sikuli脚本来自动使用该对话框。我成功地使用该脚本在现有堆叠的字段下堆叠了大约70个新字段。
要使用此脚本,请将其内容复制并粘贴到Sikuli IDE中。打开Crystal Reports并在现有堆栈的底部找到该字段。确保要添加到堆栈底部的新字段存在且在屏幕上可见。选择堆栈底部的字段。然后切换到Sikuli并按 Ctrl R 启动脚本。它将切换到Crystal Reports并打开“大小和位置”对话框,读取堆栈底部字段的现有值,然后关闭对话框。您现在有1.5秒(可配置)通过单击选择新字段。现在,脚本将再次打开“大小和位置”对话框并设置X,Y,宽度和高度,以便将所选字段放在前一个字段下面。具体来说,X,Width和Height设置为与上面的字段相同,Y设置为my other answer中描述的。您可以更改配置变量VERTICAL_SPACE_BETWEEN_FIELDS
以在每个字段之间添加空格,或者如果需要,可以使它们重叠。
脚本大约需要5秒钟来对齐一个字段。如果这太慢,您可以尝试减少时间或删除部分wait()
来电。我添加了wait()
调用,因为如果脚本过快,脚本有时会复制或粘贴错误的值。
这个脚本的一个好处是它是可链接的。完成后,仍将选择新对齐的字段。因此,如果您要在该字段下添加另一个字段,则可以使用 Ctrl R 再次运行该脚本,并准备好单击该字段中的下一个字段。中间。如果您计划多次连锁,可以增加range(1)
中的1并在wait(<num_of_seconds>)
下方添加mainAction()
,以便脚本自动重复。请记住,链接要求添加的下一个字段在屏幕上可见,因此您可以使用鼠标选择它。
我将脚本文件保存为&#34;在Crystal Reports.sikuli&#34;中对齐字段。
# 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()
答案 1 :(得分:1)
如果从头开始创建报告,则应该能够使用“邮件标签”向导,该向导将垂直堆叠所选字段。
除此之外,唯一的选择是手动执行此操作。我发现在“选项”菜单中启用“对齐网格”有助于此,就像每列插入一个垂直指南然后拖放字段以便它们捕捉到它一样。
答案 2 :(得分:1)
手动方法最有效。除了Snap to Grid和垂直指南之外,正如Mark建议的那样,您还应该使用多个Details和Group Header部分。多个部分可以使事情更有条理。
我可以随时避免使用Crystal Reports的“向导” - 这是在使用该产品15年后(自v4起)。
答案 3 :(得分:1)
作为手动对齐字段以使其边框接触的替代方法,您可以使用“对象大小和位置”对话框。您可以通过打开“格式”菜单或字段的上下文菜单,然后选择菜单项“大小和位置...”来访问它。
按照此过程将新字段添加到垂直堆叠字段列的底部:
如果更容易,您可以使用命令“格式”&gt;替换关于X值的步骤。 “对齐”&gt; “左派”(或“中心”,或“权利”)。
此方法比使用鼠标拖动字段更容易自动化。如果您必须对齐多个字段,则可以使用AutoHotkey或Sikuli自动完成此过程的大部分操作。实际上我最终实现了自动化 - 我写了this Sikuli script。
答案 4 :(得分:1)
快速而肮脏的方法。如果要使字段均匀分布,并且没有太多垂直堆叠的字段,则创建一个文本框,其中两个字段的高度(假定它们的高度相同)加上所需的空间。因此,假设您希望垂直间距为.08高度,而字段高度为0.167,则创建一个文本框,然后使用“对象大小和位置”对话框将高度设置为.414(0.167 + 0.08 + 0.167)。 现在,将字段按所需顺序垂直放置。暂时不要担心间距。
答案 5 :(得分:0)
打开Crystal Report 选择要为其显示数据的字段, 转到格式字段 - &gt;文字轮换 设置90(如果你想要从下到上的数据) 设置270(如果你想要从上到下的数据)。 : - )