基本全是参考 fastreport的demo
代码如下unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Grids, frxCross, frxClass;type
  TForm1 = class(TForm)
    frxReport1: TfrxReport;
    frxCrossObject1: TfrxCrossObject;
    StringGrid1: TStringGrid;
    BitBtn1: TBitBtn;
    procedure FormCreate(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure frxReport1BeforePrint(Sender: TfrxReportComponent);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
j:integer;
begin
for i:=1 to StringGrid1.RowCount -1      do
 for j:=1 to StringGrid1.ColCount -1       do
   StringGrid1.Cells[i,j]:=IntToStr(i*j);
end;procedure TForm1.BitBtn1Click(Sender: TObject);
begin
//frxReport1.co
self.frxReport1.ShowReport  ;
end;procedure TForm1.frxReport1BeforePrint(Sender: TfrxReportComponent);
var
  Cross: TfrxCrossView;
  i, j: Integer;
begin
  //showmessage('1');
  if Sender is TfrxCrossView then
  begin
    Cross := TfrxCrossView(Sender);
    for i := 1 to StringGrid1.RowCount -1 do
      for j := 1 to StringGrid1.ColCount -1 do
        Cross.AddValue([i], [j], [StringGrid1.Cells[i - 1, j - 1]]);
  end;
end;end.他NN的运行起来点击按钮可以打开预览窗口,但是里面什么都没有,而且frxReport1BeforePrint事件貌似不执行,哪里有问题呢?

解决方案 »

  1.   

    //=------------frReport1GetValue----------------
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Grids, StdCtrls, FR_Class, FR_Desgn, FR_BarC, FR_DSet, FR_DBSet,
      FR_Cross;type
      TForm1 = class(TForm)
        StringGrid1: TStringGrid;
        frReport1: TfrReport;
        Button1: TButton;
        frDesigner1: TfrDesigner;
        Dataset: TfrUserDataset;
        procedure FormCreate(Sender: TObject);
        procedure frReport1BeforePrint(Memo: TStringList; View: TfrView);
        procedure frReport1GetValue(const ParName: String;
          var ParValue: Variant);
        procedure Button1Click(Sender: TObject);
        procedure DatasetCheckEOF(Sender: TObject; var Eof: Boolean);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    var 
    i:integer; 
    j:integer; 
    begin 
    for   i:=1   to   StringGrid1.RowCount   -1             do 
      for   j:=1   to   StringGrid1.ColCount   -1               do
          StringGrid1.Cells[i,j]:=IntToStr(i*j);
    end; procedure TForm1.frReport1BeforePrint(Memo: TStringList; View: TfrView);
    var
        Cross :   TfrCrossView;
        i,   j:   Integer;
    begin 
        //showmessage('1'); 
     {   if   Sender   is   TfrCrossView   then
        begin
            Cross   :=   TfrxCrossView(Sender);
            for   i   :=   1   to   StringGrid1.RowCount   -1   do 
                for   j   :=   1   to   StringGrid1.ColCount   -1   do
                    Cross.AddValue([i],   [j],   [StringGrid1.Cells[i   -   1,   j   -   1]]); 
        end;      }
    end; 
    procedure TForm1.frReport1GetValue(const ParName: String;
      var ParValue: Variant);
    begin
      if AnsiCompareText(ParName, 'Cell1') = 0 then
        ParValue := StringGrid1.Cells[0, Dataset.RecNo]
      else if AnsiCompareText(ParName, 'Cell2') = 0 then
        ParValue := StringGrid1.Cells[1, Dataset.RecNo]
      else if AnsiCompareText(ParName, 'Cell3') = 0 then
        ParValue := StringGrid1.Cells[2, Dataset.RecNo]
      else if AnsiCompareText(ParName, 'Cell4') = 0 then
        ParValue := StringGrid1.Cells[3, Dataset.RecNo]
      else if AnsiCompareText(ParName, 'Cell5') = 0 then
        ParValue := StringGrid1.Cells[4, Dataset.RecNo]
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      self.frReport1.ShowReport;
    end;procedure TForm1.DatasetCheckEOF(Sender: TObject; var Eof: Boolean);
    begin
      Eof := Dataset.RecNo >= StringGrid1.RowCount;
    end;end.
      

  2.   

    楼上的朋友,谢谢,你的代码我研究下,我现在最想知道的是为什么我照抄demo的代码却不能成功,是不是我有什么设置没做或者有什么地方写的不对?
      

  3.   

    谁能帮我分析一下 frxReport1BeforePrint事件为什么不执行?谢谢
      

  4.   

    procedure   TForm1.FormCreate(Sender:   TObject); 
    var 
    i:integer; 
    j:integer; 
    begin 
    for   i:=1   to   StringGrid1.RowCount   -1             do 
      for   j:=1   to   StringGrid1.ColCount   -1               do 
          StringGrid1.Cells[i,j]:=IntToStr(i*j); 
    end; procedure   TForm1.BitBtn1Click(Sender:   TObject); 
    begin 
      frxReport1.ShowReport     ; 
    end; 程序里写好,打印时直接调用即可
      

  5.   

    你是想把StringGrid表格打印出来吗?那很简单啊,与fastreport又有什么关系?
    根本不需要用fastreport。
      

  6.   

    如果只想打印stringgrid的内容,不必要用crosstab,用一个dateset就可以了如果想打印出来效果象stringgrid,也可以不用crosstabLZ目前的问题,是if   Sender   is   TfrxCrossView   then 这个判断一直是false一起的我在FR4的时候也碰到过,后来把crosstab控件从原来masterdate上移到masterdate外,就可以了不过具体问题要具体分析
      

  7.   

    呵呵,白帖了这么多代码,我知道我的问题在哪里了,我没在page编辑页面里面添加东西,呵呵。现在预览已经可以看到东西了。但是,为什么预览中的crosstab 控件里只能填数字?我的stringgrid里如果有字符就报错,大意是:不能将string类型转换为double?
      

  8.   

    mwy654321 :你是想把StringGrid表格打印出来吗?那很简单啊,与fastreport又有什么关系? 根本不需要用fastreport。  
    那需要用什么?能不能详细点?
    try__again :如果只想打印stringgrid的内容,不必要用crosstab,用一个dateset就可以了 。
    呵呵,朋友,我对delphi不熟,请问一下dateset是否可以在不链接数据库,不执行sQL的情况下用代码设置其字段和记录值?我尝试了几次均失败,不知道是我做的不对还是本来就不行。
      

  9.   

    只需要一些代码,纯代码来实现,我这里有一个过程,调用一下就可以了,根本不需要fastreport。因为你的贴子只有30分,所以我只能帮你顶一下贴子。