Wu50Feng

许多年以后,希望能看到自己留下的脚印

 

从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;

posted on 2005-12-16 13:31  Dany  阅读(443)  评论(0编辑  收藏  举报

导航