lapanoid/Student-Work — Issue #14: Лабораторная работа 5. МегаЗадача или Mission Impossible
Author: lapanoid
Created: 2011-11-25 14:53:44+00:00
State: open

Напишите WinForms приложение, позволяющее каталогизировать список ваших домашних фильмов. Фильмы хранятся в базе данных, и имеют следующие поля: название, страна и год производства, режиссер, исполнители главных ролей. (Естественно, режиссеры и актеры хранятся в отдельных таблицах, ссылка на них идет через id, а для того, чтобы сопоставить фильм и актеров, нужна промежуточная таблица «Актеры в фильмах», содержащая id записи, id актера, id фильма, – стандартный способ реализации связи «многие ко многим»).

Приложение должно показывать все имеющиеся фильмы и позволять искать фильмы по году, режиссеру, стране и/или актеру (позволяя wildchars * и ? – используйте знания про регэкспы), редактировать и удалять фильмы. Фильмы должны показываться в гриде, первым полем должна идти картинка – обложка фильма. Картинка хранится в отдельном jpg-файле, а путь к нему указывается в соответствующем поле таблицы. Картинки может не быть, тогда показывается стандартная картинка со знаком вопроса (или какая-либо другая «обезличенная»). Картинка по умолчанию должна быть встроена в ресурсы, чтобы гарантированно присутствовать. Названия фильмов и режиссеры должны быть на русском.

Для ввода года создайте user control, проверяющий валидность введенного года (число, большее года выпуска первого фильма братьев Люмьер, и не находящееся в будущем).

У пользователя должна быть возможность сортировать фильмы по возрастанию/убыванию названия и года.

Используйте ErrorProvider для указания ошибок ввода в контролах (плохой год, поиск по нерусским буквам или с использованием недозволенных символов типа ~ или ^). Используйте HelpProvider для вывода справки по полям ввода. Сделайте тултипы полям ввода. Ставьте фокус на контрол, в котором произошла ошибка ввода. Не забудьте проставить правильный tab order.

Все потенциально длительные операции должны быть асинхронными (используйте ThreadPool и Invoke/SynchronizationContext) и во время их исполнения должен показываться прогресс. Такие операции – как минимум загрузка фильмов и поиск фильмов.

Грид должен позволять множественное выделение. При удалении фильмов должна начинаться транзакция: на каждый выделенный фильм пользователя спрашивают, уверен ли он, если он уверен, фильм удаляется. Если он не уверен, транзакция откатывается. Транзакция завершается успехом при всех ответах «да».

При показе фильмов сверху грида должна быть пометка: «Все фильмы» или «Результат поиска по критерию…». Поиск должен подписаться на событие OnCompleted асинхронной операции и выводить критерий поиска и результаты поиска на форму по этому событию. Вопрос: обработчик OnCompleted не принимает параметров, откуда взять текст критерия? Ответ: делаем анонимный делегат в месте, где начинается поиск, и где мы знаем этот самый критерий. Если это непонятно, спрашиваем преподавателя.

Приложение должно содержать меню, в котором будет пункты: File, Edit, Help.
Внутри File ¬– открыть базу данных и выйти. Edit – редактировать фильм, удалить фильм, найти фильм (этот пункт показывает диалог поиска, также должен быть доступен по Ctrl-F). Help – About. Все пункты меню должны иметь стандартные горячие клавиши (F в File, X в Exit и т.п.).

Результаты поиска выводятся на главную форму. Диалог поиска должен быть немодальным и открываться центрированным относительно главной формы. Когда открыт диалог поиска, пункт меню Exit должен быть disabled, а пункт меню Find должен быть checked. Повторное нажатие на этот пункт показывает то же (а не новое) окно поиска. Диалог должен быть resizable в ширину и его контролы должны соответственно растягиваться (используйте anchor или docking свойства контролов). Поиск производится по всем непустым полям, так что не надо создавать радиокнопки, по какому полю искать, зато можно сделать кнопку «Очистить», которая очищала бы все поля поиска.

При выходе приложение должно спрашивать подтверждения и не выходить, если пользователь выбрал «No».

Проставьте элементам управления accessibility поля и проверьте, что они читаются Narrator’ом.

ВНИМАНИЕ: База данных фильмов должна содержать не менее 10 РЕАЛЬНЫХ фильмов нескольких РАЗНЫХ режиссеров и нескольких РАЗНЫХ стран. Фильмы типа «а» режиссера «б» не принимаются. Первый фильм братьев Люмьер – ищется на Яндексе и должен быть точным.  Не поленитесь также найти картинки. Не возбраняется делиться друг с другом картинками фильмов.