关于动态创建报表的问题,请有经验的高手指点! (100分)

  • 主题发起人 主题发起人 snowboat
  • 开始时间 开始时间
S

snowboat

Unregistered / Unconfirmed
GUEST, unregistred user!
   
报表机器2.4,Delphi6,动态创建报表,非法操作,主要代码如下:
procedure ****Report;
var
RMDBDataset1: TRMDBDataset;
RMReport: TRMReport;
begin
//创建并设置RM数据集
RMDBDataset1 := TRMDBDataset1.Create(nil);
RMDBDataset1.Dataset := CDS1;
//已正常工作的一个CDS,经查有若干条记录
//创建并设置报表
RMReport1 := TRMReport.Create(nil);
RMReport1.Dataset := RMDBDataset1;
//创建并设置Band
(代码照抄RM的例子)
//创建并设置栏目
(代码照抄RM的例子)
//显示报表
RMReport1.ShowReport;
//在这里出错,非法访问内存,地址0x00000150
end;

使用预先放置的报表控件时,若未设置StoreInDFM且未从文件调入,则出同样错误。
 但在这个动态创建的函数中,设置StoreInDFM也无效。
请大虾们指教,该如何正确实现这个函数?
    
 
to snowboat
那里有这样的例子呀
能不能发一个给我让我参考一下
wshxian@sohu.com
谢谢
 
to hailang8:
我看到的例子就是FastReport2.4的开发指南,在网上应该不难找吧,张青松翻译的。
我用google搜到的有:http://www.jinqing1979.net/document/FastReport%20v2.htm
 

{打印模块--报表模板}
unit Template;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, QuickRpt, QRCtrls, IniFiles;

type
TfrmTemplate = class(TForm)
QuickRep1: TQuickRep;
QRBand1: TQRBand;
QRBand2: TQRBand;
QRBand3: TQRBand;
qrlbTitle1: TQRLabel;
QRShape1: TQRShape;
QRShape2: TQRShape;
QRBand4: TQRBand;
QRLabel7: TQRLabel;
QRSysData5: TQRSysData;
QRBand5: TQRBand;
QRLabel1: TQRLabel;
qrlbTitle2: TQRLabel;
QRLabel2: TQRLabel;
QRLabel3: TQRLabel;
QRSysData1: TQRSysData;
qrlbTail: TQRLabel;
procedure FormCreate(Sender: TObject);
procedure QuickRep1Preview(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;


var
frmTemplate: TfrmTemplate;

implementation
uses uPrintModule,dmPrint,uViewModule;
{$R *.dfm}

procedure TfrmTemplate.FormCreate(Sender: TObject);
//动态生成组件
var
count,i,j,k:Integer;
qrlblArr:array[0..39] of TQRLabel;
//标签数组
qrshpArr1:array[0..39] of TQRShape;
//QRShape数组,分隔标签
qrshpArr2:array[0..39] of TQRShape;
//QRShape数组,分隔QRDBText
qredtArr:array[0..39] of TQRDBText;
//QRDBText数组
F:TIniFile;
//读出初始化设置
begin

try
//标题赋值
qrlbTitle1.Caption:=dm.MainTitle;
qrlbTitle2.Caption:=dm.SecondTitle;
count:=dm.ADOqr.FieldCount;
//创建标签
for i:=0 to count-1do

begin

qrlblArr:=TQRLabel.Create(Application.Owner);
qrshpArr1:=TQRShape.Create(Application.Owner);
qrlblArr.Parent:=QRBand2;
qrshpArr1.Parent:=QRBand2;
qrlblArr.Caption:=dm.ADOqr.Fields.FieldName;
qrlblArr.Width:=frmPrint.DBGrid1.Columns.Width;
qrlblArr.Height:=17;
qrshpArr1.Width:=2;
qrshpArr1.Height:=QRBand2.Height+5;
qrshpArr1.Shape:=qrsVertLine;
if i>=1 then

begin

qrlblArr.Top:=8;
qrlblArr.Left:=qrlblArr[i-1].Left+qrlblArr[i-1].Width+5;
qrshpArr1.Top:=0;
qrshpArr1.Left:=qrlblArr[i-1].Left+qrlblArr[i-1].Width;
end
else

begin

qrlblArr.Top:=8;
qrlblArr.Left:=3;
qrshpArr1.Top:=0;
qrshpArr1.Left:=qrlblArr.Left+qrlblArr.Width;
end;
//if end
end;
//for end
//标签创建结束
//创建QRDBText
for j:=0 to count-1do

begin

qredtArr[j]:=TQRDBText.Create(Application.Owner);
qrshpArr2[j]:=TQRShape.Create(Application.Owner);
qredtArr[j].Parent:=QRBand3;
qrshpArr2[j].Parent:=QRBand3;
qredtArr[j].DataSet:=dm.ADOqr;
qredtArr[j].dataField:=dm.ADOqr.Fields[j].FieldName;
qredtArr[j].Width:=frmPrint.DBGrid1.Columns[j].Width;
qredtArr[j].Height:=17;
qrshpArr2[j].Width:=2;
qrshpArr2[j].Height:=QRBand3.Height;
qrshpArr2[j].Shape:=qrsVertLine;
if j>=1 then

begin

qredtArr[j].Top:=8;
qredtArr[j].Left:=qredtArr[j-1].Left+qredtArr[j-1].Width+5;
qrshpArr2[j].Top:=0;
qrshpArr2[j].Left:=qredtArr[j-1].Left+qredtArr[j-1].Width;
end
else

begin

qredtArr[j].Top:=8;
qredtArr[j].Left:=3;
qrshpArr2[j].Top:=0;
qrshpArr2[j].Left:=qredtArr[j].Left+qredtArr[j].Width;
end;
//if end
end;
//for end
//创建QRDBText结束
except
raise exception.Create('错误:创建报表模板失败!');
end;

try
//创建初始化文件
F:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'Option.ini');
//开始读取初始设置
frmTemplate.QuickRep1.Page.LeftMargin:=F.ReadFloat('LeftMargin','Length',10.00);
frmTemplate.QuickRep1.Page.RightMargin:=F.ReadFloat('RightMargin','Length',10.00);
frmTemplate.QuickRep1.Page.TopMargin:=F.ReadFloat('TopMargin','Length',10.00);
frmTemplate.QuickRep1.Page.BottomMargin:=F.ReadFloat('BottomMargin','Length',10.00);
frmTemplate.QRBand2.Height:=F.ReadInteger('RowHei','Length',30);
frmTemplate.QRShape1.Height:=F.ReadInteger('RowHei','Length',30);
frmTemplate.QRBand3.Height:=F.ReadInteger('RowHei','Length',30);
frmTemplate.QRShape2.Height:=F.ReadInteger('RowHei','Length',30);
frmTemplate.qrlbTail.Caption:=F.ReadString('TableTail','Text','');
//初始化分隔线高度
for k:=0 to count-1do

begin

qrshpArr1[k].Height:=F.ReadInteger('RowHei','Length',30);
qrshpArr2[k].Height:=F.ReadInteger('RowHei','Length',30);
end;

//初始化字体
//标题字体
frmTemplate.QRBand1.Font.Name:=F.ReadString('CaptionFont','FontName','新宋体');
frmTemplate.QRBand1.Font.Size:=F.ReadInteger('CaptionFont','FontSize',16);
frmTemplate.QRBand1.Font.Color:=stringtocolor(F.ReadString('CaptionFont','FontColor','clBlack'));
//列标题字体
frmTemplate.QRBand2.Font.Name:=F.ReadString('ColHeadFont','FontName','新宋体');
frmTemplate.QRBand2.Font.Size:=F.ReadInteger('ColHeadFont','FontSize',10);
frmTemplate.QRBand2.Font.Color:=stringtocolor(F.ReadString('ColHeadFont','FontColor','clBlack'));
//显示数据字体
frmTemplate.QRBand3.Font.Name:=F.ReadString('ColDataFont','FontName','新宋体');
frmTemplate.QRBand3.Font.Size:=F.ReadInteger('ColDataFont','FontSize',10);
frmTemplate.QRBand3.Font.Color:=stringtocolor(F.ReadString('ColDataFont','FontColor','clBlack'));
//页脚字体
frmTemplate.QRBand4.Font.Name:=F.ReadString('PageTailFont','FontName','新宋体');
frmTemplate.QRBand4.Font.Size:=F.ReadInteger('PageTailFont','FontSize',10);
frmTemplate.QRBand4.Font.Color:=stringtocolor(F.ReadString('PageTailFont','FontColor','clBlack'));
//页眉字体
frmTemplate.QRBand5.Font.Name:=F.ReadString('PageHeadFont','FontName','新宋体');
frmTemplate.QRBand5.Font.Size:=F.ReadInteger('PageHeadFont','FontSize',10);
frmTemplate.QRBand5.Font.Color:=stringtocolor(F.ReadString('PageHeadFont','FontColor','clBlack'));
finally
F.Free;
end;

end;


procedure TfrmTemplate.QuickRep1Preview(Sender: TObject);
begin

frmView.QRPreview1.QRPrinter:=frmTemplate.QuickRep1.QRPrinter;
end;


end.
 
老大,是ReportMachine啊!
 
  跟踪ReportMachine的源代码,可以发现几个全局变量,打破了面向对象的整体结构。
动态创建的时候,那几个变量没有被初始化,因此为空,就会出错。没有根本的解决办法,
只能手工赋值。
 
解决了。不过很遗憾,我很讨厌全局变量。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部