FastReport VCL是用于 Delphi、C++ Builder、RAD Studio 和 Lazarus 的报告和文档创建 VCL 库。它提供了可视化模板设计器,可以访问 30 多种格式,并可以部署到云、网站、电子邮件和打印中。
默认情况下,任何通用控件编辑器(可以从元素上下文菜单或通过双击调用)都会创建 OnClick 空白事件处理程序。这种行为可以通过编写自定义编辑器来代替。此外,编辑器允许将您自己的项目添加到组件上下文菜单中。
所有编辑器的基本类在 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;
如果您的编辑器没有在上下文菜单中创建自己的项目,您将需要覆盖两个方法,即Edit和HasEditor。第一个方法执行必要的操作(例如,显示对话框)并返回“True”,如果组件状态被修改。HasEditor如果你的组件有编辑器,方法应该返回“True”。如果它返回“False”或者您没有覆盖此方法,则不会调用编辑器。如果您的组件没有编辑器并且您希望将项目添加到组件上下文菜单中,这将是必要的。
如果编辑器将项目添加到上下文菜单中,则应覆盖GetMenuItems(在此方法中,您可以借助调用AddItem函数创建菜单)和Execute(调用此方法,当您在组件菜单中选择一项时;响应所选菜单项应该在这里描述)方法。
编辑器注册通过“frxDsgnIntf”文件中描述的过程执行:
frxComponentEditors.Register(ComponentClass: TfrxComponentClass; ComponentEditor: TfrxComponentEditorClass);
第一个参数是类名,要为其创建编辑器。第二个参数是编辑器类名。
让我们来看看我们的共同控制简单的编辑器,它会显示一个窗口,我们的元素名称并添加“已启用”和“可见”项目元素上下文菜单(选择项目时,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.
如果您对 FastReport 感兴趣,欢迎加入 FastReport QQ 交流群:702295239