Delphi DFM не найден

#delphi #dfm

#delphi #dfm

Вопрос:

У меня есть одна ссылка на файл xyz.pas в моем проекте. Но этот файл не у меня. У меня есть файлы xyz.dcu и xyz.obj этого файла xyz.pas. Когда я попытался скомпилировать проект, я получил сообщение об ошибке «xyz.dcu не найден». Итак, я включил путь к xyz.dcu в путь поиска. Теперь я получаю сообщение об ошибке «xyz.dfm не найден».

Пожалуйста, предложите мне решение. Возможно ли скомпилировать проект только с файлами .dcu и .obj?

Заранее спасибо. С уважением, Нарен

Ответ №1:

Я надеюсь, вы не потеряли свою работу.

Упрощенно Delphi работает следующим образом:
PAS DFM => DCU
DCU RES => EXE
Подробнее о файлах Delphi в конце этого ответа.

Вы можете скомпилировать проект, если у вас есть только файл DCU. Сначала удалите файл PAS из вашей папки, иначе Delphi попытается перекомпилировать его (а для перекомпиляции ему нужен файл DFM).
Я не думаю, что Obj-файл будет вам как-то полезен.


Файл DFM очень, очень важен для вашего проекта, но все же не критично важен. Если вы сильно нуждаетесь, вы все равно можете обойтись без него, поскольку его можно восстановить вручную на основе информации, имеющейся у вас в файле PAS, и на основе того, как выглядит графический интерфейс приложения (если вы когда-либо видели его запущенным).

Вот хитрость (требует некоторой работы):

Просто создайте новую форму, а затем посмотрите в верхней части вашего исходного PAS-файла объявление формы. Это может выглядеть следующим образом:

 TYPE
  TYourForm = class(TForm)
     xLabel: TLabel;
     yButton: TButton;
     etc
     etc
  end;
  

Затем верните все эти элементы управления обратно в вашу новую форму и назовите их точно так, как они названы в файле PAS (xLabel, yButton и т.д.). Расположите их так, чтобы они напоминали оригинальный графический интерфейс. Когда закончите, замените новый созданный PAS-файл вашим исходным PAS-файлом. ВАЖНО: имена DFM-файла и PAS-файла должны совпадать. Скомпилируйте, и все готово! Восстановленный графический интерфейс может выглядеть не СОВСЕМ так, как оригинальный, но он должен это делать.

Подсказка:
Существуют инструменты, которые могут извлечь файл DFM из DCU / EXE.
Вот некоторые из них: www.delphi2.software.informer.com/download-delphi-extract-dfm
Это вам очень поможет!


.PAS — Исходный файл Delphi
PAS должен храниться в системе управления версиями
В Delphi файлы PAS всегда являются исходным кодом либо для модуля, либо для формы. Исходные файлы Unit содержат большую часть кода приложения. Модуль содержит исходный код для любых обработчиков событий, прикрепленных к событиям формы или компонентам, которые она содержит. Мы можем редактировать файлы .pas с помощью редактора кода Delphi. Не удаляйте файлы .pas .

.DCU — скомпилированный модуль Delphi
Файл скомпилированного модуля (.pas). По умолчанию скомпилированная версия каждого модуля хранится в отдельном файле двоичного формата с тем же именем, что и файл модуля, но с расширением .DCU (модуль, скомпилированный Delphi). Например, unit1.dcu содержит код и данные, объявленные в файле unit1.pas. При перестроении проекта отдельные модули не перекомпилируются, если только их исходные файлы (.PAS) не изменились с момента последней компиляции, или их .Не удается найти файлы DCU. Безопасное удаление .файл dcu, потому что Delphi воссоздает его при компиляции приложения.

.DFM — Delphi Form
DFM должен храниться в системе управления версиями
, эти файлы всегда сопряжены с файлами .pas. Файл Dfm содержит сведения (свойства) объектов, содержащихся в форме. Это можно просмотреть как текст, щелкнув правой кнопкой мыши по форме и выбрав «Просмотреть как текст» во всплывающем меню. Delphi копирует информацию из файлов .dfm в готовый файл .exe code. При изменении этого файла следует соблюдать осторожность, поскольку изменения в нем могут помешать IDE загружать форму. Файлы форм могут быть сохранены либо в двоичном, либо в текстовом формате. Диалоговое окно Параметров среды позволяет указать, какой формат вы хотите использовать для вновь созданных форм. Не удаляйте файлы .dfm.

источник: delphi.about.com/od/beginners/a/aa032800a.htm

Комментарии:

1. привет, большое спасибо за помощь. Вы дали мне некоторые надежды на создание проекта. Кто-то удалил файлы xyz.pas и xyz.dfm из моего проекта. И теперь у меня есть только копия xyz.dcu. Теперь, когда у меня нет xyz.pas, почему я получаю сообщение об ошибке «xyz.dfm не найден»? пожалуйста, предложите решение для компиляции проекта. Еще раз большое спасибо. — Naren

2. You can compile the project if you only have the DCU file. Это правильно, только если вы используете точно ту же версию Delphi, с помощью которой был создан исходный файл .dcu (обратите внимание на точный ). В противном случае у вас должен быть файл .pas для перекомпиляции для другой версии Delphi.

3. DFM не содержатся в DCU. DFM — это, по сути, специальный файл *.RES. Если у вас нет файла DFM, вы не сможете использовать DCU для компиляции.

Ответ №2:

Если у вас все еще есть исполняемый файл, то вы можете извлечь свой полный и оригинальный файл DFM из ресурсов приложения любым произвольным менеджером ресурсов. Например: Редактор ресурсов XN. В категории RC-ДАННЫХ будет элемент с именем TXYZ.

Комментарии:

1. привет, спасибо. Я просто хочу успешно скомпилировать проект. Возможно ли скомпилировать только с файлами dcu? — Naren

2. Я только что пробовал, но не сработало. Возможно, это работает только тогда, когда dfm хранится в двоичном формате. Но: у вас есть (старый) исполняемый файл?

3. плохо, к счастью, у меня также нет старого exe-файла. 🙁

Ответ №3:

Delphi 20xx/XE
Обратите внимание, что Delphi сохраняет старые версии ваших файлов в скрытом поддиректоре каталога вашего проекта под названием __history .

В этом каталоге сохранены версии ваших .pas, .dfm и других файлов проекта.
Эти файлы создаются каждый раз, когда вы сохраняете изменения на диске.

Выполните поиск на вашем жестком диске по всем файлам (включая скрытые) с именами *.~*~ это должно привести ко всем имеющимся у вас резервным исходным файлам.
Они пропустят последние внесенные вами изменения, но, по крайней мере, вам не придется делать все заново.

Delphi 7 и более ранние версии
Delphi 7 сохраняет эти файлы в том же каталоге, что и файлы вашего проекта, с .~ расширением.

Ответ №4:

DFM-файлы содержат «визуальные» аспекты (элементы управления, компоненты, свойства, визуальные элементы, данные …) (скажем) формы. Если PAS-файлу (или скомпилированному DCU-файлу) требуется DFM, он должен быть у вас, иначе вы получите эту ошибку. Я думаю, что нет другого способа, кроме как использовать DFM.

Исправление (как написано ниже, извините!): вы можете скомпилировать только с DCU-файлом, если удалите PAS-файл и предоставите ТОЛЬКО DCU-файл. В этом случае DCU-файл должен быть скомпилирован с той же версией компилятора, чтобы быть связанным с приложением, поскольку компилятор не может перекомпилировать DCU.

Ответ №5:

Это довольно поздно, но вот с чем я пришел.

Структура моего каталога выглядит следующим образом

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

В папке /Project я создал файл .bat с именем ‘dfmcopy.bat’

Все, что он содержит, это

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

Затем, в моем событии post build для моего .бпл

 ./../../dfmcopy.bat $(PROJECTPATH)....Source $(PROJECTPATH)....Library$(Platform)$(Config)
  

Это приведет к рекурсивному копированию всех .dfm, содержащихся в папке /Source, в папку /Library/{DelphiVersion}/{Platform}/{Config}

Одно предостережение заключается в том, что если у вас есть несколько проектов, в которых есть это событие post build, dfms могут копироваться снова и снова для каждого проекта. Не знаю, может ли это представлять какую-либо проблему сейчас.

Ответ №6:

Я использую apache ant для сборки проекта delphi.

Я исправляю ошибку «dfm не найден», удаляя все файлы dcu и отделяя выходные файлы компилятора от исходных файлов.

Вероятно, проблема вызвана неправильным путем к файлам 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>