Перейти к содержанию
Fire Monkey от А до Я
  • 0

фремы динамическое создание


master webs

Вопрос

Добрый день в приложении использую  5 фреймов

суть вопроса

мне нужно создавать их всех один раз при повторном обращении менять  видимость фрейма все скрываю оставляю один нужный (при переходе по пунктам меню)

сейчас использую процедуру взятую с форума

procedure TForm1.TabItemNext(ANextFrame: TFrameClass);
begin
  FFrame.DisposeOf;
  FFrame := nil;
  FFrame := ANextFrame.Create(Self);
  FFrame.Parent := Panel1;
  FFrame.Name:=ANextFrame.UnitName;
  FFrame.Align := TAlignLayout.Client;
  MultiView1.HideMaster;
end;

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

подскажите как можно поступить

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
5 минут назад, master webs сказал:

мне нужно создавать их всех один раз

 

5 минут назад, master webs сказал:

 в нужный момент нужно удалить все фреймы  кроме 1

Небольшое противоречие, нет?

А так - синглтон вам поможет :)

Ссылка на комментарий
  • 0
15 минут назад, kami сказал:

 

Небольшое противоречие, нет?

А так - синглтон вам поможет :)

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

Ссылка на комментарий
  • 0

Сначала попытался объяснить как я переключаю фреймы, но потом подумал и решил что проще будет сделать пример (см. приложенный архив).  Мне не очень нравится идея создавать все фреймы сразу. На мой взгляд ( и не только на мой, существует понятие MVC, MVP, MVVP),  фреймы это только отображение данных, а сами данные лучше контролировать в другом месте. По этому в моем примере, есть контроллер данных (TDataModule), в котором (в реальной программе) прописана вся бизнес-логика. Во фреймах же и в формах, только код, который относится непосредственно к этому фрейму (форме).

Еще небольшой совет:  контроллер совсем не обязательно должен быть TDataModule, это может быть обычный класс - синглтон. Но я традиционно использую его, потому что в реальной программе он может служить контейнером для каких то невизуальных компонентов. Например в него я помещаю компонент TfgApplicationEvents из набора FGX(http://fire-monkey.ru/forum/177-fgx/) от Ярослава Бровина.

Если в программе используется база данных, то я не помещаю в контроллер компоненты доступа к данным. Для этого я делаю отдельный модуль. 

Так же, рекомендую посмотреть в сторону компонента TFrameStand (его можно найти в GetIt).

FrameSelector.zip

Изменено пользователем DirtyBorov
Ссылка на комментарий
  • 0

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

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

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

код при создании фреймов не в точности, но похож на приведенный в старте темы

Ссылка на комментарий
  • 0
11 часов назад, krapotkin сказал:

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

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

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

код при создании фреймов не в точности, но похож на приведенный в старте темы

Совершенно согласен - динамическое создание фреймов на мой взгляд намного лучше (как и форм). К тому же, если используется модель данных вне формы (фрейма), то тогда вообще нет ни каких проблем. И чаще всего, при использовании моделей типа MVC, MVP и .т.п - код значительно упрощается! Главное становится более надежным, понятным и коротким. Можно легко и не напряженно менять или добавлять формы без вмешательства в логику. Особенно хорошо это проявляется в командной работе, когда не опытный разработчик (или новый человек в команде), может не вдаваясь в код сложной бизнес логики за пару часов прикрутить например отчет или новый view. К тому же, понятие такого подхода абстрагирует разработчика от конкретного языка. В дальнейшем такой подход можно использовать на любом языке.

К сожалению архитектура Delphi часто подталкивает к "формошлепству", что в общем то не  плохо работает в небольших приложениях. Но когда программа становится несколько сложней чем "Hello world", это становится проблемой. Самое печальное то, что в массе книг по Delphi как раз таки и учат формошлепству. В духе "щелкните два раза по кнопке и получите готовый обработчик события". Я не встречал ни одной книги (кроме нескольких уже довольно устаревших статей), где бы показывалось как использовать MVC или MVP в Delphi. Если не прав - ткните носом.

Да, код полностью идентичный приведенный топикастером, за исключением использования дженериков. Но я и не стремился доказать что мой код лучше. Всего лишь показал как делаю я.  Этот намеренно простейший шаблон приложения. Не самый лучший. Но на мой взгляд он все таки отделяет "мух от котлет" (данные от форм) и возможно кому то поможет понять что на Delphi тоже можно и нужно использовать MVC. Конечно в реальном приложении обычно все на много сложней. Хотя лично у меня есть парочка довольно мудреных приложений которые используют именно такую архитектуру и прекрасно работают, периодически претерпевая изменения без каких либо серьезных проблем.

Часто слышу высказывания в духе "зачем мне усложнять? Я быстро накидаю форму с логикой и получу деньги". По своему опыту скажу - вы ошибаетесь. Да, вы быстро и легко накидаете форму, которая что то будет делать и даже как то работать. Но если вы в дальнейшем будете сопровождать свое творение, то очень скоро убедитесь в том что это полный отстой. Особенно если программа будет продолжать наращивать функционал. Не питайте иллюзий. Пишите сразу правильно - это в дальнейшем сэкономит вам время и нервы. Как говорится в одном знаменитом мульте: "лучше сейчас час потерять, зато потом за пять минут долететь" ))

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...