gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:38:16 24 4
gpt4 key购买 nike

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

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

这真是一件痛苦的事。有没有一种简单的方法可以按照表单/单元的触发顺序生成列表?

更新:2019-08-01(有用的 map 链接)

这里有两个链接可能有助于理解 DELPHI map 文件

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

  2. Understanding Delphi MAP File

最佳答案

您确实不需要费尽心思修改源单元。我想你会发现使用下面的方法会发现行为不当的单元比以某种方式生成单位列表然后耕耘要快得多你的方式来解决它。

如果您查看 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通过值(value)观计数(如果文件仍然存在,则继续当前运行,或者重置应用程序并将通过计数减半)以确定到底是哪个单元导致文件被删除。因为您可以使用二分搜索来执行此操作,所以它将快速收敛于正在删除文件的单元。当然,你可以追踪到单位断点时的初始化代码(如果已使用调试信息编译)在 TProc(P)() 上按 F7 跳闸;

关于delphi - Delphi 中按加载顺序生成表单/单元列表的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57246493/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com