转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
Delphi的组件读写机制(三)         ★★★★

Delphi的组件读写机制(三)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1692 更新时间:2009/4/23 18:37:52

 

Ø        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]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台