Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК ПП1 (C++ БД).doc
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
5 Мб
Скачать
☆

3.5.1. Лабораторные работы, семестр 1

Студенты всех форм обучения должны выполнить 9 лабораторных работ. Часть из них выполняется в классе, часть самостоятельно. Общий список работ изложен ниже, перечени работ для каждой формы обучения приведены в п.п. 2.5.2. Электронный образец выполнения лабораторных работ можно получить у преподавателя.

Перечень лабораторных работ по семестру 1

№ лаб

Наименование

1.1

Проектирование программного проекта

1.2

Надёжный ввод

1.3

Контейнеры

1.4

Компоненты выбора

1.5

Диалоги

1.6

Многострочные окна

1.7

Определение даты и временного интервала

1.8

Обработка двумерных массивов

1.9

Работа с каталогами и файлами

Работа 1.1. Проектирование программного проекта.

[1], с.257-275; [4], с.21-64

Цель: Освоение основного приема программирования на базе процедур низкого уровня.

Результат: Получить интерфейс, аналогичный рис. 69.

Компоненты: ActionList, ImageList, MainMenu, ToolBar.

Вспомогательный теоретический материал Основная тенденция технологии программирования

Общие положения современной технологии программирования и государственные стандарты на разработку программного обеспечения подробно рассматривались в [4, тема 1.1]. В данной лабораторной работе будут показаны и объяснены основные приемы программирования в среде C++Builder, позволяющей реализовать основные идеи современной технологии.

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

Компонент ActionList

Встроенный во все варианты Builder-систем компонент ActionList (список действий) замышлялся как некий диспетчер типовых действий для отдельной задачи, что является центральным моментом при проведении декомпозиции. В версиях Builder 2006 и старше появились другие аналогичные и более развитые средства, но для начального ознакомления вполне достаточно данного.

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

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

Когда список действий составлен, можно начать размышлять над исполнительными элементами интерфейса, с помощью которых пользователь сможет выполнять действия. И здесь могут возникнуть определенные сложности. Обычно для одного и того же действия предусматривается несколько различных органов управления. Например, как правило, некоторые разделы главного меню дублируются быстрыми кнопками инструментальных панелей, разделами контекстных меню, «горячими» клавишами, иногда обычными кнопками. Такое дублирование удобно пользователю. Но независимая разработка всех этих управляющих элементов часто приводит к неоправданному дублированию кодов, а главное – снижает возможности модернизации и сопровождения приложения. Действительно, если вы надумаете что-то изменить в одном из действий, вы должны будете вносить изменения сразу в нескольких местах программы, что чревато многочисленными ошибками. Компонент ActionList направлен на то, чтобы избежать подобных сложностей.

Рассмотрим работы с компонентом на примере такой задачи: на форме имеется список с текстом ListBox1; требуется выполнить над строками списка различные типовые действия. Собственно задача работы с компонентом ListBox не ставится, цель заключается в использовании ActionList. Последовательность формирования интерфейса задачи представлена на рис. 57- 63.

Рис. 57. Начало работы с ActionList

Рис. 57 отображает начало работы с диспетчером действий ActionList. Главным технологическим приёмом является запись на русском языке списка планируемых действий над компонентом ListBox1 где-нибудь в удобном и легко доступном месте. В данном примере предлагается этот список поместить в самом начале программного кода, заключив его в комментарные скобки (рис. 58).

/* Список действий

Заполнить список из файла

Записать список в файл

Добавить строку

Удалить строку

Отсортировать по алфавиту

Выход */

Рис. 58 Список действий ActionList

Этот список является чисто технологическим, впоследствии его можно будет удалить, но, как вы увидите, он поможет и лучше организовать всё алгоритмирование, и сэкономит время ввода одинаковых русских фраз. С другой стороны, этот список можно и оставить как элемент оформления программного текста, поскольку по содержанию он соответствует пункту стандартного технического задания «Функциональные требования к программе» (ГОСТ 19.106-78).

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

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

Заповедь 1 технологии программирования.

До составления интерфейса и до первых попыток программирования запишите список основных действий программы в любом удобном для доступа файле формата *.txt

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

Заповедь 2 технологии программирования.

Любые источники информации, предназначенные для копирования, (тексты, изображения, календари .т.п.) должны записываться только один раз и только в одном месте

Компонент ActionList находится на вкладке Standard палитры компонентов и расположен последним в ряду. Установите его в любом месте формы, учитывая, что он является невизуальным, то есть невидимым на фазе выполнения программы (в период Run Time). В дальнейшем вы узнаете, что наиболее удобным местом расположения невизульных компонентов является специальная «невидимая» форма Data Modul.

В данном методическом комплексе рассматриваются только минимально необходимые средства ActionList, подобное описание компонента находится в [1],[6],[7]. Важнейшим инструментом компонента ActionList является Редактор форм (Editing Forms). Чтобы вызвать его, щелкните по компоненту правой клавишей.

Именно с помощью Редактора формы мы и будем составлять план дальнейшей работы с программой. Создадим первое действие, которое уже может быть названо первой базовой процедурой. Щёлкните правой клавишей по пустому месту поля Actions (действия) и получите следующее окно Редактора действий (рис. 59.)

Рис. 59. Вызов редактора действий

В выпадающем списке представлены два варианта действий:

  • Новое действие (New Action).

  • Новое стандартное действие (New Standard Action).

Для начала будем пользоваться индивидуальными действиями, поэтому выберем первый вариант. В нашем списке запланировано 6 действий, значит, щёлкая в общей сложности 6 раз правой клавишей, создадим 6 заготовок для будущих действий (рис. 60).

Рис. 60. Предварительная запись заготовок действий для шести планируемых операций

Важно: в соответствии с общей идеологией объектно-ориентированного программирования, созданное нами действие является объектом, обладающим свойствами, событиями и методами.

На следующем этапе в свойства Caption каждого действия запишем их русские названия. Для этого, перемещая компоненты по экрану, расположите их так, чтобы были бы одновременно видны и Инспектор объектов (Object Inspector), и список действий из программного текста, и Редактор (Editing Forms). Установите фокус на первой строке с наименованием действия «Заполнить список из файла» и запишите его в буфер обмена. Затем установите фокус на действии Action1 и в его свойство Caption, которое синхронно откроет Инспектор объектов, запишите данные из буфера (рис. 61).

Рис. 61. Запись русских надписей в свойства Caption объектов Actions

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

Обратите внимание, что по умолчанию Builder назначает программные имена, ничего не выражающие по смыслу: Action1, Action2, Action3… . На следующем этапе проектирования назначим нашим действиям как программным объектам семантические имена, что является непременным условием хорошего стиля программирования. Для этого в Инспекторе объектов в свойстве Name для каждого действия запишите программное имя этого действия.

Важно: программные имена (то есть свойство Name) могут содержать только латинские буквы и цифры.

Это имя должно выражать само действие, поэтому разумны два решения:

  • записывать действия по-английски

  • записывать действия по-русски, но латиницей (как SMS).

Первый вариант может показаться красивее, но он требует знания английского языка, а кроме того, возможно случайное совпадение выбранного вами имени с какой-нибудь системной функцией, выражающей совсем не то, о чём вы думаете. Результат такой коллизии не предсказуем. Поэтому остановимся на втором решении. Выбранные наименования действий представлены на рис. 62.

Рис. 62. Назначение семантических значений свойству Name действий

Обратите внимание, что, учитывая общий стиль написания имён в среде C++Builder, мы предпослали каждому имени собственный префикс «md», что произошло из русского выражения «моё действие». Это позволит при дальнейшем программировании легко различать процедуры низкого уровня, принадлежащие списку действий ActionList1, от любых других. Кроме того, это предотвратит случайные совпадения программных имён действий с системными функциями.

Заповедь 3 технологии программирования.

В качестве семантических имен действий используйте русское наименование, записанное латиницей с префиксом md

Казалось бы, теперь можно приступать к программированию. Однако до детальной проработки будущего интерфейса этого делать не следует – возникнут неизбежные ошибки, исправлениия и, в конечном счете, программа не получится ни надёжной, ни элегантной.

Заповедь 4 технологии программирования.

На стадии проектирования вместо решающих алгоритмов пользуйтесь технологическими заглушками

Под «заглушкой» понимают просто оператор вывода на экран понятной по смыслу фразы, например, вместо того чтобы реально удалять строку из списка ListBox1, разумно вместо оператора удаления подставить вывод, например, такого сообщения:

ShowMessage («Текущая запись будет удалена»);

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

Таким образом, приступаем к программированию действий с использованием принципа заглушек. Установите курсор на первом действии FromFile, в Инспекторе объектов перейдите на вкладку Ecents (События) и дважды щёлкните по пустому полю справа от события OnExecute (При выполнении). Вместо поля формы откроется поле текста программы, в котором Builder подготовит заготовку для обработчика этого события. В качестве тела обработчика запишем единственный оператор вывода на экран, то есть заглушку (рис. 63).

void __fastcall TForm1::mdFromFileExecute(TObject *Sender)

{ShowMessage(«Список будет заполнен строками из файла»); }

Рис. 63. Пример кода для технологической заглушки для действия «FromFile»

Таким же образом «запрограммируйте» и все остальные действия.

Если сейчас вы скомпилируете программу, то никаких действий она не выполнит, даже «заглушек», потому что на интерфейсе отсутствуют органы управления (или инициаторы действий), а сам ActionList является невидимым. Чтобы воспользоваться каким-либо действием, необходимо установить на форме компонент и связать его с нужным действием из списка ActionList. Обычно используют текстовое главное меню (MainMenu) и дублирующие кнопки быстрого доступа, а также «горячие» клавиши.