-
要设计一个全新的组件编辑器,那么这个组件编辑器必须继承于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等等。
组件编辑器
最新推荐文章于 2022-01-19 09:10:23 发布