RM(Report Machine)是一個功能強大的Delphi報表控件包。使用它可以制作出非常復雜的報表。下面講述最簡單的用法:
在Form上放上兩個數據庫控件:ADOConnection和ADOQuery
設置好ADOConnection的ConnectionString。LoginPrompt=False。
ADOQuery的Connection指向ADOConnection。
ADOQuery的SQL設置好數據查詢語句。
在Form上放上兩個RM報表控件:RMDBDataSet和RMReport。
RMDBDataSet的DataSet指向ADOQuery。
RMReport的DataSet指向RMDBDataSet。
(如果想使最終生成的應用程序具備報表設計能力,還需要放上RMDesigner控件,不需要設置任何屬性)
雙擊RMReport控件,開始設計報表模板。
對於一般比較規則的報表,只需向模板中加入四個Band對象,分別是:
1)、頁標頭:通常用來顯示報表名稱,時間等
2)、主項標頭:通常用來顯示欄目名稱。
3)、主項數據:用來顯示數據。
4)、頁注腳:用來顯示頁號,日期等。
設計好的模板可以保存在DFM中,也可以保存到獨立的模板文件中,擴展名為RMF,運行時調入。下面給出幾個代碼片斷:
procedure TBrowseForm.Button5Click(Sender: TObject);
var
RMReport:TRMReport;
begin
if ADOQuery1.IsEmpty then
Exit;
try
RMReport := TRMReport.Create(Self);
RMReport.LoadFromFile('Match.rmf');
RMReport.PrepareReport;
RMReport.ShowReport;
finally
RMReport.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
RMReport1.ShowReport;
end;
// 設計報表模板
procedure TForm1.Button2Click(Sender: TObject);
begin
RMReport1.LoadFromFile('TTT.rmf');
RMReport1.DesignReport;
end;
對於大多數規則的報表,以上知識就足夠了。但這只是RM最簡單的用法,遠遠沒體現出RM功能的強大。
RM有兩個吸引人的功能是我目前最需要的:
1)、數據可以來自數據庫,也可以來自其它任何地方,如文件中、內存中等。
2)、不一定需要預先制作好模板,可以在運行時刻通過代碼生成模板,這對於數據中字段個數不定的情況非常有用。
RM雖然功能強大,但用起來並不覺的很復雜,它是我見過的為數不多的報表控件中最好的一個。
1.對於一張紙要兩面打的報表你有什么好辦法?
打印時可以選擇打奇數頁還是打偶數頁。
2.怎么能在一個頁面中打印固定的條數,另外最后一頁記錄不夠時怎么打出空白的格子出來啊.
固定條數:設置LinesPerPage
空白格子:設置AutoAppendBlank=True
3.怎樣屏蔽雙擊報表進入設計報表的界面?
RMReport1.ModifyPrepared := False
4.怎樣在報表中增加表合計???
可以放在標題欄,頁面設置中選"兩遍報表"
匯總框的TotalCalc=True即可
5.我想用代碼把參數傳遞給報表中的某一個TRMMemoView該怎么做?
RMReport1.FindObject(‘Memo1‘).Memo.Text := ‘ddddd‘
或者
RMVariables[‘a1‘] := ‘ddddd‘; //這樣就可以在報表中使用變量‘a1‘了。
6.如何能夠不打印重復內容?
Suppres=True
7.如何讓打印預覽時雙擊不能進入報表編輯器!
設置RMReport.ModifyPreview=False
8.如何在報表程序中控制MEMO的邊框是否顯示
在delphi中:
memo1.LeftFrame.Visible := False
memo1.TopFrame.Visible := False;
memo1.RightFrame.Visible := False;
memo1.BottomFrame.Visible := False
在報表的script中
memo1.FrameTyp := 15; //這個參數多試幾次就知道如何設置了
FrameTyp := 0; //不顯示
9.怎樣改變page的名稱和控制它顯示但不打印
可以,在Page1的OnBeforePrint中
begin
Page1.Visible := True;
Page1.Visible := False; //不顯示
end;
10.Report Machine中,如何強制每3行一個表格
設置主項數據欄:LinesPerPage=3
如果三人一行有辦法:設置主項數據欄的Columns=3
用分組打印,分組條件: NowLine > 3
在分組標頭的OnBeforePrint:
begin
NowLine := 1;
end;
在主項數據的OnBeforePrint:
begin
NowLine := NowLine + 1;
end;
11.能否只顯示分組統計值而不顯示分組數據?
可以,設置主項數據欄:Visible=False
統計框:CalcNoVisible=True
12.能否只對超過長度的單條記錄進行折行?
可以,設置文本框:Stretched=True; wordwrap=True
設置文本框所在的欄:Stretched=True; Breaked=True
13.如何實現打印預覽的問題
RMReport1.LoadFromFile(‘c:1.rmf‘); //讀入報表
RMReport1.ShowReport; //預覽
RMReport1.PrintReport; //打印
RMReport1.DesignReport; //設計
14.請問如何在程序中控制:1、縱向打印還是橫向打印。2、分組標頭是否每組換頁。
1.RMReport1.Pages[0].ChangePaper()
2.RMReport1.Pages[0].FindObject(分組標頭欄名).Prop[‘NewPage‘] := False;
15.直接打印的方法是什么?
RMReport1.ShowPrintDialog := False;
RMReport1.PrintReport;
16.頁邊距改變以后,所有控件應該相應的改變位置。
需要在頁面設置中不選"縮放到可打印區域"頁面居中或
RMReport1.Pages[0].pgMargins := ; //這樣試試
17.如何從導入一個rtf文件作為TRMFormReport的PageHeader
var
TempStream : TMemoryStream;
begin
TempStream := TMemoryStream.Create;
RichEdit1.Lines.SaveToStream(TempStream);
TempStream.Position := 0;
RMFormReport1.PageHeader.Caption.LoadFromStream( TempStream);
TempStream.Free;
end;
18.怎樣確定報表模版目錄?
設置TRMDesigner的TemplateDir
19.我想動態設"虛擬數據集"該怎么設!
(RMReport1.FindObject(‘Band1‘) as TRMBandView).DataSet :=‘RMDBDataSet1‘;
20.在程序中
RMVariables[‘aaa‘] := form1.Caption;
在報表中就可以使用變量‘aaa‘
21.左邊距:
CurReport.Pages[0].pgMargins.Left := Round(RMConvertToPixels(毫米 * 10, rmsuMM))
22.RMVariables[‘品牌‘] :=True;
RMVariables[‘品名‘] :=‘計算機‘;
在Page1的OnBeforPrint事件中的代碼如下:
If 品牌 Then
MessageBox(品名);
23.每頁只打10條記錄怎么處理啊?主項數據欄LinePerPage=10
24.怎么實現主項數據的統計啊???
最好用欄目注腳欄,在上面放統計框,然后設置CalcType即可
25.動態生成報表時,RM的頁邊距如何設定?
TRMPage.pgMargins := Rect(30, 30, 40, 40);
26.如何在程序運行時,在一個預覽或者打印窗口中,一次打開多個報表文件
用TRMCompositeReport,
RMCompositeReport1.Reports.Clear;
RMCompositeReport1.Reports.Add(RMReport1);
RMCompositeReport1.Reports.Add(RMReport2);
RMCompositeReport1.ShowReport;
27.rm如何進行套打
Page1不是有個BackGroundPic屬性嗎,這個就是專門做套打的
28.GridView1 能象Microsoft Excel
實現 a3=a1+a2嗎?
可以,a3內容
[memo1.CalcValue + memo2.CalcValue]
29.
使用總頁數,將CalcMemoView放在頁頭,組頭,欄目頭時需要選擇"兩遍報表",對打印沒影響,只打印一遍.
30.如何打印中括號如: [2002]
在memoview的OnBeforePrint中
begin
memo := ‘[2002]‘;
end;
或者把‘[‘,‘]‘定義成變量:
RMVariables[‘a1‘] := ‘[‘;
RMVariables[‘a2‘
report machine開發使用手冊-創建報表2010-02-10 13:08
創建報表:
創建一個報表由下面幾步組成:
1、選擇數據:選擇報表中用到的數據源
2、設計報表模板:利用區域(稱為Band)將報表分布不同的部分,決定報表樣式。
3、處理:用報表內置腳本語言或在delphi中對報表中用的的數據,報表模板等進行處理
4、生成報表:根據報表模板+數據源,生成最終的報表。
選擇數據源:
大多數報表需要的數據都是來自數據庫。TTable和TQuery組件可以作為報表的數據源。總的來說它可以使用任何一個從TDataSet組件繼承的子類。每個報表中用到的TDataSet都要有一個與之對應的TRMDBDataSet。
除了TDataSet,ReportMachine頁可以使用任何數據源(數組,文件,字符網格等等)。在這種情況下,程序必須自己控制非數據庫源的存取。你可以用TRMUserDataSet方便地把數據傳送到報表中。
設計報表模板:
報表模板本身就是描述怎樣可以看到正確的報表。每個報表模板由多個區域組成,ReportMachine把這些區域稱為"Band"。有兩種類型的Band:固定區域Band(比如報表標題,頁標頭,頁注腳等等)和用於顯示數據集中所有記錄的Band(比如主項數據欄)。數據Band需要聯接到數據源,內容是數據源中的記錄。
在ReportMachine中提供了報表開發的可視化環境(報表設計器,這個設計器也可以提供給你的End User,以方便你的End User自己修改報表模板)用於創建報表。報表設計器功能強勁,簡單又易於使用。報表設計器的界面由帶有浮動的工具欄,可以自由地改變它們的位置,使用對象觀察器(Objects Inspector)可以控制對象的屬性,類似於Delphi IDE中的那個。
處理:
在生成報表的時候,需要對輸入的數據進行某種處理(比如格式化),報表模板需要某些修改(比如報表模板中某個文本框需要改變字體)。
實現這個處理可以在Delphi中的TRMReport的事件處理中編寫代碼,這個方法並不通用,因為它不允許在Delphi外創建報表而無需重新編譯。這就是為什么在ReportMachinet中內置腳本語言,ReportMachine的內置腳本語言非常類似於Object Pascal,功能強大。用這個腳本語言編寫事件處理代碼,這就可以讓你創建復雜的處理而無需在Delphi中編寫代碼,配合報表設計器,不需要修改某個報表而重新編譯項目。可以實現報表於你的項目分離。
報表腳本例子:
unit Report;
interface
procedure Memo1OnBeforePrint(Sender: TObject);
implementation
procedure Memo1OnBeforePrint(Sender: TObject);
begin
Memo1.Text := 'test';
end;
procedure Main;
begin
end;
end.
生成報表:
生成報表是ReportMachine根據報表模板,對數據源進行加工處理生成最終的報表並能在點擊“預覽”按鈕后進行預覽的過程。在ReportMachine中准備好的報表是一組對象的集合,描述報表處理后各頁面所包含的內容。這允許你可以修改生成的報表頁面,通過在設計器中調用所需的頁面。除此之外,還可以描述在預覽窗口中鼠標點擊對象的反應。這將讓你更容易地組織你的工作(在一個報表對象點擊可以產生一個更詳細的新報表)。
在ReportMachine的預覽窗口類似於Microsoft Word:在一個窗口中可以看到多個頁面,並且可用用鼠標拖動,需要的話,可以通過雙擊調出編輯器修改當前頁。