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

Я работаю над проектом в Delphi 7, где хотел, чтобы формы наследовали компоненты из других форм. Я смог получить эту работу, но столкнулся со следующими проблемами (и я собираюсь опубликовать решения, которые, надеюсь, помогут другим в будущем):

  • В файле .pas формы я бы изменил форму наследования из какой-либо другой формы, но она не получит компоненты из формы предка.
  • Для определенных форм потомков я получаю следующее сообщение об ошибке при открытии формы во время разработки: "Ошибка создания формы: предок для" TAncestorForm "не найден". Я должен сначала вручную открыть форму предка, а затем я мог бы открыть форму потомка.

Ответы

Ответ 1

Во-первых, для тех, кто не знает, как наследовать форму визуально, вы создаете форму предка как обычно. Затем перейдите в меню "Файл" > "Создать" > "Другое". Выберите вкладку с именем текущего проекта и выберите форму, на которую вы хотите наследовать. Если вы хотите наследовать от формы, которая не является частью текущего проекта, откройте эту форму, щелкните ее правой кнопкой мыши и выберите "Добавить в репозиторий". Затем вы сможете перейти в "Файл" > "Создать" > "Другое" и выбрать эту форму на соответствующей вкладке.

Учитывая это, я столкнулся с проблемами, потому что некоторые из форм потомков уже были созданы, поэтому я не мог выполнить описанный выше процесс. Кроме того, я внес некоторые изменения в формы из стандартного кода, созданного Delphi. Я смог разрешить все проблемы с наследованием визуальной формы, используя следующие рекомендации:

  • ..pas файл формы потомка должен наследовать класс формы из правильного класса предка, например:
    type TMyForm = class(TAncestorForm)
  • Первая строка в .dfm формы потомка должна иметь слово inherited вместо object, например:
    inherited MyForm: TMyForm
  • EDIT: после двойной проверки, НЕ требуется:..pas файл формы предка должен иметь стандартную глобальную переменную, которую создает Delphi, например:
    var AncestorForm: TAncestorForm;
  • Раздел uses файла .dpr проекта должен иметь такую ​​же глобальную переменную, что и комментарий после имени файла устройства, например:
    unAncestor in 'unAncestor.pas' {AncestorForm}

Примечание/Советы:

  • И форма предка, и форма потомка могут быть неавтоматически созданы, если хотите (Set in Project > Options > Forms > Auto-create forms).
  • Чтобы вернуть свойство в форме потомка к значению формы предка, щелкните правой кнопкой мыши на свойстве в инспекторе объектов и выберите "Вернуть в унаследованное".
  • Чтобы вернуть все значения свойств компонента в значения предка, щелкните правой кнопкой мыши компонент и выберите "Вернуть в унаследованное".

Ответ 2

DPR кажется немного сложнее. В моем случае я создал предка, полученного из TFrame. Затем я получил несколько кадров из TAncestorFrame. Мое предложение DPR использует следующее:

uses
  Forms,
  ancestorFrame in 'ancestorFrame.pas' {AncestorFrame : TFrame},
  frame1Unit in 'frame1Unit.pas' {frame1:TFrame},
  frame2Unit in 'frame2Unit .pas' {frame2:TFrame},

Файл DPROJ должен выглядеть так:

<DCCReference include="frame1Unit.pas">
  <Form>frame1</Form>
  <DesignClass>TFrame</DesignClass>
</DCCReference>

Производные фреймы должны выглядеть так:

TFrame1 = class(TAncestorFrame)

И файлы Deried Frames.DFM должны сказать:

inherited Frame1:TFrame1