代码之家  ›  专栏  ›  技术社区  ›  Michael Riley - AKA Gunny

在Delphi中,按加载顺序生成表单/单元列表的最佳方法是什么?

  •  0
  • Michael Riley - AKA Gunny  · 技术社区  · 7 年前

    我遇到了一个问题,一个文件在启动时一直在删除,我无法找到负责的代码。我把Vcl.Dialogs添加到所有单元,并创建一个初始化部分,如下所示:

    initialization
    begin
      ShowMessage('Inside [Unit Name Here]');
    end;
    

    这真是太痛苦了。是否有一种简单的方法可以按照表单/单元的触发顺序生成它们的列表?

    更新日期:2019-08-01 ( 有用的地图链接 )

    以下两个链接可能有助于理解DELPHI地图文件

    1. http://docwiki.embarcadero.com/RADStudio/Rio/en/API_%28%2A.map%29

    2. Understanding Delphi MAP File

    0 回复  |  直到 7 年前
        1
  •  7
  •   Uwe Raabe    7 年前

    可以检查地图文件的“线段”部分。带有C=ICODE的条目是那些按执行顺序带有初始化部分的单元。

        2
  •  8
  •   MartynA    7 年前

    你真的不需要去所有的麻烦修改你的源单位。我想你会发现用下面的方法会发现 比生成一个单位列表然后开垦要快得多 你的方式。

    如果您查看System.Pas,您会发现这样的过程InitUnits(来自D7)。

    procedure InitUnits;
    var
      Count, I: Integer;
      Table: PUnitEntryTable;
      P: Pointer;
    begin
      if InitContext.InitTable = nil then
        exit;
      Count := InitContext.InitTable^.UnitCount;
      I := 0;
      Table := InitContext.InitTable^.UnitInfo;
      [...]
      try
        while I < Count do
        begin
          P := Table^[I].Init;
          Inc(I);
          InitContext.InitCount := I;
          if Assigned(P) then
          begin
            TProc(P)();
          end;
        end;
      except
        FinalizeUnits;
        raise;
      end;
    end;
    

    这是导致调用每个单元的初始化代码的代码。它通过单元工作并调用初始化部分(如果有的话) 每个单元通过呼叫

      TProc(P)();
    

    你可以在循环之前检查Count的值;如果它向上,不要惊讶 即使是一个相对简单的项目也有几百个。

    在TProc(P)行上放置一个断点,右键单击并将PassCount设置为 价值的一半。运行你的应用程序,当断点跳闸时,检查 文件已被删除。

    你可以做一个 binary search 通过价值观 计数(如果文件仍然存在,则继续当前运行,或重置应用程序 并将通过次数减半)以确定哪个单元导致文件被删除。 因为可以使用二进制搜索来执行此操作,所以它将在 正在删除文件的单元。当然,你可以追踪到 当断点 按TProc(P)上的F7键跳闸;