【问题标题】:How do I stack fields vertically in Crystal Reports 2008如何在 Crystal Reports 2008 中垂直堆叠字段
【发布时间】:2023-03-24 20:12:01
【问题描述】:

我正在使用 Crystal Reports 2008 开发一些报告(在 oracle 数据库上)。

我的设计/布局中有许多文本字段,我想将它们放置在垂直堆栈中,中间没有空格。

使用 Oracle 报告我可以选择字段并执行 align->stackvertical,但在 CR2008 中似乎没有类似的选项

“对齐”选项具有顶部、中间、底部、基线、左侧、中心、右侧、网格。没有一个能满足我的要求。

有没有简单的方法来做到这一点?还是我只需要手动定位它们? (也许使用对齐网格)

【问题讨论】:

    标签: crystal-reports alignment crystal-reports-2008


    【解决方案1】:

    already described 如何使用“对象大小和位置”对话框手动对齐字段。我现在编写了一个Sikuli 脚本来自动化对话框的使用。我成功地使用该脚本在现有堆叠字段下方堆叠了大约 70 个新字段。

    要使用此脚本,请将其内容复制并粘贴到 Sikuli IDE 中。打开 Crystal Reports 并找到现有堆栈底部的字段。确保要添加到堆栈底部的新字段存在并且在屏幕上可见。选择堆栈底部的字段。然后切换到 Sikuli 并按 CtrlR 启动脚本。它将切换到 Crystal Reports 并打开“大小和位置”对话框,读取堆栈底部字段的现有值,然后关闭对话框。您现在有 1.5 秒(可配置)通过单击来选择新字段。现在脚本将再次打开“大小和位置”对话框并设置 X、Y、宽度和高度,以便将所选字段放置在前一个字段的下方。具体来说,X、Width 和 Height 设置为与上述字段相同,Y 设置为我在my other answer 中描述的那样。如果需要,您可以更改配置变量 VERTICAL_SPACE_BETWEEN_FIELDS 以在每个字段之间添加空格或使它们重叠。

    脚本需要大约 5 秒来对齐一个字段。如果这太慢了,您可以尝试减少或删除一些wait() 调用的时间。我添加了 wait() 调用,因为如果脚本运行得太快,有时会复制或粘贴错误的值。

    这个脚本的一个好处是它是可链接的。完成后,新对齐的字段仍将被选中。因此,如果您要在该字段下添加另一个字段,您只需使用 CtrlR 再次运行脚本,然后准备单击下一个字段中间。如果您计划多次链接,您可以在range(1) 中增加1,并在mainAction() 下方添加wait(<num_of_seconds>),以便脚本自动重复。请记住,链接要求要添加的下一个字段在屏幕上可见,因此您可以使用鼠标选择它。

    我将脚本文件保存为“对齐 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()
    

    【讨论】:

    • 这非常适合我的需求,感谢发帖。建议您告诉人们禁用对齐网格,当我第一次尝试它时,它的行为很奇怪。
    【解决方案2】:

    如果您从头开始创建报告,您应该能够使用邮件标签向导,该向导将垂直堆叠选定的字段。

    除此之外,唯一的选择是手动进行。我发现在“选项”菜单中启用“对齐网格”有助于解决此问题,就像在每列中插入一条垂直参考线,然后拖放字段以便它们捕捉到它一样。

    【讨论】:

      【解决方案3】:

      手动方法效果最好。除了对齐网格和垂直指南,正如 Mark 建议的那样,您还应该使用多个详细信息和组标题部分。多个部分让事情变得更有条理。

      我尽可能避免使用 Crystal Reports 的“向导”——这是在使用该产品 15 年后(从 v4 开始)。

      【讨论】:

        【解决方案4】:

        作为手动对齐字段以使其边界相互接触的替代方法,您可以使用“对象大小和位置”对话框。您可以通过打开“格式”菜单或字段的上下文菜单,然后选择菜单项“大小和位置...”来访问它。

        按照以下步骤将新字段添加到垂直堆叠字段列的底部:

        1. 选择列中的当前底部字段。
        2. 打开“大小和位置”对话框。
        3. 向下复制其 X 值。
        4. 将 Y 值添加到高度,然后将其复制下来。
        5. 关闭对话框。
        6. 选择要移动到列底部的新字段。
        7. 打开“大小和位置”对话框。
        8. 输入复制的 X 值作为 X 值,输入复制的总和作为 Y 值。
        9. 关闭对话框。

        如果更简单,您可以将有关 X 值的步骤替换为命令“格式”>“对齐”>“左”(或“中心”或“右”)。

        这种方法比用鼠标拖动字段更容易自动化。如果您必须对齐许多字段,您可以使用AutoHotkeySikuli 自动执行此过程的大部分内容。实际上,我确实最终实现了自动化——我写了this Sikuli script

        【讨论】:

          【解决方案5】:

          快速而肮脏的方法。如果您希望字段均匀分布并且没有很多字段可以垂直堆叠,则创建一个文本框,其高度为两个字段的高度(假设它们的高度相同)加上所需的空间。因此,假设您希望垂直间距为 0.08 高度且字段高度为 0.167 创建一个文本框,然后使用对象大小和位置对话框设置高度 .414 (0.167 + 0.08 + 0.167)。 现在以所需的顺序垂直放置字段。暂时不用担心间距。

          1. 将文本框放在第一个字段旁边
          2. 先选择文本框。
          3. 在按住 shift 键的同时选择第一个字段,以便同时选择字段和文本框,但该字段是主要对象。
          4. 右键单击上下文菜单。
          5. 选择对齐,顶部。文本框现在将与第一个字段的顶部对齐。
          6. 选择下面的下一个字段。
          7. 按住 shift 键选择文本框,这样下一个字段和文本框都被选中,但文本框现在是主要对象。
          8. 选择对齐、底部。这会将字段移动到文本框的底部边框,这会将字段移动到正确的垂直 Y 位置并为您提供所需的边距。
          9. 对每个后续字段重复步骤 2 - 8(因此选择文本框和第二个字段作为主要对象对齐顶部,然后选择第三个字段和文本框作为主要对象对齐底部等)。

          【讨论】:

            【解决方案6】:

            打开水晶报表 选择要垂直显示数据的字段, 转到格式字段-> 文本旋转 设置 90(如果你想要从下到上的数据) 设置 270(如果你想要从上到下的数据)。 :-)

            【讨论】:

            • 不..我不希望文本是垂直的..我希望字段相互接触,它们之间没有空格
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-04-01
            • 1970-01-01
            • 2010-11-30
            • 1970-01-01
            • 1970-01-01
            • 2017-12-24
            • 1970-01-01
            相关资源
            最近更新 更多