找不到Delphi DFM

时间:2011-06-01 11:07:09

标签: delphi dfm

我的项目中有一个xyz.pas文件引用。但那个档案不适合我。我有该xyz.pas文件的xyz.dcu和xyz.obj文件。 当我尝试编译项目时,我得到错误“找不到xyz.dcu”。所以我在搜索路径中包含了xyz.dcu的路径。现在我收到错误“xyz.dfm not found”。

请建议我的解决方案。是否可以仅使用.dcu和.obj文件编译项目?

提前致谢。 问候, 那仁

5 个答案:

答案 0 :(得分:5)

我希望你没有失去工作。

简化,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 - 德尔福编译单位
已编译的单元(.pas)文件。默认情况下,每个单元的编译版本存储在一个单独的二进制格式文件中,该文件与单元文件同名,但扩展名为.DCU(Delphi编译单元)。例如,unit1.dcu包含unit1.pas文件中声明的代码和数据。重建项目时,除非自上次编译后源(.PAS)文件发生更改,否则不会重新编译单个单元,或者找不到它们的.DCU文件。安全删除.dcu文件,因为Delphi在编译应用程序时会重新创建它。

.DFM - 德尔福表格
DFM应存储在源控制中 这些文件始终与.pas文件配对。 Dfm文件包含表单中包含的对象的详细信息(属性)。通过右键单击表单并从弹出菜单中选择视图作为文本,可以将其视为文本。 Delphi将.dfm文件中的信息复制到完成的.exe代码文件中。在更改此文件时应谨慎使用,因为对它的更改可能会阻止IDE加载表单。表单文件可以二进制或文本格式保存。 “环境选项”对话框允许您指定要用于新创建的表单的格式。不要删除.dfm文件。

来源:delphi.about.com/od/beginners/a/aa032800a.htm

答案 1 :(得分:3)

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

答案 2 :(得分:2)

德尔福20xx / XE
请注意,Delphi将旧版本的文件保存在名为__history的项目目录的隐藏子目录中。

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

在您的硬盘上搜索名为*.~*~的所有文件(包括隐藏的文件),这应该会显示您可能拥有的任何备份源文件。
他们会错过你做的最后一次改变,但至少你不需要再做一切。

Delphi 7及之前
Delphi 7将这些文件保存在与.~扩展名为{1}}的项目文件相同的目录中。

答案 3 :(得分:1)

DFM-Files保存(说)形式的“视觉”方面(控件,组件,属性,视觉效果,数据......)。如果PAS文件(或编译的DCU文件)需要DFM,则必须拥有它,否则会出现此错误。我想,除了拥有DFM之外别无他法。

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

答案 4 :(得分:0)

现在已经很晚了,但这就是我的意思。

我的目录结构就像这样

/ Project
  / Source
    / Unit1.pas
  / Packages
    /Delphi2010Berlin
      / MyPackage1.dpk
      / MyPackage2.dpk
  / Library
    / Delphi2010Berlin
      / Win32
        / Debug
        / Release

在/ Project文件夹中,我创建了一个名为&#39; dfmcopy.bat&#39;

的.bat文件

它包含的全部是

@echo off
for /r %1 %%x in (*.dfm) do @copy "%%x" %2 /Y >NUL

然后,在我的.bpl

的post build事件中
./../../dfmcopy.bat $(PROJECTPATH)\..\..\Source $(PROJECTPATH)\..\..\Library\$(Platform)\$(Config)

这将以递归方式将/ Source文件夹中包含的所有.dfm复制到/ Library / {DelphiVersion} / {Platform} / {Config}文件夹

有一点需要注意的是,如果您有多个具有此post build事件的项目,则可能会为每个项目反复复制dfms。不知道现在是否会造成任何问题。