组件编辑器


  • 要设计一个全新的组件编辑器,那么这个组件编辑器必须继承于TDesignWindow,这个类在DesignWindows单元,因此还需要引入DesignWindows单元。
    通过源代码我们可以看到TDesignWindow编辑器继承与TForm,并实现了IUnkown,IDesignWindow,IDesignNotification,IEditHandler,IActivatable诸多接口。同时接口方法都设置成了虚方法,让我们可以根据自己的需要继承。以下是他的声明部分:
    unit DesignWindows;
     
    interface
     
    uses Messages, SysUtils, Classes, Controls, Forms, DesignIntf,
      ComponentDesigner;
     
    type
      TDesignWindow = class(TForm, IUnknown, IDesignWindow, IDesignNotification,
        IEditHandler, IActivatable)
      private
        FSelection: IDesignerSelections;
        FOwner: TComponent;
        FDesigner: IDesigner;
        FComponentDesigner: IComponentDesigner;
        FActive: Boolean;
        procedure ComponentRead(Component: TComponent);
        procedure ReaderSetName(Reader: TReader; Component: TComponent;
          var Name: string);
        procedure WMActivate(var Msg: TWMActivate); message WM_ACTIVATE;
      protected
        procedure Activated; dynamic;
        procedure ActivateInspector(Ch: Char);
        function ClipboardComponents: Boolean;
        procedure CopyComponents(Root: TComponent;
          const Components: IDesignerSelections);
        procedure PasteComponents(AOwner, AParent: TComponent;
          const Components: IDesignerSelections);
        procedure SetSelection(const Components: IDesignerSelections);
        function UniqueName(Component: TComponent): string; virtual;
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
     
        // IEditHandler
        function GetEditState: TEditState; virtual;
        function EditAction(Action: TEditAction): Boolean; virtual;
     
        // IDesignNotification
        procedure ItemDeleted(const ADesigner: IDesigner; Item: TPersistent); virtual;
        procedure ItemInserted(const ADesigner: IDesigner; Item: TPersistent); virtual;
        procedure SelectionChanged(const ADesigner: IDesigner; const ASelection: IDesignerSelections); virtual;
        procedure DesignerOpened(const Designer: IDesigner; AResurrecting: Boolean); virtual;
        procedure DesignerClosed(const Designer: IDesigner; AGoingDormant: Boolean); virtual;
        procedure ItemsModified(const Designer: IDesigner); virtual;
     
        // IDesignWindowActions
        procedure WindowHide; virtual;
        procedure WindowShow; virtual;
     
        property Active: Boolean read FActive;
        property Designer: IDesigner read FDesigner write FDesigner;
        property ComponentDesigner: IComponentDesigner read FComponentDesigner;
      end;
    我们设计组件所能用到的,delphi都为为我们做好了。
    A. Object Inspector变化的响应
    我的项目中需要编写一个组件编辑器,需求是当Object Inspector发生变化的时候,组件编辑器的某些内容也要得到更新。因此我们只需overrideItemsModified方法就OK了。
    procedure ItemsModified(const Designer: IDesigner); override;
    B.编辑指定Component
    Designer.SelectComponent(TseCustomBar(Node.Data));
    Designer是一个接口,可能为空,需要进行判断或赋值。
    C.抽象错误
    如果删除了某些组件,就要设置Designer.SelectComponent(nil),否则就会报告一个抽象错误。
     
    你设计组件想要的就都在里面了。
    在Delphi中有许多典型的例子可以供我们参考。
    C:/Program Files/Borland/Delphi7/Source/Property Editors/ DSDesign.pas
    C:/Program Files/Borland/Delphi7/Demos/ToolsAPI等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值