1. 程式人生 > >Report Machine(RM)報表控制元件簡單用法-delphi

Report Machine(RM)報表控制元件簡單用法-delphi

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:在一個視窗中可以看到多個頁面,並且可用用滑鼠拖動,需要的話,可以通過雙擊調出編輯器修改當前頁。