请给我建议。是否可能只使用.dcu和.obj文件来编译项目?
谢谢您的帮助。 问候, Naren
我希望你没有丢失你的工作。
简单来说,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;
如果你仍然拥有可执行文件,那么你可以通过任意资源管理器从应用程序资源中提取完整的原始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文件必须使用相同的编译器版本进行编译以链接到应用程序中,因为编译器无法重新编译DCU。
/ Project
/ Source
/ Unit1.pas
/ Packages
/Delphi2010Berlin
/ MyPackage1.dpk
/ MyPackage2.dpk
/ Library
/ Delphi2010Berlin
/ Win32
/ Debug
/ Release
@echo off
for /r %1 %%x in (*.dfm) do @copy "%%x" %2 /Y >NUL
./../../dfmcopy.bat $(PROJECTPATH)\..\..\Source $(PROJECTPATH)\..\..\Library\$(Platform)\$(Config)
我使用Apache Ant来构建Delphi项目。
我通过删除所有的dcu文件并将编译器输出文件与源文件分离来修复了“dfm未找到错误”。
问题可能是由于dcus文件路径错误引起的。
<project name ="app1" default = "run">
<property name="delphipath" value="your delphi path"/>
<property name="source" value="C:/ws4d/TStateMachine-master/Tests"/>
<property name="dunit" value="C:/ws4d/dunit-svn"/>
<property name="DCUOUT" value="C:/ws4d/TStateMachine-master/Tests/BIN"/>
<target name="run">
<!-- Compile with Delphi 6 -->
<apply executable="${delphipath}/bin/dcc32.exe" failonerror="true" output="build-dxe10.log" >
<!-- rebuild quiet -->
<arg value="-B"/>
<arg value="-Q"/>
<!-- file paths -->
<arg value="-I${source};{dunit}/src"/>
<arg value="-U${source};{dunit}/src;{delphipath}/lib/win32/release"/>
<arg value="-R${source};{dunit}/src;{delphipath}/lib/win32/release"/>
<arg value="-O${DCUOUT};"/>
<arg value="-N${DCUOUT}"/>
<arg value="-E${DCUOUT}"/>
<!-- all *.dpr files in current directory -->
<fileset dir=".">
<patternset><include name="*.dpr"/></patternset>
</fileset>
</apply>
</target>
</project>