从ComponentEditor设计原理看Delphi中的类注册机制
//在对象的世界中,最主要的问题就是如何组织好、管理好成千上万个对象!集中注册是一中有效的手段。就如同是我们显示生活中每人需要注册一个身份证号一般。看看Borland是如何组织对象的吧
{ RegisterComponentEditor }
--下面这个类型是存放在全局持有变量中的结构,主要是保持了
--Component和ComponentEditor之间的关系
type
PComponentClassRec = ^TComponentClassRec;
TComponentClassRec = record
Group: Integer;
ComponentClass: TComponentClass;
EditorClass: TComponentEditorClass;
end;
--这是全局的持有变量
var
ComponentClassList: TList = nil;
--系统注册过程
procedure RegisterComponentEditor(ComponentClass: TComponentClass;
ComponentEditor: TComponentEditorClass);
var
P: PComponentClassRec;
begin
if ComponentClassList = nil then
ComponentClassList := TList.Create;
New(P);
P.Group := CurrentGroup;
P.ComponentClass := ComponentClass;
P.EditorClass := ComponentEditor;
ComponentClassList.Insert(0, P);
end;
{ GetComponentEditor }
--得到Component对应的ComponentEditor
function GetComponentEditor(Component: TComponent;
const Designer: IDesigner): IComponentEditor;
var
P: PComponentClassRec;
I: Integer;
ComponentClass: TComponentClass;
EditorClass: TComponentEditorClass;
begin
ComponentClass := TComponentClass(TPersistent);
EditorClass := TDefaultEditor;
if ComponentClassList <> nil then
for I := 0 to ComponentClassList.Count-1 do
begin
P := ComponentClassList[I];
if (Component is P^.ComponentClass) and
(P^.ComponentClass <> ComponentClass) and
(P^.ComponentClass.InheritsFrom(ComponentClass)) then
begin
EditorClass := P^.EditorClass;
ComponentClass := P^.ComponentClass;
end;
end;
Result := EditorClass.Create(Component, Designer) as IComponentEditor;
end;