У меня есть форма, которая должна была быть рамкой. Я пытался преобразовать его в рамку, но, что бы я ни делал, он, кажется, сохраняет свою форму. Я сравнил DFM и PAS формы с фреймом и заменил все использования, изменил унаследованный класс, просмотрел DFM.
Я не понимаю, что заставляет это быть формой. Что заставляет форму быть формой? Я хочу преобразовать его в рамку?
Я не хочу создавать новый фрейм и копировать/вставлять все в него. Наверняка должен быть способ просто преобразовать форму во фрейм? или рамку сформировать?
Имейте в виду, что у потомков TFrame
нет нескольких событий, таких как, например. OnCreate
, OnDestroy
, OnActivate
и OnShow
!
Чтобы преобразовать форму VCL во фрейм, вам необходимо внести следующие изменения:
Измените предка с TForm
на TFrame
в файле .pas
, например:
type
TForm2 = class(TForm)
изменить на
type
TForm2 = class(TFrame)
В части uses
файла .dpr
вашего проекта добавьте : TFrame
рядом с именем кадра, например:
Unit2 in 'Unit2.pas' {Form2},
изменить на
Unit2 in 'Unit2.pas' {Form2: TFrame},
Закройте и снова откройте Form2
. IDE жалуется на свойства, которые невозможно применить к фрейму - нажимаем кнопку "Игнорировать".
Вот и все.
ПРИМЕЧАНИЕ. Возможно, вы захотите изменить имя класса преобразованного фрейма, если имя класса вводит в заблуждение, но я считаю, что это выходит за рамки вашего исходного вопроса.
ПРИМЕЧАНИЕ. Я проверил этот ответ на Delphi XE2.
Было бы намного лучше, если бы вы не называли все TForm2
@DavidHeffernan, я намеренно оставил имя класса TForm2 — это имя формы по умолчанию, и любой, кто использует Delphi, узнает его. Если бы я изменил его на что-то вроде TFormThatShouldBeFrame
, мне пришлось бы опубликовать больше кода, чтобы все было единообразным (например, объяснять, откуда взялся FormThatShouldBeFrame в {FormThatShouldBeFrame: TFrame}
). Мне не хотелось заканчивать объяснение структуры проекта форм Delphi VCL.
TForm1 имел бы смысл, как и TMyForm, или TFrame1, или TMyFrame, в качестве общих имен. Но 2 это просто странно. Мне это кажется неряшливым.
Я протестировал процедуру преобразования формы в рамку на Form2
, поэтому представляю результаты, которые можно сохранить. Form1
будет означать, что я конвертирую основную форму заявки во фрейм. Я просто не хочу сталкиваться с последствиями этого в своем ответе. я
Никто не вызывает форму TForm1, это всего лишь заполнитель, который затем заменяется описательным именем.
@DavidHeffernan Если вы хотите преобразовать фрейм в форму, скорее всего, у вас уже есть основная форма, и в этом случае конвертируемая форма вполне может быть Form2, а не Form1. И хотя я понятия не имею, оставляет ли их кто-нибудь еще как TForm1, я знаю, что нет, но такие имена часто можно увидеть в примерах.
Привет, @DavidHeffernan, я Никто (иногда)
@HeartWare не используется в реальных программах, которые разрабатывались в течение значительного периода времени.
@DavidHeffernan, не все программы являются «реальными программами, которые разрабатывались в течение значительного периода времени», и мы не знаем, является ли это одной из них. Некоторые из них являются коммерческими программами, другие — программами для любителей, предназначенными только для программистов, некоторые предназначены для проверки идей, а третьи — для школьных упражнений. Но мне интересно, вы переименовываете все элементы управления или только некоторые? Что касается меня (любителя), я переименовываю все формы, фреймы и другие элементы управления, которые упоминаются в коде, но не другие элементы управления, такие как статические метки.
@PhilipJ.Rayment Я обязательно все называю
Помимо DFM и PAS, вам также придется настроить DPR и DPROJ.