
- •Прикладное программирование
- •Часть 1
- •Прикладное программирование
- •Часть 1
- •1. Информация о дисциплине
- •1.1. Предисловие
- •1.2. Содержание дисциплины и виды учебной работы
- •1.2.2. Перечень видов практических занятий и контроля
- •2. Рабочие учебные материалы
- •2.1. Рабочая программа (220 часов) Введение
- •Раздел 1. Технология программирования
- •Раздел 2. Ввод данных
- •Раздел 3. Управляющие окна
- •Раздел 4. Развитые компоненты
- •Раздел 5. Основные понятия субд
- •Раздел 6. Программирование баз данных
- •6.1. Невизуальные компоненты для построения бд
- •Раздел 7. Основные приёмы программирования бд
- •Раздел 8. Развитые приёмы программирования бд
- •Раздел 9. Интерфейс прикладного программирования api
- •Заключение
- •2.2. Тематический план изучения дисциплины
- •Тематический план для студентов заочной формы обучения
- •Структурно-логическая схема дисциплины «Прикладное программирование»
- •2.4. Временной график изучения дисциплины при использовании информационно-коммуникационных технологий
- •2.5. Практический блок
- •2.5.1. Практические занятия
- •2.5.2. Лабораторный практикум
- •2.5.2.1. Лабораторные работы для очной формы обучения
- •2.5.2.2. Лабораторные работы для очно-заочной формы обучения
- •2.5.2.3. Лабораторные работы для заочной формы обучения
- •2.6. Балльно-рейтинговая система оценки знаний
- •3. Информационные ресурсы дисциплины
- •3.1. Библиографический список
- •Опорный конспект Введение
- •Раздел 1. Технология программирования
- •1.1. Основная тенденция технологии программирования
- •Раздел 2. Ввод данных
- •2.1. Организация надежного ввода
- •2.2. Обработка строк
- •2.3. Средства группирования компонентов
- •Раздел 3. Управляющие окна
- •3.1. Управление выбором
- •3.2. Диалоговые окна
- •3.3. Многострочные окна
- •Раздел 4. Развитые компонеты
- •4.1. Работа с данными типа DateTime
- •4.2. Работа с двумерными массивами
- •4.3. Компоненты навигаторов.
- •4.4. Использование указателей
- •Раздел 5. Основные понятия субд
- •5.1. Общие сведения о базах данных (бд)
- •5.2. Концепция управления бд из среды Builder
- •5.3. Файлы и индексы
- •Раздел 6. Программирование баз данных
- •6.1. Невизуальные компоненты для построения бд
- •6.2. Навигация по нд
- •6.3. Доступ к полям нд
- •6.4. Визуальные компоненты для работы с бд
- •Раздел 7. Основные приёмы программирования бд
- •7.1. Сортировка, фильтрация и редактирование нд
- •7.2.Организация надежного ввода данных в бд
- •Раздел 8. Развитые приёмы программирования бд
- •8.1. Построение связей между таблицами бд
- •8.2. Работа с изображениями.
- •Раздел 9. Интерфейс прикладного программирования api
- •9.1 Встраивание звука
- •9.2. Вызов других приложений
- •Заключение
- •3.3. Глоссарий (краткий словарь основных терминов и положений)
- •3.4. Технические средства обеспечения дисциплины
- •3.5. Методические указания к выполнению лабораторных работ
- •3.5.1. Лабораторные работы, семестр 1
- •Работа 1.1. Проектирование программного проекта.
- •Вспомогательный теоретический материал Основная тенденция технологии программирования
- •Компонент ActionList
- •Связь пунктов меню Main Menu1 с действиями ActionList
- •Связь действий ActionList с изображениями ImageList
- •Кнопки быстрого доступа
- •Всплывающие подсказки
- •Использование стандартных действий
- •10 Правил технологии программирования
- •Работа 1.2. Надёжный ввод
- •Работа 1.3. Контейнеры
- •Работа 1.4. Компоненты выбора
- •Работа 1.5. Диалоги
- •Работа 1.6. Многострочные окна
- •Работа 1.7. Определение даты и временного интервала.
- •Работа 1.8. Обработка двумерных массивов.
- •Работа 1.9. Работа с каталогами и файлами.
- •3.5.2. Лабораторные работы, семестр 2
- •Работа 2.1. Начальное создание базы данных
- •Вспомогательный теоретический материал Общие сведения о базах данных
- •Концепция управления бд из среды Builder
- •Средство dbe (Database Borland Engine – машина Borland управления базой данных)
- •Альяс базы данных
- •Поля файла бд
- •Набор данных таблицы бд
- •Управление наборами данных в среде Builder
- •Модуль данных DataModule
- •Файлы и индексы
- •Содержание работы
- •Работа 2.2. Сортировка набора данных, русификация заголовков
- •Работа 2.3. Организация надежного ввода
- •//Проверка полей Panel2 - только для режима замены
- •Работа 2.4. Ввод данных посредством вспомогательных словарей.
- •Работа 2.5. Связи таблиц типа 1:1 и 1:n
- •Работа 2.6. Поля синхронного просмотра типа Lookup
- •Работа 2.7. Поиск и фильтрация
- •Работа 2.8. Особенности сохранения изображений в бд
- •Работа 2.9. Встраивание звука
- •Работа 2.10. Вызов других приложений
- •Методические указания к практическим занятиям
- •Заключение
- •4. Блок контроля освоения дисциплины
- •Часть 1, первый семестр – контрольная работа, зачёт.
- •Часть 1, второй семестр – курсовой проект, экзамен.
- •4.1. Задание на контрольную работу и методические указания к её выполнению
- •Вниманию студентов, обучающихся с элементами дот.
- •Задание на курсовой проект и методические указания к его выполнению
- •Этапы работы над курсовым проектом
- •4.3. Текущий контроль Тренировочные тесты
- •4.4. Итоговый контроль Вопросы к зачёту, семестр 1
- •Вопросы к экзамену, семестр2
Раздел 3. Управляющие окна
При изучении данного раздела вы должны проработать следующие темы:
3.1. Управление выбором.
3.2. Диалоговые окна.
3.3. Многострочные окна.
Для проверки усвоения материала Вам предстоит ответить на вопросы для самопроверки, приведённые в конце раздела, а затем выполнить лабораторные работы №1.4, №1.5 и №1.6 и тренировочный тест №3. Изучение раздела заканчивается контролем знаний: необходимо ответить на вопросы контрольного теста №3. Максимальное количество баллов, которое вы можете получить по данному разделу, равно 10.5 (1.5 баллов за тестирование и ещё 9 баллов за лабораторные работы).
3.1. Управление выбором
При организации интерфейса для управления базами данных часто встречаются задачи сортировки и выборки. При определении способа сортировки типичным является выбор одного из многих возможных способов, например:
сортировка по фамилии,
сортировка по шифру,
сортировка по группе.
При выборе варианта сортировки, например по фамилии, остальные варианты исключаются. Для организации задач такого рода служит удобный компонент RadioGroup (рис. 9), осуществляющий исключающий выбор.
Компонент исключающего выбора RadioGroup
Главным свойством компонента является список пунктов Items, обладающий теми же параметрами, что и у компонента ListBox. В каждой строке этого списка пользователь указывает наименование пункта, а изображение так называемой «радиокнопки» будет сформировано автоматически.
Рис. 9. Компонент RadioGroup для исключающего выбора
Все радиокнопки объединяются в контейнере RadioGroup. Они образуют группы взаимосвязанных индикаторов, из которых может быть выбран только один. Они используются для выбора пользователем одной из нескольких взаимоисключающих альтернатив, варианты которых представлены на рисунке.
Общая панель компонента может содержать регулярно расположенные столбцы и строки с радиокнопками. Надпись в левом верхнем углу рамки панели (см. рис. 9) определяется свойством Caption. Для данного примера, Caption=”Сортировка по”.
Надписи кнопок и их количество определяются свойством Items, имеющим тип TStrings. Щелкнув на кнопке с многоточием около этого свойства в окне Инспектора объектов, вы попадете в редактор списков строк. В нем вы можете занести надписи, которые хотите видеть около кнопок, по одной в строке. Сколько строчек вы запишете – столько и будет кнопок. Например, для компонента RadioGroup1 свойство Items имеет вид
шифру
фамилии
году рождения
номеру группы
Кнопки, появившиеся в панели после задания значений Items, можно разместить в несколько столбцов, задав свойство Columns. По умолчанию Columns = 1, т.е. кнопки размещаются друг под другом (рис. 9, компонент RadioGroup1). Для компонента RadioGroup2 параметр Columns = 2, соответственно все кнопки расположилсь в двух столбцах.
Определить, какую из кнопок выбрал пользователь, можно по свойству ItemIndex, которое показывает индекс выбранной кнопки. Индексы, как всегда в C++ Builder, начинаются с 0. По умолчанию ItemIndex = -1, что означает отсутствие выбранной кнопки. Если вы хотите, чтобы в момент начала выполнения приложения какая-то из кнопок была выбрана, то надо установить соответствующее положительное значение ItemIndex. В рассматриваемом примере ItemIndex=2, на рисунке третья радиокнопка (её индекс равен 2) обозначена черной точкой.
Компонент RadioGroup очень удобен, если надписи кнопок имеют примерно одинаковую длину и если число кнопок в каждом столбце (при размещении их в нескольких столбцах) одинаково.
В некоторых случаях желательно нерегулярное расположение кнопок. Такую возможность дают компоненты RadioButton, сгруппированные панелью GroupBox. Панель GroupBox выглядит на форме так же, как RadioGroup, и надпись в ее верхнем левом углу также определяется свойством Caption. Эта панель сама по себе пустая. Ее назначение – служить контейнером для других управляющих элементов, в частности для радиокнопок RadioButton. Чтобы на панели появились радиокнопки, надо «поштучно» перетащить из палитры компонентов столько элементов RadioButton, сколько потребуется кнопок.
Группа из пяти радиокнопок объединяется единым контейнером GroupBox, который обеспечивает исключающий выбор одного варианта из всех возможных. Физическое расположение радиокнопок полностью определяется пользователем, так что такого рода формирование списка для исключающего выбора представляется наиболее универсальным.
Рассмотрим свойства радиокнопки RadioButton. Свойство Caption содержит надпись, появляющуюся около кнопки. Значение свойства Alignment определяет, с какой стороны от кнопки появится надпись: taLeftJustify – слева, taRightJustify – справа (это значение принято по умолчанию). Свойство Checked определяет, выбрана данная кнопка пользователем, или нет. Поскольку в начале выполнения приложения обычно надо, чтобы одна из кнопок группы была выбрана по умолчанию, ее свойство Checked надо установить в true в процессе проектирования.
Компоненты комплексного выбора CheckBox и CheckListBox
Наряду с сортировкой, другой часто встречающейся задачей при доступе к базам данных является выборка или фильтрация. Суть её в том, что пользователь выбирает по своему усмотрению сочетание параметров объектов хранения, которые надо отобрать из общего множества. В этом случае надо иметь компонент, в котором были бы представлены все возможные параметры, а пользователь имел бы возможность выбирать не одно единственное значение, а их произвольное сочетание. Для этой цели хорошо подходит компонент CheckListBox (рис. 10).
Рис. 10. Список индикаторов с флажком CheckListBox предназначен для организации комплексного выбора
Комонент CheckListBox используются в приложениях в основном для того, чтобы пользователь мог включать и выключать какие-то параметры, или для индикации состояния. Основным свойством компоненты является список строк Items типа TStrings, снабженных флажками – индикаторами. Список заполняется вручную при проектировании интерфейса (в течение фазы Design Time), причем пользователь записывает только текст, а изображения флажков формируются автоматически.
Состояния индикаторов определяют два свойства: State и Checked. Оба эти свойства можно рассматривать как индексированные массивы, каждый элемент которого соответствует индексу строки. Общее количество элементов определяется свойством Count. Это свойство доступно только для чтения. Поскольку индексы начинаются с 0, то индекс последнего элемента равен Count - 1.
При каждом щелчке пользователя на индикаторе его состояние изменяется, проходя в общем случае последовательно через три значения:
выделенное (появление черной галочки),
промежуточное (серое окно индикатора и серая галочка),
невыделенное (пустое окно индикатора).
Этим трем состояниям соответствуют три значения свойства компонента State:
cbChecked (выделенное),
cbGrayed (промежуточное),
cbUnchecked (невыделенное).
Впрочем, эти три состояния допускаются только при значении другого свойства AllowGrayed равном true. Если же AllowGrayed = false (значение по умолчанию), то допускается только два состояния: выделенное и не выделенное. И State, и AllowGrayed можно устанавливать во время проектирования или программно во время выполнения.
Промежуточное состояние обычно используется, если индикатор применяется для отображения какой-то характеристики объекта. Например, если индикатор призван показать, какой регистр использовался при написании какого-то фрагмента текста, то в случае, если весь текст написан в верхнем регистре, индикатор может принимать выделенное состояние, если в нижнем – не выделенное, а если использовались оба регистра – промежуточное.
Проверять состояние индикатора можно не только по значению State, но и по значению свойства Checked. Если Checked равно true, то индикатор выбран, т.е. State == cbChecked. Если Checked равно false, то State равно cbUnchecked или cbGrayed. Установка Checked в true во время проектирования или выполнения автоматически переключает State в cbChecked.
Свойства State и Checked можно устанавливать программно или считывать, определяя установки пользователя. Хотя строки Items организованы в запоминающую структуру «список», в компоненте разрешен индексный доступ к отдельной строке, как если бы она была элементом массива. Тогда значение индекса указывается в квадратных скобках. Рассмотрим два оператора:
CheckListBox1->Checked[0]=true;
CheckListBox1->State[1]= cbGrayed;
Вспоминая, что индексы начинаются с 0, делаем вывод, что индикатор первой строки списка CheckListBox1 устанавливается в состояние выбранного, а индикатор второй строки – в промежуточное состояние (рис. 7).
Рис. 11. Программное управление состоянием индикаторов: первый индикатор «выбран», а второй находится в «промежуточном» состоянии
Состояния вех флажков могут быть считаны в цикле, просматривающим весь список.
Например, если список CheckListBox1 предназначен для выбора параметров фильтрации, то перед тем, как осуществлять собственно фильтрацию, полезно вывести на экран вспомогательное сообщение, в котором записывается список выбранных параметров. Воспользуемся системным диалогом MessageDlg, который выдает строку сообщения, записанную в параметре «FilterString», а также набор кнопок, предлагаемых пользователю для выбора дальнейших действий (конструкция процедуры MessageDlg рассматривается только в самых общих чертах). Фрагмент программы, обеспечивающий сборку нужной строки, может быть записан так:
{AnsiString FilterString;
int i;
FilterString="";
for (i=0;i<=CheckListBox1->Count-1;i++)
{ if (CheckListBox1->Checked[i]==true)
// если индикатор в состоянии «выбран», то
//к строке FilterString присоединяется русское
//наименование этого пункта CheckListBox1->Items->Strings[i]
FilterString=FilterString+» «+CheckListBox1->Items->Strings[i];
// конец опреатора if
}//конец цикла по i
MessageDlg("Выбраны признаки фильтрации: \n"+ FilterString+" \n Фильтровать ? ", mtConfirmation, TMsgDlgButtons() << mbYes << mbNo,0);
}//конец программы
Результат работы программы представлен на рис. 12.
Рис. 12. Результат анализа всех пунктов списка CheckListBox при выборе только одного флажка
Если выбрать несколько флажков, то строка – список параметров будет длиннее (рис. 13).
Рис. 13. Результат анализа пунктов списка CheckListBox при выборе нескольких флажков
В компоненте CheckListBox имеется также событие OnClickCheck, возникающее при каждом изменении пользователем состояния индикатора. Его можно использовать для обработки результатов изменения.
Наряду с списком индикаторов CheckListBox, можно использовать и отдельные, не объединённые в список флажки CheckBox. В принципе их использование практически не отличается от работы со списком, за исключением естественного отсутствия индекса в указателе индикатров.