FastReport的使用方法

如下是我在網上收集的數據庫

 

 

這是FastReport的主控件。它包含了調入、保存、預覽和打印報表的方法。每一個TfrReport控件只能包含一個單獨報表。編程

TfrReport屬性
描   述

DataSet
-
聯接到一個TfrxxxDataSet。這個數據源的記錄數定義需多少時間這個報表才能被構建和打印。(參考:ReportType屬性)

GrayedButtons
False
若是爲True,設計器和預覽窗口的工具欄將顯示爲灰色。

InitialZoom
pzDefault
定義預覽的初始縮放值。

MDIPreview
False
顯示預覽窗口爲一個MDI子窗口。

ModalPreview
True
若是爲True,預覽窗口爲模式方式。

ModifyPrepared
True
若是爲True,在預覽窗口中雙擊頁面則能夠修改準備好的報表。

Preview
-
鏈接到一個TfrPreview。若是這個屬性被設置,準備好的報表將被顯示在這個控件中。

PreviewButtons
All
定義在預覽窗口中可用的按鈕集。

ReportType
RtSimple
Defines how to interpret the data source connected to the DataSet property. If ReportType = rtMultiple, the report will be built as many times as the number of records in the connected data source. This is useful for printing a report multiple times based on a list (i.e. the data source).瀏覽器

定義怎樣解釋數據源鏈接到DataSet屬性。若是ReportType = rtMultiple,報表將在不一樣時間構建鏈接數據源的記錄數。

ShowProgress
True
若是爲True,當準備、打印或輸出報表時顯示過分窗口。

StoreInDFM
False
若是爲True,存貯報表在DFM文件中。注意:報表存入DFM文件後存貯在可執行文件(EXE)中而不能被修改。

Title
-
報表標題。這個名稱顯示在預覽窗口和打印任務列表中。ide

注意:TfrReport.StoreInDFM屬性缺省爲False。意思是你的報表必須存入一個可執行文件或轉換到數據庫的BLOB或二進制字段中。若是你想保存你的報表到DFM資源(像在其它的報表工具中,例如QuickReport和ReportBuilder),設置這個屬性爲True。但必需記住——這將要求你在任何一個報表被修改時都必須從新編譯你的應用程序。函數

TfrReport事件工具

事件
描 述

OnBeforePrint
這個事件在打印報表以前被激活。注意:FastReport對象不是控件,所以它們不能顯示在在對象觀察中。你不能指定各個對象的個別事件處理。不過,你可使用公共事件處理,像OnBeforePrin,OnBeginBand和OnEndBand。

OnBeginBand
在打印一個區域前這個事件被激活。

OnBeginColumn
在打印透視表欄前這個事件被激活。

OnBeginDoc
在打印一個報表前這個事件被激活。

OnBeginPage
在開始打印一個頁面時這個事件被激活。

OnEndBand
在打印一個區域結束後這個事件被激活。

OnEndDoc
在結束一個報表的打印時這個事件被激活。

OnEndPage
在結束一個頁面的打印時這個事件被激活。

OnGetValue
當FastReport在表達式中查找不明變量時這個事件被激活。指定事件處理返回這個變量值。

OnManualBuild
指定這個事件的處理將容許你手工構建報表。(例如用代碼顯示一個須要的區域)。參考演示:DEMOS\MANUAL。

OnMouseOverObject
在預覽窗口中當鼠標在任什麼時候間移到某個對象時這個事件被激活。事件句柄將返回這個對象的光標類型(例如「pointing hand」光標)。這能讓用戶觀察哪些對象可「點擊」,哪些不能。

OnObjectClick
當你在預覽窗口中點擊某個對象時這個事件被激活。

OnPrintColumn
打印透視表欄前這個事件被激活。這個事件可以返回欄寬。

OnProgress
在長時間的運行中這個事件被激活。這個事件處理能夠顯示工做進度。

OnUserFunction
當FastReport在表達式中查找不名函數時這個事件被激活。這個事件處理將返回這個函數值。post

///////////////////////字體

我在報表中使用了這樣一個Memo:ui

自定義數據:[Test]設計

而後

uses
frxVariables;

procedure TForm1.Button1Click(Sender: TObject);
begin
frxReport1.LoadFromFile('Test.fr3');
frxReport1.Variables['Test']:='hello';
frxReport1.ShowReport();
end;

結果發生異常。不能賦值。請問該怎麼傳遞程序中的變量到報表裏面?

在你的 frReport 控件的 OnGetValue 事件中加入如下代碼:
procedure TForm1.frReport1GetValue(const ParName: string;
var ParValue: Variant);
var
Test: string;
begin
if ParName = 'Test' then
    parValue := 'hello';
end;
而後,在你的報表上加入,這個變量,就能夠了。

////////////////////////
因爲在統計彙總表裏對一段時間進行查詢的,如今須要把從起始時間到終止時間送到報表裏去,應該如何送。
如:起始時間:2005-05-01 終止時間:2005-05-31,如何把這兩個時間送到報表裏去,謝謝!

假設報表中有一個memo,裏面定義一個變量[mydate]
Report.Dictionary.Variables.Variable['mydate']:=''''+edtsz.Text+'''';

////////////////////////////////
: 我怎樣添加個人自定義函數?
A: 使用 TfrReport.OnUserFunction 事件. 這裏有一個簡單的例子:

procedure TForm1.frReport1UserFunction(const Name: String;
p1, p2, p3: Variant; var val: Variant);
begin
if AnsiCompareText('SUMTOSTR', Name) = 0 then
val := My_Convertion_Routine(frParser.Calc(p1));
end;

而後,你就能夠在報表(任何表達式或腳本)的任何地方使用 SumToStr 函數了。


Q: 可是它僅僅能工做在一個TfrReport組件中。可我想在任何地方(在全部的TfrReport組件中)使用的個人自定義函數?
A: 使 OnUserFunction event 句柄做爲全部組件的公用句柄。若是你不能作到這一點,你須要建立函數庫:

type
TMyFunctionLibrary = class(TfrFunctionLibrary)
public
constructor Create; override;
procedure DoFunction(FNo: Integer; p1, p2, p3: Variant;
var val: Variant); override;
end;

constructor TMyFunctionLibrary.Create;
begin
inherited Create;
with List do
begin
Add('DATETOSTR');
Add('SUMTOSTR');
end;
end;

procedure TMyFunctionLibrary.DoFunction(FNo: Integer; p1, p2, p3: Variant;
var val: Variant);
begin
val := 0;
case FNo of
0: val := My_DateConvertion_Routine(frParser.Calc(p1));
1: val := My_SumConvertion_Routine(frParser.Calc(p1));
end;
end;

要註冊函數庫,調用
frRegisterFunctionLibrary(TMyFunctionLibrary);
要卸載函數庫,調用
frUnRegisterFunctionLibrary(TMyFunctionLibrary);


Q: 我怎樣將個人函數添加到函數列表中 (用表達式生成器)?
A: 使用 frAddFunctionDesc 過程 (在FR_Class 單元中):

frAddFunctionDesc(FuncLib, 'SUMTOSTR', 'My functions',
'SUMTOSTR(<Number>)/Converts number to its verbal presentation.');

注意: "/" 符號是必須的! 它從它的描述中分隔函數語法。
FuncLib 被聲明爲你本身的函數庫 (若是你不使用函數庫能夠將其設置爲nil). 當函數庫未註冊時,全部它的函數將自動從函數列表中刪除。


---------------- 使用變量 -------------------------------------

Q: 我怎樣編程實現填充變量列表(在數據詞典中)?

A: 數據詞典中的全部變量及分類都被存儲在 TfrReport.Dictionary.Variables 中.

with frReport1.Dictionary do
begin
// 建立分類(名稱用空白)
Variables[' New category'] := '';
// 建立變量
Variables['New Variable'] := 'CustomerData.Customers."CustNo"';
Variables['Another Variable'] := 'Page#';
end;

Q: 我定義了字符串變量:

with frReport1.Dictionary do
Variables['Month'] := 'March';

可是當我運行報表是,出現了錯誤,爲何?

A: 由於 FastReport 假定數據詞典中的字符串變量值是一個表達式,它須要分析、計算它。
可使用其它的方法:

with frReport1.Dictionary do
Variables['Month'] := '''' + 'March' + '''';

或者, 使用 frVariables 來傳輸固定數據到報表。


Q: 我不想在數據詞典中顯示某些數據集?

A: 使用 TfrReport.Dictionary.DisabledDatasets:

with frReport1.Dictionary do
begin
// 關閉該數據集
DisabledDatasets.Add('CustomerData.Bio');
// 或者, 關閉整個數據模塊/窗體
DisabledDatasets.Add('CustomerData*');
end;


Q: 我怎樣將數據傳送到報表?

A: 有幾個方法能夠實現它. 第一是使用全局對象 frVariables (在 FR_Class 單元中被定義):

frVariables['My variable'] := 10;

這段代碼建立了一個名稱爲「My variable」,值爲 10 的變量。這是最好的傳輸固定數據的報表的方法。

第二種方法是使用 TfrReport.OnGetValue 事件. 這可使用這個方法來傳送動態數據、記錄等。

procedure TForm1.frReport1GetValue(ParName: String; var ParValue: Variant);
begin
if ParName = 'MyField' then
ParValue := Table1MyField.Value;
end;

最後, 第三種方法是經過編程在數據詞典中定義變量(能夠參考之前的問題):

with frReport1.Dictionary do
begin
Variables['MyVariable'] := 'CustomerData.Customers."CustNo"';
Variables['Another Variable'] := '10';
end;


Q: 我能在報表和程序間傳送數據嗎?
A: 使用 frVariables 對象. 若是你在報表的任何對象的腳本中寫入如下代碼:

MyVariable := 10

那麼,在你的程序中,你可使用如下代碼來獲取 MyVariable 的值:
v := frVariables['MyVariable'];


---------------- 腳本 (FastReport Pascal) ---------------------------------

Q: Band 中是否可使用腳本?

A: 固然. 選擇 band ,而後按 Ctrl+Enter 或在對象瀏覽器中選擇 "OnBeforePrint" 屬性。

Q: 報表頁中是否可使用腳本?

A: 固然. 選擇頁 (在空白處單擊) ,而後在對象瀏覽器中選擇 "OnBeforePrint" 屬性。若是該頁是一個對話框窗體,那麼這個屬性就是 "OnActivate".


Q: 我有兩個對象: Memo1 和 Memo2. 我可否在 Memo1 的腳本中調用 Memo2 的屬性和方法?

A: 固然, 例如,你能夠這樣作: 對象名.屬性名.


Q: 在腳本中,我可使用對象的哪些屬性?

A: 幾乎全部你能在對象瀏覽器中看到的屬性。例如,可使用 Font.Name, Font.Size等來存取字體屬性。


---------------- 其它問題 --------------------------------------------

Q: 怎樣改變多頁報表中某一頁的順序?

A: 拖動頁標籤到目的位置。


Q: 我想查看全部的字段及變量,我想在報表中使用列表來實現它?

A: 設置 TfrReport.MixVariablesAndDBFields := True.如今,全部的數據字段及變量可在「插入數據字段」對話框中可存取了。


Q: 我不想顯示導入選項對話框?

A: 在導入組件(好比,TfrTextExport)中設置全部必需的選項,而後經過設置ShowDialog屬性爲False來關閉此對話框。


Q: 爲何 TotalPages 變量不起做用? 它老是返回 0.

A: 在你的報表中設置 Two-pass 選項. 要設置它,你須要在報表設計器的「文件」菜單中,打開「報表選項」對話框。


Q: 我用BLOB字段來存儲個人報表。當我運行報表設計器時,它顯示個人報表未命名?

A: 在運行報表設計器前,這樣作:

frReport1.FileName := 'Name of my report';


Q: 我想在從新定義報表設計器中的「打開」及「保存」按鈕的功能?


A: 查看 TfrDesigner 組件. 它有幾個必需的事件: OnLoadReport 和
OnSaveReport. 這裏有一小段代碼例子:

procedure TForm1.frDesigner1LoadReport(Report: TfrReport;
var ReportName: String; var Opened: Boolean);
begin
with MyOpenDialog do
begin
Opened := ShowModal = mrOk;
if Opened then
begin
Report.LoadFromBlobField(...);
ReportName := ...;
end;
end;
end;

procedure TForm1.frDesigner1SaveReport(Report: TfrReport;
var ReportName: String; SaveAs: Boolean; var Saved: Boolean);
begin
if SaveAs then
with MySaveDialog do
begin
Saved := ShowModal = mrOk;
if Saved then
begin
Report.SaveToBlobField(...);
ReportName := ...;
end;
end
else
Report.SaveToBlobField(...);
end;


Q: 在 QR 中, 我能夠寫這樣的代碼: QRLabel1.Caption := 'Some text'. 我能夠用FR這樣作嗎?

A: FR 對象並非一個組件 (這並不像 QR, RB). 但使用 TfrReport.FindObject 方法能夠經過對象名稱找到該對象。

var
t: TfrMemoView;
begin
t := TfrMemoView(frReport1.FindObject('Memo1'));
if t <> nil then
t.Memo.Text := 'FastReport';
end;


Q: 我想在用戶預覽(TfrPreview組件)中自定義熱鍵?

A: 這個組件有個窗口: TForm 屬性. 將自定義句柄指定到 Window.OnKeyDown 屬性.


Q: Fast Report 2.4 不能裝載 FreeReport 2.21 文件?

A: 這僅須要使用16進制數改變報表文件的第一字節,而後在源代碼中修改下面的部分。在這些修改以後,裝載報表並保存它. 最後,返回到源代碼處.

FR_Class:

function ReadString(Stream: TStream): String;
begin
{ if frVersion >= 23 then}
Result := frReadString(Stream) {else
Result := frReadString22(Stream);}
end;

procedure ReadMemo(Stream: TStream; Memo: TStrings);
begin
{ if frVersion >= 23 then}
frReadMemo(Stream, Memo){ else
frReadMemo22(Stream, Memo);}
end;


FR_Utils:

procedure frReadMemo(Stream: TStream; l: TStrings);
var
s: String;
b: Byte;
n: Word;
begin
l.Clear;
l.Text := frReadString(Stream); exit;
Stream.Read(n, 2);
if n > 0 then
repeat
Stream.Read(n, 2);
SetLength(s, n);
Stream.Read(s[1], n);
l.Add(s);
Stream.Read(b, 1);
until b = 0
else
Stream.Read(b, 1);
end;

function frReadString(Stream: TStream): String;
var
s: String;
n: Integer;
b: Byte;
begin
Stream.Read(n, 4);
SetLength(s, n);
Stream.Read(s[1], n);
if (n > 0) and (s[n] = #$0A) then
SetLength(s, n - 2);
// Stream.Read(b, 1);
Result := s;
end;


Q: 怎樣不在打印預覽中打印報表?
A: 這裏有一段代碼:

frReport1.PrepareReport;
frReport1.PrintPreparedReport('', 1, True, frAll);

frReport1.PrintPreparedReportDlg;


Q: 我想在報表中旋轉圖片。問題是這張圖片是由個人應用程序生成的。是否有方法能夠在打印前將這幅圖片裝載到報表中?

A: 使用 TfrReport.OnBeforePrint 事件:

if View.Name = 'Picture1' then
TfrPictureView(View).Picture.LoadFromFile(...) 或
.Assign 或
.你所想要作的任何事情

天天早上敲醒本身的不是鬧鐘,是夢想!
相關文章
相關標籤/搜索