gpt4 book ai didi

delphi - 为什么此资源指令显示在可用表单列表中?

转载 作者:行者123 更新时间:2023-12-03 18:01:56 26 4
gpt4 key购买 nike

我刚刚偶然发现了一些非常奇特的东西。引用这个截图:

Project Options > Forms

为什么在可用表单列表中显示 $R *.res?本项目只有两种形式和一个附加单元,下面是项目的主要文件来源:

program MyProgram;

uses
Forms,
uMain in 'uMain.pas' {fMain},
uEmail in 'uEmail.pas' {frmEmail},
Vcl.Themes,
Vcl.Styles,
Other.Unit in 'Other.Unit.pas';

{$R *.res}

begin
Application.Initialize;
TStyleManager.TrySetStyle('Iceberg Classico');
Application.Title := 'My Program Title';
Application.CreateForm(TfMain, fMain);
Application.Run;
end.

PS - 这是稍微修改过的代码,唯一改变的是程序名称、程序标题和其中一个单元的名称 (Other.Unit.pas),我知道这是一个不好的例子,因为 Unit 是一个保留字。但是原始单元名称有一个 namespace 前缀,例如这个。

更新

我按照建议将此 RES 引用移至 uses 子句之前。在执行此操作(并清除所有临时文件、重新启动 IDE 等)之后,它仍然显示在列表中。但令我惊讶的是,IDE 实际上已经将这个 RES 引用添加回来了!

所以现在 IDE 本身已经把它变成了:

UpdateUnit in 'UpdateUnit.pas' {$R *.res};

(UpdateUnit 是我给它起的新名字,所以我不会泄露内部信息)

因此,我打开了 DPROJ 文件并搜索了 *.res,果然找到了这个:

<ItemGroup>
....
<DCCReference Include="UpdateUnit.pas">
<Form>$R *.res</Form>
</DCCReference>

最佳答案

如所写,我无法重现此...但是,如果我删除“Other.Unit in 'Other.unit.pas'”行之后的尾随分号(“;”),则“$R *.res "显示在项目选项中。

据我所知,这不是错误。由于您的评论表明提供的代码与您使用的代码不同,因此很难诊断。我会尝试解释发生了什么;如果您查看 uMain 和 uEmail 单元,每个单元旁边都有一个注释,即表单的名称。由于这些单元实际上可能并未在 IDE 中打开,因此无法知道是否存在与该单元关联的表单。 uMain.dfm 的存在并不能保证 uMain.pas 实际上有一个表单(它可能是遗留下来的垃圾)。 IDE 将这个简单的注释放在该单元的 uses 子句中,以便告诉项目经理该单元有一个表单。

通过删除“;”,解析器将下一个注释标记视为 {$R *.res}。然后得出结论,Other.Unit.pas 必须包含一个名为“$R *.res”的表格。它不会验证名称,甚至不会尝试打开设备。它仅采用该评论的原始内容并假定它是一个表单名称。

您可以安全地将 {$R *.res} 移到 uses 子句之前,这样项目解析器就不会将该指令注释混淆为一种形式。

编辑:来 self 上面的评论:

可能发生的事情是这样的;在某些时候,您可能以某种方式编辑 .dpr 文件,使解析器误以为“$R *.res”是表单名称。然后,您在该状态下保存它,同时将该信息注入(inject)到 .dproj 文件中。 IDE 试图使这两件事保持同步,有时会将 .dproj 文件作为“主文件”并更新 .dpr 文件以进行匹配。您应该能够安全地从 dproj 文件中删除 $R *.res。

关于delphi - 为什么此资源指令显示在可用表单列表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16693880/

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