没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|其它|编辑:郝浩|2012-11-30 11:40:20.000|阅读 494 次
概述:当你在设计器中选择一个组件时,组件属性便显示在对象检查器中。你可以为属性创建你自己的编辑器。本文主要介绍如何编写属性编辑器。
# 界面/图表报表/文档/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@ke049m.cn
文章转载自:慧都控件网



接DevExpress原厂商通知,将于近日上调旗下产品授权价格,现在下单客户可享受优惠报价!
面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@ke049m.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
半岛外围网上直营