zoukankan      html  css  js  c++  java
  • Application对象与单元的Initialize

    下面是一个典型的应用程序的Delphi工程文件,我们注意到一开始就有一个对Application对象的Initialize方法的引用,我们的分析也就从这里开始:

    program Project1;

    uses
      Forms,
      Unit1 in 'Unit1.pas' {Form1};

    {$R *.res}

    begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.

    隐藏的窗口是由Application对象创建的,那么Application对象又从何而来呢?在Delphi的代码编辑窗口中按住Ctrl点击Application就会发现,Application对象是在Forms.pas单元中定义的几个全局对象之一。这还不够,我们想要知道的是Application对象是在什么地方创建的,因为必须成功创建了TApplication类的实例我们才能引用它。
    想一下,有什么代码会在Application.Initialize之前执行呢?对了,是initialization代码段中的代码。认真调试过VCL源码就可以知道,VCL中很多单元都有initialization代码段,启动Delphi程序时,先是按照uses的顺序执行每个单元中initialization代码段的代码,完成所有的初始化动作之后才执行Application的Initialize方法以初始化Application,所以很显然,Application对象是在某个单元的initialization代码段中创建的。
    以"TApplication.Create"为关键字在VCL源码目录中搜索一番,我们果然在Controls.pas单元中找到了创建Application对象的代码。在Controls.pas单元的initialization代码段,有一句对InitControls过程的调用,而InitControls的实现则如下所示:

    Unit Controls;

    initialization
        ...
        InitControls;

    procedure InitControls;
    begin
    ...
      Mouse := TMouse.Create;
      Screen := TScreen.Create(nil);
      Application := TApplication.Create(nil);
    ...
    end;

    好,到这里我们的分析就完成了第一步,因为要解决非正常窗口的问题,我们必须要在Application对象初始化之前做一件事,因此了解应用程序的初始化过程就非常重要了。


  • 相关阅读:
    opensuse的一些软件使用
    love2d新闻
    好用的在线工具收集
    POJ2531 Network Saboteur 枚举||随机化
    Acdream Path 动态规划
    Acdream Xor 简单数学
    POJ2676 Sudoku 搜索
    Acdream 1015 Double Kings 搜索
    Acdream Multiplication 基础题
    Acdream Cut 贪心
  • 原文地址:https://www.cnblogs.com/ZhouXiHong/p/656807.html
Copyright © 2011-2022 走看看