好久不用Delphi,都不知道怎么用了.
有个朋友要我帮他完成一个报表打印功能,他在Visual Foxpro中无法实现要求:
输出的字段由用户设置
报表纸张可设置,走纸方向可设置
做成DLL假设表为Table1,列c1, c2, c3...cn
输出的列从这个表取.要求完整源码,分不够可加.
请各位帮忙,谢谢
有个朋友要我帮他完成一个报表打印功能,他在Visual Foxpro中无法实现要求:
输出的字段由用户设置
报表纸张可设置,走纸方向可设置
做成DLL假设表为Table1,列c1, c2, c3...cn
输出的列从这个表取.要求完整源码,分不够可加.
请各位帮忙,谢谢
不要用.Net
在VFP中更好处理.
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;
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版本升级的影响!
报表格式是不是固定的?
如果是固定的话,是不是可以理解为满足某些条件下的记录才被打印?这样就可以做一个查询,把满足条件的记录查询出来,直接输出作为打印。
如果报表格式不固定,我想可能要通过INI或者其他格式存储报表格式该条件下的报表打印格式,然后在形成报表的时候,动态形成所需报表格式,看这样可以不?
如果你想从头开始创建一个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;
保存时出错: EDataBaseError with message "数据提供程序或其他服务返回E_FAIL状态"请问如何解决?急
首先给出一个用户选择字段的窗口,根据选择结果将数据复制到一个新的dbgrid2,
没有选中的列的visible属性设为false,将printgrid的dbgrid 属性设为该dbgrid2,
然后预览就行了。
首先安装FastReport
遇到问题了.......
我需要暂时存放一些数据(Key,Value二维表)就到一个对象,以便下面可以使用,用什么对象好?
C#可以用Hashtable,Delphi中用什么好?
需要源码的请留下Mail地址。