【问题标题】:Unable to programmatically set Graphic Location in crystal report无法以编程方式在水晶报表中设置图形位置
【发布时间】:2017-12-08 21:16:57
【问题描述】:

在 Crystal Reports 2008 中,有一个“图形位置”图像属性,可以将其设置为文件路径,因此当报表运行时,它使用选定的图片文件而不是报表上的图片文件。我尝试通过 .NET API 进行设置,但它只在某些时候有效。

在报告本身中,我将图形位置设置为{@LogoPath},然后当我通过.NET API 运行报告时,我将{@LogoPath} 设置为图片的文件名。我已将公式放在报告本身上,它确实设置为正确的文件名,但报告上的图像并不总是更新。它会一直显示一段时间,然后一直不会再次显示。

【问题讨论】:

  • 你得到这个答案了吗?我有一个包含 4 个部分的子报表,每个部分都有一个 OLEObject,其图形位置设置为来自主报表的参数。子报表还有一个隐藏/显示部分的参数。第一次运行报告时,徽标会正确显示。在随后的运行中,如果隐藏部分发生更改,则不会出现徽标。这与您的问题相似吗?

标签: crystal-reports


【解决方案1】:

这是我最终使用的,代码在 Delpi Prism 中。要处理的一件尴尬的事情是,如果要替换的图像与报表上的图像大小不同,Crystal 不会正确调整它的大小。另一个问题是我需要手动释放图片对象,否则 Crystal 有时不会在报表上显示它。

方法 SetShadingAndLogo(const AReport:ReportDocument); 变量 标志路径:字符串; PicObj:图片对象; 徽标:System.Drawing.Image; PicRatio:双; ContWidth,ContHeight:双; 容器比:双; 新维度:双; PosAdj:整数; 规模:双; 开始 对于每个 Section:Section 在 AReport.ReportDefinition.Sections 做 开始 对于 Section.ReportObjects 中的每个 RptObj:ReportObject 做 开始 如果 RptObj.Name.StartsWith('LOGO', StringComparison.CurrentCultureIgnoreCase) 和 (RptObj.Kind = ReportObjectKind.PictureObject) 然后 开始 //设置为公司标志 LogoPath := "C:\logo.jpg"; PicObj := RptObj 作为图片对象; 如果不是 System.IO.File.Exists(LogoPath) 那么 PicObj.ObjectFormat.EnableSuppress := true 别的 开始 徽标:= System.Drawing.Image.FromFile(LogoPath); //计算图像和容器的纵横比 PicRatio := Double(Logo.Width) / Double(Logo.Height); //将缇转换为像素 //96 是 Windows 的默认 dpi,但应该真正检查 Windows 设置 //而不是硬编码 ContWidth := Double(TwipsToPx(PicObj.Width, 96)); ContHeight := Double(TwipsToPx(PicObj.Height, 96)); ContainerRatio := ContWidth / ContHeight; // 调整报表上容器的大小,保持原样 //图像的比例 如果 PicRatio > ContainerRatio 那么 开始 // 重置垂直位置以保持在原始位置的中心 // 获取容器的新高度(以像素为单位) NewDimension := (ContWidth / Logo.Width) * Logo.Height; // 获取运动(以缇为单位) PosAdj := PxToTwips(Integer((ContHeight - NewDimension) / 2), Integer(Logo.VerticalResolution)); // 调整位置 PicObj.Top := PicObj.Top + PosAdj; //图片比较宽所以相应调整高度 // 需要使用徽标的 dpi 进行缩放以正确调整大小 比例:= Double(PicObj.Width) / Double(PxToTwips(Logo.Width, Integer(Logo.VerticalResolution))); PicObj.Width := Integer(PicObj.Width * Scale); PicObj.Height := Integer(PicObj.Height * Scale); 结尾 别的 开始 // 图片比较高,需要缩放到高度 // 重置水平位置以保持在原始位置的中心 // 获取容器的新宽度(以像素为单位) NewDimension := (ContHeight / Logo.Height) * Logo.Width; // 获取运动(以缇为单位) PosAdj := PxToTwips(Integer((ContWidth - NewDimension) / 2), Integer(Logo.VerticalResolution)); // 调整位置 PicObj.Left := PicObj.Left + PosAdj; // 图片比较高,需要缩放到高度 // 需要使用徽标的 dpi 进行缩放以正确调整大小 比例:= Double(PicObj.Height) / Double(PxToTwips(Logo.Height, Integer(Logo.VerticalResolution))); PicObj.Width := Integer(PicObj.Width * Scale); PicObj.Height := Integer(PicObj.Height * Scale); 结尾; //必须释放logo,否则Crystal有时不会在report上显示 标志。处置; 对于 AReport.DataDefinition.FormulaFields 中的每个 fm:FormulaFieldDefinition 开始 如果 fm.Name.Equals("LogoPath") 那么 fm.Text := """"+LogoPath+""""; 结尾; 结尾; 结尾; 结尾; 结尾; 结尾; 方法 TwipsToPx(const AValue, ADpi:Integer):Integer; 开始 //使用指定的dpi转换为twips,96是Windows的默认dpi 结果:= System.Convert.ToInt32(Double(AValue) * ADpi / 1440); 结尾; 方法 PxToTwips(const AValue, ADpi:Integer):Integer; 开始 //使用指定的dpi转换为像素,96是Windows的默认dpi 结果:= System.Convert.ToInt32(Double(AValue) * 1440 / ADpi); 结尾;

【讨论】:

    【解决方案2】:

    看看我的Crystal Reports: Dynamic Images 发帖。

    【讨论】:

    • 不幸的是没有帮助。我已经将报告中的图形位置设置为公式,如您发布的示例所示。唯一的区别是他们使用参数公式而不是常规公式,这不适合这种情况,因为它每次都会提示用户输入图像位置。我需要我的程序在不提示用户的情况下设置正确的图像。
    • 显示一致性问题是否与使用保存的数据和刷新数据有关?
    【解决方案3】:

    在图形位置公式中,您可能希望执行如下操作:-

    {?imageUrl}
    

    您可以通过以下方式在您的 CS 文件中动态设置此参数:-

     ParameterFields paramFields = new ParameterFields();
     ParameterField paramField = new ParameterField();
     ParameterDiscreteValue parameterValue = new ParameterDiscreteValue();
    
     paramField.Name = "imageUrl";
     parameterValue.Value = "**URL FOR IMAGE**";
     paramField.CurrentValues.Add(parameterValue1);
    
     paramFields.Add(paramField);
    

    在报表中,创建“imageUrl”参数字段。通过执行以下操作:-

    1) 前往报告并打开左侧的字段资源管理器。如果它不在那里,你可以通过去得到它 水晶报表 >> 归档资源管理器。

    2) 右键单击​​参数字段,然后单击“新建”

    3) 将参数名称命名为“imageUrl”。在“值选项”中,将“仅显示提示”和“可选提示”设置为 false。

    这应该可以。 如果有帮助,请告诉我。

    【讨论】:

    • 不幸的是,这不起作用。当我加载报告时,即使我清楚地传递了参数,它仍然会提示我输入参数。有什么想法吗?
    猜你喜欢
    • 2014-04-20
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多