Как мне использовать или решить проблемы с визуальным наследованием форм в Delphi? - PullRequest
12 голосов
/ 10 октября 2008

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

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

Ответы [ 2 ]

27 голосов
/ 10 октября 2008

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

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

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

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

  • Разрешается, чтобы как форма-предок, так и форма-потомок могли создаваться неавтоматически (Установите в Project> Options> Forms> Auto-create формы).
  • Чтобы вернуть свойство в форме-потомке к значению формы-предка, щелкните правой кнопкой мыши свойство в Инспекторе объектов и выберите «Вернуть в унаследованное».
  • Чтобы вернуть все значения свойств компонента к значениям предка, щелкните компонент правой кнопкой мыши и выберите «Вернуть в наследство».
1 голос
/ 23 октября 2009

ДНР кажется немного хитрее этого. В моем случае я создал предка, полученного из 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)

И файлы производных фреймов .DFM должны содержать:

inherited Frame1:TFrame1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...