Delphi IDE обрабатывает TFrame как форму

Время от времени, когда я настраиваю свои классы TFrame (добавляя свойства, методы и т. Д.), IDE сбивается с толку и действует так, как будто думает, что фрейм - это форма с заголовком / заголовком, границами и т. Д. класс объявлен как потомок TFrame. Есть идеи относительно того, что вызывает это, как предотвратить и как исправить?

Я использую Delphi 2007 Pro. Также обратите внимание (если это имеет значение), потомки TFrame обычно регистрируются в IDE (то есть на палитре) через пакет времени разработки.


Позже: Дополнительные "особенности": Фрейм, с которым у меня возникла эта проблема в данный момент, визуально является ОЧЕНЬ базовым TFrame (от нового TFrame отличается только размер и цвет фона).

Вот его объявление класса:

TBasePanel = class(TFrame)
  private
    FPanelManager: TPanelManager;
    procedure SetPanelManager(const Value: TPanelManager);
  protected
    procedure Connect; virtual; abstract;
    procedure Disconnect; virtual; abstract;
    procedure Refresh; virtual;
    procedure Requery; virtual; abstract;
  published
    property PanelManager: TPanelManager read FPanelManager write
        SetPanelManager;

Этот фрейм используется как базовый класс для ряда других. Обычно я редактирую его непосредственно из проекта BPL, которому он принадлежит (потому что все эти фреймы устанавливаются в палитру), а не как часть проекта EXE с открытыми связанными формами и т. Д.

Также отметим «Встроенный конструктор» в Инструменты -> Параметры.

Я сохраняю все файлы DFM как текстовые, а не двоичные (если это вообще имеет значение).


person Jamo    schedule 26.02.2009    source источник
comment
Просто обновление по этому поводу: ответ, похоже, представляет собой комбинацию ответа Берджера ниже PLUS, создающего базовый класс кадра, который НЕ имеет никаких изменений по сравнению с обычным TFrame, и ЗАТЕМ наследуется от него перед добавлением каких-либо свойств, методов и т. Д. Кажется, что стабилизирует наследование потоковое как-то.   -  person Jamo    schedule 20.03.2009


Ответы (5)


Я столкнулся с той же проблемой. Следующие шаги решили проблему для нас, это также может сработать для вас:

  1. в IDE: закройте все формы, использующие фрейм
  2. открыть фрейм, просмотреть как текст (* .dfm)
  3. dfm, вероятно, начинается с объекта MyFrame: TMyFrameClass
  4. измените это на унаследованный MyFrame: TMyFrameClass

Я не знаю, что вызвало проблему.

person Birger    schedule 26.02.2009
comment
Кажется, это работает с классами-предками, но иногда у меня все еще возникают проблемы с корневым классом (тем, который происходит от TFrame). Первый ДОЛЖЕН быть возражением, верно? - person Jamo; 27.02.2009
comment
Я не уверен, что в проекте, где у меня возникла эта проблема, все фреймы начинаются с «унаследованного MyFrame: TMyFrame». У первого потомка TFrame, который мы используем, нет dfm, поэтому я не могу проверить, что там должно быть в dfm. - person Birger; 27.02.2009
comment
Интересный! Я не думал, что первый потомок TFrame будет без DFM. Это могло бы устранить основные проблемы с TFrame, о которых я подозреваю. Хммм ... Спасибо за эту информацию. Буду экспериментировать с таким подходом! - person Jamo; 27.02.2009
comment
Мой герой! Спасибо! Вы только что закончили несколько часов совершенно бессмысленной охоты за ошибками. ;) Я совершенно не заметил этого изменения в DFM. Вероятно, было бы легче обнаружить, если бы файл уже находился под контролем версий ... - person Oliver Giesen; 18.08.2010

Возможно, вы сняли флажок «Встроенный конструктор»? (Инструменты | Параметры | Параметры среды | VCL Designer). Тогда действительно ваш фрейм отображается во время разработки как форма (с заголовком, рамкой и т. Д.). Также может помочь конкретный код вашего проблемного потомка TFrame или более подробная информация о вашем случае.

person John Thomas    schedule 26.02.2009

Насколько мне известно, при редактировании фрейма в редакторе должны быть открыты и форма, и фрейм. Иначе могут быть проблемы с обновлением. Хотя я этого не видел.

Но я давно отказался от фреймов, потому что не считал их очень надежными.

Прямо сейчас я использую их только для прототипирования, создания пользовательского компонента (производного от панели с соответствующими элементами управления на ней).

person Toon Krijthe    schedule 26.02.2009

Возможно, вам придется зарегистрировать пользовательский модуль в среде IDE Но ваши дополнительные свойства не будут работать, если они не находятся в классе-предке.

person Serguzest    schedule 26.02.2009
comment
Вам все равно нужно это делать, даже если весь компонент, основанный на кадрах, зарегистрирован через пакет дизайна? Он отлично отображается на палитре, а опубликованные свойства отображаются в инспекторе. Он теряет свое поведение кадра, но на самом деле это то, что я хочу. Не следуя тому, что это делает. - person Jamo; 27.02.2009
comment
Речь идет не о регистрации его как обычного компонента. Вам может потребоваться зарегистрировать настраиваемый модуль, чтобы получить надлежащее поведение конкретного дизайнера. Тем не менее, я не уверен, потому что то, как ide обрабатывает Tframe во время разработки, непрозрачно для программистов. Но, на мой взгляд, попробовать стоит. - person Serguzest; 28.02.2009

Я столкнулся с множеством проблем с TFrame и, наконец, пришел к такому обходному пути, который решает все мои проблемы: я создаю и проектирую фреймы визуально, но использую их только вручную.

Как побочный эффект, мои приложения стали меньше из-за меньшего количества dfm-файлов.

person kuaw26    schedule 19.12.2009