Delphi DFM未找到。

6
我在项目中引用了一个名为xyz.pas的文件,但是我没有这个文件。我只有该文件的xyz.dcu和xyz.obj文件。 当我尝试编译项目时,出现了“找不到xyz.dcu”的错误。所以我将xyz.dcu的路径包含在搜索路径中。现在我又遇到了“找不到xyz.dfm”的错误。
请给我建议。是否可能只使用.dcu和.obj文件来编译项目?
谢谢您的帮助。 问候, Naren
6个回答

7

我希望你没有丢失你的工作。

简单来说,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窗体 DFM应存储在源代码控制中。 这些文件始终与.pas文件配对。dfm文件包含窗体中包含的对象的详细信息(属性)。可以通过右键单击窗体并从弹出菜单中选择“以文本形式查看”来将其视为文本。Delphi将信息复制到.dfm文件中,并将其复制到完成的.exe代码文件中。更改此文件时应谨慎,因为更改可能会防止IDE能够加载该表单。表单文件可以保存为二进制或文本格式。环境选项对话框允许您指定要为新创建的表单使用哪种格式。不要删除.dfm文件。
来源:delphi.about.com/od/beginners/a/aa032800a.htm

嗨,非常感谢您的帮助。您给了我一些建立项目的希望。有人从我的项目中删除了xyz.pas和xyz.dfm文件。现在我只有xyz.dcu的副本。既然没有xyz.pas,为什么会出现“找不到xyz.dfm”的错误?请建议解决方案以编译该项目。再次感谢您。 --- Naren - naren
2
如果您使用与原始 .dcu 文件创建时完全相同的 Delphi 版本,则只有 DCU 文件就可以编译该项目(请注意强调“完全相同的”)。否则,您必须拥有 .pas 文件才能重新编译针对不同版本的 Delphi。 - Ken White
5
DFM并不包含在DCU文件中。DFM本质上是特殊的*.RES文件。如果没有DFM文件,就无法使用DCU进行编译。 - Ken Bourassa
@naren - 如果这个回答对你有帮助,你可以将其标记为已采纳。 - Gabriel

3

如果你仍然拥有可执行文件,那么你可以通过任意资源管理器从应用程序资源中提取完整的原始DFM文件。例如:XN资源编辑器。在RC DATA类别中,将会有一个名为TXYZ的项目。


嗨,谢谢。我只想成功编译项目。是否可能仅使用dcu文件进行编译?--- Naren - naren
我刚试了一下,但没成功。也许只有在二进制存储dfm时才有效。但是:你有(旧的)可执行文件吗? - NGLN
很不幸,我也没有旧的exe文件。:( - naren

2

Delphi 20xx/XE
请注意,Delphi会在项目目录的隐藏子目录__history中保存您文件的旧版本。

在该目录中,保存了您的.pas、.dfm和其他项目文件的版本。
每次将更改保存到磁盘时,都会创建这些文件。

在硬盘上搜索所有文件(包括隐藏文件),名称为*.~*~,这应该可以找到您可能拥有的任何备份源文件。
它们将缺少您所做的最后更改,但至少您不必重新开始全部工作。

Delphi 7及之前版本
Delphi 7将这些文件保存在与您的项目文件相同的目录中,并带有.~扩展名。


1

DFM文件包含了一个表单的“视觉”方面(控件、组件、属性、图形、数据等)。如果PAS文件(或已编译的DCU文件)需要DFM,则必须拥有该文件,否则将会出现错误。我认为没有其他方法,只能拥有DFM。

更正(如下所述,抱歉!):如果删除PAS文件并仅提供DCU文件,则可以使用仅DCU文件进行编译。在这种情况下,DCU文件必须使用相同的编译器版本进行编译以链接到应用程序中,因为编译器无法重新编译DCU。


1
这可能有些晚了,但这是我想到的方案。
我的目录结构如下:
/ 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的构建后事件中。保留HTML标记,不做解释。
./../../dfmcopy.bat $(PROJECTPATH)\..\..\Source $(PROJECTPATH)\..\..\Library\$(Platform)\$(Config)

这将递归复制 /Source 文件夹中包含的所有 .dfm 文件到 /Library/{DelphiVersion}/{Platform}/{Config} 文件夹中。
需要注意的是,如果有多个项目具有此后期构建事件,则每个项目都可能会重复复制 dfms。不确定现在是否会出现任何问题。

-1

我使用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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接