|
|
|
Создание программы - ООП модель, MVP30.10.2018, 11:10. Показов 73604. Ответов 100
Пример разработки приложения с нуля под WinForms
Рассматриваются такие аспекты разработки как:
В этом примере НЕ рассматриваются шаблоны типа фабрик, не рассматривается внедрение зависимостей (DI). Используется простой вариант шаблона Model-View-Presenter, адаптированный под специфику WinForms. Этот топик перекликается с этим FAQ, и является практическим примером к нему. Комментарии и вопросы - приветствуются. Постановка задачи Требуется создать приложение - опросник. Опросник будет состоять из нескольких вопросов с различными вариантами ответов. Вопросы могут быть двух видов - с выбором одного ответа из набора возможных, и открытые вопросы, в которых респондент может указать произвольный ответ в виде текста. В опроснике нужно предусмотреть возможность задавать некоторые вопросы и альтернативы только при выполнении некоторых условий, например если в предыдущем вопросе респондент выбрал определенный ответ. Приложение должно состоять из двух частей - конструктора опросника и приложения в котором респондент может ответить на вопросы готового опросника. Результаты опроса должны выгружаться в виде, пригодном для дальнейшей обработки.
19
|
|
| 30.10.2018, 11:10 | |
|
Ответы с готовыми решениями:
100
Встраивание Google RESTful pattern A в модель MVP Создание дочернего окна в MVP
|
|
#MRoose
8 / 9 / 3
Регистрация: 22.02.2013
Сообщений: 416
|
|||||||||||||||||
| 02.01.2019, 18:30 | |||||||||||||||||
|
В том же методе, в том же классе interview.anketa.Remove(prevAnswer); заменил на interview.anketa.Remove(interview.Curren tAnswer); Экспорт теперь вроде работает корректно. Еще подкорректировал механизм возврата. У кнопки btBack остались теже методы : Кликните здесь для просмотра всего текста
А в конце метода Build формы прохождения опросника добавил : Кликните здесь для просмотра всего текста
Добавлено через 8 минут if-else заменил на
0
|
|||||||||||||||||
|
|
|||||||||||
| 02.01.2019, 18:49 [ТС] | |||||||||||
|
MIRAMIX,
Все правильно вы сделали (в последнем варианте) НО, вот это выражение interview.PassedAnswers.Count != 0 - это логика. А логики не должно быть в интерфейсе. Логика должна быть в модели.Поэтому в InterviewManipulator нужно сделать метод CanGoToPrevQuestion:
1
|
|||||||||||
|
#MRoose
8 / 9 / 3
Регистрация: 22.02.2013
Сообщений: 416
|
|||||||
| 02.01.2019, 21:08 | |||||||
|
Код огонь, никаких if else, а получаем правду/ложь. Несколько раз пересмотрел, чтоб понять)) Где всему этому научиться? Явно не по книжкам Добавлено через 2 часа 0 минут Storm23, ну никак не могу понять - как запретить проге принимать пустой ответ в строке ввода. Если пользователь ничего не ввел - вставлять в эксель дефолтную фразу null. Все файлы перелопатил. Логически, подходит вот это из InterviewManipulator : Кликните здесь для просмотра всего текста
Вроде есть условие - принимаем не пустые ответы, но на деле прохождение опросника идет как по маслу( Беда в том, что если пользователь ничего не введет - выходит ошибка при экспорте, типа ячейка в экселе пустая. Эта же ошибка выходит, если показ вопроса зависит от ответа в другом вопросе - то есть, если вопросов 5 и 5й вопрос зависим (может показаться, а может нет) - вылетает ошибка с отсутствием ответа. Последняя часть мелочи, переварю весь код, исправлю сам, но вот с пустым полем беда, ответ не обязателен от пользователя.
0
|
|||||||
|
#MRoose
8 / 9 / 3
Регистрация: 22.02.2013
Сообщений: 416
|
||||||
| 08.01.2019, 22:21 | ||||||
|
Storm23, прошу помощи с проверкой на пустой ответ с ручным вводом.
Сделал вот так у кнопки перехода к следующему вопросу : Кликните здесь для просмотра всего текста
Так месседжбокс выходит и при выборе ответа из списка. В идеале - при пустом ответе отправлять ответ типа прочерка, но пытался хотя бы информировать, чтоб был дан ответ, но не работает(
0
|
||||||
|
|
|||||||||
| 09.01.2019, 10:00 [ТС] | |||||||||
|
Для проверки того, что ответ пустой сделайте в классе Answer свойство IsEmpty:
1
|
|||||||||
|
#MRoose
8 / 9 / 3
Регистрация: 22.02.2013
Сообщений: 416
|
|||||||
| 09.01.2019, 22:31 | |||||||
|
Storm23, огромное спасибо)
2я половина метода GoToNextQuestion : Кликните здесь для просмотра всего текста
На локальном тесте вроде все ок. Если эту проверку вставлять в обработчик кнопки перехода к следующему вопросу при прохождении опроса - нужно нажать 2 раза, чтоб ответ ("-") вставился и закрепился.
0
|
|||||||
| 09.01.2019, 22:50 | |
|
Не по теме: Storm23, в силу своей наивности, не всегда правильно понимаю речевые обороты. Надеюсь вы не о том, откуда руки у некоторых растут :)
0
|
|
|
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
|
|
| 11.08.2020, 15:25 | |
|
Storm23,
1. Можно ли рассматривать сообщения 1-13, 38 (Шаг 11: Добавление экспорта в БД) как пример ООП MVP ? 2. В данных сообщениях актуальные решения или нужно собирать по всей теме изменения к 1-13, 38 (Шаг 11: Добавление экспорта в БД) как пример ООП MVP? 3. Или есть обновлённое решение в одном месте? Задаю вопрос, потому, что бегло прочитал сообщения других пользователей.... многие критикуют данное решение.
0
|
|
|
|
||||
| 12.08.2020, 10:40 [ТС] | ||||
|
Soft17,
0
|
||||
|
0 / 0 / 0
Регистрация: 25.02.2021
Сообщений: 2
|
|
| 07.07.2021, 13:10 | |
|
Storm23, добрый день. Подскажите, пожалуйста, правильное с Вашей точки зрения решение проблемы замены юзерконтрола в зависимости от выбранного значения комбобокса в создающемся по умолчанию юзерконтролу с возможностью возврата к изначальному. Если не сложно, то пример кода был бы полезным. Заранее благодарю.
0
|
|
|
|
||
| 07.07.2021, 15:06 [ТС] | ||
|
Редактируется объект одного и того же класса? Или в зависимости от комбобокса нужно создавать/редактировать объекты разных классов? Если второе - то нужно просто создать юзерконтрол для нужного класса и передвать в его Build(...) нужный объект. Если первое - то не очень понятно, почему у объекта разные редакторы. Ну в принципе решается также - создаются разные юзерконтролы, в их Build передается один и тот же объект. В чем проблема то?
0
|
||
|
0 / 0 / 0
Регистрация: 25.02.2021
Сообщений: 2
|
||
| 07.07.2021, 15:15 | ||
|
Пошел по второму пути, создал разные юзерконтролы и передаю в них объект, но где-то в логике реализации ошибся, потому и просил пример кода.
0
|
||
|
67 / 65 / 61
Регистрация: 11.11.2015
Сообщений: 395
|
||||||
| 15.12.2021, 16:21 | ||||||
|
Может вопрос уже где-то задавался, но внятного ответа я не нашел.
Как быть, если построение модели занимает время? (например, загружаются данные из Интернета)
в моем случае, пока BuildDataSource() не отработает, форма будет мертва.
0
|
||||||
|
Она кричала хватит
41 / 42 / 7
Регистрация: 21.05.2019
Сообщений: 112
|
|||||||
| 16.12.2021, 17:07 | |||||||
1
|
|||||||
|
67 / 65 / 61
Регистрация: 11.11.2015
Сообщений: 395
|
|
| 18.12.2021, 20:03 | |
|
И ещё. Подскажите пожалуйста, почему тут - https://www.cyberforum.ru/atta... 1445438693 предпочитаются не конструкторы а статические классы для создания объектов модели?
0
|
|
|
|
||
| 19.12.2021, 10:19 [ТС] | ||
|
Например, для gif картинок вы захотите добавить свойство "продолжительность анимации". Для этого вы сделаете наследник class AnimatedFileItem : FileItem. И в этом классе пропишите свойство duration.Но как теперь создавать AnimatedFileItem вместо FileItem? Если использовать просто конструкторы, то получается, что решение о том какой класс создавать будет принимать внешний (по отношению к FileItem) код. Это нехорошо, потому что логика создания отдается на откуп внешнего кода, нарушается инкапсуляция. А вот если использовать статический метод Create внутри FileItem, то класс FileItem сам решает какой конкретно тип объекта создать, создает и возвращает его. При этом принятие решение об использовании конкретного наследника FileItem принимает сам FileItem. Сохраняется инкапсуляция; внешний код менять не потребуется.
1
|
||
|
67 / 65 / 61
Регистрация: 11.11.2015
Сообщений: 395
|
|
| 19.12.2021, 11:09 | |
|
Storm23, но в этом примере все заранее известно. Поэтому все еще не понимаю. Или я просто взял пример, когда разработка еще кончилась?
0
|
|
|
|
||
| 19.12.2021, 12:36 [ТС] | ||
|
Это просто задел на будущее.
3
|
||
|
67 / 65 / 61
Регистрация: 11.11.2015
Сообщений: 395
|
|
| 19.12.2021, 12:56 | |
|
Понял, благодарю.
0
|
|
| 19.12.2021, 12:56 | |
|
Модель ООП Закрепить модель ООП Модель работы светодиода ооп ООП модель системы спама Ооп модель телефонного справочника Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
|
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
|
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал.
Оно само - говорит.
Кто слышит тот слышит.
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|