打印本文 打印本文 关闭窗口 关闭窗口
Delphi的组件读写机制(三)
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2343  更新时间:2009/4/23 18:37:52  文章录入:mintao  责任编辑:mintao

 

Ø        TReader

       先来看Delphi的工程文件,会发现类似这样的几行代码:

begin

  Application.Initialize;

  Application.CreateForm(TForm1, Form1);

  Application.Run;

end.

       这是Delphi程序的入口。简单的说一下这几行代码的意义:Application.Initialize对开始运行的应用程序进行一些必要的初始化工作,Application.CreateForm(TForm1, Form1)创建必要的窗体,Application.Run程序开始运行,进入消息循环。

       现在我们最关心的是创建窗体这一句。窗体以及窗体上的组件是怎么创建出来的呢?在前面已经提到过:窗体中的所有组件包括窗体自身的属性都包含在DFM文件中,而Delphi在编译程序的时候,利用编译指令{$R *.dfm}已经把DFM文件信息编译到可执行文件中。因此,可以断定创建窗体的时候需要去读取DFM信息,用什么去读呢,当然是TReader了!

       通过对程序的一步步的跟踪,可以发现程序在创建窗体的过程中调用了TReader的ReadRootComponent方法。该方法的作用是读出根组件及其所拥有的全部组件。来看一下该方法的实现:

 

function TReader.ReadRootComponent(Root: TComponent): TComponent;

……

begin

  ReadSignature;

  Result := nil;

  GlobalNameSpace.BeginWrite;  // Loading from stream adds to name space

  try

    try

      ReadPrefix(Flags, I);

      if Root = nil then

      begin

        Result := TComponentClass(FindClass(ReadStr)).Create(nil);

        Result.Name := ReadStr;

      end else

      begin

        Result := Root;

        ReadStr; { Ignore class name }

        if csDesigning in Result.ComponentState then

          ReadStr else

        begin

          Include(Result.FComponentState, csLoading);

          Include(Result.FComponentState, csReading);

          Result.Name := FindUniqueName(ReadStr);

        end;

      end;

      FRoot := Result;

      FFinder := TClassFinder.Create(TPersistentClass(Result.ClassType), True);

      try

        FLookupRoot := Result;

        G := GlobalLoaded;

        if G <> nil then

          FLoaded := G else

          FLoaded := TList.Create;

        try

          if FLoaded.IndexOf(FRoot) < 0 then

            FLoaded.Add(FRoot);

          FOwner := FRoot;

          Include(FRoot.FComponentState, csLoading);

          Include(FRoot.FComponentState, csReading);

          FRoot.ReadState(Self);

          Exclude(FRoot.FComponentState, csReading);

          if G = nil then

            for I := 0 to FLoaded.Count - 1 do TComponent(FLoaded[I]).Loaded;

        finally

          if G = nil then FLoaded.Free;

          FLoaded := nil;

        end;

      finally

        FFinder.Free;

      end;

     ……

  finally

[1] [2] [3] [4]  下一页

打印本文 打印本文 关闭窗口 关闭窗口