好久不用Delphi,都不知道怎么用了.
有个朋友要我帮他完成一个报表打印功能,他在Visual Foxpro中无法实现要求:
输出的字段由用户设置
报表纸张可设置,走纸方向可设置
做成DLL假设表为Table1,列c1, c2, c3...cn
输出的列从这个表取.要求完整源码,分不够可加.
请各位帮忙,谢谢

解决方案 »

  1.   

    对了请用delphi7+ado
    不要用.Net
      

  2.   

    要求不太高,用VFP完全可以解决。
      

  3.   

    你这不是叫别人给你写程序么!
    在VFP中更好处理.
      

  4.   

    To WWWWA(aaaa) : 要求不太高,用VFP完全可以解决。怎么解决,他用的是VFP5
      

  5.   

    好心帮帮忙吧,我只有二天时间:附:
    ave使用体会(14):运行时动态向RAVE报表增加一个TEXT对象 
    运行时动态向RAVE报表增加一个TEXT对象unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, RpBase, RpSystem, RpDefine, RpRave,RvCsRpt,RVProj,RVClass,RVCsStd;type
      TForm1 = class(TForm)
        RvProject1: TRvProject;
        RvSystem1: TRvSystem;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
        MyBand: TRaveBand;
        MyRegion: TRaveRegion;
        MyPage: TRavePage;
        MyText: TRaveText;
    begin
        RvProject1.Open;
        With RvProject1.ProjMan do 
        begin
            MyPage := FindRaveComponent('Report1.Page1',nil) as TRavePage;
            MyRegion:= FindRaveComponent('Region1',MyPage) as TRaveRegion;
            MyBand := FindRaveComponent('Band1',MyRegion) as TRaveBand;
            MyText:=TRaveText.Create(Myband);
            MyText.Parent:=Mypage;
            MyText.Name:=GetUniqueName('Text1',MyPage,false);
            MyText.Top:=0.2;
            MyText.Left:=0.7;
            MyText.Width:=200;
            MyText.Height:=200;
            MyText.Text:='[email protected]';
            MyText.Font.Size :=20;   //设置字体的属性
            MyText.Font.Color :=ClRed;
            MyText.Font.Name :='隶书';
            AddComponent(MyText);
        end; { with }
        RvProject1.ExecuteReport('Report1');
        RvProject1.Close; 
    end;end.
    Rave使用体会(9):动态设置报表中的特定对象的内容 
            动态设置报表中的特定对象的内容有两种方法。        法一 查找对象法
            通过FindRaveComponent函数逐级获得子对象来确定目标对象后,直接设定该对象各种属性。        法二 参数法
            在RAVE报表设计器中,为特定的页增加参数Param1;在程序代码中setparam函数动态改变参数的内容。RAVE报表中与该参数挂接的对象DataText也会相应地动态改变。(参数与对象挂接的方法是:在RAVE报表设计器中选定特定的对象,比如一个DataText对象,利用属性编辑器设定对象的DataField属性为前面加入的参数,比如Param.Param1,即可)        方法一可以更改对象的多种属性,而方法二仅能改变内容。-------------------------源代码如下: unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, RpDefine, RpRave, StdCtrls, RVClass,RVCsStd;type
      TForm1 = class(TForm)
        Button1: TButton;
        RvProject1: TRvProject;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
        MyPage: TRavePage;
        MyText: TRaveText;        
    begin
        RvProject1.Open;    //方法一  采用查找对象法
        With RvProject1.ProjMan do
        begin
            MyPage := FindRaveComponent('Report1.Page1',nil) as TRavePage;  //查找PAGE
            MyText := FindRaveComponent('Text1',MyPage) as TRaveText;       //查找TEXT
            MyText.Text := '[email protected] 上海';                         //设置报表中文本内容
            MyText.Color := clRed;                                          //设置颜色
        end; { with }    //方法二  采用参数法
        RvProject1.SetParam('Param1','[email protected] 上海');    RvProject1.ExecuteReport('Report1');
        RvProject1.Close;
    end;end.
    Rave使用体会(8):RAVE中如何设置纸张大小 
    我研究了一下,初步的方法如下: 1.在RAVE报表设计器中更改缺省报表页的尺寸的菜单路径为:
        Edit-->Preferences-->选择defaults选项-->更改Paper Size
        如上更改的缺省报表页面的尺寸仅对此后新生成的页有效!2.在RAVE报表设计器中更改已经存在的页的尺寸的方法为:
        从右边的树状对象库中选定对应的页,通过属性编辑器更改
    页的PaperSize属性为所需要的大小!3.在应用程序中,采用以下代码应该可以改变页的尺寸。procedure TForm1.Button1Click(Sender: TObject);
    var
        MyPage: TRavePage;
    begin
        RvProject1.Open;    With RvProject1.ProjMan do
        begin
            MyPage := FindRaveComponent('Report1.Page1',nil) as TRavePage;  //查找PAGE
            MyPage.PaperSize:=DMPAPER_A4;                                   //设置报表页的尺寸    end; { with }    RvProject1.ExecuteReport('Report1');
        RvProject1.Close;
    end;
      

  6.   

    附:
    Rave使用体会(3) :如何显示中文化的打印预览对话框 
    如何显示中文化的打印预览对话框      拷贝C:\Rave5\Source目录中的RpFormPreview.pas和RpFormPreview.dfm到对应的项目目录中。      把RpFormPreview.pas加入到对应的项目文件中,把对应窗体的名字从RavePreviewForm更改为SCRavePreviewForm;将文件RpFormPreview.pas另存为SCFormPreview.pas。      把窗体SCRavePreviewForm中的对应文字从英文更改为中文。      在主窗体上加上 RvProject和 RvSystem部件,通过设定RvProject.Engine为RvSystem部件来把两者挂接。          设置RvSystem部件的OverridePreview事件过程为以下代码:procedure TForm1.RvSystem1OverridePreview(ReportSystem: TRvSystem;
      OverrideMode: TOverrideMode; var OverrideForm: TForm);
    begin
        Case OverrideMode Of
        omCreate:
        Begin
            OverrideForm := TSCRavePreviewForm.Create(self);
            //OverrideForm.Caption := ReportSystem.TitlePreview;
            OverrideForm.Width := ReportSystem.SystemPreview.FormWidth;
            OverrideForm.Height := ReportSystem.SystemPreview.FormHeight;
            OverrideForm.WindowState := ReportSystem.SystemPreview.FormState;
            (OverrideForm As TSCRavePreviewForm).ReportSystem := ReportSystem;
        End;
        omShow:
        Begin
            ReportSystem.SystemPreview.InitPreview((OverrideForm As TSCRavePreviewForm).RvRenderPreview);
            If Assigned(ReportSystem.OnPreviewSetup) Then
            Begin
              ReportSystem.OnPreviewSetup((OverrideForm As TSCRavePreviewForm).RvRenderPreview);
            End; { if }
            (OverrideForm As TSCRavePreviewForm).InputFileName := ReportSystem.SystemFiler.Filename;
            (OverrideForm As TSCRavePreviewForm).InputStream := ReportSystem.SystemFiler.Stream;
            (OverrideForm As TSCRavePreviewForm).InitFromRPSystem;
            (* *)
            If soPreviewModal In ReportSystem.SystemOptions Then
            Begin
                OverrideForm.ShowModal;
            End
            Else
            Begin
                OverrideForm.Show;
            End; { else }
        End;
        omWait:
        Begin
            If Not (soPreviewModal In ReportSystem.SystemOptions) Then
            Begin
                // Wait for close
                Repeat
                     Sleep(250);
                     Application.ProcessMessages;
                Until Not OverrideForm.Visible;
            End; { if }
        End;
        omFree:
        Begin
            If (ReportSystem.SystemFiler.StreamMode In [smTempFile, smFile]) Then
            Begin
                (OverrideForm As TSCRavePreviewForm).RvRenderPreview.NDRStream.Free;
                (OverrideForm As TSCRavePreviewForm).RvRenderPreview.NDRStream := Nil;
            End; { if }
            FreeAndNil(OverrideForm);
        End;
        End; { case }
    end;       编译运行这个项目,其打印预览窗口就会变成中文的了!
           备注:这种方式进行中文化不会受到RAVE版本升级的影响!Rave使用体会(2) :如何显示中文化的打印设置对话框 
    如何显示中文化的打印设置对话框?      拷贝C:\Rave5\Source目录中的RpFormSetup.pas和RpFormSetup.dfm到对应的项目目录中。      把RpFormSetup.pas加入到对应的项目文件中,把对应窗体的名字从RPSetupForm更改为SCSetupForm;将文件RpFormSetup.pas另存为SCFormSetup.pas。      把窗体SCSetupForm中的对应文字从英文更改为中文。      在主窗体上加上 RvProject和 RvSystem部件,通过设定RvProject.Engine为RvSystem部件来把两者挂接。          设置RvSystem部件的OverrideSetup事件过程为以下代码:procedure TForm1.RvSystem1OverrideSetup(ReportSystem: TRvSystem;
      OverrideMode: TOverrideMode; var OverrideForm: TForm);
    begin
        case
        OverrideMode of
        omCreate:
        begin
            OverrideForm := TSCSetupForm.Create(nil);
            //OverrideForm.Caption := RvSystem1.TitleSetup;
            (OverrideForm as TSCSetupForm).ReportSystem := ReportSystem;
        end;
        omShow:
        begin
            with OverrideForm as TSCSetupForm, ReportSystem do
            begin
              PreviewSetup := False;
              Aborted := ShowModal = mrCancel;
            end;
        end;
        omWait:
        begin
         {because showModal: no wait necessary!}
        end;
        omFree:
        begin
            OverrideForm.Free;
        end;
        end;
    end;       编译运行这个项目,其打印设置对话框就会变成中文的了!
           这种方式进行中文化不会受到RAVE版本升级的影响!
      

  7.   

    思路:
    报表格式是不是固定的?
    如果是固定的话,是不是可以理解为满足某些条件下的记录才被打印?这样就可以做一个查询,把满足条件的记录查询出来,直接输出作为打印。
    如果报表格式不固定,我想可能要通过INI或者其他格式存储报表格式该条件下的报表打印格式,然后在形成报表的时候,动态形成所需报表格式,看这样可以不?
      

  8.   


    如果你想从头开始创建一个ActiveX控件,首先你的控件必须从TWincontrol开始继承,如果想要提供自绘画的功能,必须从TCustomControl开始。另外,应该使用自动化兼容的数据类型来定义属性、方法、参数。如果你想转换一个已有的VCL控件变成ActiveX,注意一定要改变参数类型,否则方法,属性等等是不会被转换的。  源码清单1 - ListBoxImpl.pas  unit ListBoxImpl;   interface   uses   Windows, ActiveX, Classes, Controls, Graphics, Menus, Forms,   StdCtrls, ComServ, StdVCL, AXCtrls, DelphiByDesignXLib_TLB;   type   TListBoxX = class(TActiveXControl, IListBoxX)   private     { Private declarations }     FDelphiControl: TListBox;     FEvents: IListBoxXEvents;     procedure ClickEvent(Sender: TObject);     procedure DblClickEvent(Sender: TObject);     procedure KeyPressEvent(Sender: TObject; var Key: Char);       // Add a custom event handler for the OnDrawItem event     procedure DrawItemEvent( Control: TWinControl; Index: Integer;                              Rect: TRect; State: TOwnerDrawState );   protected     { Protected declarations }     procedure InitializeControl; override;     procedure EventSinkChanged(const EventSink: IUnknown); override;     procedure DefinePropertyPages(       DefinePropertyPage: TDefinePropertyPage); override;     function Get_BorderStyle: TxBorderStyle; safecall;     function Get_Color: TColor; safecall;     function Get_Columns: Integer; safecall;     function Get_Ctl3D: WordBool; safecall;     function Get_Cursor: Smallint; safecall;     function Get_DragCursor: Smallint; safecall;     function Get_DragMode: TxDragMode; safecall;     function Get_Enabled: WordBool; safecall;     function Get_ExtendedSelect: WordBool; safecall;     function Get_Font: Font; safecall;     function Get_ImeMode: TxImeMode; safecall;     function Get_ImeName: WideString; safecall;     function Get_IntegralHeight: WordBool; safecall;     function Get_ItemHeight: Integer; safecall;     function Get_ItemIndex: Integer; safecall;     function Get_Items: IStrings; safecall;     function Get_MultiSelect: WordBool; safecall;     function Get_ParentColor: WordBool; safecall;     function Get_ParentCtl3D: WordBool; safecall;     function Get_SelCount: Integer; safecall;     function Get_Sorted: WordBool; safecall;     function Get_Style: TxListBoxStyle; safecall;     function Get_TabWidth: Integer; safecall;     function Get_TopIndex: Integer; safecall;     function Get_Visible: WordBool; safecall;     procedure AboutBox; safecall;     procedure Clear; safecall;     procedure Set_BorderStyle(Value: TxBorderStyle); safecall;     procedure Set_Color(Value: TColor); safecall;     procedure Set_Columns(Value: Integer); safecall; 
      

  9.   

    procedure Set_Ctl3D(Value: WordBool); safecall;     procedure Set_Cursor(Value: Smallint); safecall;     procedure Set_DragCursor(Value: Smallint); safecall;     procedure Set_DragMode(Value: TxDragMode); safecall;     procedure Set_Enabled(Value: WordBool); safecall;     procedure Set_ExtendedSelect(Value: WordBool); safecall;     procedure Set_Font(const Value: Font); safecall;     procedure Set_ImeMode(Value: TxImeMode); safecall;     procedure Set_ImeName(const Value: WideString); safecall;     procedure Set_IntegralHeight(Value: WordBool); safecall;     procedure Set_ItemHeight(Value: Integer); safecall;     procedure Set_ItemIndex(Value: Integer); safecall;     procedure Set_Items(const Value: IStrings); safecall;     procedure Set_MultiSelect(Value: WordBool); safecall;     procedure Set_ParentColor(Value: WordBool); safecall;     procedure Set_ParentCtl3D(Value: WordBool); safecall;     procedure Set_Sorted(Value: WordBool); safecall;     procedure Set_Style(Value: TxListBoxStyle); safecall;     procedure Set_TabWidth(Value: Integer); safecall;     procedure Set_TopIndex(Value: Integer); safecall;     procedure Set_Visible(Value: WordBool); safecall;   end;   implementation   uses AboutListBox;   { TListBoxX }   procedure TListBoxX.InitializeControl; begin   FDelphiControl := Control as TListBox;   FDelphiControl.OnClick := ClickEvent;   FDelphiControl.OnDblClick := DblClickEvent;   FDelphiControl.OnKeyPress := KeyPressEvent;     //添加一个定制的事件来处理OnDrawItem事件   FDelphiControl.OnDrawItem := DrawItemEvent; end;   procedure TListBoxX.EventSinkChanged(const EventSink: IUnknown); begin   FEvents := EventSink as IListBoxXEvents; end;   function TListBoxX.Get_Enabled: WordBool; begin   Result := FDelphiControl.Enabled; end;   procedure TListBoxX.Set_Enabled(Value: WordBool); begin   FDelphiControl.Enabled := Value; end;   procedure TListBoxX.DrawItemEvent( Control: TWinControl;   Index: Integer; Rect: TRect; State: TOwnerDrawState ); var   ItemColor: Integer; begin   ItemColor := Integer(FDelphiControl.Font.Color);     //产生OnColorItem ActiveX事件   if FEvents <> nil then     FEvents.OnColorItem( Index, ItemColor );     //用ItemColor画列表项   with FDelphiControl do   begin     if not ( odSelected in State ) then       Canvas.Font.Color := ItemColor;     Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top, Items[Index]);     Canvas.Font.Color := FDelphiControl.Font.Color;   end; end;   initialization   TActiveXControlFactory.Create(     ComServer,     TListBoxX,     TListBox,     Class_ListBoxX,     1,     '{B19A64E4-644D-11D1-AE4B-444553540000}',     0); end. 
      

  10.   

    没有帮忙,只能自己做了.不过,遇到一个问题: 用ADO 连接Interbase 6,FROM上用ADOTable关联DBGrid,
    保存时出错: EDataBaseError with message "数据提供程序或其他服务返回E_FAIL状态"请问如何解决?急
      

  11.   

    使用FastReport的printgrid,
    首先给出一个用户选择字段的窗口,根据选择结果将数据复制到一个新的dbgrid2,
    没有选中的列的visible属性设为false,将printgrid的dbgrid 属性设为该dbgrid2,
    然后预览就行了。
    首先安装FastReport
      

  12.   

    编程中......
    遇到问题了.......
    我需要暂时存放一些数据(Key,Value二维表)就到一个对象,以便下面可以使用,用什么对象好? 
    C#可以用Hashtable,Delphi中用什么好?
      

  13.   

    我用RaveReport实现了让用户选择所需要的字段进行输出的功能。
    需要源码的请留下Mail地址。