彩票走势图

FastReport VCL报表控件开发者手册六:Property Editors

原创|其它|编辑:郝浩|2012-11-30 11:40:20.000|阅读 449 次

概述:当你在设计器中选择一个组件时,组件属性便显示在对象检查器中。你可以为属性创建你自己的编辑器。本文主要介绍如何编写属性编辑器。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

相关链接:

当你在设计器中选择一个组件时,组件属性便显示在对象检查器中。你可以为属性创建你自己的编辑器。例如,“Font”属性也拥有一个编辑器:如果此属性选择了“...”按钮,通过点击此按钮打开标准的 "font properties"对话框。

“TfrxPropertyEditor”是所有属性编辑器的基类,并在“frxDsgnIntf”中做了声明:

TfrxPropertyEditor = class(TObject)
protected
procedure GetStrProc(const s: String);
function GetFloatValue: Extended;
function GetOrdValue: Integer;
function GetStrValue: String;
function GetVarValue: Variant;
procedure SetFloatValue(Value: Extended);
procedure SetOrdValue(Value: Integer);
procedure SetStrValue(const Value: String);
procedure SetVarValue(Value: Variant);
public
constructor Create(Designer: TfrxCustomDesigner); virtual;
destructor Destroy; override;
function Edit: Boolean; virtual;
function GetAttributes: TfrxPropertyAttributes; virtual;
function GetExtraLBSize: Integer; virtual;
function GetValue: String; virtual;
procedure GetValues; virtual;
procedure SetValue(const Value: String); virtual;
procedure OnDrawLBItem(Control: TWinControl; Index: Integer;
ARect: TRect; State: TOwnerDrawState); virtual;
procedure OnDrawItem(Canvas: TCanvas; ARect: TRect); virtual;
property Component: TPersistent readonly;
property frComponent: TfrxComponent readonly;
property Designer: TfrxCustomDesigner readonly;
property ItemHeight: Integer;
property PropInfo: PPropInfo readonly;
property Value: String;
property Values: TStrings readonly;
end;

你还可以从以下类中继承,

TfrxIntegerProperty = class(TfrxPropertyEditor)
TfrxFloatProperty = class(TfrxPropertyEditor)
TfrxCharProperty = class(TfrxPropertyEditor)
TfrxStringProperty = class(TfrxPropertyEditor)
TfrxEnumProperty = class(TfrxPropertyEditor)
TfrxClassProperty = class(TfrxPropertyEditor)
TfrxComponentProperty = class(TfrxPropertyEditor)

多个属性被定义在TfrxPropertyEditor类中:

Component:链接到父组件
frComponent:链接到父组件,但方便在某些情况下,转换到TfrxComponent类型。
Designer:链接到报表设计器
ItemHeight:item高度
PropInfo:链接到PPropInfo结构,该结构包含了被编辑属性的所有信息
Value:显示为字符串的属性值
Values:值列表;如果定义了“paValueList” 属性,该属性就用“GetValue”方法来填补。

下列系统方法可用于获取或者设置所编辑的属性值。

function GetFloatValue: Extended;
function GetOrdValue: Integer;
function GetStrValue: String;
function GetVarValue: Variant;
procedure SetFloatValue(Value: Extended);
procedure SetOrdValue(Value: Integer);
procedure SetStrValue(const Value: String);
procedure SetVarValue(Value: Variant);

你应该选择使用适合属性类型的方法。如果属性是属于 “Integer” 类型,那么你就需要使用“GetOrdValue”和“SetOrdValue”方法。由于这些属性包含了32-bit对象的地址,因此,这些方法也可用于“TObject" 类型的属性,如MyFont := TFont(GetOrdValue)。

你可以从基类中继承并重写公共部分声明的一些方法,从而创建你自己的编辑器。“GetAttributes”是其中一个需要被重写的方法。通过以下方式定义其属性:

TfrxPropertyAttribute = (paValueList, paSortList, paDialog, paMultiSelect,
paSubProperties, paReadOnly, paOwnerDraw);
TfrxPropertyAttributes = set of TfrxPropertyAttribute

属性编辑器注册由frxDsgnIntf 文件中定义的程序执行:

procedure frxPropertyEditors.Register(PropertyType: PTypeInfo;
ComponentClass: TClass;
const PropertyName: String;
EditorClass:
TfrxPropertyEditorClass);

只有“PropertyType”参数需要进行指定。 “ComponentClass” 和/或 “PropertyName”参数可能为空。

让我们来看看三个属性编辑器的例子。FastReport VCL报表要求Editor code 存放在与component code所在文件夹同名的文件夹中,其后缀名为'Editor'。

{ TFont property editor displays editor button('...') }
{ inherit from ClassProperty }
type
TfrxFontProperty = class(TfrxClassProperty)
public
function Edit: Boolean; override;
function GetAttributes: TfrxPropertyAttributes; override;
end;
function TfrxFontProperty.GetAttributes: TfrxPropertyAttributes;
begin
{ property has nested properties and editor;
it cannot be edited manually }
Result := [paMultiSelect, paDialog, paSubProperties, paReadOnly];
end;
function TfrxFontProperty.Edit: Boolean;
var
FontDialog: TFontDialog;
begin
{ create standard dialogue }
FontDialog := TFontDialog.Create(Application);
try
{ take property value }
FontDialog.Font := TFont(GetOrdValue);
FontDialog.Options := FontDialog.Options + [fdForceFontExist];
{ display dialogue }
Result := FontDialog.Execute;
{ bind new value }
if Result then
SetOrdValue(Integer(FontDialog.Font));
finally
FontDialog.Free;
end;
end;
{ registration }
frxPropertyEditors.Register(TypeInfo(TFont), nil, '', TfrxFontProperty);
--------------------------------------------------
{ TFont.Name property editor displays a drop-down list
of available fonts;
inherit from StringProperty, as property is of string type }
type
TfrxFontNameProperty = class(TfrxStringProperty)
public
function GetAttributes: TfrxPropertyAttributes; override;
procedure GetValues; override;
end;
function TfrxFontNameProperty.GetAttributes: TfrxPropertyAttributes;
begin
Result := [paMultiSelect, paValueList];
end;
procedure TfrxFontNameProperty.GetValues;
begin
Values.Assign(Screen.Fonts);
end;

{ registration }
frxPropertyEditors.Register(TypeInfo(String), TFont,
'Name', TfrxFontNameProperty);

-----------------------------------------
{ TPen.Style property editor displays a picture,
which is an example of the selected style }
type
TfrxPenStyleProperty = class(TfrxEnumProperty)
public
function GetAttributes: TfrxPropertyAttributes; override;
function GetExtraLBSize: Integer; override;
procedure OnDrawLBItem(Control: TWinControl; Index: Integer;
ARect: TRect; State: TOwnerDrawState); override;
procedure OnDrawItem(Canvas: TCanvas; ARect: TRect); override;
end;
function TfrxPenStyleProperty.GetAttributes: TfrxPropertyAttributes;
begin
Result := [paMultiSelect, paValueList, paOwnerDraw];
end;
{ method draws thick horizontal line with selected style }
procedure HLine(Canvas: TCanvas; X, Y, DX: Integer);
var
i: Integer;
begin
with Canvas do
begin
Pen.Color := clBlack;
for i := 0 to 1 do
begin
MoveTo(X, Y - 1 + i);
LineTo(X + DX, Y - 1 + i);
end;
end;
end;
{ drawing drop-down list }
procedure TfrxPenStyleProperty.OnDrawLBItem
(Control: TWinControl; Index: Integer;
ARect: TRect; State: TOwnerDrawState);
begin
with TListBox(Control), TListBox(Control).Canvas do
begin
FillRect(ARect);
TextOut(ARect.Left + 40, ARect.Top + 1, TListBox(Control).Items
[Index]);
Pen.Color := clGray;
Brush.Color := clWhite;
Rectangle(ARect.Left + 2, ARect.Top + 2,
ARect.Left + 36, ARect.Bottom - 2);
Pen.Style := TPenStyle(Index);
HLine(TListBox(Control).Canvas, ARect.Left + 3,
ARect.Top + (ARect.Bottom - ARect.Top) div 2, 32);
Pen.Style := psSolid;
end;
end;
{ drawing property value }
procedure TfrxPenStyleProperty.OnDrawItem(Canvas: TCanvas; ARect: TRect);
begin
with Canvas do
begin
TextOut(ARect.Left + 38, ARect.Top, Value);
Pen.Color := clGray;
Brush.Color := clWhite;
Rectangle(ARect.Left, ARect.Top + 1,
ARect.Left + 34, ARect.Bottom - 4);
Pen.Color := clBlack;
Pen.Style := TPenStyle(GetOrdValue);
HLine(Canvas, ARect.Left + 1,
ARect.Top + (ARect.Bottom - ARect.Top) div 2 - 1, 32);
Pen.Style := psSolid;
end;
end;
{ return picture width }
function TfrxPenStyleProperty.GetExtraLBSize: Integer;
begin
Result := 36;
end;
{ registration }
frxPropertyEditors.Register(TypeInfo(TPenStyle), TPen,
'Style', TfrxPenStyleProperty);

标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:慧都控件网

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP