微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Delphi 2007应用程序中显示Crystal XI报告?

Delphi的最新Crystal XI组件是为Delphi 7发布的.该VCL组件在D2007中编译,但在运行时给出了错误.在Delphi 2007应用程序中显示数据库连接的Crystal Report的最佳方法是什么?

解决方法

这是我发现的使用ActiveX的解决方案:

首先,注册Active X控件,如下所示:

在Delphi中,选择Component – >导入组件

单击“类型库”,单击“下一步”

选择“Crystal ActiveX Report Viewer Library 11.5”

选择你想要的任何调色板页面(我选择了“数据访问”)

选择导入位置

退出向导

将您选择的位置添加到项目搜索路径中

在这代码应该工作:

...
uses
  CrystalActiveXReportViewerLib11_5_TLB,OleAuto;
...

procedure TForm1.Button1Click(Sender: TObject);
var
  cry : TCrystalActiveXReportViewer;
  oRpt,oApp : variant;
  i : integer;
  frm : TForm;
begin
  cry := TCrystalActiveXReportViewer.Create(Self);
  oApp := CreateOleObject('CrystalRuntime.Application');
  oRpt := oApp.OpenReport('c:\my_report.rpt',1);
  for i := 1 to oRpt.Database.Tables.Count do begin
    oRpt.Database.Tables[i].ConnectionProperties.Item['User ID'] := 'username';
    oRpt.Database.Tables[i].ConnectionProperties.Item['Password'] := 'password';
  end;

  frm := TForm.Create(Self);
  try
    cry.Parent := frm;
    cry.Align := alClient;
    cry.ReportSource := oRpt;
    cry.ViewReport;
    frm.Position := poOwnerFormCenter;
    frm.ShowModal;
  finally
    FreeAndNil(frm);
  end;  //try-finally
end;

procedure TForm1.btnExportClick(Sender: TObject);
var
  cry : TCrystalActiveXReportViewer;
  oRpt,oApp : variant;
  i : integer;
begin
  //Export the report to a file
  cry := TCrystalActiveXReportViewer.Create(Self);
  oApp := CreateOleObject('CrystalRuntime.Application');
  oRpt := oApp.OpenReport(c_DBRpt,1);
  for i := 1 to oRpt.Database.Tables.Count do begin
    oRpt.Database.Tables[i].ConnectionProperties.Item['User ID'] := 'username';
    oRpt.Database.Tables[i].ConnectionProperties.Item['Password'] := 'password';
  end;

  oRpt.ExportOptions.FormatType := 29;  //excel 8
  oRpt.ExportOptions.diskFileName := 'c:\output.xls';
  oRpt.ExportOptions.DestinationType := 1;  //file destination
  //Export(False) => do NOT prompt.
  //Export(True) will give runtime prompts for export options.
  oRpt.Export(False);
end;

如果你使用这个方法,那么this (rather dense) reference将会有所帮助,特别是因为Intellisense不适用于像这样的Ole对象.

编辑:引用的原始链接断开,因此我将其更改为指向新的(从2009年12月15日起生效).如果新的那个破了,那么Google should be able to find it.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐