Delphi error creating form ancestor for not found

Ошибка при наследование фрейма: Error creating form: Ancestor for '.' not found Delphi, RAD XE3+ Решение и ответ на вопрос 2889112

fossean

2 / 2 / 0

Регистрация: 05.03.2021

Сообщений: 82

1

RAD XE3+

25.10.2021, 13:28. Показов 1043. Ответов 11

Метки нет (Все метки)


Здравствуйте!
Имеется модуль BaseForms, в котором описан класс, наследуемый от TFrame:

Delphi
1
2
3
TMyFrame = class(TFrame)
...
end;

Далее создаю фрейм отдельно: File -> New -> VCL Frame и наследуюсь от TMyFrame:

Delphi
1
2
3
TCustomFrame = class(TMyFrame)
...
end;

Далее в dfm файле ‘CustomFrame’ меняю object на inherited:

Delphi
1
2
inherited CustomFrame: TCustomFrame
end

При закрытии и открытие фрейма выходит ошибка: Error creating form: Ancestor for ‘…’ not found
Чтобы решить эту ошибку создаю dfm файл ‘MyFrame.dfm’ для TMyFrame:

Delphi
1
2
object MyFrame: TMyFrame
end

Подключаю dfm файл к модулю:

Delphi
1
{$R MyFrame.dfm}

Но выходит все та же ошибка. Что я делаю не так?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Житель Земли

2994 / 2987 / 391

Регистрация: 26.07.2011

Сообщений: 11,456

Записей в блоге: 1

25.10.2021, 15:33

2

Цитата
Сообщение от fossean
Посмотреть сообщение

Далее в dfm файле ‘CustomFrame’ меняю object на inherited:

Бред. С какого перепугу ты что-то меняешь в DFM-файле?



1



2 / 2 / 0

Регистрация: 05.03.2021

Сообщений: 82

26.10.2021, 12:38

 [ТС]

3

DenNik, в таком случае, если оставить object, выходит следующая ошибка при открытии фрейма на визуальное редактирование:

Error reading CustomFrame.TabOrder: Property TabOrder does not exist.

То есть ide воспринимает фрейм как форму.
Я, так понимаю, что создавать базовый фрейм в «чистом» модуле не получится, нужно будет создавать через ide File -> New -> Frame и затем наследоваться File -> New -> Other -> MyFrame.



0



Verevkin

Нарушитель

8388 / 4391 / 1009

Регистрация: 12.03.2015

Сообщений: 20,566

26.10.2021, 12:42

4

Цитата
Сообщение от DenNik
Посмотреть сообщение

Бред. С какого перепугу ты что-то меняешь в DFM-файле?

Видимо, так работает визуальное наследование.
Я так тоже делаю. Вот такой коммент я сам себе оставил в модуле фрейма-родителя:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
{ Общий предок фреймов проекта.
  ВНИМАНИЕ! При наследовании от TCommonFrame в DFM-файле нужно РУКАМИ
            заменить object на inherited, иначе будут проблемы при открытии
            фреймов-наследников и форм, на которых они расположены, в дизайнере,
            не смотря на то, что компиляция проходит без ошибок. Я пол-дня
            сношался с этим косяком, пока не прочухал, откуда ноги растут.
            Будьте осторожны.
 
            Verevkin, 29 июл 2020  }
unit ufrCommonFrame;
 
{$R *.dfm}
 
interface
 
{$REGION 'uses'}
uses
  //=========================== Модули проекта общие ===========================
  //======================= Модули проекта специфические =======================
  //==================== Модули проекта с формами и фреймами ===================
  //=============================== Левые модули ===============================
  //=================== Системные модули, добавленные вручную ==================
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs;
{$ENDREGION}
 
{$REGION 'TCommonFrame = class(TFrame) - общий предок фреймов приложения'}
type
  TCommonFrame = class(TFrame)
  private
    // поля-флаги
    FModified: Boolean;
 
    // поле события
    LOnChange: TNotifyEvent;
  protected
    // обработчики внутренние
    procedure ControlChange(Sender: TObject); virtual; abstract;
 
    // диспетчеризация
    procedure DoChange; dynamic;
 
    // методы внутренние
    procedure Modify(const ACondition: Boolean); dynamic;
  public
    //  методы общие
    procedure ResetToDefaults; dynamic; abstract; // сброс в умолчания
  public
    // свойства общие
    property Modified: Boolean read FModified write FModified;
  published
    // события
    property OnChange: TNotifyEvent read LOnChange write LOnChange;
  end;
{$ENDREGION}
 
implementation
 
{$REGION 'TCommonFrame'}
{ TCommonFrame }
 
procedure TCommonFrame.DoChange;
begin
  FModified:= true;
  if Assigned(LOnChange)
    then LOnChange(Self);
end;
 
procedure TCommonFrame.Modify(const ACondition: Boolean);
begin
  FModified:= FModified or ACondition;
end;
 
{$ENDREGION}
 
end.

Вложения

Тип файла: zip src_frames.zip (8.9 Кб, 6 просмотров)



0



Модератор

8254 / 5477 / 2248

Регистрация: 21.01.2014

Сообщений: 23,578

Записей в блоге: 3

26.10.2021, 12:44

5

Цитата
Сообщение от fossean
Посмотреть сообщение

и затем наследоваться

читаю-читаю и никак не пойму: зачем, для каких целей Вы чего-то там наследуете?
Создали в дизайнере свой фрейм — получили готовый класс со своими свойствами и методами. Теперь в нужном месте просто создаете экземпляр этого класса и все…



0



Нарушитель

8388 / 4391 / 1009

Регистрация: 12.03.2015

Сообщений: 20,566

26.10.2021, 12:49

6

Цитата
Сообщение от D1973
Посмотреть сообщение

читаю-читаю и никак не пойму: зачем, для каких целей Вы чего-то там наследуете?

я прицепил там куски исходников, загляни



0



2 / 2 / 0

Регистрация: 05.03.2021

Сообщений: 82

26.10.2021, 13:00

 [ТС]

7

Цитата
Сообщение от D1973
Посмотреть сообщение

читаю-читаю и никак не пойму: зачем, для каких целей Вы чего-то там наследуете?

Чтобы избавиться от дублирования полей и методов



0



5442 / 4266 / 1375

Регистрация: 14.04.2014

Сообщений: 19,204

Записей в блоге: 19

26.10.2021, 14:25

8

судя по тексту, все верно, но если у вас ошибка, то о чем-то вы умолчали
выложите файлы, да и посмотрим
это быстрее



0



fossean

2 / 2 / 0

Регистрация: 05.03.2021

Сообщений: 82

28.10.2021, 08:48

 [ТС]

9

Всем спасибо за помощь, нашел решение моей проблемы. Изначально моя цель была создать модуль с описанием классов, наследуемых от TFrame, без dfm файла. Но так как если наследоваться в модуле с визуальным фреймом, он начинает думать что эта форма и выводит ошибку c TabOrder`ом. Чтобы всё заработало, нужно переназначить класс TFrame:

Delphi
1
2
3
4
5
TFrame = class(TMyFrame);
 
TCustomFrame = class(TMyFrame)
...
end;

Тогда визуальная форма открывается нормально, без каких-либо ошибок.

Добавлено через 8 минут
Немного поторпился, вот правильный вариант:

Delphi
1
2
3
4
5
TFrame = class(TMyFrame);
 
TCustomFrame = class(TFrame)
...
end;



0



krapotkin

28.10.2021, 10:25

Не по теме:

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



0



2 / 2 / 0

Регистрация: 05.03.2021

Сообщений: 82

28.10.2021, 11:36

 [ТС]

11

Цитата
Сообщение от krapotkin
Посмотреть сообщение

Не по теме:
обычно такие хакерские решения потом отличаются большими проблемами в поддержке
никто не понимает, почему это вчера было а сегодня нет
и становится важным все вплоть до порядка модулей в uses

Не по теме:

А какие проблемы ещё могут быть кроме порядка модулей? В HeidiSQL используется этот хак.



0



krapotkin

29.10.2021, 11:16


    RAD XE3+ Ошибка при наследование фрейма: Error creating form: Ancestor for ‘.’ not found

Не по теме:

недавно целая дискуссия была, сейчас вряд ли найду уже
вроде mORMot сто лет использовали какой-то хак, а в новой делфи что-то поменялось, и это все накрылось тазом, и они встали перед необходимостью тупо переписать ВСЕ. потому что архитектура же…
а так — конечно ради бога. но если есть метод сделать «по красоте» или ловко извернуться, то лучше всегда по красоте))



0



Error creating form: Ancestor for ‘<ParentForm>’ not found

(OP)

5 Nov 09 03:10

Hi all,

First off, I use Delphi 6 upd pack 2 on WinXP.

I’ve been programming in Delphi for over a decade now. Up until recently, I used to include everything the project needed in the project source. One day I decided to make my own library(ies) for obvious reasons.

I started by making a TfrmMDIAppMain = class(TForm), a common ancestor for all my MDI apps’ mainforms. I added its location at the Library Path in Tools->Env.Options->Library.

As a second step, I created a test project with TfrmMDIAppDescMain = class(TfrmMDIAppMain) as its main form. The project compiled ok, even though TfrmMDIAppMain’s unit was not included in the project. But the next time I opened the project and doubleclicked on TfrmMDIAppDescMain, I got «Error creating form: Ancestor for ‘TfrmMDIAppDescMain’ not found». The source file is opened but the form cannot be displayed.

Now, if I open TfrmMDIAppMain in the editor (which by the way works by right-clicking it in the editor and selecting Find Declaration) and reopen its descendant, everything is fine and the form displays correctly.

After adding the parent’s path to every possible (environment and project) path I came to the conclusion that, in order for the error not to appear, one has to either add the parent form in the project or have the parent form opened before the descendant.

Is there any way to solve this? I mean, what’s the use of a library path / project search path if the IDE can’t utilize it?

Thanx

 
Юрий Зотов ©
 
(2010-04-27 10:48)
[0]

Загружаю в IDE чужой проект. Билдится, запускается. Но при попытке поднять любую форму для визуального просмотра IDE выдает ошибку: «Error creating form: Ancestor for «TForm» not found». В других проектах все нормально.

Такая ошибка возникает (и гугль это подтвердил), если в проекте есть визуальное наследование форм и при попытке открыть форму-потомка форма-предок не открыта. Но тут-то IDE говорит о классе TForm, у которого вовсе нет никаих ресурсов. Поэтому и непонятно, в чем дело.

Может, кто-то уже с таким безобразием сталкивался?


 
jack128_
 
(2010-04-27 10:58)
[1]

а если создать новую форму в этом проблемном проэкте — все нормально??  

если в проэкте какая нить форма без визуального наследования и вложенных фреймов? Проверь её и выложи dfm»ку, а то так с ходу и не скажешь. ну и вообще проверь, нету где нить левой копии Forms.pas на винте


 
sniknik ©
 
(2010-04-27 11:44)
[2]

приблизительно было.
в dfm сбилось (каким образом хз.)  указание что форма наследуемая. стала как обычная. компилятор не пострадал, все inherited действовали как положено, компилировалось/работало правильно, но ide при открытии этой формы временами валился в ексепт (а также если форма просто присутствовала среди открытых, переходить и смотреть на нее для ошибки было необязательно, но так реже).


 
sniknik ©
 
(2010-04-27 11:46)
[3]

> Но тут-то IDE говорит о классе TForm
TForm = class(Forms.TForm);


 
_Гость_
 
(2010-04-27 13:47)
[4]

надо проверить, что написано в dfm первым
object или inherited
должно быть  object
IDE иногда ошибочно пишет туда inherited, и начинается зоопарк


 
Anatoly Podgoretsky ©
 
(2010-04-27 19:02)
[5]

> Юрий Зотов  (27.04.2010 10:48:00)  [0]

Вообще то он не совсем о TForm говорит, а о том, что не найден наследник от него.


 
Игорь Шевченко ©
 
(2010-04-27 20:17)
[6]


> IDE иногда ошибочно пишет туда inherited, и начинается зоопарк

IDE ошибочно не пишет и чудес на свете не бывает


 
Германн ©
 
(2010-04-28 02:52)
[7]


> IDE ошибочно не пишет

Это точно.
Но IDE пишет «туда» всегда «тупо». И читает при компиляции тоже всегда по шаблону. Возможно это и правильно. Возможно нет.
Не всегда «шаблонная» реализация хороша.


 
Юрий Зотов ©
 
(2010-04-28 09:57)
[8]

В общем, так. Может, кому пригодится.

Визуального наследования и вложенных фреймов в проекте нет. Левых Forms.pas на диске тоже нет. Класс TForm нигде не переопределен. Это все сразу было проверено, иначе и писать сюда не стал бы.

Потом подумал, что надо проверить dfm. Сконвертил все dfm в текст (были бинарными) и проверил — везде object.

Вроде, все нормально. А глюк живет.

Удалил из проекта все формы и сохранил его. Потом перезагрузил IDE и те же формы добавил снова.

Глюк исчез. Значит, это действительно был глюк.

PS
Предок, Толя, предок. Что и странно.


 
Anatoly Podgoretsky ©
 
(2010-04-28 11:23)
[9]

> Юрий Зотов  (28.04.2010 09:57:08)  [8]

Мне тоже странно, ни разу не видал такого сообщения. А глюк возможно связан с путями, лечился повторным добавлением форм.


Понравилась статья? Поделить с друзьями:

Читайте также:

  • Deep sea electronics ошибки
  • Deep rock galactic сессия закончена ошибка
  • Deep rock galactic ошибка при запуске
  • Deep rock galactic как изменить имя на пиратке
  • Deep rock galactic the error cube

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии