翻譯|使用教程|編輯:楊鵬連|2021-06-29 09:25:03.697|閱讀 230 次
概述:FastReport VCL它提供了可視化模板設計器,可以訪問 30 多種格式,并可以部署到云、網站、電子郵件和打印中。本文介紹了FastReport VCL自定義報表組件編寫。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
FastReport VCL是用于 Delphi、C++ Builder、RAD Studio 和 Lazarus 的報告和文檔創建 VCL 庫。它提供了可視化模板設計器,可以訪問 30 多種格式,并可以部署到云、網站、電子郵件和打印中。
FastReport 有大量的組件,可以放在報表設計頁面上。它們是:文本、圖片、線條、幾何圖形、OLE、Rich、條碼、圖表等。您也可以編寫自己的自定義組件,然后將其附加到FastReport。
在 FastReport 中定義了幾個類,從中繼承了組件。有關更多詳細信息,請參閱“ FastReport 類層次結構”一章。這個TfrxView類是我們最感興趣的,因為大多數報表組件都是從它繼承而來的。
至少應該有基本類中Draw定義的方法TfrxReportComponent。
procedure Draw(Canvas: TCanvas; ScaleX, ScaleY, OffsetX, OffsetY: Extended); virtual;在設計器中、預覽窗口中和輸出打印期間繪制組件時調用此方法。TfrxView覆蓋此方法以繪制對象框架和背景。此方法應該在“Canvas”繪圖表面上繪制組件內容。對象坐標和大小都存儲在AbsLeft,AbsTop,Width和Height相應屬性。
ScaleX 和 ScaleY 參數分別定義 X 軸和 Y 軸上的對象縮放。這些參數在 100% 縮放時等于 1,如果用戶在設計器或預覽窗口中修改縮放,則這些參數可能會有所不同。OffsetX 和 OffsetY 參數通過 X 軸和 Y 軸進行點位移。因此,當考慮這些參數時,左上角坐標如下:
X := Round(AbsLeft * ScaleX + OffsetX);為了簡化坐標操作,在類中定義了BeginDraw方法(其參數類似于Draw方法)TfrxView
procedure BeginDraw(Canvas: TCanvas; ScaleX, ScaleY, OffsetX, OffsetY: Extended); virtual;它應該在Draw方法的第一行中調用。此方法將坐標轉換為FX, , FY, FX1, FY1, FDX, FDY,FFrameWidth整數值,以后可以在 TCanvas 方法中使用。此方法還將 Canvas、ScaleX 和 ScaleY 值復制到FCanvas、FScaleX、FScaleY變量中,可以從任何類方法中引用這些變量。
還有兩種為TfrxView類中的對象繪制背景和框架的方法。
procedure DrawBackground; procedure DrawFrame;BeginDraw 方法應該在調用這些方法之前被調用。
讓我們檢查創建一個將顯示箭頭的組件。
type TfrxArrowView = class(TfrxView) public { we should override only two methods } procedure Draw(Canvas: TCanvas; ScaleX, ScaleY, OffsetX, OffsetY: Extended); override; class function GetDescription: String; override; published { Place required properties into the published section } property BrushStyle; property Color; property Frame; end; class function TfrxArrowView.GetDescription: String; begin { component description will be displayed next to its icon in toolbar } Result := 'Arrow object'; end; procedure TfrxArrowView.Draw(Canvas: TCanvas; ScaleX, ScaleY, OffsetX, OffsetY: Extended); begin { call this method to perform coordinates transformation } BeginDraw(Canvas, ScaleX, ScaleY, OffsetX, OffsetY); with Canvas do begin { set colors } Brush.Color := Color; Brush.Style := BrushStyle; Pen.Width := FFrameWidth; Pen.Color := Frame.Color; { draw arrow } Polygon( [Point(FX, FY + FDY div 4), Point(FX + FDX * 38 div 60, FY + FDY div 4), Point(FX + FDX * 38 div 60, FY), Point(FX1, FY + FDY div 2), Point(FX + FDX * 38 div 60, FY1), Point(FX + FDX * 38 div 60, FY + FDY * 3 div 4), Point(FX, FY + FDY * 3 div 4)]); end; end; { registration } var Bmp: TBitmap; initialization Bmp := TBitmap.Create; Bmp.LoadFromResourceName(hInstance, 'frxArrowView'); frxObjects.RegisterObject(TfrxArrowView, Bmp); finalization { delete component from list of available ones } frxObjects.Unregister(TfrxArrowView); Bmp.Free; end.創建其顯示從一個DB之一的任何數據傳輸應的組件DataSet,DataField屬性分為“發布”部分,然后重寫GetData方法。讓我們以TfrxCheckBoxView標準組件為例對其進行檢查。
該組件可以通過基本類中聲明的DataSet和DataField屬性連接到 DB 字段TfrxView。此外,該組件具有Expression可放置表達式的屬性。一旦計算出來,結果將被放入Checked屬性中。如果Checked屬性等于“True” ,則此組件顯示一個叉號。您可以在下方看到組件的初始聲明文本(最重要的部分)。
TfrxCheckBoxView = class(TfrxView) private FChecked: Boolean; FExpression: String; procedure DrawCheck(ARect: TRect); public procedure Draw(Canvas: TCanvas; ScaleX, ScaleY, OffsetX, OffsetY: Extended); override; procedure GetData; override; published property Checked: Boolean read FChecked write FChecked default True; property DataField; property DataSet; property Expression: String read FExpression write FExpression; end; procedure TfrxCheckBoxView.Draw(Canvas: TCanvas; ScaleX, ScaleY, OffsetX, OffsetY: Extended); begin BeginDraw(Canvas, ScaleX, ScaleY, OffsetX, OffsetY); DrawBackground; DrawCheck(Rect(FX, FY, FX1, FY1)); DrawFrame; end; procedure TfrxCheckBoxView.GetData; begin inherited; if IsDataField then FChecked := DataSet.Value[DataField] else if FExpression <> '' then FChecked := Report.Calc(FExpression); end;
如果您對 FastReport 感興趣,歡迎加入 FastReport QQ 交流群:702295239
還想要更多嗎?您可以點擊閱讀【FastReport報表2021最新資源盤點】,查找需要的教程資源。上是FastReport .NET慧正在網火熱銷售中!>>查看價格詳情
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自: