我的项目中有一个 xyz.pas 文件引用。但那个文件不在我身边。我有那个 xyz.pas 文件的 xyz.dcu 和 xyz.obj 文件。当我尝试编译项目时,出现错误“xyz.dcu not found”。所以我在搜索路径中包含了 xyz.dcu 的路径。现在我收到错误“xyz.dfm not found”。
请建议我解决方案。是否可以仅使用 .dcu 和 .obj 文件编译项目?
提前致谢。问候, 纳伦
我希望你没有丢掉你的工作。
简化后,Delphi 的工作方式如下:
PAS+DFM => DCU
DCU+RES => EXE
有关 Delphi 文件的更多信息,请参见此答案的末尾。
如果您只有 DCU 文件,则可以编译项目。首先,从您的文件夹中删除 PAS 文件,否则 Delphi 将尝试重新编译它(为了重新编译它,它需要 DFM 文件)。
我认为 Obj 文件对您没有任何用处。
DFM 文件对您的项目非常重要,但并不重要。如果您非常需要,您仍然可以在没有它的情况下继续操作,因为它可以根据您在 PAS 文件中的信息和应用程序 GUI 的外观(如果您曾经看到它运行)手动重建。
这是诀窍(涉及一些工作):
只需创建一个新表单,然后查看原始 PAS 文件的顶部以获取表单声明。它可能看起来像这样:
TYPE
TYourForm = class(TForm)
xLabel: TLabel;
yButton: TButton;
etc
etc
end;
然后将所有这些控件放回您的新窗体中,并完全按照它们在 PAS 文件中的名称命名它们(xLabel、yButton 等)。将它们排列成类似于原始 GUI。完成后,将新创建的 PAS 文件替换为原始 PAS 文件。重要提示:DFM 和 PAS 文件的名称应该匹配。编译,你就完成了!重建的 GUI 可能看起来不像原来的 GUI,但它应该这样做。
提示:
有一些工具可以从 DCU/EXE 中提取 DFM 文件。
以下是其中一些: www.delphi2.software.informer.com/download-delphi-extract-dfm
这将对您有很大帮助!
.PAS - Delphi 源文件
PAS 应存储在源代码管理中
在 Delphi 中,PAS 文件始终是单元或表单的源代码。单元源文件包含应用程序中的大部分代码。该单元包含附加到表单事件或其包含的组件的任何事件处理程序的源代码。我们可以使用 Delphi 的代码编辑器编辑 .pas 文件。不要删除 .pas 文件。
.DCU - Delphi 编译单元
编译单元 (.pas) 文件。默认情况下,每个单元的编译版本存储在一个单独的二进制格式文件中,与单元文件同名,但扩展名为 .DCU(Delphi 编译单元)。例如 unit1.dcu 包含在 unit1.pas 文件中声明的代码和数据。重建项目时,不会重新编译各个单元,除非它们的源 (.PAS) 文件自上次编译后发生更改,或者找不到它们的 .DCU 文件。安全地删除 .dcu 文件,因为 Delphi 在您编译应用程序时会重新创建它。
.DFM - Delphi Form
DFM 应该存储在源代码管理中
这些文件总是与 .pas 文件配对。Dfm 文件包含表单中包含的对象的详细信息(属性)。通过右键单击表单并从弹出菜单中选择以文本形式查看,可以将其查看为文本。Delphi 将 .dfm 文件中的信息复制到完成的 .exe 代码文件中。更改此文件时应谨慎,因为对其进行更改可能会阻止 IDE 加载表单。表单文件可以以二进制或文本格式保存。环境选项对话框允许您指示要用于新创建的表单的格式。不要删除 .dfm 文件。
来源:delphi.about.com/od/beginners/a/aa032800a.htm
如果您仍然拥有可执行文件,那么您可以通过任意资源管理器从应用程序资源中提取完整的原始 DFM 文件。例如:XN 资源编辑器。在 RC DATA 类别中,将有一个名为 TXYZ 的项目。
Delphi 20xx/XE
请注意,Delphi 将文件的旧版本保存在项目目录的隐藏子目录中,名为__history
.
在该目录中保存了 .pas、.dfm 和其他项目文件的版本。
每次将更改保存到磁盘时都会创建这些文件。
在您的硬盘上搜索所有文件(包括隐藏文件),*.~*~
这应该会显示您可能拥有的所有备份源文件。
他们会错过您所做的最后一次更改,但至少您不必重新做所有事情。
Delphi 7 和之前
的 Delphi 7 将这些文件保存在与您的项目文件相同的目录中,并带有.~
扩展名。
DFM 文件包含(比如)表单的“视觉”方面(控件、组件、属性、视觉效果、数据......)。如果 PAS 文件(或编译后的 DCU 文件)需要 DFM,则必须拥有它,否则会出现此错误。我认为除了拥有 DFM 之外别无他法。
更正(如下所述,抱歉!):如果您删除 PAS 文件并仅提供 DCU 文件,则可以仅使用 DCU 文件进行编译。在这种情况下,DCU-File 必须使用相同的编译器版本编译才能链接到 App,因为编译器无法重新编译 DCU。
这已经很晚了,但这就是我带来的。
我的目录结构是这样的
/ Project
/ Source
/ Unit1.pas
/ Packages
/Delphi2010Berlin
/ MyPackage1.dpk
/ MyPackage2.dpk
/ Library
/ Delphi2010Berlin
/ Win32
/ Debug
/ Release
在 /Project 文件夹中,我创建了一个名为“dfmcopy.bat”的 .bat 文件
它所包含的只是
@echo off
for /r %1 %%x in (*.dfm) do @copy "%%x" %2 /Y >NUL
然后,在我的 .bpl 的后期构建活动中
./../../dfmcopy.bat $(PROJECTPATH)\..\..\Source $(PROJECTPATH)\..\..\Library\$(Platform)\$(Config)
这将递归地将 /Source 文件夹中包含的所有 .dfm 复制到 /Library/{DelphiVersion}/{Platform}/{Config} 文件夹中
需要注意的是,如果您有多个具有此构建后事件的项目,则可能会为每个项目一遍又一遍地复制 dfms。不知道现在会不会有什么问题。