Как отладить или исправить модуль с открытыми потомками или ошибкой связанных модулей?

У меня была эта давняя проблема, что я не могу просматривать как текст основную форму для проекта, который я унаследовал. Даже если никакие другие формы не открыты.

Как я могу отладить причину этого сообщения об ошибке? Какие варианты у меня есть, чтобы исправить это?

Я нашел одно связанное сообщение группы новостей http://embarcadero.newsgroups.archived.at/public.delphi.ide/200906/0906193960.html, но это касается только причины наследования форм и ничего не объясняет о связанных модулях. Я не верю, что использую наследование форм.

У меня есть DM (модуль данных) для проекта, и форма загружает пару изображений из dm через свойства TTreeView в форме - означает ли, что модуль данных автоматически означает, что я никогда не смогу просматривать форму как текст в Delphi (кроме просмотра формы как текста в блокноте)? Кажется, не имеет значения, открыт или закрыт мой DM в IDE.

Я также нашел один вопрос SO с соответствующим заголовком (Модуль %s имеет открытые потомки или связанные модули. Невозможно перезагрузить), но сам вопрос и ответ на него не имеют особого значения.


person Jessica Brown    schedule 18.12.2014    source источник
comment
Не могли бы вы сделать минимальную репродукцию? Действительно, если бы вы это сделали, я предсказываю, что вы решили бы проблему самостоятельно. Когда вы сократите код и компоненты, вы обнаружите, что проблема исчезает. Таким образом, последнее, что вы убрали, — это ключ. Это важный навык отладки, которому необходимо научиться. Изолируйте проблему.   -  person David Heffernan    schedule 19.12.2014
comment
Попробую сделать минимальную копию. Но я все же хотел бы понять, что означает ошибка, потому что мне пока не удалось найти какую-либо официальную документацию об этой ошибке ;-)   -  person Jessica Brown    schedule 19.12.2014


Ответы (3)


Иногда это вызвано тем, что форма наследуется от другой формы в вашем проекте (или галерее) (в документации это называется наследованием визуальных форм, IIRC). IDE не знает, как найти базовый класс для формы; ему нужно, чтобы открылась перед потомком форма. Например, это может вызвать ту же ошибку, если модуль, содержащий TMyBaseForm, не открыт первым в среде IDE, особенно если базовый модуль (предок) не включен в проект первым:

unit SpecialForm;

interface

uses
  Forms, { all the other usual stuff }, BaseForm;

type
  TMySpecialForm = class(TMyBaseForm)
  private

  public

  end;

Вы можете сказать, так ли это, посмотрев на объявление класса вашей формы - если он происходит от чего-то другого, кроме TForm, это, вероятно, причина ошибки.

(Другой случай, когда это часто происходит при использовании модуля данных, поскольку базовый TDataModule .DFM недоступен. Попытка просмотреть модуль данных .DFM как текст будет каждый раз вызывать эту ошибку; решение состоит в том, чтобы закрыть проект и использовать внешний редактор, такой как Notepad или Notepad++, для редактирования .dfm для вашего модуля данных.)

person Ken White    schedule 19.12.2014
comment
Хм... Я смог убедиться, что моя форма напрямую расширяет TForm, между ними нет базового класса, а Forms определенно находится в предложении использования... так что я все еще склоняюсь к подозрению, что наследование не является причиной в моем кейс. Любые указатели на то, что связанные модули могут быть причиной этой ошибки? - person Jessica Brown; 19.12.2014
comment
Нет простите. Это единственная причина, по которой я когда-либо сталкивался с проблемой (именно поэтому я иногда писал, а не причину). Вам не хватает строки в файле проекта (Project->View Source) для рассматриваемого устройства? Это должно быть что-то вроде uses Forms, Unit4 in 'Unit4.pas' {Form4}; — обратите внимание на часть {} в конце. Это подарок для формы, с которой у вас проблемы? (Было бы настолько намного проще, если бы вы разместили какой-то код или соответствующие детали, которые мы могли бы видеть, вместо того, чтобы строить догадки о том, что у вас может быть, а может и нет.) - person Ken White; 19.12.2014
comment
Кроме того, если вы откроете рассматриваемый .dfm из Блокнота, что говорит первая строка в этом .dfm? Это должно быть object Form4: TForm4 (конечно, заменяя Form4 в обоих случаях именем вашей формы и классом). - person Ken White; 19.12.2014
comment
На самом деле проблема не в том, что база не может быть найдена. Скорее в IDE уже открыта база. И потомок открытый. Ошибка говорит вам, что вы не можете изменить базу, потому что потомок открыт. - person David Heffernan; 19.12.2014
comment
@ Дэвид: На самом деле нет. Среда IDE сбита с толку, потому что думает, что она у вас открыта, но на самом деле она не открыта. (Если бы это было так, вы могли бы найти его на вкладке редактора и закрыть, но не можете.) Как я уже сказал, я сталкивался с этим раньше (фактически, всего несколько минут назад с модулем данных, который явно не имеет предок загружен в IDE). - person Ken White; 19.12.2014
comment
Мой комментарий был основан на том, что вы сказали в своем ответе: Иногда это вызвано формой, которая наследуется от другой формы в вашем проекте (или галерее) (известная как Наследование визуальной формы в документации, IIRC). Среда IDE не знает, как найти базовый класс для формы. - person David Heffernan; 19.12.2014

Иногда у меня возникала эта проблема, возможно, когда я использовал фреймы, но мой последний экземпляр не включал ни фреймы, ни модули данных, ни унаследованные формы.

После огромной работы по созданию копии формы (с какой копией проблем не было) и переименованию исходного блока и самой формы (что изначально казалось решением проблемы) получилась живая привязка между формы.

В частности, в моем FMX-приложении форма A имеет страницу параметров с TSpinBox, которая позволяет пользователю установить минимальное значение для TTrackBar в форме B (эта форма меня огорчила). Таким образом, TSpinBox.Value был настроен на обновление поля TTrackBar.Min с помощью живой привязки. Закрытие формы A или удаление этой живой привязки (и замена ее обработчиком событий, чтобы сделать то же самое) решили проблему.

person Philip J. Rayment    schedule 15.10.2018

Я хотел бы обратиться к ответу Филиппа Дж. Рэймента и ADD о том, что вам не обязательно иметь живую привязку, чтобы возникла эта проблема. Достаточно иметь пользовательский элемент управления (класс), экземпляр которого у вас есть в другой форме. Затем может появиться проблема RLink32, которая не будет решена, пока вы не закроете форму, в которой находится экземпляр. Проблема, с которой я столкнулся, выдавала следующие сообщения: -RLink32 (during building) -Нарушение прав доступа в модуле designide160.bpl` (если я внес изменения в проблемную форму) -Модуль имеет открытые потомки или связанные модули» (если я пытался «Просмотреть как Форма')

person Igor Kostadinov    schedule 14.01.2020