FastReport 提示篇

來源:互聯網
上載者:User

標籤:

FastReport 提示篇 

提示篇

1.FastReport中如果訪問報表中的對象?

可以使用FindObject方法。

     TfrxMemoView(frxReport1.FindObject(‘memo1‘)).Text:=‘FastReport‘; 2.FastReport中如何使用上下標? 設定frxmemoview.AllowHTMLTags:= True;在Text輸入如下上標:mm<sup>2</sup>下表:k<sub>6</sub>舉一反三,你還可以使用其他HTML標記。 3.FastReport中如何列印總頁數? 設定兩次報表後加入引號內內容 "第[Page#]頁共[TotalPages#]頁" 4.FastReport中如何動態加入變數及變數組? 建立變數組名frxreport1.Variables.Add .Name:=‘ ‘+變數組名;建立變數名frxreport1.Variables.AddVariable(‘組名,如果為不存的組或空,則為預設組,這裡不需要空格‘,變數名,變數初始值);例如要建立變數組Yuan,二個變數Yuan1,Yuan2,則為frxreport1.Variables.Add .Name:=‘ Yuan‘注意前面是空格frxreport1.Variables.AddVariable(‘Yuan‘,Yuan1,初始值)frxreport1.Variables.AddVariable(‘Yuan‘,Yuan2,初始值) 5.FastReport中如何加入自訂函數? Fastreport可以自己加入需要的函數,來實現特定的功能。過程就是:1)添加函數到報表中。frxreport1.AddFunction(‘完整的函式宣告‘);如有一個自訂函數,為GetName(Old:String):String;這個函數通過資料集的一個欄位,得到另一個傳回值。       則語句為:frxreport1.AddFunction(‘Function GetName(Old:String):String;‘);2)指令碼中使用函數。       在指令碼中或報表中使用自訂函數,就像使用其它Fastreport內建函數一樣。3)程式中處理函數。使用函數是通過frxreport1的OnUserFunction函數來實現的。     OnUserFunction的聲明如下:Function(constMethodName: String;var Params: Variant): Variant;比如上面的函數,首先要有一個函數,這個函數是GetName的實現部分。如有一個在程式中實現的函數。     function RealGetName(Old:String):String;這個函數名是無所謂的,也可以是GetName。在OnUserFunction的事件處理中有如下代碼即可完成自訂函數在報表中的使用。if CompareText(MethodName,‘GetName‘)=0 thenResult:=RealGetName(VarToStr(Params[0]));我一般都是使用CompareText來比較函數名,因為我發現二個版本的Fastreport,一個是MethodName全部自動變成了小寫,一個是全部自動變成了大寫,所以乾脆用CompareText來比較,肯定不會出錯。如果有多個參數,則依次傳遞Params[0],Params[1]即可,要保持順序一致。這裡要注意一點,如果參數為指標,則不能直接使用Pointer(Integer(Params[0]))。因為實際傳遞過來的是指標的整數值,可以使用Pointer(StrToInt(VarToStr(Params[0])))。 6.FastReport中如何共用TFrxreport及TfrxDBDataSet? 一個程式中,不管多麼大的程式,只要列印或預覽時是模式的,則完全可以共用一個TFrxreport變數及幾個TfrxDBDataSet。只不過,要注意完成一個報表程式的步驟,主要是下面幾步1)清除報表,得到一個全新的報表內容。Frxreport1.clear。2)設定要使用的TfrxDBDataSet的別名,如果不需要可以省略這一步,但一般最好不同的報表用不同的別名。注意這一步要在載入報表檔案之前,因為一般設計報表檔案時已經包含了別名資訊。frxDBDataSet1.UserName:=別名;3)載入報表或動態建立一個TfrxReportPage。Frxreport1.LoadFromFile(報表檔案的完整檔案名稱);4)關聯TfrxDBDataSet與TDataset,並設定要使用哪些TfrxDBDataSet。Frxreport1.DataSets.Clear;//先清除原來的資料集frxDBDataSet1.DataSet:=dataset1;//關聯Fastreport的組件與TDataset資料集。Frxreport1.DataSets.Add(frxDBDataSet1);//載入關聯好的TfrxDBDataSet到報表中。經過這幾步後,就可以像單獨使用一個Tfrxreport一樣使用共用的報表元件了7.FastReport中如何使用指令碼,指令碼中使用變數?很多時候,我們希望把對報表的控制放到報表的指令碼中,通常我這樣做有二個原因:1)能夠根據欄位內容的變化而使用不同的設定,因為如果想在程式中實現這樣功能,就不得不用自訂函數,函數的實現要放到程式中,函數可能需要傳遞很多參數,效率低下。2)把不同報表的控制放到指令碼中,可以實現報表的模組化,程式只是簡單的設定資料集的關係,並載入硬碟上的報表檔案,不同報表的不同實現方式,顯示方式,均放到報表檔案中,程式簡潔,易維護,易升級。當然,這樣的缺點就是程式中載入報表時的資料集別名必須與設計報表時的別名一致。指令碼的使用與通常程式的使用並沒有太多的區別,就是像正常的程式那樣引用控制項的名稱即可。但注意對變數的使用,需要把變數名或運算式用<>括起來。實現列印分組的頁數。基本的原理就是:1)必須使用二遍報表,因為FS算總頁數就是需要二遍報表的。2)在第一遍報表中,在GroupBand列印前,動態建立整數型陣列變數,用以儲存上一個分組的總頁數。3)在最後一遍報表時,需要顯示分組頁數的Tfrxmemoview取得數組中的資料,但最後一個分組不會有總數,可以通過總頁數減去GroupBand事件中儲存的頁數來取得。4)代碼中處理了一頁多組,及一組多頁列印分組頭的情況。可以看到這些特殊處理的代碼說明。5)我特意在分組尾及頁尾都用了Tfrxmemoview來顯示這些資料,說明在不同情況下的顯示。8.FastReport中如何在指令碼中根據欄位名改變Tfrxmemoview的內容?假設有資料表“使用者”,欄位ID為使用者標識,Name為使用者名稱,列印時要求,如果使用者名稱為空白,則列印“無使用者名稱”,否則列印出“使用者名稱:實際的使用者”,則可以在ID的Tfrxmemoview控制項的OnAfterData事件中寫如下指令碼。if<frxDBDataSet1."Name">=‘‘ thenMemo2.Text:=‘無使用者名稱‘elseMemo2.Text:=‘使用者名稱:[frxDBDataSet1."Name"]‘Memo2是放置使用者名稱稱資料的Tfrxmemoview控制項。這裡注意,要在指令碼中訪問變數需要把變數用<>包括起來。9.FastReport中如何動態調整高度?我經常使用下面的幾個函數來實現Band及Tfrxmemoview高度的動態調整,需要注意的是:下面的函數只能調整一個Band中多行的最後一行,如果只有一行(多數情況下應該是這樣)就無所謂了,而且這是在寬度已經固定的前提下。在想要調整高度的Band的OnBeforePrint事件中寫SetMemo(Sender);,代碼如下,粘貼到字碼頁中就可以使用。下面的代碼也可以演變一些,實現動態寬度等。我多處都判斷了Tag是否為7635,因為我經常需要單獨調用其中的某個函數。//7635為保留數字,表示不作任何調整,通常用在多行的最上方function Biger(Old:Extended):Integer;beginResult:=Trunc(Old);if Frac(Old)>0 thenResult:=Result+1;end;procedure JustHeight(Sender:TfrxComponent);varRealHeight:Integer;beginRealHeight:=Biger(TFrxMemoView(Sender).CalcHeight+TFrxMemoView(Sender).Top);ifBiger(TfrxBand(Sender.Parent).Height)<RealHeight thenbegin//若MEMO的高度小於BAND但計算高度大於BAND,則在調整BAND的函數中就會被調整TfrxBand(Sender.Parent).Height:=Biger(RealHeight);JustBandHeight(Sender.Parent);endelseTfrxMemoView(Sender).Height:=TfrxBand(Sender.Parent).Height-TfrxMemoView(Sender).Top;end;procedureJustBandHeight(Sender:TfrxComponent);varI:Integer;beginfor I:=0 to Sender.Objects.Count-1 doif TObject(Sender.Objects.Items[I]) isTFrxMemoView thenifTFrxMemoView(Sender.Objects.Items[I]).Tag=7635 then Continueelse//如果小才改變,如果大則不能改變ifBiger(TfrxMemoView(Sender.Objects.Items[I]).Height+TfrxMemoView(Sender.Objects.Items[I]).Top)<>Biger(TfrxBand(Sender).Height)thenTfrxMemoView(Sender.Objects.Items[I]).Height:=Biger(TfrxBand(Sender).Height-TfrxMemoView(Sender.Objects.Items[I]).Top);end;procedure JustMemo(Sender:TfrxComponent);beginif not Engine.FinalPass then Exit;if Sender.Tag<>7635 thenJustHeight(Sender);end;procedure SetMemo(Sender:TfrxComponent);varI:Integer;beginfor I:=0 to Sender.Objects.Count-1 doif TObject(Sender.Objects.Items[I]) isTFrxMemoView thenifTfrxMemoView(Sender.Objects.Items[I]).Tag<>7635 thenTfrxMemoView(Sender.Objects.Items[I]).OnAfterData:=‘JustMemo‘;end;10.FastReport中如何?套打?紙張是連續的帶鋸齒的已經印刷好的,類似於通訊公司發票這裡設計的是客戶銷售記錄。客戶有兩個要求:1、因為列印紙張是印刷的,明細記錄只有8行,所以,如果明細記錄如果不到8行,就將公司名稱、銷售記錄列印在上面,下一個公司的資訊列印在下一頁,而不能接在該頁上(呵呵,是啊,如果接在一起,那印刷單就失去意義了)2、如果銷售記錄超過8行,則從第9行開始的銷售記錄列印在下一頁(所謂下一頁,其實就是鋸齒分割的下一*,稱呼“下一份”比較妥切?),並且抬頭(也就是公司名稱)也要打上(如果不列印抬頭,撕下了後,可能弄混淆了,不知道這一頁是哪個公司的)問題描述標準說法是不是應該叫“列印固定行”、“強制換頁”?回答:每頁列印抬頭的問題,就是把包含公司名稱的Band每頁重複列印即可。屬性中有一個的。勾選就行了。至於固定行,實際上設計套打時,頁面大小都是固定的,每一行的高度也都是固定的,頁首與頁尾也是固定的,這樣設計出來的報表可列印的行數自然就是你要求的 8行了。根本不需要什麼強制換頁。因為根據紙張會自動換頁的。你要做的就是設計好紙張尺寸、頁面配置,就得了,套打是一種最簡單的列印,不用想的太複雜。11.FastReport中如何?連續列印?很多人認為Fr不能實現連續列印,以為只能通過自己寫函數調用列印函數來實現連續列印,實際上,Fr可以輕易的實現連續列印,同時,實現時又是非常簡單,你甚至可以在你的程式的列印設定中簡單的讓客戶選擇是否連續列印,其它都可以保持不變。function PelsTomm(Pels:Extended):Extended;beginResult:=Pels/Screen.PixelsPerInch*25.4;end;procedurePrintSerial(Frx:TFrxReport;SequencePage:Byte=0);varP:TfrxReportPage;R,R1:Extended;begin{必須是二遍報表,否則無法計算總頁數。下面的方法只適用於沒有頁尾的情況,因為如果有頁尾的話FreeSpace就始終為0了。可以用報表腳來代替。因為是連續列印,也可以看作只有一頁,報表腳也就相當於頁尾了}if not Frx.Engine.DoublePass then Exit;//SequencePage指要連續列印的頁面,普通報表就是0P:=TfrxReportPage(Frx.Pages[SequencePage]);R1:=P.TopMargin+P.BottomMargin;while Frx.PrepareReport dobeginif (Frx.Engine.TotalPages<=1) thenBreak;R:=Pelstomm(Frx.Engine.TotalPages*Frx.Engine.PageHeight-Frx.Engine.FreeSpace)+R1;P.PaperHeight:=R;end;{必須用上面的迴圈代碼來得到準確的空白地區不能用通過計算總頁數減去各頁的頁面邊界的方法來獲得空白地區因為如果碰到一條記錄過寬的情況導致換頁,就不準確了。}R:=Pelstomm(Frx.Engine.TotalPages*Frx.Engine.PageHeight-Frx.Engine.FreeSpace)+R1;P.PaperHeight:=R;end;在預覽或列印前先調用PrintSerial即可。12.如何在程式中指定印表機名稱?frxReport1.Report.PrintOptions.Printer := ‘印表機名稱‘;13.如何使用印表機直接列印?implementationuses Printers;{$R *.dfm}procedure TForm1.Button1Click(Sender:TObject);beginPrinter.PrinterIndex := 0;{網路印表機也是要安裝在你本地的作業系統中的,直接使用順序試試吧}Printers.Printer.SetPrinter(‘HP1020‘,‘HP1020‘,‘LPT1‘,0);{印表機名字,驅動,連接埠等,自查,我是用虛擬印表機測試的}Printers.Printer.BeginDoc;Printers.Printer.Canvas.TextOut(10,10,‘列印這一行字‘);Printers.Printer.EndDoc;end;14.如何列印空白處?在列印報表的Band處的OnBeforePrint事件中添加代碼:while FreeSpace > 20 doShowBand(Child1)15.如何列印指定行數後換頁?在master band中OnBeforePrint事件中寫代碼:varvLineCount: integer;beginvLineCount := vLineCount + 1;if vLineCount = 10 thenbeginvLineCount := 0;NewPage;end;end;16.fastreport中如何把資料顯示為百分比DisplayFormat屬性,其中的Kind你設定成fkNumeric,FormatStr[<frxDBDataset1."sjl">*100#n%2.2f]%”。17.FastReport如何列印表格式的空行?varPageLine: integer; //在頁列印到第幾行PageMaxRow: integer=15; //設定每頁列數procedure MasterData1OnBeforePrint(Sender:TfrxComponent);beginPageLine := <Line> mod PageMaxRow;if(PageLine = 1) and (<line> > 1) thenEngine.newpage;child1.visible := False;end;//Footer1高度設為0procedure Footer1OnBeforePrint(Sender:TfrxComponent);vari:integer;begini:= iif(PageLine=0, PageMaxRow, PageLine);child1.visible := True;while i < PageMaxRow dobegini:= i + 1;Engine.ShowBand(Child1); //印空白表格end;child1.visible := False;end;beginend.========================================================================早期版本---------------- 使用自訂函數----------------------------------------Q: 我怎樣添加我的自訂函數?A: 使用TfrReport.OnUserFunction 事件. 這裡有一個簡單的例子:procedureTForm1.frReport1UserFunction(const Name: String;p1, p2, p3: Variant; var val: Variant);beginif AnsiCompareText(‘SUMTOSTR‘, Name) = 0 thenval :=My_Convertion_Routine(frParser.Calc(p1));end;然後,你就可以在報表(任何錶達式或指令碼)的任何地方使用 SumToStr 函數了。Q: 但是它僅僅能工作在一個TfrReport組件中。可我想在任何地方(在所有的TfrReport組件中)使用的我的自訂函數?A: 使 OnUserFunctionevent 控制代碼作為所有組件的公用控制代碼。如果你不能做到這一點,你需要建立函數庫:typeTMyFunctionLibrary =class(TfrFunctionLibrary)publicconstructor Create; override;procedure DoFunction(Fno: Integer; p1, p2,p3: Variant;var val: Variant); override;end;constructor TMyFunctionLibrary.Create;begininherited Create;with List dobeginAdd(‘DATETOSTR‘);Add(‘SUMTOSTR‘);end;end;procedureTMyFunctionLibrary.DoFunction(Fno: Integer; p1, p2, p3: Variant;var val: Variant);beginval := 0;case Fno of0: 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‘, ‘Myfunctions‘,‘SUMTOSTR(<Number>)/Converts number toits verbal presentation.‘);注意: "/" 符號是必須的! 它從它的描述中分隔函數文法。FuncLib 被聲明為你自己的函數庫 (如果你不使用函數庫可以將其設定為nil). 當函數庫未註冊時,所有它的函數將自動從函數列表中刪除。---------------- 使用變數-------------------------------------Q: 我怎樣編程實現填充變數列表(在資料詞典中)?A:資料詞典中的所有變數及分類都被儲存在TfrReport.Dictionary.Variables 中.with frReport1.Dictionary dobegin// 建立分類(名稱用空白)Variables[‘ New category‘] := ‘ ‘;// 建立變數Variables[‘New Variable‘] := ‘CustomerData.Customers."CustNo"‘;Variables[‘Another Variable‘] := ‘Page#‘;end;Q: 我定義了字串變數:with frReport1.Dictionary doVariables[‘Month‘] := ‘March‘;但是當我運行報表是,出現了錯誤,為什麼?A: 因為 FastReport 假定資料詞典中的字串變數值是一個運算式,它需要分析、計算它。可以使用其它的方法:with frReport1.Dictionary doVariables[‘Month‘] := ‘‘‘‘ +‘March‘ + ‘‘‘‘;或者, 使用 frVariables 來傳輸固定資料到報表。Q: 我不想在資料詞典中顯示某些資料集?A: 使用TfrReport.Dictionary.DisabledDatasets:with frReport1.Dictionary dobegin// 關閉該資料集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);beginif ParName = ‘MyField‘ thenParValue := Table1MyField.Value;end;最後, 第三種方法是通過編程在資料詞典中定義變數(可以參考以前的問題):with frReport1.Dictionary dobeginVariables[‘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. 這裡有一小段代碼例子:procedureTForm1.frDesigner1LoadReport(Report: TfrReport;var ReportName: String; var Opened:Boolean);beginwith MyOpenDialog dobeginOpened := ShowModal = mrOk;if Opened thenbeginReport.LoadFromBlobField(…);ReportName := …;end;end;end;procedureTForm1.frDesigner1SaveReport(Report: TfrReport;var ReportName: String; SaveAs: Boolean;var Saved: Boolean);beginif SaveAs thenwith MySaveDialog dobeginSaved := ShowModal = mrOk;if Saved thenbeginReport.SaveToBlobField(…);ReportName := …;end;endelseReport.SaveToBlobField(…);end;Q: 在 QR 中, 我可以寫這樣的代碼:QRLabel1.Caption := ’Some text’. 我可以用FR這樣做嗎?A: FR 對象並不是一個組件 (這並不像 QR, RB).但使用 TfrReport.FindObject 方法可以通過對象名稱找到該對象。vart: TfrMemoView;begint :=TfrMemoView(frReport1.FindObject(’Memo1’));if t <> nil thent.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) {elseResult := frReadString22(Stream);}end;procedure ReadMemo(Stream: Tstream; Memo:Tstrings);begin{ if frVersion >= 23 then}frReadMemo(Stream, Memo){ elsefrReadMemo22(Stream, Memo);}end;FR_Utils:procedure frReadMemo(Stream: Tstream; l:Tstrings);vars: String;b: Byte;n: Word;beginl.Clear;l.Text := frReadString(Stream); exit;Stream.Read(n, 2);if n > 0 thenrepeatStream.Read(n, 2);SetLength(s, n);Stream.Read(s[1], n);l.Add(s);Stream.Read(b, 1);until b = 0elseStream.Read(b, 1);end;function frReadString(Stream: Tstream):String;vars: String;n: Integer;b: Byte;beginStream.Read(n, 4);SetLength(s, n);Stream.Read(s[1], n);if (n > 0) and (s[n] = #$0A) thenSetLength(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‘ thenTfrPictureView(View).Picture.LoadFromFile(…) 或.Assign 或.你所想要做的任何事情FastReport套打全攻略//以設計套打行為6行為例進行說明一、定義變數TaoDa 0 是套打1 不套打cPage系統變數頁#caPage系統變數總頁數二、TfrPage.OnBeforePrint事件中寫{ifTaoDa = ‘0‘ thenbegintitle.visible:=false; //不用列印的設定Visible為False;danweiv.frametyp := 0; //只列印資料的不需要列印邊框的設定 frametyp 為 0;...end;i :=0 ; //定義一個變數並進行初始化。}二、主項資料.OnBeforePrint事件中寫{ifTaoDa = ‘0‘ thenbegini:= i + 1;bm.memo := i;if(i > 5 ) thenif ((i-1) mod 6 ) = 0 then newpage;end;}三、主項腳.OnBeforePrint事件中寫{j :=i mod 6;if j<> 0 thenbeginfor k := j to 5 dobeginShowBand(Child1); //Child1是子的名稱 顯示空白行end;end;}四、欄目腳.OnBeforePrint事件中寫{ifcpage <> capage thenbeginshi.memo := ‘‘; //十bai.memo := ‘‘; //百qian.memo := ‘‘; //千wan.memeo := ‘‘; //萬endelse beginshi.memo := v1;bai.memo := v2;qian.memo := v3;wan.memo := v4;end;}這段代碼是用來控制在有多頁情況下,在最後一頁上顯示總金額。其中:v1,v2,v3,v4 是自訂變數。報表結構組成:欄目頭 //畫報表的標題主項資料 //顯示的資料,會與資料來源進行綁定主項腳 //什麼也不用放,只用來控制 visible := false;子 //畫出空白行顯示的元件匣目腳 //顯示總的金額、數量頁尾//顯示頁數調用方法:frReportA.LoadFromFile(s); s 是檔案frReportA.Dictionary.Variables[‘taoda‘]:=‘1‘;進行查詢列印:frReportA.PrepareReport;frreportA.PrintPreparedReport(‘‘,1,true,frall);預覽:frReportA.ShowReport;FastReport列印CxGrid資料用慣了FastReport,就不願意再使用其他的Print Component。用FastReport列印CxGrid Filter後的資料,網上一直沒有很好的辦法和常式。看到有將CxGrid的Fileter Text取出後再賦給DataSet的說明,沒有具體去實驗,太麻煩。如此著名的Component肯定有解決此問題的方法。於是今天到Dev Express英文網站去瀏覽了一番,在該站上搜尋了一下,居然出來N多此問題的提問者,看了幾個這類的問題後,終於解決了。解決此問題可以使用以下方法:1、將View的datacontroller.filter.autodatasetfilter屬性設為True。此方法需要DataSet支援才能設定。2、是在FastReport的frDBDataSet的CheckEofEvent裡寫如下代碼:EOF := frUserDataset1.RecNo >=Grid.ViewData.RecordCount;在frReport的GetValue Event裡寫代碼:if ParName=‘Field1‘ thenParValue :=Grid.ViewData.Records[frDataset1.RecNo].Values[2]);此代碼也可這樣寫:ParValue:=Grid.ViewData.Records[frDataset1.RecNo].Values[View.GetColumnByFieldName(ParName).Index]);ReportMachine1.如何使用代碼指定印表機?RMReport1.LoadFromFile(‘Untitled.rmf‘);rmreport1.PrinterName:=‘\\192.168.10.1\HP LaserJet 1022‘;    

FastReport 提示篇

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.