2010-03-30 55 views
2

在Crystal Reports 2008中,有一個「圖形位置」圖像屬性,可以將其設置爲文件路徑,以便報表運行時使用選定的圖片文件而不是一份報告。我試着通過.NET API來設置它,但它只是在某些時候才工作。無法以編程方式設置水晶報表中的圖形位置

在報告本身,我將圖形位置設置爲{@LogoPath},然後當我通過.NET API運行報告時,我將{@LogoPath}設置爲圖片的文件名。我已經將公式放在報告本身上,並且確實將其設置爲正確的文件名,但報告中的圖像並不總是更新。它會一直出現一段時間,然後一直不再顯示它。

+0

你得到了這個答案嗎?我有一個包含4個部分的子報表,每個部分都帶有一個圖形位置設置爲來自主報表的參數的OLEObject。 該子報表也有一個隱藏/顯示部分的參數。報告第一次運行時,徽標顯示正確。 在後續運行中,如果隱藏部分更改,則不會顯示徽標。這與您的問題類似嗎? – 2011-02-28 06:01:14

回答

0

這是我最終使用的代碼是在Delpi Prism中。要解決的一個尷尬之處是,如果被替換的圖像與報表上的圖像大小不同,則Crystal無法正確調整其大小。另一個問題是我需要手動釋放圖片對象,否則Crystal有時不會在報告中顯示它。

 
method SetShadingAndLogo(const AReport:ReportDocument); 
var 
    LogoPath:String; 
    PicObj:PictureObject; 
    Logo:System.Drawing.Image; 
    PicRatio:Double; 
    ContWidth, ContHeight:Double; 
    ContainerRatio:Double; 
    NewDimension:Double; 
    PosAdj:Integer; 
    Scale:Double; 
begin 
    for each Section:Section in AReport.ReportDefinition.Sections do 
    begin 
    for each RptObj:ReportObject in Section.ReportObjects do 
    begin 
     if RptObj.Name.StartsWith('LOGO', StringComparison.CurrentCultureIgnoreCase) and 
     (RptObj.Kind = ReportObjectKind.PictureObject) then 
     begin 
     //set to company logo 
     LogoPath := "C:\logo.jpg"; 
     PicObj := RptObj as PictureObject; 

     if not System.IO.File.Exists(LogoPath) then 
      PicObj.ObjectFormat.EnableSuppress := true 
     else 
     begin   
      Logo := System.Drawing.Image.FromFile(LogoPath); 

      //work out the aspect ratios of the image and the container 
      PicRatio := Double(Logo.Width)/Double(Logo.Height); 

      //convert twips to pixels 
      //96 is the default dpi for Windows, but should really check Windows settings 
      //instead of hard coding 
      ContWidth := Double(TwipsToPx(PicObj.Width, 96)); 
      ContHeight := Double(TwipsToPx(PicObj.Height, 96)); 

      ContainerRatio := ContWidth/ContHeight; 

      // adjust the size of the container on the report to maintiain the original 
      // image's ratio 
      if PicRatio > ContainerRatio then 
      begin 
      // reset the vertical position to remain centred on the original location 

      // get the new height of the container (in pixels) 
      NewDimension := (ContWidth/Logo.Width) * Logo.Height; 

      // get the movement (in twips) 
      PosAdj := PxToTwips(Integer((ContHeight - NewDimension)/2), Integer(Logo.VerticalResolution)); 

      // adjust the position 
      PicObj.Top := PicObj.Top + PosAdj; 

      // picture is wider so adjust the height accordingly 
      // need to scale using the logo's dpi to resize correctly 
      Scale := Double(PicObj.Width)/Double(PxToTwips(Logo.Width, Integer(Logo.VerticalResolution))); 
      PicObj.Width := Integer(PicObj.Width * Scale); 
      PicObj.Height := Integer(PicObj.Height * Scale); 
      end 
      else 
      begin 
      // picture is taller and needs to be scaled to height 
      // reset the horizontal position to remain centred on the original location 

      // get the new width of the container (in pixels) 
      NewDimension := (ContHeight/Logo.Height) * Logo.Width; 

      // get the movement (in twips) 
      PosAdj := PxToTwips(Integer((ContWidth - NewDimension)/2), Integer(Logo.VerticalResolution)); 

      // adjust the position 
      PicObj.Left := PicObj.Left + PosAdj; 

      // picture is taller and needs to be scaled to height 
      // need to scale using the logo's dpi to resize correctly 
      Scale := Double(PicObj.Height)/Double(PxToTwips(Logo.Height, Integer(Logo.VerticalResolution))); 
      PicObj.Width := Integer(PicObj.Width * Scale); 
      PicObj.Height := Integer(PicObj.Height * Scale); 
      end; 

      //must free the logo, otherwise Crystal sometimes doesn't display it on report 
      Logo.Dispose; 

      for each fm:FormulaFieldDefinition in AReport.DataDefinition.FormulaFields do 
      begin 
      if fm.Name.Equals("LogoPath") then 
       fm.Text := """"+LogoPath+""""; 
      end; 
     end; 
     end; 
    end; 
    end; 
end; 

method TwipsToPx(const AValue, ADpi:Integer):Integer; 
begin 
    //convert to twips using specified dpi, 96 is Windows' default dpi 
    Result := System.Convert.ToInt32(Double(AValue) * ADpi/1440); 
end; 

method PxToTwips(const AValue, ADpi:Integer):Integer; 
begin 
    //convert to pixels using specified dpi, 96 is Windows' default dpi 
    Result := System.Convert.ToInt32(Double(AValue) * 1440/ADpi); 
end; 
0

看看我的Crystal Reports: Dynamic Images發表。

+0

不幸的是,我已經將報告中的圖形位置設置爲公式,如您發佈的示例中所示。 唯一的區別是它們使用參數公式而不是常規公式,因爲它不會每次都提示用戶輸入圖像位置。我需要我的程序在不提示用戶的情況下設置正確的圖像。 – Robo 2010-03-31 01:50:12

+0

顯示一致性問題是否與使用保存的數據和刷新數據相關? – craig 2010-03-31 13:55:49

0

在圖形位置公式,你可能想要做像如下: -

{?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)去報告並打開左側的字段資源管理器。如果它不在那裏,你可以通過 Crystal Report >> Filed Explorer。

2)在參數字段右鍵單擊,然後單擊 「新建」

3)給出參數名稱爲 「IMAGEURL」。在「Value Option」中將「僅限顯示」和「可選提示」設置爲false。

這應該工作。 讓我知道它是否有幫助。

+0

不幸的是,這是行不通的。當我加載報告時,即使我明確地傳遞參數,它仍會提示我輸入參數。任何想法? – Keith 2016-05-27 20:30:45

相關問題