Delphi, кадры по сравнению с формами. Зачем многодокументный интерфейс?

Они - в основном различные имена, описывающие то же самое - хорошо, на самом деле пять имен, поскольку последний D может обозначать Дизайн, а также Разработку.

Тест Сначала был термином, использованным первоначально, особенно в контексте Экстремального программирования, для test-code-refactor цикла. Имя Разработка через тестирование было предложено - и быстро взято - позже, для выделения того, что TFD - и всегда был - больше стратегии проектирования, чем стратегия тестирования.

у, Очевидно, сегодня некоторых людей есть различные коннотации для тех двух условий, но это не было намерением позади их существования, и я не буду полагаться на него быть общеизвестное (потому что это не). На самом деле я видел бы термин TFD, как удержавший от использования.

7
задан migajek 23 September 2009 в 08:47
поделиться

7 ответов

Отвечая на комментарий, объясняющий причину использования фреймов:

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

Они позволяют вам сконцентрироваться на разработке именно той функциональности, которая вам нужна, и не более того. Если все сделано правильно, вы можете затем встроить их в листы управления вкладками, в модальные или немодальные диалоги, в дочерние фреймы MDI и в стандартные фреймы. Вы даже можете добавить несколько из них в одну форму - чего, вероятно, нельзя сделать со встроенными формами. Дело в том, что для максимального повторного использования часто требуется многоуровневый подход, и фреймы помогают в этом.

Фрейм подходит для встраивания с ходу. Форма должна быть адаптирована для того, чтобы не отображать строку заголовка и границу, обычно можно переопределить CreateParams () и соответствующим образом настроить стиль окна. В инспекторе гораздо больше свойств формы, которые просто не имеют смысла для встроенной формы. ИМХО следует использовать самый простой и общий объект, которого достаточно. Форма - это гораздо больше, чем контейнер для встраивания.

OTOH Я не знаю каких-либо недостатков встраивания фрейма, которого не было бы во встраивании формы.

Изменить:

Есть комментарий относительно такие события, как OnCreate или OnShow , которых нет в кадрах. На самом деле я' Я считаю, что еще одно преимущество фреймов, так как у обработчиков событий нет параметров, поэтому многие вещи обязательно жестко закодированы в формах.

Рассмотрим случай настроек для каждого пользователя: в OnCreate ] доступно не так много информации, поэтому неизменно заканчивается использование константы или имени формы для раздела файла INI, что очень затрудняет или даже делает невозможным повторное использование формы или создание нескольких ее экземпляров. С другой стороны, для фреймов метод LoadSettings является очевидным способом сделать это, и он может нести необходимые параметры. Таким образом, управление возвращается туда, где оно принадлежит, контейнеру встроенного фрейма / формы. Возможность повторного использования возможна только в том случае, если поведение можно отрегулировать извне.

Для содержащихся объектов, которые не являются компонентами и должны управляться в течение всего срока службы,

11
ответ дан 6 December 2019 в 10:01
поделиться

Возможно, вы найдете ответы в этой теме: gui-design-multiple-forms-vs-simulated-mdi-tabs-vs-pagecontrol

5
ответ дан 6 December 2019 в 10:01
поделиться

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

Позже я обнаружил компонент TLMDDisplayForm из LMDTools , который упростил встраивание форм внутри него, уменьшил используемый код и получил больше возможностей.

одна из основных В целях, которые мы изменили с фреймов на формы, отсутствовали некоторые события TForm, такие как: OnCreate, OnShow, OnActive, которые мы используем для некоторых задач в наших приложениях, помимо отсутствия некоторых свойств, таких как:ActiveControl и другие вещи, которые я не помню.

Если вы хотите использовать формы, я предлагаю вам использовать LMDTools , которые облегчают вам задачу, кроме базовой версии бесплатны: - )

1
ответ дан 6 December 2019 в 10:01
поделиться

Фреймы удобны, когда вы хотите многократно повторить «подформу» в форме. Я бы не стал использовать их для взаимодействия с вкладками, поскольку встроенная форма - лучшее решение для использования интерфейса MDI / Tabbed.

-1
ответ дан 6 December 2019 в 10:01
поделиться

Для динамически вставляемых форм / фреймов я лично предпочитаю использовать встроенные формы вместо фреймов. Несколько версий назад, когда можно было редактировать фрейм, для которого было установлено значение alClient, размер фрейма изменялся между редактированием, и любые элементы управления, которые были выровнены по правому краю фрейма, меняли положение. При использовании встроенных форм этого не произошло, поэтому я переключился. Я считаю, что эта проблема теперь исправлена ​​в более поздних версиях Delphi.

Я полностью согласен с замечаниями Mghie, сделанными ранее относительно невозможности передать информацию во встроенную форму через события уведомления. Чтобы решить эту проблему, я обычно реализую серию интерфейсов в каждой встроенной форме для связи. Это действительно упрощает код и позволяет использовать более общие реализации, где у вас есть один «контейнер». это будет иметь дело со многими различными типами встроенных форм / фреймов. Несколько примеров этого доступны в моем блоге как часть разработанной мной инфраструктуры мастера.

1
ответ дан 6 December 2019 в 10:01
поделиться

Фрейм использует самую быструю загрузку и без задержки при создании фрейма.

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

поместите частный раздел кадра:

procedure CMShowingChanged(var M: TMessage); message CM_SHOWINGCHANGED;

, а затем создайте код, подобный этому:

procedure TFrame1.CMShowingChanged(var M: TMessage);
begin
  inherited;
  if Showing then
  begin
    // .... put your code for onShowing is triggered
  end
  else
  begin
    // .... put your code for onHiding is triggered
  end;
end;

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

Вы можете использовать комбинацию с PageControl для управления открытием фрейма.

Manz

2
ответ дан 6 December 2019 в 10:01
поделиться

Думаю, следует использовать оба варианта. Например, у меня есть «стандартный» фрейм с компонентами dbnavigator, dbgrid и datasource, что очень удобно для обычного просмотра данных. Вместо того, чтобы каждый раз вставлять такие компоненты, я вставляю фрейм, который также имеет возможность экспортировать свои данные (с помощью JVCL: D) в несколько форматов ... но я знаю, что я хочу отображать во время разработки, поэтому я предлагаю очень простое правило: если это известно во время разработки, используйте фреймы, в противном случае используйте встроенные формы.

Однако имейте в виду, что формы не были предназначены для встраивания. Используя их таким образом, это неестественно (как заявляет вампир, когда хоронит свою 80-летнюю дочь, а она выглядела как 30: D). Встроенная форма мало знает о том, кому она принадлежит, и может также (логически) предположить, что она не встроена.

В дополнение к этому, Альваро Кастиелло

0
ответ дан 6 December 2019 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: