1. 程式人生 > 其它 >報表控制元件如何元件編輯器寫作

報表控制元件如何元件編輯器寫作

本文介紹了FastReport VCL元件編輯器寫作。預設情況下,任何通用控制元件編輯器(可以從元素上下文選單或通過雙擊呼叫)都會建立 OnClick 空白事件處理程式。

FastReport VCL是用於 Delphi、C++ Builder、RAD Studio 和 Lazarus 的報告和文件建立 VCL 庫。它提供了視覺化模板設計器,可以訪問 30 多種格式,並可以部署到雲、網站、電子郵件和列印中。

下載FastReport VCL v6.9最新版【慧都控制元件】

預設情況下,任何通用控制元件編輯器(可以從元素上下文選單或通過雙擊呼叫)都會建立 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