Writing Component Editors  编写组件的编辑器

 

All common control editors (opened from a control's context menu or by double-clicking) create blank OnClick event handlers by default. This behavior can be altered by writing a custom editor. Also, the custom editor can add extra items to the component's context menu.

The base class for all editors is “TfrxComponentEditor”, declared in the frxDsgnIntf file:

所有的控件编辑(从一个控件的右键菜单或双击打开)默认创建空白的onclick事件处理程序。这种行为可以通过编写自定义编辑器来改变。另外,自定义编辑器可以添加额外的项目到组件的右键菜单中。所有编辑器基类是“TfrxComponentEditor”,在frxDsgnIntf 文件中声明:

 

TfrxComponentEditor = class(TObject)

protected

function AddItem(Caption: String; Tag: Integer;Checked: Boolean = False): TMenuItem;

public

function Edit: Boolean; virtual;

function HasEditor: Boolean; virtual;

function Execute(Tag: Integer; Checked: Boolean): Boolean; virtual;

procedure GetMenuItems; virtual;

property Component: TfrxComponent readonly;

property Designer: TfrxCustomDesigner readonly;

end;

 

If your editor does not create its own items in the contextual menu you will need to override two methods, “Edit” and “HasEditor.” The first method performs essential actions (for example, displays the dialogue box) and returns “True” if the component's content was modified. The “HasEditor” method should return “True” if your component has an editor. If it either returns “False” or the method is not overridden the editor will not be opened. It should return “False” if your component does not have an editor and you wish to add items to the component's context menu.

如果你的编辑器不创建项目右键菜单,你需要重写方法“Edit”和“HasEditor”。第一个方法执行必要的行动(例如,显示对话框并返回“True”,如果组件的内容被修改)。如果你的组件有一个编辑器,“HasEditor”方法应该返回“True”否则返回“假”或方法不重写编辑器将不被打开。

如果你的组件没有编辑器并且你希望将项目添加到组件的右键菜单中,则应该返回“False”。

 

If the editor adds items to the context menu you should override “GetMenuItems” (where you can create a menu using the AddItem function) and “Execute” (where you can create the actions initiated by selecting the items in the component menu).

如果编辑器添加项目到上下文菜单应该重写”GetMenuItems”(在那里你可以创建一个菜单使用AddItem函数)和“Execute”(在那里你可以创建actions 在构件菜单选择启动)。

 

Editor registration is performed using the procedure defined in the “frxDsgnIntf” file:

frxComponentEditors.Register(ComponentClass: TfrxComponentClass;ComponentEditor: TfrxComponentEditorClass);

The first parameter is the class name of the component for which the editor is being created. The second parameter is the class name of the editor.

编辑器的注册使用frxDsgnIntf单元的以下过程:

第一个参数是编辑器对应组件的类名,第二个参数是编辑器的类名。

Let's look at a simple editor for our common control, which will display a window with our element name and also add "Enabled" and "Visible" items to control's context menu (which change the “Enabled” and “Visible” properties). FastReport requires that the Editor code is placed in a file having the same name as the file having the component’s code, with 'Editor' added as suffix (frxBitBtnEditor.pas in our case).

让我们看一个简单的控件的编辑器,将用我们的元素名称显示一个窗口,还添加“Enabled”和“Visible”的项目,以控制的上下文菜单(改变了“Enabled”和“Visible”属性)。FastReport要求编辑器文件跟组件文件放置在一起,并用“Editor”作为后缀(frxbitbtneditor.pas在这个例子中)。

 

uses frxClass, frxDsgnIntf, frxBitBtn;

type

TfrxBitBtnEditor = class(TfrxComponentEditor)

public

//重写的方法

function Edit: Boolean; override;

function HasEditor: Boolean; override;

function Execute(Tag: Integer; Checked: Boolean): Boolean; override;

procedure GetMenuItems; override;

end;

function TfrxBitBtnEditor.Edit: Boolean;

var

c: TfrxBitBtnControl;

begin

Result := False;

{ Component property is edited component; in this case, it is TfrxBitBtnControl }

c := TfrxBitBtnControl(Component);

ShowMessage('This is ' + c.Name);

end;

function TfrxBitBtnEditor.HasEditor: Boolean;

begin

Result := True;

end;

function TfrxBitBtnEditor.Execute(Tag: Integer; Checked: Boolean): Boolean;

var

c: TfrxBitBtnControl;

begin

Result := True;

c := TfrxBitBtnControl(Component);

if Tag = 1 then

c.Enabled := Checked

else if Tag = 2 then

c.Visible := Checked;

end;

procedure TfrxBitBtnEditor.GetMenuItems;

var

c: TfrxBitBtnControl;

begin

c := TfrxBitBtnControl(Component);

{ AddItem method parameters: menu item name, its tag and Checked/Unchecked condition }

AddItem('Enabled', 1, c.Enabled);

AddItem('Visible', 2, c.Visible);

end;

initialization

frxComponentEditors.Register(TfrxBitBtnControl, TfrxBitBtnEditor);

end.

 

可以参考 frxRichEditor.pas 等单元。

[翻译]Writing Component Editors 编写组件的编辑器的更多相关文章

  1. [翻译] Writing Property Editors 编写属性编辑器

    Writing Property Editors 编写属性编辑器   When you select a component in the designer its properties are di ...

  2. [翻译]Writing Custom Wizards 编写自定义的向导

    Writing Custom Wizards  编写自定义的向导   You can extend FastReport's functionality with the help of custom ...

  3. [翻译]Writing Custom DB Engines 编写定制的DB引擎

    Writing Custom DB Engines  编写定制的DB引擎   FastReport can build reports not only with data sourced from ...

  4. [翻译]Writing Custom Report Components 编写自定义报表组件

    摘要:简单介绍了如何编写一个FastReport的组件,并且注册到FastReport中使用.   Writing Custom Report Components 编写自定义报表组件 FastRep ...

  5. 为Node.js编写组件的几种方式

    本文主要备忘为Node.js编写组件的三种实现:纯js实现.v8 API实现(同步&异步).借助swig框架实现. 关键字:Node.js.C++.v8.swig.异步.回调. 简介 首先介绍 ...

  6. [翻译]Writing Custom Common Controls 编写自定义控件

    摘要:介绍如何编写自定义的控件,用在报表的窗体上(如Edit,Button等)   Writing Custom Common Controls 编写自定义控件 FastReport contains ...

  7. [翻译] FastReport Class Hierarchy (FastReport 组件类层次结构)

    "TfrxComponent" is the base class for all FastReport components. Objects of this type have ...

  8. react 编写组件 五

    看以下示例了解如何定义一个组件 // 定义一个组件LikeButton var LikeButton = React.createClass({ // 给state定义初始值 getInitialSt ...

  9. Gradle 1.12 翻译——第十三章 编写构建脚本

    有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com ...

随机推荐

  1. ASI和TS流有什么区别

    TS流是信源码流,最高码率为44.209 Mbit/s,它是经过信源编码后的压缩码流,为了使欲传输的信源信息在传输速率一定的条件下更快更多地传输,还要把数据进行压缩,也就是通过信源编码去掉信息中多余的 ...

  2. 慕课网 -- 性能优化之PHP优化总结笔记

    视频链接,感兴趣的可以去看看,对我来说耳目一新. http://www.imooc.com/learn/205 什么情况下遇到PHP性能问题 1 :PHP语法使用不恰当 2 :使用了PHP语言他不擅长 ...

  3. pytest框架 里 fixture 参数化的方法

  4. MySql 日期函数比较

    查询当天数据 select * from tab where FROM_UNIXTIME(fabutime, '%Y%m%d') = 20121217;   mysql TO_DAYS(date) 函 ...

  5. oracle link的创建过程

    下面做一个测试,在测试中,创建数据库链接的库为XJ(WINDOWS 2003 ORACLE 10g 10.2.0.1),被链接的库为DMDB(LINUX AS5 ORACLE 10g 10.2.0.1 ...

  6. ubantu的下载和在虚拟机VM中的安装

    一.下载Ubuntu镜像文件 下载地址:http://www.ubuntu.com 打开上面的连接,我们来到如下页面,点击download: 下一步,到如下页面,点击Ubuntu Desktop: 然 ...

  7. 九、创建Slave节点

    通常情况下,我们的项目会由多个模块或者系统组成,不同模块可能会分别部署在不同的服务器,比如mod1部署在ser1,mod2部署在ser2上: 之前的文档是描述了将jenkins也部署在ser1上,当m ...

  8. xml 注释中不允许出现字符串“--“(再也不要来坑爹了,好么,XML)

    转自:https://blog.csdn.net/randomnet/article/details/18708575?utm_source=blogxgwz3 关于xml文件时出现中文注释出错的一个 ...

  9. 光圈、曝光、ISO

    光圈大小对景深的影响: 光圈大小示意图(值越小光圈越大) 光圈.曝光.ISO对图像效果影响

  10. LUA 运行期间不独占线程的递归,通过回调实现

    function main(d) local function func(d) moveto(d, function() print("d=======", d) d = d - ...