Проблема наследования визуальных форм."не может наследовать от (родительская форма). Содержит компонент, который не поддерживает наследование" - PullRequest
3 голосов
/ 28 января 2011

У меня есть базовая форма с потомками.Базовая форма содержит TElRelDataSource (из ElPack v4.00).Когда я открываю дочернюю форму, я получаю сообщение об ошибке «не могу наследовать от (родительская форма). Содержит компонент, который не поддерживает наследование».Это происходит с открытыми формами предков (их две), чтобы избежать ошибки «предок для (родительская форма) не найден».

Delphi 7 не поддерживает (AFAIK) финализирующие классы, но, похоже, этобыть стандартным сообщением об ошибке.Он включен в указатель «Tomes of Delphi: поиск и устранение неисправностей», но у меня нет его копии, и я не хочу тратить $ 60, чтобы прочитать запись типа «вот почему вы должны избегать VFI» (будучи пессимистичным в отношениисодержание книги).Кроме этого, в Google или Bing нет ссылок.

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

Итак, как мне обойти это сообщение об ошибке?

Ответы [ 2 ]

5 голосов
/ 28 января 2011

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

В исходном коде не было TElRelDataSource

Это означает, что вы пытаетесь добавить это сами. Не добавляйте его, найдите другое решение, которое не зависит от TElRelDataSource.

Оригинальный код имел его!

Оригинал, вероятно, был скомпилирован с другой версией TElRelDataSource, которая допускала наследование. «Inherability» управляется стилем компонента «csInheritable». То есть, если компонент не включает «csInheritable» в ComponentStyle, Delphi IDE не разрешит визуальное наследование. У вас есть несколько вариантов:

  • Используйте другую версию TElRelDataSource, возможно, оригинал был скомпилирован с НОВОЙ версией TElRelDataSource. Если вы используете последнюю версию TElRelDataSource, автор, вероятно, решил, что код не может обрабатывать визуальное наследование, поэтому он / она удалил флаг csInheritable из ComponentStyle!
  • Попробуйте создать свой собственный производный компонент и установить этот стиль самостоятельно. Это легко сделать, но если автор TElRelDataSource по какой-то причине убрал флаг csInheritable, у вас, вероятно, возникнут проблемы.
  • Обычно идея HeartWare будет работать нормально; К сожалению, с компонентом DATA SOURCE это не так просто: я предполагаю, что у вас есть элементы управления DB-Aware, связанные с этим источником данных. Если вы создаете DataSource из кода, вам также потребуется заново создать соединения с элементами управления, учитывающими данные, и для этого потребуется много «if-s» (или умного использования RTTI).
  • Вы можете попробовать переместить источник данных в модуль TDataModule. Это, вероятно, больше проблем, чем оно того стоит.
3 голосов
/ 28 января 2011

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

...