博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[翻译]Writing Custom Report Components 编写自定义报表组件
阅读量:4930 次
发布时间:2019-06-11

本文共 5827 字,大约阅读时间需要 19 分钟。

摘要:简单介绍了如何编写一个FastReport的组件,并且注册到FastReport中使用。

 

Writing Custom Report Components 编写自定义报表组件

FastReport has a large number of components that can be placed on a report design page. They are: text, picture, line, geometrical figure, OLE, rich text, bar code, diagram etc. You can also write your own custom component and then attach it to FastReport.

FastReport有很多放在报表设计页上的组件,他们是text,picture等,你可以编写自定义的组件并附加到FastReport。

FastReport has several classes from which components can be inherited. For more details, see “FastReport Class Hierarchy”. The TfrxView class is of primary interest, since most report components are inherited from it.

(选择合适的基类继承)

As a minimum the “Draw” method in the TfrxReportComponent base class should be defined.

procedure Draw(Canvas: TCanvas;ScaleX, ScaleY, OffsetX, OffsetY: Extended); virtual;

This method is called when the component is painted in the designer, in the preview window and during output printing. TfrxView overrides this method for drawing the object frame and background. This method should draw the component's contents on the “Canvas” drawing surface. The object coordinates and sizes are stored in the “AbsLeft”, “AbsTop” and “Width”, “Height” properties respectively.

(编写组件就是重写Draw方法)

The “ScaleX” and “ScaleY” parameters define the object scaling in the X-axis and Y-axis respectively. These parameters equal 1 at 100% zoom and can change if the user modifies zooming either in the designer or in the preview window. The “OffsetX” and “OffsetY” parameters shift the object along the X-axis and Y-axis. So, taking all these parameters into account the upper left corner coordinate will be:

(缩放)

X := Round(AbsLeft * ScaleX + OffsetX);

Y := Round(AbsTop * ScaleY + OffsetY);

To simplify operations with coordinates, the “BeginDraw” method (with parameters similar to “Draw”) is defined in the “TfrxView” class.

procedure BeginDraw(Canvas: TCanvas;ScaleX, ScaleY, OffsetX, OffsetY: Extended); virtual;

This method should be called in the first line of the “Draw” method. It transforms the coordinates into FX, FY, FX1, FY1, FDX, FDY and FFrameWidth integer values, which can be used later in TCanvas methods. It also copies Canvas, ScaleX and ScaleY values into the FCanvas, FScaleX and FScaleY variables, which can be referred to in any class method.

(重写BeginDraw方法)

There are also two methods in the TfrxView class for drawing object backgrounds and frames.

procedure DrawBackground;

procedure DrawFrame;

The BeginDraw method should be called before calling these two methods.

 

Let's look at how to create a component which will display an arrow.

让我们来看看如何创建一个组件,它将显示一个箭头。

type

TfrxArrowView = class(TfrxView)   //根据需求选择不同的基类

public

{ we should override only two methods }

procedure Draw(Canvas: TCanvas;ScaleX, ScaleY, OffsetX, OffsetY: Extended); override;  //重写Draw方法

class function GetDescription: String; override;

published

{ place required properties in 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 transform coordinates }  // 调用BeginDraw方法来转换坐标

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);     // frxObjects是函数,在frxDsgnIntf单元 TfrxObjectCollection

finalization

{ delete from list of available components }

frxObjects.Unregister(TfrxArrowView);

Bmp.Free;

end.

 

To create a component which displays data from a DB move the DataSet and DataField properties into the “published” section and then override the “GetData” method. Let's look at this by using the TfrxCheckBoxView standard component as an example.

创建一个从数据集显示数据的组件,移动DataSet和DataField属性到“published”部分,然后重写“GetData”方法。让我们用Tfrxcheckboxview标准组件为例看看。

The “TfrxCheckBoxView” component can be connected to a DB field using the “DataSet” and “DataField” properties, which are declared in the TfrxView base class. This component also has the “Expression” property which can hold an expression. As soon as the expression has been calculated the result is placed in the “Checked” property. The component displays a cross when “Checked” is “True.” Below are the most important parts of the component’s definition.

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;

转载于:https://www.cnblogs.com/moon25/p/5530460.html

你可能感兴趣的文章
CRM(2)
查看>>
JavaScript Number() Vs new Number()
查看>>
【最小生成树】畅通工程
查看>>
【最短路径】畅通工程续
查看>>
基于mpvue的小程序项目搭建的步骤一
查看>>
python之路-Pymysql
查看>>
中断处理中的save_all、restore_all和iret
查看>>
创建 overlay 网络 - 每天5分钟玩转 Docker 容器技术(50)
查看>>
一些简单的SQL Server服务器监控
查看>>
MongoDB的Windows安装
查看>>
什么是函数式编程(副作用、纯函数、引用透明)
查看>>
android系统提供的几种颜色Color
查看>>
【OpenCV学习笔记】三十、轮廓特征属性及应用(七)—位置关系及轮廓匹配
查看>>
selenide01---截图
查看>>
mysql 查询死锁语句
查看>>
pl_sql操作--激活提升权限scott用户
查看>>
UDP网络编程
查看>>
[Nuxt] Display Vuex Data Differently in Each Page of Nuxt and Vue.js
查看>>
[Ramda] Curry and Uncurry Functions with Ramda
查看>>
[TypeScript] Function Overloads in Typescript
查看>>