Павлодар облысының білім беру басқармасы
Жаяу Мұса атындағы Ақсу колледжі
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
по выполнению лабораторных работ
по предмету «Алгоритмизация и программирование»
специальности «Вычислительная техника и программное обеспечение»
Преподаватель: Исаханова Ж.Г.
Аксу, 2018
Методические указания составила: преподаватель специальных дисциплин специальности «Вычислительная техника и программное обеспечение Исаханова Ж.Г.
Методическое пособие создано для использования преподавателями и учащимися специальности «Вычислительная техника и программное обеспечение» в технических и профессиональных учебных заведениях при выполнении лабораторных работ по предмету «Основы алгоритмизации и программирования».
Одобрен цикловой методической комиссией_спецдисциплин энергетического отделения
Протокол № ____1_____ “__29__”___марта _________ 2017 г
Руководитель цикловой методической комиссии ______ Исаханова Ж.Г.
Методист колледжа: ______________Д.И.Адильжанова
СОДЕРЖАНИЕ
1. | Введение |
2. | Лабораторные работы №1-39 |
3. | Заключение |
4. | Использованная литература |
ВВЕДЕНИЕ
Дисциплина «Алгоритмизация и программирование» предусматривает изучение языков программирования для современных ПК, при подготовке специалистов 1304000 «Вычислительная техника и программное обеспечение».
В соответствии с квалификационной характеристикой специалист в области программирования для ЭВМ и автоматизированных систем должен уметь разрабатывать алгоритмы и программы для решения различных задач на языках программирования.
Программа курса «Основы алгоритмизации и программирования» состоит из 5-и разделов и предусматривает проведение 39 лабораторных работ.
Раздел 1 Основы программирования. Работа в консольном режиме Delphi
Раздел 2 Основные компоненты Delphi. Структурированные типы и их реализация в Delphi
Раздел 3 Файлы.
Раздел 4 Графика и мультимедиа
Раздел 5 Разработка приложений баз данных.
Лабораторные работы является неотъемлемой частью основной образовательной программы профессионального образования и эффективной формой профессиональной подготовки квалифицированных кадров технического и обслуживающего труда к профессиональной деятельности.
Лабораторные работы направлены на подготовку обучающихся к осознанному и углубленному изучению общепрофессиональных и специальных дисциплин, привитие им практических профессиональных компетенций, умений и навыков по избранной специальности.
Пособие можно использовать на уроках, а также для работы учащихся дома.
Лабораторная работа № 1
Тема: Составление алгоритмов и построение блок-схем линейной структуры.
Цель работы: овладение навыками алгоритмизации и построения блок-схем для задач линейной структуры.
Задание для самостоятельной подготовки
- Изучить:
- Что такое алгоритм, типы структур алгоритмов
- Алгоритм линейной структуры
- Правила построения блок-схемы
- Основные элементы блок-схемы
- Выявить все переменные и их типы для решения задачи
- Разработать алгоритм решения в соответствии с заданием
Задание к работе:
- Составить блок-схему в соответствии с вариантом, указанным в таблице:
Вариант задания | Задание |
А) Составить блок-схему для пересчета веса из фунтов в килограммы (один фунт равен 4,095 кг).Б) Составить блок-схему для вычисления объема поверхности шара: V=3/4 πr3 | |
А) Составить блок-схему для вычисления площади прямоугольника.Б) Составить блок-схему для пересчета температуры из шкалы Цельсия в шкалу Фаренгейта ( 0F = 0C*1,8+32). | |
А) Составить блок-схему для пересчета расстояния из мили в километры (один км = 1,6 мили).Б) Составить блок-схему для вычисления площади треугольника: s = ah/2, где а – длина основания треугольника, h – его высота. | |
А) Составить блок-схему для пересчета расстояния из километров в версты (одна верста равна 1,0668 км).Б) Составить блок-схему для вычисления площади трапеции: s = (a + b / 2)*h, a и b – длины оснований, h – высота трапеции. | |
А) Составить блок-схему для вычисления площади круга: S=πr2Б) Составить блок-схему для вычисления тока по известным значениям напряжения и сопротивления электрической цепи | |
А) Составить блок-схему для вычисления площади поверхности цилиндра: S=2πr(h+r).Б) Составить блок-схему для вычисления сопротивления электрической цепи по известным значениям напряжения и силы тока. | |
А) Составить блок-схему для вычисления объёма цилиндра: V=πr2h.Б) Составить блок-схему для вычисления сопротивления электрической цепи, состоящей из двух параллельно соединенных резисторов: | |
А) Составить блок-схему для вычисления объема поверхности шара: V=3/4 πr3Б) Составить блок-схему для вычисления стоимости покупки некоторого количества (по весу) помидоров | |
А) Составить блок-схему для пересчета сопротивления электрической цепи из омов в килоомы.Б) Составить блок-схему для вычисления стоимости покупки нескольких тетрадей, карандашей и линейки | |
А) Составить блок-схему для вычисления значения функции y = -2,7x3 + 0,23x2 – 1,4.Б) Составить блок-схему для пересчета байтов в биты. |
- Оформить лабораторную работу на листах А4 по следующим пунктам:
- Тема лабораторной работы;
- Цель лабораторной работы;
- Задание, соответствующее варианту;
- Переменные и их типы в соответствии с заданием;
- Алгоритм решения в соответствии с заданием;
- Блок-схема решения в соответствии с заданием;
- Вывод.
Контрольные вопросы
- Какие типы переменных Вы знаете? Перечислите их.
- Зарисуйте основные элементы блок-схемы и расскажите, что они означают.
- Что такое алгоритм, зачем он необходим при разработке программы?
Лабораторная работа № 2
Тема: Решение задачи на работу с вещественным типом данных.
Цель работы: овладение практическими навыками разработки и программирования вычислительного процесса линейной структуры, навыками использования математических функций в языке Паскаль и навыками по отладке и тестированию программ.
Задание для самостоятельной подготовки
- Изучить:
- Запись констант, переменных, стандартных функций
- Арифметический оператор присваивания
- Правила записи арифметических выражений
- Математические функции и процедуры
- Организацию простейшего ввода – вывода данных
- Разработать алгоритм решения в соответствии с заданием
- Составить программу решения задачи
- Подготовить текстовый вариант исходных данных и вычислить для них вручную значения вычисляемых в программе величин.
Задание к работе:
- 1. Выполнить на ЭВМ программу в соответствии с вариантом, указанным в таблице:
Вариант задания | Расчетные формулы | Значения исходных данных |
a = (2cos(x — p/6))/(1/2 + sin2y)b = 1 + z2 / (3 + z2/5) | x = 1,426y = -1,220z = 3,5 | |
a = |x2 — |b = (y-x) | x = 1,825y = 18,225z = -3,298 | |
S = 1 + x + x2/2! + x3/3! + x4/4!P = x (sin x3 + cos2 y) | x = 0,335y = 0,025 | |
y = e-bt sin (at+b) — |bt+a|s = b sin (at2 cos 2t) — 1 | a = -0.5, b = 1.7t = 0.44 | |
w = -b2 sin3 (x+a)/xy = cos2 x3 – x / | a = 1.5b = 15.5x = -2.9 | |
s = x3 tg2 (x+b)2 + a /q = | a =16.5b = 3.4x = 0.61 | |
R = x2 (x+1) / b – sin2 (x+a)S = + cos2 (x+b)3 | a = 0.7, x = 0.5,b = 0.05 | |
y = sin3 (x2+a)2 -z = x2/a + cos (x+b)3 | a = 1.1, x = 0.2,b = 0.004 | |
f =z = m cos (bt sin t)+ c | m = 2, c = -1,t = 1.2, b = 0.7 | |
f = ln (a+x2) + sin2 (b/x)z = e-xc | a = 10.2,b = 9.2,x = 2.2,c = 0.5 |
- 2. Проверить правильность ввода программы и при необходимости скорректировать ее.
- 3. Оформить лабораторную работу на листах А4 по следующим пунктам:
- Тема лабораторной работы;
- Цель лабораторной работы;
- Задание, соответствующее варианту;
- Алгоритм решения в соответствии с заданием;
- Описание работы программы;
- Листинг программы;
- Вывод.
Контрольные вопросы
- Какие типы величин используются в языке программирования?
- Какие имена переменных допустимы в программе?
- Назвать последовательность действий при выполнении арифметического оператора присваивания. Допустимо ли использование величин разных типов в арифметическом выражении?
- Указать старшинство выполнения операций при вычислении арифметического выражения.
Лабораторная работа № 3
Тема: Решение задачи на ввод, вывод данных.
Цель работы: овладение практическими навыками разработки и программирования вычислительного процесса линейной структуры, навыками по отладке и тестированию программ. Овладение навыками алгоритмизации и программирования задач диалогового типа; знакомство с особенностями организации ввода и вывода в диалоговых программах.
Задание для самостоятельной подготовки
- Изучить:
- Запись констант, переменных
- Арифметический оператор присваивания
- Правила записи арифметических выражений
- Организацию простейшего ввода – вывода данных
- Разработать алгоритм решения в соответствии с заданием
- Составить программу решения задачи
- Подготовить текстовый вариант исходных данных и вычислить для них вручную значения вычисляемых в программе величин.
Задание к работе:
- 1. Выполнить на ЭВМ программу в соответствии с вариантом, указанным в таблице:
Вар | Задание |
1. | Составить программу для вычисления объема поверхности шара: V=3/4 πr3 |
2. | Составить программу для вычисления сопротивления электрической цепи, состоящей из двух параллельно соединенных резисторов: |
3. | Составить программу для вычисления сопротивления электрической цепи по известным значениям напряжения и силы тока. |
4. | Составить программу для вычисления тока по известным значениям напряжения и сопротивления электрической цепи. |
5. | Составить программу для вычисления объема поверхности шара: V=3/4 πr3 |
6. | Составить программу для вычисления объёма цилиндра: V=πr2h. |
7. | Составить программу для вычисления площади поверхности цилиндра: S=2πr(h+r). |
8. | Составить программу для вычисления площади круга: S=πr2 |
9. | Составить программу для вычисления площади трапеции: s = (a + b / 2)*h, a и b – длины оснований, h – высота трапеции. |
10. | Составить программу для вычисления площади треугольника: s = ah/2, где а – длина основания треугольника, h – его высота. |
- 2. Проверить правильность ввода программы и при необходимости скорректировать ее.
- 3. Оформить лабораторную работу на листах А4 по следующим пунктам:
- Тема лабораторной работы;
- Цель лабораторной работы;
- Задание, соответствующее варианту;
- Алгоритм решения в соответствии с заданием;
- Описание работы программы;
- Листинг программы;
- Вывод.
Контрольные вопросы
- Каким образом можно ввести числовые значения переменных?
- Объясните различия в работе операторов Write и WriteLn, Read и ReadLn.
- Каким образом задается формат вывода изображения целого и вещественного числа?
Лабораторная работа № 4
Тема: Программирование алгоритмов разветвляющей структуры. Программирование с помощью инструкции CASE. Создание меню.
Цель работы: овладение практическими навыками разработки, программирования вычислительного процесса разветвляющейся структуры
Задание для самостоятельной подготовки
- Изучить возможности языка программирования для реализации:
- Условной передачи управления
- Вычислительного процесса разветвляющейся структуры
- Разработать алгоритм решения в соответствии с заданием
- Составить программу решения задачи
- Подготовить тесты (число тестов равно числу ветвей вычислительного процесса) для проверки правильности функционирования программы.
Задание к работе:
- 1. Выполнить на ЭВМ программу в соответствии с вариантом, указанным в таблице:
Вариант | Задание |
Составить программу, с помощью которой вычисляется частное от деления двух чисел. Должна проверяться правильность введенных пользователем данных и, если они неверные (делитель равен нулю), выдавать сообщение об ошибке. | |
Составить программу вычисления стоимости покупки с учетом скидки. Скидка в 3 % предоставляется в том случае, если сумма покупки больше 1000 руб. | |
Составить программу вычисления стоимости покупки с учетом скидки. Скидка в 3 % предоставляется в том случае, если сумма покупки больше 500 руб., в 5 % -если сумма больше 1000 руб. | |
Составить программу, которая сравнивает два числа, введенных с клавиатуры. Программа должна указать, какое число больше, или, если числа равны, вывести соответствующее сообщение. | |
Составить программу, которая выводит пример на умножение двух однозначных чисел, запрашивает ответ пользователя, проверяет его и выводит сообщение «Правильно!» или «Вы ошиблись» и правильный результат. | |
Составить программу, которая выводит пример на вычисление (в пределах 100), запрашивает ответ пользователя, проверяет его и выводит сообщение «Правильно!» или «Вы ошиблись» и правильный результат. | |
Составить программу, которая проверяет, является ли четным введенное пользователем целое число. | |
Составить программу, которая проверяет, делится ли на три целое число, введенное с клавиатуры. | |
Составить программу решения квадратного уравнения. Программа должна проверять правильность исходных данных и в случае, когда коэффициент при второй степени неизвестного равен нулю, вводить соответствующее сообщение об ошибке. | |
Составить программу проверки знания даты основания Санкт-Петербурга. В случае неверного ответа пользователя программа должна выводить правильный ответ (Санкт-Петербург основан в 1703 году). |
- 2. Проверить правильность ввода программы и при необходимости скорректировать ее.
- 3. Оформить лабораторную работу на листах А4 по следующим пунктам:
- Тема лабораторной работы;
- Цель лабораторной работы;
- Задание, соответствующее варианту;
- Алгоритм решения в соответствии с заданием;
- Описание работы программы;
- Листинг программы;
- Вывод.
Контрольные вопросы
- Перечислить действия, реализуемые при выполнении условного оператора.
- Что такое вычислительный процесс разветвляющейся структуры?
- Как организовать разветвление вычислений: а) на две ветви; б) на три ветви?
- Зачем необходимо при отладке тестировать все ветви алгоритма?
- Перечислить действия, реализуемые при выполнении оператора CASE.
Лабораторная работа № 5
Тема: Решение задачи на работу с множеством.
Цель работы: овладение практическими навыками разработки и программирования вычислительного процесса с множеством, навыками по отладке и тестированию программ. Овладение навыками алгоритмизации и программирования задач диалогового типа; знакомство с особенностями организации множества в программах.
Задание для самостоятельной подготовки
- Изучить:
- Запись констант, переменных
- Перечисляемый тип
- Тип диапазон
- Множество
- Условной передачи управления
- Вычислительного процесса разветвляющейся структуры
- Разработать алгоритм решения в соответствии с заданием
- Составить программу решения задачи
- Подготовить текстовый вариант исходных данных и вычислить для них вручную значения вычисляемых в программе величин.
Задание к работе:
- Выполнить на ЭВМ программу в соответствии с вариантом, указанным в таблице:
Вариан | Задание |
Написать программу создания меню. В меню имеется семь пунктов, при выборе которых экран закрашивается в цвет, соответствующий названию выбранного пункта. | |
Написать программу определения стоимости разговора по телефону с учетом скидки, предоставляемой соответственно следующей таблице.Время разговораСкидка, %000 — 60040600 — 90010900 — 2000-2000 — 240020Исходными данными для программы являются время разговора (относительно суток) и продолжительность разговора | |
Написать программу, которая запрашивает у пользователя номер дня недели и выводит одно из сообщений: «Рабочий день», «Суббота» или «Воскресенье». В случае если пользователь укажет недопустимое число, программа должна вывести сообщение » Ошибка ввода данных». | |
Написать программу, которая запрашивает у пользователя номер месяца и выводит соответствующее название времени года. В случае если пользователь укажет недопустимое число, программа должна вывести сообщение » Ошибка ввода данных». | |
Написать программу, вычисляющую стоимость междугороднего телефонного разговора (цена одной минуты определяется расстоянием до города, в котором находится абонент). Исходными данными для программы являются код города и продолжительность разговора.ГОРОДКОДЦена за минуты, тенгеПавлодар318210,5Москва09570Аксу2375,8Алматы327211,6 | |
Написать программу создания меню. Программа должна вычислять площади прямоугольника, квадрата и круга. Создать в меню соответствующие пункты для вычисления площадей. | |
Написать программу создания меню. Программа должна умножать, делить или суммировать введенных пользователем два числа. Создать в меню соответствующие пункты для вычисления. | |
Написать программу определения стоимости разговора по телефону с учетом скидки 10%, предоставляемой по субботам, и 20% — по воскресеньям. Исходными данными для программы являются номер дня недели и продолжительность разговора. | |
Написать программу тестирования ученика. Программа должна вывести 5 вопросов, которые имеют 3 варианта ответа. После каждого вопроса пользователь вводит номер ответа, а программа подсчитывает количество баллов и выводит в конце программы оценку. | |
Написать программу создания меню. Программа должна переводить байты в килобайты, мегабайты и в биты. Создать в меню соответствующие пункты для вычисления. |
- 2. Проверить правильность ввода программы и при необходимости скорректировать ее.
- 3. Оформить лабораторную работу на листах А4 по следующим пунктам:
- Тема лабораторной работы;
- Цель лабораторной работы;
- Задание, соответствующее варианту;
- Алгоритм решения в соответствии с заданием;
- Описание работы программы;
- Листинг программы;
- Вывод.
Контрольные вопросы
- Перечислить действия, реализуемые при выполнении оператора CASE.
- Что такое вычислительный процесс разветвляющейся структуры?
- Зачем необходимо при отладке тестировать все ветви алгоритма?
Лабораторная работа № 6
Тема: Решение задачи с применением оператора цикла с параметром и перечисляемым типом
Цель работы: овладение практическими навыками разработки и программирования циклической структуры, получение дальнейших навыков по отладке и тестированию программы.
Задание для самостоятельной подготовки
- Изучить:
- Организацию циклов с помощью инструкции FOR
- Возможности языка программирования для реализации вычислительных процессов циклической структуры с известным числом повторений в цикле
- Разработать алгоритм решения в соответствии с заданием
- Составить программу решения задачи
- Подготовить тесты (число тестов равно числу ветвей вычислительного процесса) для проверки правильности функционирования программы.
Задание к работе:
- 1. Выполнить на ЭВМ программу в соответствии с вариантом, указанным в таблице:
Вариант | Задание |
Написать программу, которая выводит таблицу квадратов первых десяти целых положительных чисел. | |
Написать программу, которая выводит сумму первых N целых положительных целых чисел. Количество суммируемых чисел должно вводиться с клавиатуры. Результат необходимо вывести на экран. | |
Написать программу, которая выводит таблицу степеней двойки (от нулевой до десятой). | |
Написать программу, которая вычисляет факториал числа, введенного с клавиатуры. Факториал числа N называется произведение целых чисел от 1 до N. Например, факториал 1! = 1 а, 8!=40320. | |
Написать программу, которая выводит 10 случайных чисел в диапазоне от 1 до 10, выводит эти числа на экран и вычисляет их среднее арифметическое. | |
Написать программу, которая выводит на экран таблицу умножения, например, на 7. Цифру, на которую выводите таблицу умножения необходимо ввести в начале программы с клавиатуры. | |
Напишите программу, которая выводит на экран изображение шахматной доски. Четные клетки отображать «звездочкой», белые пробелом. | |
Написать программу, которая преобразует введенное пользователем десятичное в двоичное. | |
Написать программу, которая выводит таблицу квадратов первых пяти целых положительных нечетных чисел. | |
Написать программу, которая вычисляет сумму первых N членов ряда 1, 3, 5, 7, … Количество суммируемых членов ряда вводятся с клавиатуры. Результат необходимо вывести на экран. |
- 2. Проверить правильность ввода программы и при необходимости скорректировать ее.
- 3. Оформить лабораторную работу на листах А4 по следующим пунктам:
- Тема лабораторной работы;
- Цель лабораторной работы;
- Задание, соответствующее варианту;
- Алгоритм решения в соответствии с заданием;
- Описание работы программы;
- Листинг программы;
- Вывод.
Контрольные вопросы
- Указать последовательность действий, выполняемых при организации циклических участков программы с заданным числом повторений.
- Указать назначение и правила организации циклов
Лабораторная работа № 7
Тема: Решение задачи с применением оператора цикла итерационного типа
Цель работы: овладение практическими навыками разработки и программирования алгоритмов итерационной циклической структуры, получение дальнейших навыков по отладке и тестированию программы.
Задание для самостоятельной подготовки
- Изучить:
- Организацию циклов с помощью инструкций WHILE и REPEAT
- Возможности языка программирования для реализации вычислительных процессов циклической структуры с неизвестным числом повторений в цикле
- Организацию итерационных циклов
- Разработать алгоритм решения в соответствии с заданием
- Составить программу решения задачи
- Подготовить тесты (число тестов равно числу ветвей вычислительного процесса) для проверки правильности функционирования программы.
Задание к работе:
- 1. Выполнить на ЭВМ программу в соответствии с вариантом, указанным в таблице:
Вариант задания | Сумма членов ряда | Значение | Точность вычисления |
1. | S = | 0,20 | 10-5 |
2. | S = | 0,10 | 0,5*10-4 |
3. | S = | 0,12 | 10-4 |
4. | S = | 0,7 | 10-4 |
5. | S = 4 () | p | 10-4 |
6. | S = | 1,5 | 0,5*10-3 |
7. | S = | 1,7 | 10-3 |
8. | S = | 0,75 | 0,5*10-3 |
9. | S = | 0,20 | 10-4 |
10. | S = | 0,30 | 10-5 |
- 2. Проверить правильность ввода программы и при необходимости скорректировать ее.
- 3. Оформить лабораторную работу на листах А4 по следующим пунктам:
- Тема лабораторной работы;
- Цель лабораторной работы;
- Задание, соответствующее варианту;
- Алгоритм решения в соответствии с заданием;
- Описание работы программы;
- Листинг программы;
- Вывод.
Контрольные вопросы
- Указать последовательность действий, выполняемых при организации циклических участков программы с неизвестным числом повторений.
- Указать назначение и правила организации циклов
- Что такое итерационный циклический процесс? Его отличия от цикла с заданным числом повторений.
- Каково условие выхода из цикла при вычислении значения суммы бесконечного ряда?
Лабораторная работа №8
Тема: Решение задачи на создание и уничтожение объекта
Цель: Научиться создавать и уничтожать объекты в среде программирования Delphi
Проект №1. «Моя первая программа».
Постановка задачи:
- 1. Создать программу, позволяющую установить текст на форму «Я программирую на Делфи». Создать звучащую кнопку.
- 2. Проверить правильность ввода программы и при необходимости скорректировать ее.
- 3. Оформить лабораторную работу на листах А4 по следующим пунктам:
- Тема лабораторной работы;
- Цель лабораторной работы;
- Задание, соответствующее варианту;
- Алгоритм решения в соответствии с заданием;
- Описание работы программы;
- Листинг программы;
- Вывод.
Пояснения к проекту:
В проекте на форме будет присутствовать кнопка, при нажатии на которую будет появляться текст. Причём данная кнопка при нажатии должна издавать звук.
В проекте познакомимся с:
- основными этапами программирования в среде Delphi;
- модификацией пустой формы;
- сохранением проекта;
- динамическим и статическим изменением свойств компонентов в проекте;
- реакцией на события;
- компиляцией программы.
- Модификация пустой формы.
- Настройка Delphi.
- Модификация пустой формы.
С самого начала работы над новой программой Delphi создаёт минимально необходимый код, обеспечивающий её нормальное функционирование в операционной системе. Прежде чем создавать новый проект рекомендуется создать для него новый каталог (папку) и нужным образом настроить Delphi. Например, для всех проектов создадим сначала папку Проекты, а в ней уже будем создавать папки с соответствующими названиями: Моя первая программа, Арифметика и т. д.
Далее желательно внести изменения в стандартную настройку среды Delphi. Это необходимо для того, чтобы среда автоматически сохраняла на диске последнюю версию создаваемой нами программы. Выполните следующие действия:
- выберите опцию меню Tools / Environment Options;
- перейдите на вкладку Preferences;
- в левом верхнем углу страницы в группе Autosave Options активизируйте переключатели Editor Files и Desktop. Это приведёт к автоматическому сохранению текста окна кода программы и общего расположения окон Delphi перед началом очередного прогона создаваемой программы;
- в группе Compiling and Running активизируйте переключатели Show Compiler Progress для того, чтобы следить за ходом компиляции.
Для того чтобы использовать комментарии на русском языке в окне кода программы необходимо выполнить следующие действия:
- выберите опцию Tools / Editor Options;
- перейдите на страницу Display;
- в строке Editor Font установите Courier New Cyr.
- Сохранение проекта и имена в Delphi.
При работе в среде Delphi также как и в других приложениях операционной системы необходимо выполнить сохранение проекта. Причём сохранение необходимо выполнить дважды: при первом сохранении сохраняется сам код программы, а при втором проект:
- выполните команду File – Save As…;
- создайте новый каталог для проекта;
- введите имя для проекта, состоящее из латинских букв;
- выполните команду OK;
- выполните сохранение проекта командой File – Save Project As…;
- введите имя проекта латинскими буквами.
Delphi не признаёт ни русских, ни французских имён, другими словами не признаёт имена, в которых присутствуют символы, отличные от латинских букв, цифр и знака подчёркивания. Также имена не могут состоять из нескольких слов, если всё же необходимо указать имя, состоящее из нескольких слов, то используйте следующий пример: MY_FIRST_UNIT, MOY_PERVIJ_MODUL.
- Изменение свойств формы.
Попробуем изменить свойства формы нашего готового проекта. Начнём с заголовка окна формы. По умолчанию, заголовок окна совпадает с заголовком формы Form1. Чтобы изменить заголовок, нужно обратиться к инспектору объектов. Для этого:
- щёлкните на любом месте окна формы проекта;
- обратитесь к инспектору объектов и выберите свойство Cartion, характеризующее заголовок объекта;
- удалите в правом поле от названия свойства текст Form1;
- введите Моя первая программа.
Если выполнить прогон программы, т. е. нажать клавишу F9, или выполнить команду Run на панели инструментов, то вы увидите результат ваших изменений. Форма проекта будет носить имя Моя первая программа.
Таким образом, можно изменить любое другое свойство формы.
- Размещение нового компонента и задание для него свойств.
Для размещения нового компонента на форме необходимо выбрать (щёлкнуть левой кнопкой мыши) его на палитре компонентов, а затем щёлкнуть мышью по точке рабочего пространства формы, где должен располагаться левый верхний угол компонента.
Рис. 1.1. Размещение компонента Label1 на форме.
Установим компонент Label1 (метка), предназначенный для размещения различного рода надписей:
- перейдите на страницу палитры компонент Standard;
- выберите (щёлкните левой кнопкой мыши) компонент Label1;
- установите выбранный компонент на форме (щёлкните левой кнопкой мыши в рабочем пространстве формы, рисунок 1.1.);
- активизируйте компонент Label1 (выделите компонент);
- в окне инспектора объектов выберите свойство Caption;
- задайте заголовок компоненту Я программирую на Delphi;
- выберите свойство Font и с помощью кнопки в правой части строки раскройте диалоговое окно настройки шрифта. Задайте параметры шрифта метки.
- Реакция на события.
Функциональность программы определяется совокупностью её реакций на те или иные события. В связи с этим каждый компонент помимо свойств характеризуется также набором событий, на которые он может реагировать.
Для того чтобы проследить работу того или иного события установим на форме создаваемого проекта новый компонент – кнопку – и заставим её откликаться на событие, связанное с нажатием левой кнопки мыши.
Для того, чтобы распознать нужный компонент на палитре, необходимо подвести курсор к пиктограмме на палитре компонентов и произвести зависание курсора, всплывает подсказка с названием компонента.
Компонент кнопка Button1 изображается пиктограммой на странице Standard палитры компонентов. Поместите этот компонент на форму и расположите его ниже метки посередине формы (рисунок 1.2.).
Рис. 1.2. Форма со вставленной кнопкой.
При щелчке по кнопке мышью в работающей программе возникает событие OnClick (По щелчку). Пока это событие никак не обрабатывается программой, и поэтому «нажатие» кнопки не приведёт ни к каким последствиям. Чтобы заставить программу реагировать на нажатие кнопки, необходимо написать на языке Object Pascal фрагмент программы, который называется обработчиком события.
Этот фрагмент должен представлять собой последовательность текстовых строк, в которых программист указывает, что именно должна делать программа в ответ на нажатие кнопки. Фрагмент оформляется в виде специальной подпрограммы языка – процедуры.
Чтобы заставить Delphi самостоятельно создать заготовку для процедуры обработчика события OnClick, дважды подряд без заметной паузы щёлкните мышью по вновь вставленному компоненту. В ответ Delphi активизирует окно кода, в котором размещён текстовый фрагмент:
procedure TForm1. Button1Click (Sender: TObject);
begin
end;
Слово procedure извещает компилятор о начале подпрограммы – процедуры. За ним следует имя процедуры TForm1. Button1Click. Это имя – составное: оно состоит из имени класса TForm1 и собственно процедуры Button1Click.
begin
end;
Вся строка в целом
procedure TForm1. Button1Click (Sender: TObject);
называется заголовком процедуры. Её завершает символ «;». Этот символ играет важную роль в ObjectPascal, т. к. показывает компилятору на конец предложения языка. Из отдельных предложений составляется весь текст программы. В конце каждого предложения нужно ставить точку с запятой – это обязательное требование синтаксиса языка.
Три следующие строки определяют тело процедуры:
begin
end;
Слово begin (начало) сигнализирует компилятору о начале последовательности предложений, описывающих алгоритм работы процедуры, а слово end (конец) – о конце этой последовательности. В данный момент тело процедуры пока ещё не содержит описания, каких – либо действий. Наполнение тела процедуры нужными предположениями – задача программиста.
Каждый раз при нажатии кнопки Button1 управление будет передаваться в тело процедуры, а значит, между словами begin и end можно написать фрагмент программы, который будет выполняться в ответ на это событие.
Для примера можно сделать кнопку звучащей. Между строками begin и end впишите следующее предложение:
procedure TForm1. Button1Click (Sender: TObject);
begin
end;
Далее скомпилируйте программу клавиши F9. Теперь в ответ на нажатие кнопки в динамике компьютера будет раздаваться звуковой сигнал, т. к. вставленная строка реализует обращение к стандартной процедуре, которая умеет извлекать из динамика различные стандартные для операционной системы звуки.
- Динамическое изменение свойств компонента.
Поскольку кнопка Button1 способна звучать, целесообразным было бы изменить её надпись: вместо умалчиваемой надписи Button1, которую автоматически формирует Delphi по имени компонента, назовём кнопку, например, «Звук». Проще всего это сделать с помощью окна формы и Инспектора объектов, т. е. на этапе конструирования формы (для этого нужно изменить свойство Cartion компонента Button1 в окне Инспектора объектов). Такое изменение называется статистическим, а изменение в ходе прогона программы – динамическим. Для динамического изменения нужно создать обработчик события OnCreate (По созданию) для формы и изменить в нём это свойство.
Событие OnCreate возникает после создания Windows – окна, но до появления этого окна на экране. Чтобы создать обработчик события необходимо:
- раскрыть список компонентов в верхней части Инспектора объектов;
- выбрать компонент Form1;
- раскрыть страницу Events (События) в Инспекторе объектов;
- дважды щёлкнуть по свойству OnCreate (щёлкать нужно по правому полю от свойства OnCreate);
- Delphi активирует окно кода с заготовкой для процедуры TForm1. FormCreate;
- Нужно отредактировать код процедуры следующим образом:
procedure TForm1. FormCreate (Sender: TObject);
begin
Button1. Cartion: =’Звук’;
end;
Вставленная строка представляет собой, так называемый оператор присваивания языка ObjectPascal. В левой части оператора указывается свойство Button1. Cartion, а в правой – значение «Звук». Связывает обе части комбинация «:=» – присвоить значение. Эти символы всегда пишутся раздельно, хотя до и после них можно устанавливать пробелы. Как и любое другое предложение, оператор присваивается, заканчивается точкой с запятой.
Составное имя Button1. Cartion необходимо для точного указания компилятору, о каком свойстве идёт речь. Присваиваемое свойству значение является текстовой строкой. По правилам языка текстовая строка должна обрамляться с двух сторон апострофами. Внутри апострофов можно написать любое количество произвольных символов – именно они будут определять новую надпись на кнопке.
После очередной компиляции программы имя кнопки в работающей программе меняется. Таким образом, любое свойство компонента можно изменять динамически, т. е. в ходе изменения программы.
Контрольные вопросы
- Перечислите этапы разработки программ в ООП
- Дайте понятие класса и объекта
- Перечислите основные принципы ООП
Лабораторная работа № 9.
Тема: Решение задачи на создание и уничтожение объекта с помощью конструкторов и деструкторов
Цель: Научиться работать в среде Delphi с объектами
Постановка задачи:
- 1. Аналогично предыдущему заданию получить на форме текст «Я программирую на DELPHI» и создать возможность вывода произвольного текста в работающей программе.
- 2. Проверить правильность ввода программы и при необходимости скорректировать ее.
- 3. Оформить лабораторную работу на листах А4 по следующим пунктам:
- Тема лабораторной работы;
- Цель лабораторной работы;
- Задание, соответствующее варианту;
- Алгоритм решения в соответствии с заданием;
- Описание работы программы;
- Листинг программы;
- Вывод.
Пояснение к проекту:
Прокомментируем задачу. Будем создавать проект аналогично предыдущему проекту. На форме поместим три кнопки, каждая из которой будет выполнять определённую функцию:
- при щелчке на первой кнопке, которую назовём Пример 1, на форме выводится текст «Программирование на Делфи»;
- при щелчке по второй кнопке Пример 2 выходит диалоговое окно, в поле которого можно поместить текст. Введённый текст отобразится на форме проекта;
- щелчок по кнопке Результат выводит сообщение в окне;
- щелчок по кнопке Выход завершит работу проекта.
Для решения поставленной задачи разместим на форме следующие компоненты с палитры (рисунок 2.1.):
- Button1 со страницы Standard;
- Button2 со страницы Standard;
- Button3 со страницы Standard;
- BitBtn1 со страницы Additional.
Рис. 2.1. Конструирование формы проекта.
После конструирования формы (установка компонентов на форме) устанавливаем свойства для компонентов проекта в соответствии с приведёнными таблицами.
Свойства для объекта Form1.
Свойство | Значение |
Cartion | Проект 2 |
Height | 375 |
Width | 544 |
Position | poScreenCenter |
Свойство Position (Позиция) определяет положение формы на экране после компиляции. Значение poScreenCenter размещает форму в центре экрана. Свойства Height – высота окна формы, Width – ширина окна формы.
Свойства для объекта Button1.
Свойство | Значение |
Cartion | Пример 1 |
Cursor | crHandPoint |
Width | 100 |
Height | 35 |
Font | Жирный курсив, 12 пт |
Hint | Кликните левой кнопкой мыши |
ShowHint | True |
Свойство Cursor (Курсор) определяет форму указателя мыши при наведении курсора на данный объект. В данном случае значение crHandPoint – указатель принимает форму руки при наведении указателя на компонент Button1.
Свойство Hint (подсказка) содержит подсказку, которая всплывает при наведении указателя мыши на данный момент. Подсказка представляет собой поле жёлтого (по умолчанию) цвета, на котором отображается текст, поясняющий использование или назначение компонента. Однако для того чтобы подсказка всплывала, необходимо указать в свойстве ShowHint (показать подсказку) значение True.
Свойство Font – выбор параметров шрифта.
Диалог выбора названия (гарнитуры) и других параметров шрифта обеспечивает изменение свойства Font (шрифт) для любого визуального компонента, обладающего этим устройством, например, формы или метки. В Delphi диалог выбора параметров шрифта реализует компонент FontDialog. Окно диалога представлено на рисунке 2.2.
Рис. 2.2. Диалоговое окно параметров шрифта.
Основными свойствами диалога FontDialog являются следующие:
- Font типа TFont – определяет параметры шрифта. Управление параметрами шрифта осуществляется через него подсвойства, из которых являются подсвойства Name, Style, Size, Color;
- MaxFontSize типа Integer – ограничивает доступный в диалоге максимальный размер шрифта. Свойство активно, если установлен параметр fdLimitSize;
- MaxFontSize типа Integer – ограничивает доступный в диалоге минимальный размер шрифта. Свойство активно, если установлен параметр fdLimitSize;
- Device типа TFontDialogDevice – указывает тип устройства, для которого устанавливается шрифт, и может принимать одно из трёх значений:
- fdScreen – вывод на экран;
- fdPrinter – вывод на принтер;
- fdBoth – вывод на экран и принтер;
- Option типа TFontDialogOptions – используется для настройки отдельных параметров диалога. Свойство Option включает свыше полутора десятка параметров, к числу важнейших из которых относятся следующие:
— fdEffects – отображение группы переключателей атрибутов (подчёркнутый и зачёркнутый) и списка цветов;
— fdLimitSize – активизация свойств MaxFontSize и MinFontSize, приводящая к установлению для размеров шрифта допустимого диапазона;
— fdTrueTypeOnly – отображение в списке только шрифтовTrueType;
— fdWysiwyg – отображение в списке шрифтов, одновременно доступных и для экрана и для принтера.
По умолчанию включён параметр fdEffects.
Пример 2.1. Использование диалога FontDialog.
If FontDialog. Execute then Label1. Font: = FontDialog1;
С помощью диалога выбора шрифтов выполняется задание шрифта надписи Label1.
Свойства для объекта Button2. (см. для Button1, кроме)
Свойство | Значение |
Cartion | Пример 1 |
Свойства для объекта Button3. (см. для Button1, кроме)
Свойство | Значение |
Cartion | Результат |
Свойства для объекта BitBtn1 из страницы Additional.
Свойство | Значение |
Kind | bkClose |
Width | 100 |
Height | 35 |
Font | Жирный курсив, 12 пт |
Hint | Выход из программы |
ShowHint | True |
Компонент BitBtn1 – командная кнопка с надписью и рисунком. Она представляет собой разновидность стандартной кнопки Button. Её отличительная особенность – свойство Glyph, с помощью которого определяется растровое изображение, рисуемое на поверхности кнопки. Свойство Kind определяет одну из 11 стандартных разновидностей кнопки, показанных на рисунке 2.3. Значение свойства Kind позволяет выйти из работающей программы.
Нажатие любой из представленных на рисунке кнопок, кроме bkCustom и bkHelp, закрывает модальное окно и возвращает в программу результат mrXXX: bkOk – mrOk, bkCancel – mrCansel и т. д. Как и в кнопках Button, программист не может управлять цветом поверхности кнопки, но в отличие от неё может применять цвет надписи на ней.
Рис. 2.3. Разновидности кнопок TBitBtn.
В результате конструирования и модификации проекта окно формы должно принять вид, представленный на рисунке 2.4.
Следующий этап создания проекта – это описание процедур для каждой кнопки Button использовать для вывода текста на форму следующий код:
procedure TForm1. Button1Click (Sender: TObject);
begin
Canvas. TextOut (150, 100, ‘Программирование на Delphi’);
end;
Функция Canvas.TextOut позволяет указать вывод текста на форму. В скобках координаты по осям x, y и содержание самого текста в апострофах. Текст ограничен по размерам.
Рис. 2.4. Окно формы после конструирования проекта в соответствии с таблицами 2.1. – 2.5.
В процедуре для события OnClick при нажатии кнопки Button2 использовать следующий код:
procedure TForm2. Button1Click (Sender: TObject);
var
s: string;
begin
s:= InputBox (‘Ввод значения’, ‘Введите слово’, ‘’);
Canvas. TextOut (100, 100, s);
end;
При написании процедуры необходимо описать все переменные, которые присутствуют в ней после ключевого слова var. В данном случае мы использовали переменную, которая содержит текст, поэтому отнесли её к типу string (строковая).
Если необходимо ввести целое число, используйте integer, дробное (вещественное) – real.
S – это строковая величина, которой присваивается значение вводимого слова.
Ввод данных из окна осуществляется вызовом функции InputBox. В общем виде инструкция ввода выглядит так:
Переменная: = InputBox (‘Заголовок’, ‘Подсказка’, ‘Значение’);
При компиляции программы щелчок на кнопке Пример 2 вызовет диалоговое окно, представленное на рисунке 2.5. Слово, введённое в данное поле окна, будет выведено на форму в точке с координатами 100*100.
Рис. 2.5. Диалоговое окно функции InputBox.
Значение функции строкового типа. Для получения значения числового типа, необходимо введённую строку (изображение числа) преобразовать в число при помощи соответствующей функции преобразования. Например, если в программе переменная t вещественного (real) типа или целого (integer), то инструкции могут выглядеть следующим образом:
S: = InputBox (‘’, ‘Введите значение переменной’, ‘’);
t: = StrtoFloat (s); // для Real или
t: = StrToInt (s); // для integer
Теперь можно вывести результат, предварительно разместив на форме ещё один компонент Button 3. При нажатии этой кнопки, программа выводит сообщение о ваших успехах. Процедура программы:
procedure TForm1. Button3Click (Sender: TObject);
begin
ShowMessage (‘Молодец! Вы успешно’+#13+ ‘осваиваете язык программирования’);
end;
ShowMessage – функция вывода сообщения, содержащегося в скобках.
+#13+ – код конца строки и перехода на следующую. Он используется, если сообщение слишком длинное.
Полная запись этой функции: ShowMessage (‘текст сообщения’);
Если текст по размерам велик, то можно разделить данный текст на две строки в окне сообщения с помощью кода конца строки и перехода на следующую. Рассмотрим на примерах.
Пример 2.2. Функция ShowMessage (‘текст сообщения’);
выводит следующее окно сообщения, представленное на рисунке 2.6.
Рис. 2.6. Окно сообщения в одну строку.
Пример 2.3. Функция ShowMessage (‘Молодец! Вы успешно’+#13+ ‘осваиваете язык программирования’);
выводит следующее окно:
Рис. 2.7. Окно сообщения с разрывом текста в две строки.
Контрольные вопросы
- Назовите пять уровней инкапсуляции
- С помощью каких методов можно создать и удалить объект?
- Как работают конструктор и деструктор
- Как динамически конструируются объекты
Литература
Бобровский С. «Delphi 7 Учебный курс»
Лабораторная работа № 10.
Тема: Решение задачи на создание наследника
Цель: Научиться работать в среде Delphi с объектами
Проект «Приветствие».
Постановка задачи:
- 1. Создать программу, с помощью которой можно после запуска программы, щёлкнув мышью по кнопке «Приветствие» вывести сообщение «Первые успехи!». Для выхода из программы необходимо щёлкнуть мышью на Выход.
- 2. Проверить правильность ввода программы и при необходимости скорректировать ее.
- 3. Оформить лабораторную работу на листах А4 по следующим пунктам:
- Тема лабораторной работы;
- Цель лабораторной работы;
- Задание, соответствующее варианту;
- Алгоритм решения в соответствии с заданием;
- Описание работы программы;
- Листинг программы;
- Вывод.
Технология выполнения проекта:
Для решения поставленной задачи разместите на форме компоненты в соответствие с рисунком 3.1.
Рис. 3.1. Конструирование формы проекта.
Для создания проекта понадобятся компоненты, которые представлены в таблице 3.1. В этой же таблице приведено назначение каждого компонента.
Таблица 3.1.
Компоненты для проекта и их назначение.
Компоненты | Назначение |
Label1 | Для размещения текстовой строки «Первые успехи». |
Button1 | Для вывода метки Label1. |
Button2 | Для выхода и проекта. |
Рис. 3.2. Готовое окно проекта «Приветствие».
Установите свойства для компонентов проекта в соответствии с приведённой таблицей.
Таблица 3.1.
Компоненты проекта и их свойства.
Компонент | Свойство | Значение |
Form1 | Caption | Приветствие |
Height | 250 | |
Width | 200 | |
Position | poScreenCenter | |
Color | clMoneyGreen | |
Label1 | Caption | Удалите содержимое |
Button1 | Caption | Приветствие |
Button2 | Caption | Выход |
Свойство Color (Цвет) управляет цветом формы.
После того, как определили свойства для компонентов, необходимо описать процедуры для кнопок проекта Приветствие и Выход.
Определим выполняемые функции для кнопок. Значит, по нажатию кнопки Приветствие на форме выходит текстовая строка с надписью «Первые успехи». По нажатию кнопки Выход мы выходим из проекта.
Для кнопки Приветствие (компонент Button1) выполните следующие действия:
- выделите компонент Button1;
- перейдите в окно инспектора объектов и выберите страницу Events;
- запустите событие OnClick (дважды щёлкните по правому полю от данного события);
- поместите в процедуру следующую строку:
Label1. Caption: = ‘Первые успехи’;
- в целом процедура должна выглядеть следующим образом:
procedure TForm1. Button1Click (Sender: TObject);
begin
Label1. Cartion: = ‘Первые успехи!’;
end;
Для кнопки Выход (компонент Button2) выполняем аналогичные действия, но в процедуре помещаем следующую строку:
close;
В целом процедура должна выглядеть следующим образом:
procedure TForm1. Button1Click (Sender: TObject);
begin
close;
end;
Дополнительные задания к проекту:
- Сделать шрифт выводимой реплики отличным от стандартного по виду, цвету и размеру.
Подсказка. Для метки в Object Inspector справа от свойства Font щёлкнуть мышкой дважды.
- Заменить простую кнопку Выход на более привлекательную кнопку.
Подсказка. Для замены кнопки надо удалить существующую, а другую найти в палитре компонентов на странице Additional – BitBtn. Затем изменить её вид в свойстве Kind.
- Сделать так, чтобы при запуске проекта на экране вместо названия Label1 появляется текст Первые успехи!, а после нажатия кнопки Приветствие появлялось новое сообщение Первые и не последние!
Подсказка. Изменить свойство Caption и для события OnClick внести изменения.
- Запустить исполняемый файл данного проекта не в среде Delphi, а в Windows.
Подсказка. Выйти из Delphi в Windows. Использовать диспетчер программ или проводник Windows.
Контрольные вопросы
- В чем заключается принцип ООП наследование
- С помощью каких методов можно создать и удалить объект?
- Назовите основные принципы ООП
Литература
Бобровский С. «Delphi 7 Учебный курс»
Дополнительное задание к лабораторной №10
Проект «Диалог»
Постановка задачи:
Создать программу, после запуска, которой пользователь вводит своё имя, например, Дархан, в прямоугольник с мигающим текстовым курсором и нажимает клавишу Enter (см. рисунок 4.1.).
Появляется вопрос: «Дархан, ты любишь читать?». Если пользователь нажмёт на кнопку Да, то должна появиться реплика: «Молодец!», если он нажмёт на кнопку Нет, то появится реплика: «Почему же? Надо читать».
Для выхода из программы необходимо щёлкнуть мышью на кнопке Выход.
Рис. 4.1. Окно проекта Диалог.
Пояснения к проекту:
Новым в этой программе является строка ввода Edit на странице палитры компонентов Standard, обработка события строки ввода – OnKeyPress и свойство активности компонента Enabled.
Однострочный редактор или строка редактирования, представляет собой поле ввода информации, в котором возможно отображение и изменение текста. В Delphi имеется несколько однострочных редакторов, из них наиболее часто используемым является компонент Edit.
Компонент Edit позволяет вводить с клавиатуры и редактировать различные символы, при этом поддерживаются операции, такие как перемещение по строке с использованием клавиш управления курсором, удаление символов с помощью клавиш <Backspace> и <Delete>, выделение части текста и др. Отметим, что однострочный редактор не реагирует на управляющие клавиши <Enter> и <Esc>.
Для изменения регистра символов в строке редактирования служит свойство CharCase типа TEditCharCase, которое может принимать одно из трёх значений:
- ecLowerCase – символы текста преобразуются в символы нижнего регистра;
- ecNormal – регистр символов не изменяется (по умолчанию);
- ecUpperCase – символы текста преобразуются в символы верхнего регистра.
При использовании компонента Edit для ввода пароля можно воспользоваться свойством Passwordchar типа char, которое задаёт символ для отображения в поле ввода. Этот символ при вводе текста появляется вместо фактически введённой информации. Например, после выполнения операторов:
Edit1. Passwordchar: = ‘*’;
Edit1. Text: = ‘Пароль’;
в строке редактирования появится строка ******, в то время как в действительности свойство Text имеет значение пароль.
По умолчанию свойство Passwordchar имеет значение #0, и в строке редактирования отображается реально выведенная информация.
Компонент MaskEdit также представляет собой Однострочный редактор, но по сравнению с компонентом Edit он дополнительно предоставляет возможность ограничения вводимой информации по шаблону. С помощью шаблона (маски) можно ограничить число вводимых пользователем символов, тип вводимых символов (алфавитный, цифровой и т. д.). Кроме того, во вводимую информацию можно вставить дополнительные символы (разделители при вводе даты, времени и т. д.). С помощью редактирования по маске удобно вводить телефонные номера, даты, почтовые индексы и другую информацию заранее определённого формата.
Маска задаётся в свойстве EditMask типа string. Она представляет собой последовательность специальных кодов, определяющих для строки редактирования формат. Содержащегося в ней текста. Для составления маски можно использовать редактор шаблонов (Input Mask Editor). Редактор шаблонов вызывается двойным щелчком в поле значения свойства EditMask.
Для проверки вводимой информации можно использовать обработчики событий нажатия клавиш, например, обработчик события OnKeyPress.
Визуальные компоненты способны генерировать и обрабатывать достаточно большое количество (несколько десятков) событий различных видов. К наиболее общим группам событий можно отнести следующие:
- выбор управляющего элемента;
- перемещение указателя мыши;
- нажатие клавиши клавиатуры;
- получение и потеря управляющим элементов фокуса ввода;
- перемещение объектов методом drag – and – drop.
При выборе управляющего компонента возникает событие OnClick типа TNotifyEvent, которое также называют событием нажатия. Обычно оно возникает при щелчке кнопкой мыши на компоненте. При разработке приложений событие OnClick является одним из наиболее широко используемых.
При работе с клавиатурой генерируются события OnKeyPress и OnKeyDown, возникающие при нажатии клавиши, а также событие OnKeyUp, возникающее при отпускании клавиши. При нажатии клавиши события возникают в следующем порядке: OnKeyDown, OnKeyPress, OnKeyUp.
При удерживании клавиши нажатой непрерывно генерируется событие OnKeyDown, событие OnKeyUp происходит только после отпускания клавиши.
Событие OnKeyPress типа TKeyPressEvent генерируется при каждом нажатии алфавитно – цифровых клавиш. Обычно оно обрабатывается тогда, когда требуется реакция на нажатие одной клавиши.
Параметр Key содержит код ASCII нажатой клавиши, который может быть проанализирован и при необходимости изменён. Если параметру Key задать значение ноль (#0), то это соответствует отмене нажатия клавиши.
Пример 4.1. Обработчик события OnKeyPress редактора.
procedure TForm1. Edit1OnKeyPress (Sender: TObject; var Key: Char);
begin
if Key = ‘!’ then Key: = #0;
end;
Здесь при редактировании содержимого редактора Edit1 пользователю запрещён ввод символа «!».
Пример 4.2. Ограничение набора символов, вводимых в редактор.
procedure TForm1. Edit1OnKeyPress (Sender: TObject; var Key: Char);
begin
if (Key < ‘0’) or (Key > ‘9’) then Key: = #0;
end;
Здесь для редактора Edit1 установлено разрешение ввода только цифр.
В поле редактирования может содержаться одна строка, не имеющая символа конца, поэтому при нажатии клавиши <Enter> не выполняются никакие действия и в строку ничего не выводится. При необходимости программист должен сам кодировать действия, связанные с нажатием клавиши <Enter>. Чаще всего нажатие клавиши <Enter> является признаком окончания информации в поле редактора, и необходимо перейти к другому акта управления, то есть передать ему фокус ввода, например с помощью метода SetFocus или установки значения свойства ActiveControl.
Пример 4.3. Задание реакции однострочного редактора на нажатие клавиши <Enter>.
procedure TForm1. Edit1OnKeyPress (Sender: TObject; var Key: Char);
begin
if Key = #13 then
begin
Key: = #0;
Form1. ActiveControl: = Edit2;
end;
end;
procedure TForm1. Edit2OnKeyPress (Sender: TObject; var Key: Char);
begin
if Key = #13 then
begin
Key: = #0;
Edit3. SetFocus;
end;
end;
procedure TForm1. Edit3OnKeyPress (Sender: TObject; var Key: Char);
begin
if Key = #13 then
then Key: = #0;
end;
Информация последовательно вводится в три поля: Edit1, Edit2, Edit3. При окончании ввода в первое или второе поля по нажатию клавиши <Enter> автоматически активизируется очередное поле. Из третьего поля фокус ввода автоматически не передаётся. Передача фокуса из разных полей показана двумя способами: с использованием свойства ActiveControl формы и с помощью метода SetFocus.
Часто при окончании ввода в элемент редактирования и переходе к следующему (в порядке табуляции) управляющему элементу более удобным является использование разделяемого обработчика события, связанного с нажатием клавиши <Enter>. Эта процедура должна быть общей для всех элементов редактирования и может содержать следующий код:
procedure TForm1. AllEditKeyPress (Sender: TObject; var Key: Char);
begin
if Key = #13 then
begin
Form1. SelectNext (Sender as TWinControl, true, true);
Key: = #0;
end;
end;
При нажатии клавиши <Enter> выполняется метод SelectNext, передающий фокус следующему управляющему элементу. Процедура SelectNext (CurControl: GoForward, CheckTabStop: Boolean) имеет три параметра. Параметр CurControl указывает оконный управляющий элемент, относительно которого выполняется передача фокуса. Параметр GoForward определяет направление передачи фокуса. Если его значение равно True, то фокус получает следующий управляющий элемент, в противном случае – предыдущий управляющий элемент. Параметр CheckTabStop определяет, нужно ли учитывать значение свойства TabStop управляющего элемента, который должен получить фокус ввода. При значении параметра, равном True, управляющий элемент получит фокус в случае, если свойство TabStop имеет значение True.
В качестве ещё одного варианта обработки нажатия клавиши <Enter> использовать процедуру обработки события OnKeyPress самой формы, которой находятся элементы редактирования. Свойству KeyPreview устанавливает значение True, чтобы обработчик формы получал сообщение о нажатии клавиш первым. Процедура – обработчик может иметь следующий вид:
procedure TForm1. FormKeyPress (Sender: TObject; var Key: Char);
begin
if Key = #13 then
begin
Form1. SelectNext (Form1. ActiveControl as TWinControl, true, true);
Key: = #0;
end;
end;
Аналогичным образом можно выполнить обработку нажатия клавиши <Esc> и других.
Технология разработки проекта:
Разместите на форме компоненты в соответствии с рисунком 4.2.
Рис. 4.2. Конструирование окна формы проекта.
Настройте свойства компонентов в соответствии с таблицей
Таблица компонентов и их свойства для проекта.
Выделенный компонент | Имя свойства | Действие |
BitBtn1 | Caption | &Выход |
Kind | bkClose | |
Label1 | Caption | Введи своё имя и нажми Enter |
Button1 | Caption | Да |
Button2 | Caption | Нет |
Edit1 | Text | Удалите содержимое |
Label2 | Удалить заголовок | |
Label3 | Удалить заголовок |
Событие OnClick кнопки Да (компонент Button1) содержит следующий код:
procedure TForm1. Button1Click (Sender: TObject);
begin
Label3. Caption: = ‘Молодец!’;
Button1. Visible: = false;
Button2. Visible: = false;
Label2. Visible: = false;
end;
Данная процедура при нажатии кнопки Да выполняет следующее:
- присваивает заголовок для метки (компонент Label1) Молодец!;
- прячет кнопки Button1, Button2 и метку Label2.
Аналогичные действия производит нажатие кнопки Нет. Событие OnClick кнопки Нет (компонент Button2) содержит следующий код:
procedure TForm1. Button2Click (Sender: TObject);
begin
Label3. Cartion: = ‘Почему же? Надо читать.’;
Button1. Visible: = false;
Button2. Visible: = false;
Label2. Visible: = false;
end;
Для события OnKeyPress поля ввода имени (компонент Edit) поместим следующий код:
procedure TForm1. Edit1KeyPress (Sender: TObject; var Key: Char);
begin
if Key = #13 then
begin
Label2. Caption: = Edit1. Text + ‘ты любишь читать?’;
Button1. Visible: = false;
Button2. Visible: = false;
Label2. Visible: = false;
Label3. Visible: = false;
end;
end;
Данная процедура означает, что при нажатии клавиши <Enter> программа выполняет следующие действия:
- присваивает заголовок второй метке Имя пользователя + «ты любишь читать?»;
- показывает на форме кнопки Button1, 2, метки Label 1,2.
Дополнительные задания к проекту:
- Сделать кнопки Да и Нет доступными только после ввода имени и нажатия клавиши Enter.
Пояснения. Свойство Enabled типа Boolean определяет активность компонента, т. е. его способность реагировать на поступающие сообщения, например, от мыши или клавиатуры. Если свойство имеет значение True (по умолчанию), то компонент активен, в противном случае не активен. Неактивное состояние выделяется цветом, при этом заголовок или текст неактивного компонента становится бледным.
Компонент может быть отключён (заблокирован), например, в том случае, когда какая – либо связанная с ним команда в настоящий момент не может быть выполнена. Так, при нажатии кнопки с именем btnPrint должен печататься документ. Если загруженных документов нет, то кнопку нужно временно сделать неактивной:
btnPrint. Enabled: = false;
Подсказка. В Object Inspector свойству Enabled кнопок Да и Нет придать значение False, а в процедуру Edit1KeyPress включить код:
Button1. Enabled: = true;
Button2. Enabled: = true;
- Выполнить сброс значений компонентов Edit1, Labe2, Labe3 для обеспечения возможности повторить диалог.
Подсказка. Разместить на форме ещё одну кнопку BitBtn. Свойству Kind придать значение bkRetry, а свойству Caption – &Повторить. Ввести программно пустые строки в свойства указанных компонентов по нажатию кнопки Повторить:
Label2. Caption: = ‘’;
Label3. Caption: = ‘’;
Edit1. Text: = ‘’;
- Сделать так, чтобы при повторении диалога строка ввода была бы снова активной.
Пояснения. Форма, как контейнер, содержит в себе другие управляющие элементы. Оконные элементы управления могут получать фокус ввода (фокус). Свойство ActiveControl типа TWinControl определяет, какой элемент на форме находится в фокусе. Для выбора элемента, находящегося в фокусе ввода (активного элемента), можно устанавливать этому свойству нужное значение в процессе выполнения программы, например, Form1. ActiveControl: = Edit1;
Подсказка. Ввести в обработчик события по щелчку для кнопки Повторить следующую строку.
Form1. ActiveControl: = Edit1;
Листинг программы проекта.
После всех действий в целом весь код программы проекта выглядит следующим образом:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialog,
Button, StdCtrls;
type
TForm1 = class (TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Button1. TButton;
Button2. TButton;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
procedure Button1Click (Sender: TObject);
procedure Button2Click (Sender: TObject);
procedure Edit1KeyPress (Sender: TObject; var Key: Char);
procedure BitBtn2Click (Sender: TObject);
private
{Private declarations}
public
{Public declarations}
end;
var
Form1: TForm1;
implementation
{SR*.DFM}
procedure TForm1. Button1Click (Sender: TObject);
begin
Label 3. Caption: = ‘Молодец!’;
Button 1.Visible: = false;
Button 2. Visible: = false;
Label 2. Visible: = false;
end;
procedure TForm1. Button2 Click (Sender: TObject);
begin
Label 3. Caption: = Почему же? Надо читать.’;
Button 1.Visible: = false;
Button 2. Visible: = false;
Label 2. Visible: = false;
end;
procedure TForm1. Edit1KeyPress (Sender: TObject; var Key: Char);
begin
If key = #13 then
begin
Label 2. Caption: = Edit1. Text + ‘ты любишь читать?’;
Button 1.Visible: = true;
Button 2. Visible: = true;
Label 2. Visible: = true;
Label 3. Visible: = true;
Button1. Enabled : = true;
Button2. Enabled : = true;
end;
end;
procedure TForm1. BitBtn2Click (Sender: TObject);
begin
Label 2. Caption: = ‘ ‘;
Label 3. Caption: = ‘ ‘;
Edit1. Text : = ‘ ‘;
Form1. ActiveControl : = Edit1;
end;
end.
Лабораторная работа № 11
Проект 5. «Арифметика»
Тема: Решение задачи на перегружаемые и виртуальные методы
Цель: Научиться работать в среде Delphi с объектами
Постановка задачи:
- 1. Даны два действительных числа a,b. Вычислить их сумму, разность, произведение и частное.
- 2. Проверить правильность ввода программы и при необходимости скорректировать ее.
- 3. Оформить лабораторную работу на листах А4 по следующим пунктам:
- Тема лабораторной работы;
- Цель лабораторной работы;
- Задание, соответствующее варианту;
- Алгоритм решения в соответствии с заданием;
- Описание работы программы;
- Листинг программы;
- Вывод.
Пояснения к задаче
Для решения поставленной задачи необходимо отметить, что нам понадобятся:
- Поля для ввода (числа a и b) и вывода (сумма, разность, произведение и частное)
значений;
- Метки для указания назначения каждого поля;
- Кнопка для вычисления;
- Кнопка для выхода из проекта.
Технология разработки проекта
- Создайте новый проект для данной задачи.
- Установите на форме компоненты в соответствии с рисунком 5.1:
Рис. 5.1. Конструирование формы проекта «Арифметика»
В таблице 5.1 приведены названия компонентов, присутствующих на форме, и их назначение.
Таблица 5.1
Компоненты для проекта и их назначение
Компоненты | Назначение |
Edit 1 | Поле для ввода значения а |
Edit 2 | Поле для ввода значения b |
Button 1 | Для вычисления суммы, разности, произведения и частного введенных значений |
Edit 3 | Поле вывода суммы |
Edit 4 | Поле вывода разности |
Edit 5 | Поле вывода произведения |
Edit 6 | Поле вывода частного |
Label 1, 2, 3, 4, 5, 6 | Метка для подписи полей и вывода данных |
BitBtn1 | Для выхода из проекта |
- Установите свойства для компонентов в соответствии с таблицами 5.2 – 5.5.
Таблица 5.2
Свойства для объекта Form1
Свойство | Значение |
Caption | Арифметика |
Height | 375 |
Width | 244 |
Position | poScreenCenter |
Таблица 5.3
Свойства для объекта Button1
Свойство | Значение |
Caption | Вычислить |
Cursor | crHandPoint |
Width | 120 |
Height | 35 |
Hint | Кликните левой кнопкой мыши |
ShowHint | True |
Таблица 5.4
Свойства для объекта Edit 1, 2, 3, 4, 5, 6
Свойство | Значение |
Text | Удалите содержимое |
Width | 75 |
Height | 25 |
Таблица 5.5
Значение свойства Caption у следующих компонентов:
Компонент | Значение |
Label 1 | Введите значение а |
Label 2 | Введите значение b |
Label 3 | Сумма |
Label 4 | Разность |
Label 5 | Произведение |
Label 6 | Частное |
После модификации форма должна приобрести вид, представленный на рисунке 5.2.
Рис. 5.2. Готовая форма проекта «Арифметика»
- В процедуру обработки события OnClick компонента Button 1 запишите следующий код (фигурные скобки и все, что находится за ними – это пункты комментариев, их писать не нужно):
procedure TForm1. Button1Click (Sender: TObject);
var
a, b, sum, razn, proizv: integer; a
del:real;
begin
Editl.setfocus; б
а: = StrToInt (Edit 1. Text); в
b: = StrToInt (Edit 2. Text);
sum: = a+b;
razn: = a-b; г
proizv: = a*b;
del: = a/b;
Edit 3. Text: = IntToStr (sum);
Edit 4. Text: = IntToStr (razn);
Edit 5. Text: = IntToStr( proizv); д
Edit 6. Text: = IntToStr (del);
end;
Комментарии к процедуре программы:
а) После ключевого слова var описываем все переменные, которые участвуют в программе.
У нас имеются две переменные a,b – значения, которые вводятся программистом в соответствующие поля. Далее по условию нам необходимо вычислить сумму, которую обозначили sum, разность – razn, произведение – proizv, частное – del.
Каждая переменная определяется типом. По условию задачи даны два действительных числа, поэтому их описываем как переменные целого типа, т.е. a, b: integer. Поскольку сумма, разность, произведение целых чисел в результате дает целое число, то их тоже можно отнести к переменным целого типа, т.е. sum, razn, proizv: integer. При делении же целых чисел иногда получаются дробные числа, поэтому частное опишем как переменную вещественного типа, т.е. del:real;
б) Edit1.setfocus – фокус ввода устанавливается в компонент edit1, т.е. в поле ввода значения а;
в) а: = StrToInt (Edit 1. Text)
— а – значение переменной первого вводимого числа;
— : = — знак присваивания;
— StrToInt – функция преобразования переменной из строкового типа в целый тип. Так как все данные, вводимые в поле Edit1, являются строковыми, то данная функция преобразовывает их в число для последующих вычислений;
— Edit 1. Text – имя компонента, в которое вводятся данные;
г) вычислительные операции;
д) Edit 3. Text: = IntToStr (sum);
— Edit 3. Text – имя компонента, в который осуществляется вывод результата. В данной строке вывод получившейся суммы;
— : = — знак присваивания;
— IntToStr – функция преобразования переменной целого типа в строковый. Поскольку переменная del вещественного типа (real), то функция преобразования из вещественного в строковый тип выглядит следующим образом: FloatToSt;
— sum – результат вычисления суммы чисел;
- 5. Скомпилируйте программу и проверьте вычисления.
Контрольные вопросы
- В чем заключается принцип ООП полиморфизм?
- Какие методы называются виртуальными?
- Какие методы называются динамическими?
- Назовите основные принципы ООП
Литература
Бобровский С. «Delphi 7 Учебный курс»
Лабораторная работа № 12
Тема: Знакомство со средой Delphi
Цель: Научиться работать в среде Delphi с объектами
Проект «Учебная программа»
Постановка задачи:
- 1. Создать программу, которая позволит из однострочной текстовой строки переносить её содержимое в многострочный редактор.
- 2. Проверить правильность ввода программы и при необходимости скорректировать ее.
- 3. Оформить лабораторную работу на листах А4 по следующим пунктам:
- Тема лабораторной работы;
- Цель лабораторной работы;
- Задание, соответствующее варианту;
- Алгоритм решения в соответствии с заданием;
- Описание работы программы;
- Листинг программы;
- Вывод.
Пояснения к задаче
В данном проекте мы познакомимся с новыми компонентами Panel и Memo. Также научимся задавать другие имена для компонентов и работать с ним.
Панель
Панель представляет собой контейнер, в котором можно размещать другие элементы управления. Панели применяются в качестве визуальных средств группирования, а также для создания панелей инструментов и строк состояния. Для работы с панелями в Delphi предназначен компонент Panel.
Панель имеет край с двойной фаской: внутренней и внешней. Внутренняя фаска обрамляет панель, а внешняя отображается вокруг внутренней.
Ширина каждой фаски в пикселях задается свойством Bevel Width типа ТBeve.lWidth. Значение типа ТBevelWidth представляет собой целое число (ТBevelWidth= 1 ….MaxInt). По умолчанию ширина фаски равна 1.
Свойства ТBevelInner и ТBevelOuter типа TPanelBevel определяют вид внутренней и внешней фаски соответственно. Каждое из свойств может принимать следующие значения:
- bvNone – фаска отсутствует;
- bvLowered – фаска утоплена;
- bvRaised – фаска приподнята;
- bSpace – действие неизвестно.
По умолчанию свойство BevelInner имеет значение ВvNone, а свойство BevelOuter – значение ВvRaised.
Между фасками может быть промежуток, ширина которого в пикселях определяется свойством Border Width типа TBorder Width. По умолчанию ширина промежутка равна нулю, т.е. промежуток отсутствует.
Многострочный редактор
Для работы с многострочным текстом Delphi предоставляет компонент Memo. Многострочный редактор имеет практически те же возможности редактирования текста, что и однострочные элементы редактирования. Главное отличие этих управляющих элементов заключается в тои, что многострочный редактор содержит несколько строк.
Для доступа ко всему содержимому многострочного редактора используется свойство Text типа String. В этом случае содержимое компонента Memo представляется одной строкой, причем символ конца строки, вводимый при нажатии клавиши <Enter>, представляется двумя кодами # 13#10, и видимых пользователем символов будет меньше, чем их содержится в строке Text. Эту особенность нужно учитывать, например, при определении позиции заданного символа в какой-либо строке компонента Memo.
Для работы с отдельными строками используется свойство Lines типа TStrings. Класс TStrings специально создан для выполнения операций со строками и имеет различные свойства и методы. Компонент Memo может использовать возможности этого класса через свойство Lines.
Пример 6.1. Операции с многострочным редактором.
Memo1. Lines [3] : = ‘asd’;
Memo2. Lines.Clear;
Memo3. Lines.Add (‘Новая строка’);
Здесь четвертой строке редактора Memo1 присваивается новое значение. Отметим, что в классе TString нумерация строк начинается с нуля. Содержимое редактора Memo2 полностью очищается. В конец текста редактора Memo3 добавляется новая строка.
Содержимое компонента Memo можно загружать из текстового файла и сохранять в текстовом файле. Для этого удобно использовать методы LoadFromFile (const FileName: String) и LoadFromFile (const FileName: String) класса TStrings. Параметр FileName методов определяет текстовый файл для операций чтения и записи.
Пример 6.2. Чтение информации из текстового файла в компонент Memo1.
Memo1. Lines. LoadFromFile ( ‘ С : \TEXT\ examplel. txt ‘ );
Пример 6.3. Запись информации из компонента Memo2 в текстовый файл.
Memo2. Lines.SaveToFile ( ‘ С : \TEXT\ example2. txt’ );
Для того, чтобы информацию было удобно просматривать, можно задать в поле редактирования полосы прокрутки с помощью свойства ScrollBars типа TScrollStyle, принимающего следующие значения:
- ssNone – полосы прокрутки отсутствуют (по умолчанию);
- ssHorizontal – снизу имеется горизонтальная полоса прокрутки;
- ssVertical – справа имеется вертикальная полоса прокрутки;
- ssBoth – есть обе полосы прокрути.
Текст в поле компонента Memo может быть выровнен различными способами. Способ выравнивания определяет свойство Alignment типа ТAlignment, которое может принимать одно из следующих значений:
- taLeftJustify – выравнивание по левой границе (по умолчанию);
- taCenter – выравнивание по центру;
- taRight Justify – выравнивание по правой границе.
В отличие от однострочного редактора, компонент Memo обладает возможностью реакции на нажатие клавиши <Enter>. Чтобы при этом происходил ввод новой строки свойству WantReturns типа Boolean должно быть установлено значение True (по умолчанию). В противном случае редактор не реагирует на нажатие клавиши <Enter>.
Технология разработки проекта
- Создайте новый проект для данной задачи и сохраните в отдельную папку под названием Ucheb_Prog.
- Установите на форме компоненты в соответствии с рисунком 6.1:
Компоненты для проекта и их назначение
Компоненты | Назначение |
Panel 1(разместите на любое место формы) | Для того, чтобы размещенные на ней кнопки, строка ввода и метка всегда располагались снизу |
BitBtn1 (разместите на любое место панели) | Для сообщения программе о подготовке текста в строке |
BitBtn2 (разместите на любое место панели) | Для выхода из программы |
Edit 1 (разместите на любое место панели) | Строка ввода одной строки |
Label 1 (разместите на любое место формы) | Для размещения коротких сообщений, которые будет формировать программа |
Memo1 (разместите на любое место формы) | Для вывода многострочных сообщений |
- Установите свойства для компонентов в соответствии с таблицами 6.2 – 6.8.
Таблица 6.2.
Свойства для объекта Form1
Свойство | Значение |
Caption | Учебная программа |
Height | 375 |
Width | 244 |
Position | poScreenCenter |
Font | Жирный, 10 |
Align | alCustom |
Свойство Align определяет выравнивание компонента внутри контейнера, в котором находится компонент. Чаще всего в роли такого контейнера выступает форма Form или панель Panel. Выравнивание используется в тех случаях, когда требуется, чтобы какой-либо интерфейсный элемент занимал определенное положение относительно содержащего его контейнера, независимо от изменения размеров последнего. Для некоторых компонентов, например, кнопки Button, это свойство доступно только во время выполнения программы.
Свойство Align может принимать одно из следующих значений:
- аlNone — выравнивание не используется. Компонент по умолчанию находится на том месте, куда был помещен при разработке приложения;
- аlTop – компонент перемещается в верхнюю часть контейнера, высота компонента не меняется, а его ширина становится равной ширине контейнера;
- аlBottom – аналогично действию аlTop, но компонент перемещается в нижнюю часть контейнера;
- аlLeft – компонент перемещается в левую часть контейнера, ширина компонента не меняется, его высота становится равной высоте контейнера;
- аlRight – аналогично действию аlLeft, но компонент перемещается в правую часть контейнера;
- аlClient – компонент занимает весь контейнер.
В нашем примере компонент будет развернут по центру экрана.
Свойства для объекта Panel 1
Свойство | Значение |
Caption | Удалить заголовок |
BevelOuter | BvNone |
Align | AlBottom |
Height | 84 |
Свойство Align указывает способ выравнивания размещаемого компонента относительно того контейнера, в котором он размещается. В данном случае мы задали выравнивание AlBottom (Внизу). После установки этого значения компонент прижимается к нижней границе формы и растягивается по всей её длине. Теперь панели и все размещённые на ней компоненты будут примыкать к нижнему краю окна, даже если окно распахивается на весь экран. Если бы мы разместили строку ввода и кнопки не на панели, а непосредственно на форме, они не имели бы свойства перемещения и оставались бы на своих местах при изменении размеров окна.
Чтобы панель и расположенная на ней метка воспринимались как единое целое, в свойстве BevelOuter(Внешняя кромка), панели установлено значение BvNone.
Свойства (Слева), (Сверху) и (Ширина) определяют положение левого верхнего угла компонента относительно такого же угла своего контейнера и его (компонента) ширину. Указанные в списке значения этих свойств для строки ввода обеспечивают симметричное по горизонтали расположение строки относительно сторон не распахнутого окна.
Свойства для объекта BitBtn (страница Addional).
Свойство | Значение BitBtn1 | Значение BitBtn2 |
Kind | BkOk | bkClose |
Left | 32 | 128 |
Name | bbRun | bbClose |
Top | 48 | 48 |
Свойство (Имя) определяет имя, под которым компонент будет известен программе (рекомендация называть компоненты исходя из функции её выполнения).
Для компонентов BitBtn1, 2 установлено свойство Kind (Сорт), которое определяет типовые функции, которые реализует кнопка в диалоговых кнопках.
Свойства для объекта Edit1 (страница Standard).
Свойство | Значение |
Name | EdInput |
Left | 128 |
Text | Удалить |
Width | 289 |
Top | 16 |
Свойство Text (Текст) у компонента Edit1 определяет текст, который будет содержать строка ввода в момент появления на экране. Следует очистить это свойство, чтобы начальный текст не мешал вводу данных для программы. Точно также нужно очистить свойство Caption у метки Label1 и Lines многострочного редактора Memo1.
Свойства для объекта Label1 (страница Standard).
Свойство | Значение |
Name | IbOutput |
Align | AlBottom |
Caption | Удалить |
Свойства для объекта Memo1 (страница Standard).
Свойство | Значение |
Name | mmOutput |
Align | alClient |
Lines | Удалить |
ScrolBars | ssBoth |
WordWrap | False |
Чтобы удалить содержимое свойства Lines нужно щёлкнуть по кнопке с тремя точками у этого свойства в Инспекторе объектов. Откроется диалоговое окно, в котором нужно удалить имеющийся текст.
Свойство ScrolBars имеет значение ssBoth (Оба). При таком значении среда Delphi поместит в редактор обе полосы прокрутки – вертикальную и горизонтальную. Наличие таких полос поможет увидеть текст, отсекаемый границы компонента.
Для свойства WordWrap (Перенос слов) установлено значение False. Это позволит не переносить слова на другую строку редактора.
Значение alClient свойства Align устанавливает размер компонента по всей незаполненной части формы независимо от размеров окна.
4.После преобразований форма должна принять вид, показанный на рисунке 6.2.
- 5. В процедуру обработки события OnClick компонента BitBtn1 запишите следующий код:
procedure TForm1. bbRunClick (Sender: TObject);
begin
IbOutput. Caption: = EdInput. Text;
// Повторяем текст в метке
mmOutput. Lines. add (EdInput. Text);
// и в многострочном редакторе
EdInput. Text: = ‘’;
// Очищаем строку ввода
EdInput. SetFocus;
// Передаём ей фокус ввода
end;
Все комментарии приведены после каждой строки кода после //. Этот текст можно писать и в конце строки кода процедуры, их программа не воспринимает за счёт указания двух косых чёрт.
Вводимый текст хранится в свойстве Text компонента EdInput. После выполнения первого оператора присваивания он будет перенесён в свойство Caption компонента IbOutput и тут же появится на экране над строкой ввода.
Многострочный редактор mmOutput способен сохранять и отображать на экране множество строк. Все они содержатся в его свойстве Lines, относящемуся к классу TstringList. Метод add класса TstringList добавляет новую строку к имеющемуся в Lines набору строк. Добавленная с помощью второго оператора строка тут же отображается на экране.
С помощью оператора:
EdInput. Text: = ‘’
строка ввода очищается и подготавливается к вводу нового текста. Двойной апостроф в правой части оператора указывает «пустую» строку или, что то же самое строку нулевой длины.
Завершает обработчик оператор EdInput. SetFocus;
с помощью, которого EdInput получает фокус ввода. Получить фокус ввода означает связать указанный компонент с клавиатурой. В окне программы может быть несколько компонентов, которые способны принимать и обрабатывать клавиатурный ввод. Каждый из компонентов имеет метод SetFocus, с помощью которого программа может передать компоненту контроль над клавиатурой.
Контрольные вопросы
- Сколько окон открывается при первом открытии Делфи?
- Опишите назначение окон Делфи?
- Как сохранить проект?
- Что такое компиляция и как скомпилировать проект?
Литература
Бобровский С. «Delphi 7 Учебный курс»
Лабораторная работа № 13
Тема: Решение задачи на линейные алгоритмы в среде Delphi
Цель: Научиться работать в среде Delphi с объектами
Проект «Произведение чисел».
Постановка задачи:
- 1. Создать программу, которая вычисляет и показывает произведение введённых целых чисел.
- 2. Проверить правильность ввода программы и при необходимости скорректировать ее.
- 3. Оформить лабораторную работу на листах А4 по следующим пунктам:
- Тема лабораторной работы;
- Цель лабораторной работы;
- Задание, соответствующее варианту;
- Алгоритм решения в соответствии с заданием;
- Описание работы программы;
- Листинг программы;
- Вывод.
Пояснения к задаче:
Для решения поставленной задачи воспользуемся уже готовым проектом «Учебная программа». Необходимо открыть данный проект и сохранить его в другой папке. Проект «Произведение чисел» создадим, лишь дополняя и внося, некоторые изменения в проект «Учебная программа».
Технология разработки проекта:
В данном проекте мы будем опираться на заготовку предыдущего проекта. Компоненты остаются всё те же, мы лишь внесём ряд дополнений и изменений.
Прежде всего, нужно рассмотреть те проблемы, с которыми мы можем столкнуться при разработке проекта. Во – первых, это как оповестить программу о вводе каждого из операндов. Во – вторых, что произойдёт, если пользователь введёт неверную запись числа.
Суть первой проблемы состоит в том, что учебная программа fmExample имеет только одну строку ввода и одну кнопку bbRun. Можно вставить в форму ещё одну кнопку. Тогда щелчок по первой кнопке будет сигналом о том, что в строке ввода подготовлен первый операнд, а щелчок по второй – что готов второй операнд и можно вычислять результат. В этом варианте следует предусмотреть случай, когда щелчок по второй кнопке будет предшествовать щелчку по первой и программа будет вычислять выражение с неопределённым первым операндом. Решение этой дополнительной проблемы состоит в том, чтобы сделать вторую кнопку недоступной или даже невидимой до тех пор, пока не будет введён первый операнд.
Таким образом, поместим на форму новую кнопку BitBtn так, чтобы она полностью перекрывала имеющуюся кнопку bbRun, и зададим ей имя bbResult (свойство Name). Установим сорт bkOk (свойство Kind) и сделаем её временно невидимой (поместить в свойство Visible значение False). После такой подготовки в момент начала работы новая кнопка не будет видна и не помешает пользователю щёлкнуть по кнопке bbRun и показать кнопку bbResult, чтобы пользователь смог подтвердить ввод второго операнда. Сделайте необходимые изменения формы для нового проекта.
Суть второй проблемы заключается в том, что пользователь может случайно или преднамерно ввести строку, которая не содержит правильного представления целого числа. Преобразование такой строки к целому числу может привести к аварийному завершению работы программы. Существует множество способов решения этой проблемы. Мы воспользуемся следующим: заменим обычный однострочный редактор edInput на специализированный, способный контролировать ввод пользователя. Удалите из формы редактор edInput (щёлкните по нему мышкой и нажмите клавишу Delete) и поместите на его место компонент MaskEdit (Страница Additional). Дайте ему прежнее имя edInput (свойство Name) и раскройте диалоговое окно свойства EditMask (рисунок 7.1.). Это свойство указывает маску компонента, т. е. определяет, какие символы и в какой последовательности может набирать пользователь в окне ввода.
Рисунок 7.1. Окно определения маски компонента MaskEdit.
В строке Input Mask введите #99999999; 1;
В окошке Character for Blanks вместо умалчиваемого символа заполнителя «_» укажите пробел и закройте окно кнопкой Ok. Сформированная нами маска заставит компонент автоматически контролировать ввод пользователя и отвергать любые символы кроме знаков + или – в первой позиции (элемент маски «#») и цифр (элементы «9»).
После внесения данных изменений остаётся изменить код программы для каждой кнопки.
Для кнопки bbResult в обработчик события по щелчку мыши OnClick нужно внести следующий код:
procedure TForm1. bbResulClickt (Sender: TObject);
// Обработка второго операнда
begin
// Преобразуем текст из edInput в целое число
y: = strtoint (Trim (edInput. Text));
// Сообщаем в Memo о вводе второго операнда
mmOutput. Lines. Add (‘2 – й операнд:’ + edInput. Text);
// Вычисляем и показываем результат
mmOutput. Lines. Add (‘Результат:’ + IntToStr (x) + ‘*’ + IntToStr (y) + ‘=’ + IntToStr (x*y));
// Очищаем ввод
edInput. Text: = »;
// возвращаем фокус
edInput. SetFocus;
IbOutput. Caption: = »;
bbResult. Hide;
// прячем кнопку bbResult
bbRun. Show;
// показываем кнопку bbRun
end;
Для кнопки bbRun в обработчик события по щелчку мыши OnClick нужно ввести следующий код:
procedure TForm1. bbRunClick (Sender: TObject);
// Обработка ввода первого операнда
begin
// Преобразуем текст из edInput в целое число
x: = strtoint (Trim (edInput. Text));
// Сообщаем в Memo о вводе первого операнда
mmOutput. Lines. Add (‘1 – й операнд:’ + edInput. Text);
edInput. Text: = »; // очищаем ввод
edInput. SetFocus; // возвращаем фокус
IbOutput. Caption: = ‘Введите 2 – й операнд’;
bbResult. Show; // показываем кнопку
bbRun. Hide; // прячем кнопку
end;
При активизации формы необходимо сразу передать фокус компоненту edInput для ввода первого операнда, поэтому событие OnActivate формы необходимо вписать следующие строки:
procedure TForm1. Form Activate (Sender: TObject);
// Подготовка к началу работы
begin
edInput. SetFocus; // передаем фокус редактору edInput
IbOutput. Caption: = ‘Введите 1 – й операнд’;
end;
В результате выполнения всех изменений форма принимает вид, представленный на рисунке 7.2.
Поскольку в нашей программе появились переменные х и у, необходимо описать их как переменные целого типа. Для того в самом начале окна кода программы разыщите строку
Private
{Private declarations}
И опишите здесь данные переменные следующим образом:
х, у : integer;
Таким образом, мы решили поставленную задачу, причем создали возможность вывода участвующих операндов в отдельное поле, что позволяет пользователю проследить ход решения задачи (см. рисунок 7.2).
Рис. 7.2. Окно работающего проекта «Произведение чисел»
Листинг всей программы проекта:
Unit Proizv;
Interface
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; Buttons; Extctrls; Mask;
Type
TForm1 = Class (TForm)
mmOutput: TMemo;
Panel 1 : TPanel;
bbRun : TBitBtn;
bbClose : TBitBtn;
IbOutput : TLabel;
bbResult : TBitBtn;
edInput : TMaskEdit;
procedure bbRunClick (Sender: TObject);
procedure bbResultClick (Sender: TObject);
procedure Form Activate (Sender: TObject);
Private
х, у : integer;
{Private declarations}
public
{Public declarations}
end;
var
Form1: TForm1;
implementation
{SR*.DFM}
procedure TForm1. bbRunClick (Sender: TObject);
// Обработка ввода 1-го операнда
begin
// Преобразуем текст из edInput в целое число
x: = strtoint (Trim (edInput. Text));
// Сообщаем в Memo о вводе 1-го операнда
mmOutput. Lines. Add (‘1 – й операнд:’ + edInput. Text);
edInput. Text: = »; // очищаем ввод
edInput. SetFocus; // возвращаем фокус компоненту
IbOutput. Caption: = ‘Введите 2 – й операнд’;
bbResult. Show; // показываем кнопку bbResult.
bbRun. Hide; // прячем кнопку bbRun
end;
procedure bbResultClick (Sender: TObject);
// Обработка второго операнда
begin
// Преобразование текста из edInput в целое число
у: = strtoint (Trim (edInput. Text));
// Сообщаем в Memo о вводе 2-го операнда
mmOutput. Lines. Add (‘2 – й операнд:’ + edInput. Text);
// Вычисляем и показываем результат
mmOutput. Lines. Add (‘результат:’ + IntToStr (x) + ‘*’ + IntToStr (y) + ‘=’ + IntToStr (x*y));
// Очищаем ввод
edInput. Text: = ‘ ‘;
// передаем фокус
edInput. SetFocus;
IbOutput. Caption: = ‘ ‘;
bbResult. Hide;
// прячем кнопку bbResult
bbRun. Show;
// показываем кнопку bbRun
end;
procedure ТForm1. FormActivate (Sender: TObject);
// подготовкакначалуработы
begin
edInput. SetFocus; // передаем фокус ввода редактору edInput
IbOutput. Caption: = ‘Введите 1 – й операнд’;
end;
end.
Контрольные вопросы
- Сколько окон открывается при первом открытии Делфи?
- Опишите назначение окон Делфи?
- Как сохранить проект?
- Что такое компиляция и как скомпилировать проект?
Литература
Бобровский С. «Delphi 7 Учебный курс»
Лабораторная работа № 14
Тема: Использование компонентов отображения
Цель: Научиться работать в среде Delphi с объектами
Проект «Угадай число»
Постановка задачи:
- 1. Создать программу, с помощью которой компьютер загадывает число. Пользователю необходимо угадать задуманное компьютером число. Число загадывается в диапазоне от 0 до 100. При этом, если пользователь не угадал число, программа должна выдать сообщение число больше или меньше задуманного. При угадывании числа спросить у пользователя о повторном загадывании.
- 2. Проверить правильность ввода программы и при необходимости скорректировать ее.
- 3. Оформить лабораторную работу на листах А4 по следующим пунктам:
- Тема лабораторной работы;
- Цель лабораторной работы;
- Задание, соответствующее варианту;
- Алгоритм решения в соответствии с заданием;
- Описание работы программы;
- Листинг программы;
- Вывод.
Пояснения к задаче:
Игра «Угадай число» программа случайным образом выбирает целое число в диапазоне от 0 до 100 и запоминает его. Пользователь пытается угадать его и вводит свое число в поле ввода (Edit 1). Сравнив ввод с запомненным числом (нажатие кнопки Button 1 для проверки введенного числа), программа выдает сообщение в многострочный редактор (Memo1) – больше, меньше или равно введенное число запомненному. Ввод продолжается до угадывания, после чего программа предлагает сыграть еще раз.
Технология выполнения проекта
Для решения поставленной задачи нам потребуются компоненты, перечисленные в таблице 8.1:
Таблица 8.1
Компоненты | Назначение |
Label 1 | Вывод комментария |
Button 1 | Проверка совпадения числа введенного пользователем и задуманного компьютером |
Edit 1 | Поле ввода числа для угадывания |
Memo1 | Вывод результатов угадывания числа |
Расположите компоненты на форме в соответствии с рисунком 8.1.
Рис. 8.1. Конструирование формы проекта.
После конструирования формы (установка компонентов на форме) устанавливаем свойства для компонентов проекта в соответствии с приведенными таблицами.
Таблица 8.2
Свойства для компонентов
Выделенный компонент | Свойство | Значение |
Form1 | Height | 360 |
Width | 360 | |
Font | Tahoma, жирный курсив, 12 | |
Color | clCreen | |
Position | poScreenCenter | |
Label 1 | Caption | Удалить заголовок |
Edit 1 | Text | Удалите содержимое |
Button 1 | Caption | Угадай! |
Memo1 | Lines | Удалить содержимое |
В секцию Private описания поместите объявление целочисленного поля х:
Private
{Private declarations}
х : integer;
Для обработчика OnActivate события формы Form1 напишите такой код:
procedure TForm1. FormActivate (Sender: TObject);
begin
x: = random (101);
Edit 1. SetFocus;
Caption : = ‘Угадай целое число в диапазоне 0….100’;
Label 1. Caption : = ‘введите число’;
end;
Итак, в данной процедуре видно, что при активизации формы программа выполняет следующее:
- Выбирает случайное число от 0 до 100 и присваивает значению х;
- Устанавливает фокус ввода в поле ввода числа;
- Задает имя форме;
- Задает заголовок для текстовой метки.
Поместите в обработчик события OnClick кнопки Button 1 следующий код:
procedure TForm1. Button1Click (Sender: TObject);
var
у : integer;
begin
у: = strtoint (Trim (Edit 1.Text)); Преобразуем ввод в число
Edit 1.Text : = »; // очищаем ввод
Edit 1. SetFocus; // устанавливаем фокус ввода
{Параметр Tag=0 означает угадывание числа, иначе – ответ на вопрос, будет ли пользователь играть после угадывания}
If tag=0 Then
If х<у Then // угадывание числа
Memo1. Lines. Add (‘ х <‘ + IntToStr (y));
Else If х>у Then
Memo1. Lines. Add (‘ х >’ + IntToStr (y));
Else // х=у
begin
Memo1. Lines. Add (‘ х =’ + IntToStr (y));
MessageBeep (MB_OK); // звук для привлечения внимания
ShowMessage ( ‘Вы угадали!!! Введите 1 в поле ввода, ‘+#13+’
Если хотите повторить: ‘); // вывод сообщения об угадывании числа
Tag:=1; // следующий ввод – ответ на вопрос
End
Else // анализ ответа
If у=1 Then
begin
x: = random (101); // новое число
Label 1. Caption: = ‘ Введите число!’;
Tag:=0; // следующий ввод – угадывание
Edit 1. SetFocus
End Else
Close;
end;
Комментарии к программе
При активации окна программы обработчик FormActivate с помощью оператора
x: = random (101);
помещает в поле х случайное число в диапазоне от 0 до 100 -1 = 100 (параметр обращения к генератору псевдослучайных чисел – на единицу больше верхней границы диапазона).
Каждый компонент Delphi имеет целочисленное свойство Tag, которым программист может распоряжаться по своему усмотрению. Программа использует это свойство формы для разделения алгоритма события OnClick кнопки Button на два варианта: пользователь угадывает число (Tag=0) или отвечает на предложение сыграть еще раз (Tag=1). В момент создания экземпляра класса Form – все его поля обнуляются, поэтому первоначально Tag=0 и программа анализирует угадывание числа. При угадывании срабатывает составной оператор
begin
Memo1. Lines. Add (‘ х =’ + IntToStr (y));
MessageBeep (MB_OK);
ShowMessage (‘Вы угадали!!!Введите 1 в поле ввода, ‘+#13+’
если хотите повторить: ‘);
Tag:=1;
end
и Tag получает значение 1 (стандартная процедура MessageBeep заставляет звуковую систему ПК издать короткий звуковой сигнал). Теперь очередной щелчок на кнопке Button будет означать, что пользователь подготовил ответ на вопрос, и программа анализирует его. Если пользователь ввел число отличное от 1, произойдет обращение к методу Close формы и программа прекратит работу.
В результате всей работы проект должен принять вид, представленный на рисунке 8.2:
Рис. 8.2. Окно проекта «Угадай число»
Листинг программы проекта:
Unit Ugadai;
Interface
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; Mask;
Type
TForm1 = Class (TForm)
Edit 1: T Edit;
Label 1: TLabel;
Button 1: TButton;
Memo1: TMemo;
procedure FormActivate (Sender: TObject);
procedure Button1Click (Sender: TObject);
Private
{Private declarations}
х : integer;
public
{Public declarations}
end;
var
Form1: TForm1;
implementation
{SR*.DFM}
procedure TForm1. FormActivate (Sender: TObject);
begin
x: = random (101);
Edit 1. SetFocus;
Caption : = ‘Угадай целое число в диапазоне 0….100’;
Label 1. Caption : = ‘введите число’;
end;
procedure TForm1. Button1Click (Sender: TObject);
var
у : integer;
begin
у: = strtoint (Trim (Edit 1.Text));
Edit 1.Text : = ‘ ‘;
Edit 1. SetFocus;
If tag=0 Then
If х<у Then
Memo1. Lines. Add (‘ х <‘ + IntToStr (y));
Else If х>у Then
Memo1. Lines. Add (‘ х >’ + IntToStr (y));
Else
begin
Memo1. Lines. Add (‘ х =’ + IntToStr (y));
MessageBeep (MB_OK);
ShowMessage ( ‘Вы угадали!!! Введите 1 в строку ввода, ‘+#13+’
если хотите повторить: ‘);
Tag:=1;
End
Else
If у=1 Then
begin
x: = random (101);
Label 1. Caption: = ‘ Введите число!’;
Tag:=0;
Edit 1. SetFocus
End Else
Close;
end;
end.
Контрольные вопросы
- Какие компоненты отображают информацию?
- Назовите свойства компонентов отображающих текстовую информацию
Литература
Бобровский С. «Delphi 7 Учебный курс»
Лабораторная работа № 15
Тема: Использование компонентов редактирования
Цель: Научиться работать в среде Delphi с объектами
Проект «Калькулятор».
Постановка задачи:
- 1. Создать программу, имитирующую работу микрокалькулятора. Пользователь вводит два операнда и знак математического действия, после чего программа вычисляет и показывает результат.
- 2. Проверить правильность ввода программы и при необходимости скорректировать ее.
- 3. Оформить лабораторную работу на листах А4 по следующим пунктам:
- Тема лабораторной работы;
- Цель лабораторной работы;
- Задание, соответствующее варианту;
- Алгоритм решения в соответствии с заданием;
- Описание работы программы;
- Листинг программы;
- Вывод.
Пояснения к задаче:
Для разработки данного проекта необходимо учесть следующее:
- фокус ввода при активизации проекта;
- поля для ввода операндов;
- указание математической операции (+, -, *, /);
- вычисление;
- вывод результата вычисления;
- завершение работы проекта.
Новым в данном проекте является, во – первых, компонент ComboBox1, который позволит нам выбрать из своего списка знак математического действия, во – вторых оператор выбора Case.
Комбинированный список ComboBox1.
Список представляет собой упорядоченную совокупность взаимосвязанных элементов, являющихся текстовыми строками. Списки широко применяются в операционных системах, например, для отображения перечня шрифтов. Элементы списка могут быть отсортированы в алфавитном порядке или размещены в порядке их добавления в список. Как и другие объекты, списки предоставляют возможности по добавлению, удалению и выбору отдельных его элементов.
Простой список представляет собой прямоугольную область, в которой располагаются его элементы. Для работы с простым списком служит компонент ListBox.
Комбинированный список объединяет поле редактирования и список. Пользователь может выбирать значение из списка или вводить его непосредственно в поле. Для работы с комбинированным списком в Delphi служит компонент ComboBox1.
Список, инкапсулированный в компонент ComboBox1, может быть простым и раскрывающимся. Раскрывающийся список в свёрнутом виде занимает на экране меньше места.
В отличие от простого, комбинированный список не может иметь горизонтальную полосу прокрутки и из комбинированного списка можно выбрать одно значение.
Свойство style типа TComboBox1Style определяет внешний вид и поведение комбинированного списка. Свойство style может принимать следующие значения:
- csDropDown – раскрывающийся список с полем редактирования (по умолчанию). Пользователь может выбирать элементы из списка, при этом выбранный элемент появляется в поле ввода, или вводить (редактировать) информацию непосредственно в поле ввода;
- csSimple – поле редактирования с постоянно раскрытым списком. Для того чтобы список был виден, необходимо увеличить высоту (свойство Height) компонента ComboBox;
- csDropDownList – раскрывающийся список, допускающий выбор элементов из списка;
- csOwnerDrawFixed – список с элементами фиксированной высоты, которую задаёт свойство ItemHeight;
- csOwnerDrawvariabie – список с элементами, которые могут иметь разную высоту.
Если стиль списка имеет значение csOwnerDrawFixed или csOwnerDrawvariabie, то программист сам отвечает за прорисовку элементов списка.
Свойство DropDownCount типа integer определяет количество строк, которые одновременно отображаются в раскрывающемся списке. Если значение свойства превышает число строк списка, определяемое значение подсвойства Count свойства items, то на раскрывающемся списке автоматически появляется вертикальная полоса прокрутки. Если размер списка меньше, чем задано в свойстве DropDownCount, то отображаемая область списка автоматически уменьшается. Свойство DropDownCount по умолчанию имеет значение 8.
Свойство DroppedDown типа Boolean позволяет определить, раскрыт ли список. Если свойство имеет значение True, то список отображается в раскрытом виде, в противном случае список свернут. Свойство DroppedDown действует только, если свойство style имеет значение, не равное csSimple. При отображении раскрывающегося списка возникает событие onDropDown типа.
TNotifyEvent. Программист может самостоятельно управлять раскрытием и свертыванием списка в процессе выполнения приложения, устанавливая свойству DroppedDown соответствующее значение.
Пример 9.1. Управление раскрытием и свертыванием списка.
procedure TForm1.btnSpisokOpenClick (Sender: TObject);
begin
ComboBox1. DroppedDown: = True;
end;
procedure TForm2.btnSpisokCloseClick (Sender: TObject);
begin
ComboBox1. DroppedDown: = False;
end;
Нажатие кнопки btnSpisokOpen приводит к открытию, а кнопки btnSpisokClose к свертыванию списка ComboBox1.
Свойство items типа TStrings представляет собой массив строк и определяет количество элементов списка и их содержимое. Класс TStrings является базовым типом и разработан специально для операций со строками, в примере свойства items списка рассмотрим основные свойства и методы TStrings. От класса TStrings происходит большое количество производных классов, например, TstringList.
Каждый элемент списка является строкой, к которой можно получить доступ по её номеру в массиве строк items. Отсчет элементов списка начинается с нуля. Для обращения к первому элементу нужно указать items [0], второму items [1], к третьему items [2] и т.д. При операциях с отдельными строками программист должен контролировать номера строк в списке и не допускать обращения к несуществующему элементу. Например, список содержит три строки, то попытка работы с десятой строкой приведет к ошибке.
Свойство Count типа integer задает число элементов в списке. Так как первый элемент списка имеет нулевой номер, то номер последнего элемента равен Count – 1.
Функция Add (const S: String): Integer добавляет в конец списка строку, заданную параметром s, а в качестве результата возвращает положение нового элемента в списке.
Процедура Insert (Index: Integer; const S: String) вставляет строку S на позицию с номером, определяемым параметром Index. При этом элементы списка, находившиеся до операции вставки в указанной позиции и ниже, смещаются вниз.
Пример 9.2. Добавление к комбинированному списку ComboBox1 строки «Нажата кнопка Button1».
procedure TForm1. Button1Click (Sender: TObject);
begin
ComboBox1. Items. Add ( ‘Нажата кнопка Button1 ‘);
end;
Для удаления элементов списка используются методы Delete и Clear.
Процедура Delete (Index: Integer) удаляет элемент с номером, заданным параметром Index. При попытке удаления несуществующей строки сообщение об ошибке не выдается, но метод Delete не срабатывает.
Пример 9.3. Удаление элемента списка.
procedure TForm1. Button2Click (Sender: TObject);
begin
ComboBox1. Items. Delete [4];
end;
При нажатии кнопки Button2 из комбинированного списка ComboBox1 удаляется пятая строка.
Процедура Clear очищает список, удаляя все его элементы.
Пример 9.4. Очистка содержимого списка.
procedure TForm1. btnPersonalClearClick (Sender: TObject);
begin
IbPersonal. Items. Clear;
end;
При нажатии кнопки btnPersonalClear происходит очистка списка IbPersonal.
Процедура Move (CurIndex, NewIndex: integer) сдвигает элемент на позиции с номером CurIndex в новую позицию с номером NewIndex. Если указанный номер больше, чем есть элементов в списке, то возникает ошибка.
Выполнить поиск элемента в списке можно с помощью метода IndexOf. Процедура IndexOf (const S: string): integer определяет, содержится ли в списке строка S. В случае успешного поиска процедура возвращает номер позиции найденной строки в списке, если строковый элемент не найден, то возвращается значение – 1.
Класс TStrings имеет методы SaveToFile и LoadFromFile, позволяющие непосредственно работать с текстовыми файлами. Эти методы предоставляют возможность сохранения строк списка в текстовом файле на диске и последующего чтения списка строк из текстового файла. Символы текстового файла кодируются в коде ANSI.
Процедура SaveToFile (const FileName: string) сохраняет строковые элементы списка в файле FileName. Если заданный файл отсутствует на диске, то он создаётся. В последующем сохранённые строки можно извлечь, используя метод LoadFromFile.
Пример 9.5. Процедура сохранения содержимого списка.
ComboBox1. SaveToFile (‘c: \ firma \ family. txt’);
Содержимое списка ComboBox1 записывается в файл family. txt каталога C: \ FIRMA.
Пример 9.6. Загрузка содержимого списка.
procedure TForm1. FormCreate (Sender: TObject);
begin
ComboBox2. Items. LoadFromFile (‘C: \ TEXT \ personal. txt’);
end;
Файл personal. txt содержит фамилии сотрудников организации. При запуске приложения комбинированный список ComboBox2 заполняется содержимым этого файла.
Элементы списка могут быть отсортированы в алфавитном порядке. Наличие или отсутствие сортировки определяет свойство Sorted типа Boolean. При значении свойства False (по умолчанию) элементы в списке располагаются в порядке их поступления в список. Если свойство sorted имеет значение True, то элементы автоматически сортируются по алфавиту в порядке возрастания.
Если для отсортированного списка свойству Sorted снова установить значение False, то изменений в порядке следования элементов списка не произойдет. В этом случае значение свойства сортировки будет действовать только для новых строк, добавляемых в список.
Оператор выбора Case
Оператор выбора позволяет выбрать из нескольких возможных вариантов продолжений программы. Параметром, по которому осуществляется выбор, служит ключ выбора – выражение любого порядкового типа.
Структура выбора такова:
Case <ключ выбора> of < список выбора> [else<операторы>] end;
Здесь Case, of , else, end – зарезервированные слова (случай, из, иначе, конец); < ключ выбора> — ключ выбора (выражение порядкового типа); < список выбора> — одна или более конструкций вида:
< константа выбора> : < оператор>;
< константа выбора> — константа того же типа, что и выражение < ключ выбора> — произвольный оператор Object Pascal.
Оператор выбора работает следующим образом. Вначале вычисляется значение выражение < ключ выбора>, а затем в последовательности оператора < список выбора> отыскивается такой, которому предшествует константа, равная вычисленному значению. Найденный оператор выполняется, после чего оператор выбора завершает свою работу. Если в списке выбора не будет найдена константа, соответствующая вычисленному значению ключа выбора, управление передается оператором, стоящим за словом else. Часть else можно опускать. Тогда при отсутствии в списке выбора нужной константы ничего не произойдет, и оператор выбора просто завершит свою работу.
Пример 9.7.
Var
Ch : Char;
Begin
Case ch of
‘ n’, ‘N’, ‘h’, ‘H’: Label1. Caption : = ‘Нет’;
‘y’, ‘Y’, ‘д’, ‘Д’ : Label1. Caption : = ‘Да’;
End
end;
Пример 9.7.
Begin
Case NumberDay of
1: S: = ‘ Понедельник ‘;
2: S: = ‘ Вторник ‘;
3: S: = ‘ Среда ‘;
4: S: = ‘ Четверг ‘;
5: S: = ‘ Пятница ‘;
6: S: = ‘ Суббота’;
7: S: = ‘ Воскресенье ‘;
End
end;
В зависимости от значения целочисленной переменной NumberDay, содержащей номер дня недели, строковой переменной S присваивается соответствующее значение.
Технология выполнения проекта
Разместим на форме компоненты в соответствии с рисунком 9.1. В таблице 9.1 приведены компоненты, которые понадобятся для решения поставленной задачи, и их назначение.
Рис. 9.1. Конструирование формы проекта «Калькулятор»
Таблица 9.1
Компоненты проекта и их свойства
Компонент | Назначение |
Label1 | Вывод примера, который вычисляет программа в данный момент времени |
BitBtn1 | Вычисление примера |
BitBtn2 | Завершение работы проекта |
Edit1 | Поле ввода первого операнда |
Edit2 | Поле ввода второго операнда |
Memo1 | Вывод результатов вычисления примера |
ComboBox1 | Список для выбора математического действия. Содержит знак суммы, разности, произведения (умножения), деления (частного) |
Установите свойства для компонента проекта в соответствии с приведенной таблицей 9.2.
Таблица 9.2.
Компонент | Свойство | Значение |
Form1 | Caption | Калькулятор |
Height | 320 | |
Width | 350 | |
Label 1 | Caption | Удалите содержимое |
BitBtn1 | Kind | bkOk |
BitBtn2 | BitBtn1 | bkClose |
Edit1, 2 | Text | Удалить текст |
Height | 20 | |
Width | 100 | |
Memo1 | Lines | Удалить содержимое |
Height | 140 | |
Width | 290 | |
ComboBox1 | Caption | Удалить заголовок |
Height | 20 | |
Width | 40 | |
Name | cbSing | |
items | Раскройте окно данного свойства и введите следующие строки:+-*/ |
Поместите в обработчик события On Click кнопки BitBtn1 следующий код:
procedure TForm1. BitBtn1 Click (Sender: TObject);
Var
x, y, z: Real;
Begin
(Блокируем работу, если не введены операнды и не выбрано действие).
if (Edit1. Text = ‘’) or (Edit2. Text = ‘’);
or (cbSign. ItemIndex <0) then Exit;
// Проверяем правильность ввода первого операнда
Try
// Начало защищённого блока
x: = StrToFloat (Trim (Edit1. Text));
except // Обработка ошибки
ShowMessage (‘Ошибочная запись числа:’+ Edit1. Text);
Edit1. SelectAll;
Exit;
end; // Конец защищённого блока
// Проверяем правильность ввода второго перанада
Try
// Начало защищённого блока
y: = StrToFloat (Trim(Edit1. Text));
except // Обработка ошибки
ShowMessage (‘Ошибочная запись числа:’+ Edit2. Text);
Edit1. SelectAll;
Exit;
end; // Конец защищённого блока
// Всё правильно вычисляем результат
case cbSign. ItemIndex of
0: z: = x+y;
1: z: = x-y;
2: z: = x*y;
3: try
z: = x/y;
except
z: = 1.1e+38; // Бесконечность при делении на 0
end;
end;
// Показываем результат
Label 1. Caption: = Trim (Edit1. Text) + ‘ ‘+
cbSign.Items [cbSign. ItemIndex] + ‘ ‘+
Trim (Edit2. Text) + ‘ = ‘+;
if z > = 1.1e+38 then
Label 1. Caption: = Label 1. Caption: = + ‘бесконечность ‘
else
Label 1. Caption: = Label 1. Caption: = + FloatToStr (z);
Memo1. Lines. Add (Label 1. Caption);
// Очищаем ввод
edit1. Text: = ‘ ‘;
edit2. Text: = ‘ ‘;
cbSign. ItemIndex: = -1;
end;
Так как элементы в комбинированном списке формируются, начиная с 0, то в программе мы пишем
case cbSign. ItemIndex of
0: z: = x+y;
1: z: = x-y;
…
и т. д., т. е. cbSign. ItemIndex [0] = ‘ + ‘, cbSign. ItemIndex [3] = ‘ / ‘ и т. д. Если не выбрана ни одна строка, это свойство содержит – 1. Программа контролирует выбор за счёт условия
cbSign. ItemIndex < 0
при проверке операндов, а также в операторе case:
case cbSign. ItemIndex of
Если строки введены в правильной последовательности, индекс выбранной строки будет соответствовать номеру операции (0 — +, 1 — -, 2 — *, 3 — /), и над операндами будет выполнено требуемое действие.
В результате выполненных действий окно проекта примет вид, представленный на рисунке 9.2.
Рис. 9.2. Готовое окно проекта «Калькулятор».
Дополнительные задания к проекту:
Создать возможность ввода первого операнда в поле ввода при активизации формы.
Подсказка. В обработчик события OnActivate компонента Form1 поместить соответствующую строку.
Контрольные вопросы
- Какие компоненты редактируют информацию?
- Назовите свойства компонентов редактирующих текстовую информацию
Литература
Бобровский С. «Delphi 7 Учебный курс»
Лабораторная работа №16
Тема: иСПОЛЬЗОВАНИЕ КОМПОНЕНТОВ МНОГОСТРОЧНОГО РЕДАКТОРА ДЛЯ ОБРАБОТКИ СТРОКОВЫХ ДАННЫХ
Цель лабораторной работы: освоить применение компонентов ListBox и СomboBox и создать приложение, в котором используются строки.
5.1. Пример создания приложения
Задание: создать Windows-приложение для подсчета количества слов в произвольной строке. Слова в строке разделяются любым количеством пробелов. Ввод строки заканчивать нажатием клавиши Enter. Работа приложения должна завершаться нажатием кнопки Close.
Один из возможных вариантов панели интерфейса создаваемого приложения показан на рис.5.1.
5.1.1. Размещение компонентов на Форме
При работе со строками ввод и вывод информации на экран удобно организовывать с помощью компонентов ListBox и ComboBox.
Рис. 5.1 |
Компонент ListBox представляет собой список, элементы которого выбираются при помощи клавиатуры или “мыши”. Список элементов задается свойством Items, методы Add, Delete и Insert которого используются для добавления, удаления и вставки строк, соответственно. Для определения номера выделенного элемента используется свойство ItemIndex.
Компонент ComboBox представляет собой комбинацию списка ListBox и редактора Еdit, поэтому практически все свойства заимствованы у этих компонентов. Для работы с окном редактирования используется свойство Text как в Edit, а для работы со списком выбора используется свойство Items как в ListBox. Cуществует 5 модификаций компонента, определяемых его свойством Style. В модификации csSimple список всегда раскрыт, в остальных он раскрывается после нажатия кнопки справа от редактора.
Компоненты ListBox и ComboBox находятся на странице Standard Палитры Компонентов.
Компонент BitBtn расположен на странице Additional Палитры Компонентов и представляет собой разновидность стандартной кнопки Button. Его отличительная особенность – наличие растрового изображения на поверхности кнопки, которое определяется свойством Glyph. Кроме того, имеется свойство Kind, которое задает одну из 11 стандартных разновидностей кнопок. Нажатие любой из них, кроме bkCustom и bkHelp закрывает модальное окно. Кнопка bkClose закрывает главное окно и завершает работу программы.
5.1.2. Создание процедур обработки событий
В момент запуска приложения, когда панель интерфейса появляется на экране, для пользователя удобно чтобы курсор уже находился в поле редактора компонента ComboBox. При активизации Формы возникает событие OnActivate, которое можно использовать для передачи фокуса ввода компоненту ComboBox. Для создания процедуры-обработчика этого события необходимо в Инспекторе Объектов выбрать компонент Form1, на странице Events найти событие OnActivate и дважды щелкнуть “мышью” по его правой (белой) части. Курсор установится в тексте процедуры-обработчика события активизации Формы: procedure TForm1.FormActivate(Sender: TObject). В этом месте процедуры наберите оператор передачи фокуса ввода компоненту ComboBox1 (см. текст модуля UnStr, который приведен в п. 5.1.3).
В соответствии с заданием необходимо, чтобы при нажатии клавиши Enter строка символов, которую пользователь набрал в поле редактирования, переносилась в список выбора компонента ComboBox. Для создания процедуры-обработчика этого события необходимо в Инспекторе Объектов выбрать компонент ComboBox1, на странице Events найти событие OnKeyPress и дважды щелкнуть “мышью” по его правой части. Курсор установится в тексте процедуры-обработчика события нажатия клавиши на клавиатуре: procedure TForm1.ComboBox1KeyPress(Sender:TObject;var Key:Char). В этом месте процедуры, пользуясь текстом модуля UnStr, наберите операторы, которые при нажатии клавиши Enter переносят строку из поля редактирования в список выбора и очищают поле редактирования.
Процесс создания процедуры-обработчика события нажатия клавиши “мыши” в списке выбора procedure TForm1.ComboBox1Click(Sender: TObject) выполняется аналогично для события OnClick компонента
ComboBox1. Пользуясь текстом модуля UnStr, наберите операторы, которые осуществляют основной алгоритм обработки символов выбранной строки.
5.1.3. Текст модуля UnStr
Unit UnStr;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons;
type
TForm1 = class(TForm)
Label2: TLabel;
Label3: TLabel;
BitBtn1: TBitBtn;
ComboBox1: TComboBox;
Label1: TLabel;
procedure ComboBox1KeyPress(Sender: TObject; var Key: Char);
procedure ComboBox1Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Implementation
{$R *.DFM}
// Обработка события активизации Формы
procedure TForm1.FormActivate(Sender: TObject);
begin
ComboBox1.SetFocus; // передача фокуса ввода ComboBox1
end;
// Обработка события ввода символа и нажатия клавиши Enter
procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then // если нажата клавиша Enter то
begin // строка из поля редактирования заносится
ComboBox1.Items.Add(ComboBox1.Text); // в список выбора
ComboBox1.Text:=»; // очистка окна редактирования
end;
end;
// Обработка события нажатия клавиши «мыши» в списке выбора
procedure TForm1.ComboBox1Click(Sender: TObject);
var
st : string;
n,i,nst,ind: integer;
begin
n:=0; // n содержит количество слов
ind:=0;
nst:=ComboBox1.ItemIndex; // определение номера выбранной строки
st:=ComboBox1.Items[nst]; // st присваивается выбранная строка
for i:=1 to Length(st) do // просмотр всех символов строки
case ind of
0 : if st[i]<>’ ‘ then // если встретился символ
begin
ind:=1;
n:=n+1; // количество слов увеличивается на единицу
end;
1 : if st[i]=’ ‘ then // если встретился пробел
ind:=0;
end;
Label3.Caption:=IntToStr(n); // вывод количества слов в Label3
end;
end.
5.2. Выполнение индивидуального задания
Во всех заданиях исходные данные вводить с помощью компонента Edit в компонент ListBox, либо с помощью свойства Text в свойство Items компонента ComboBox. Результат выводить c помощью компонента Label. Ввод строки заканчивать нажатием клавиши Enter. Работа приложения должна завершаться нажатием кнопки Close.
Для проверки функционирования приложения подготовить несколько тестов.
Индивидуальные задания
- 1. Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется друг от друга одним или несколькими пробелами. Найти количество групп с пятью символами.
- 2. Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется друг от друга одним или несколькими пробелами. Найти и вывести на экран самую короткую группу.
- 3. Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется друг от друга одним или несколькими пробелами. Подсчитать количество символов в самой длинной группе.
- 4. Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется друг от друга одним или несколькими пробелами. Найти и вывести на экран группы с четным количеством символов.
Лабораторная работа №17
ТЕМА: ИСПОЛЬЗОВАНИЕ КОМПЕНЕНТОВ МНОГОСТРОЧНОГО РЕДАКТОРА ДЛЯ ОДНОМЕРНЫХ массивов
Цель лабораторной работы: освоить применение компонента StringGrid и создать приложение, в котором используются массивы.
4.1. Пример создания приложения
Задание: создать Windows-приложение для вычисления вектора x={x1,x2,…,xm},равного p-й строке матрицы A={aij}(xj=apj, j=1,2,…,m) и вектора y={y1,y2,…,yn}, равного q-му столбцу матрицы A={aij}(yi=aiq, i=1,2,…,n) (n£6,m£8). В панели интерфейса предусмотреть возможность управления размерностью массивов.
Один из возможных вариантов панели интерфейса создаваемого приложения показан на рис.4.1.
4.1.1. Размещение компонентов на Форме
При работе с массивами ввод и вывод информации на экран удобно организовывать с помощью компонента StringGrid.
Рис. 4.1 |
Компонент StringGrid используется для отображения информации в виде таблицы. Таблица содержит две зоны – фиксированную и рабочую. Фиксированная зона служит для вывода наименований строк и столбцов рабочей зоны и управления их размерами с помощью “мыши”. Фиксированная зона выделена другим цветом и в нее запрещен ввод информации с клавиатуры. Количество строк и столбцов фиксированной зоны устанавливается в свойствах FixedRows и FixedCols, соответственно.
Рабочая зона содержит RowCount строк и ColCount столбцов информации, которую можно изменять как программно, так и с помощью “мыши” или клавиатуры.
Доступ к информации в программе осуществляется с помощью свойства Cells[ACol, ARow: integer]: string, где ACol-номер столбца, а ARow – номер строки таблицы, причем нумерация начинается с нуля.
Пиктограмма компонента StringGrid находится на странице Additional Палитры Компонентов. Так как в нашем задании для всех компонентов StringGrid фиксированная зона не используется, в Инспекторе Объектов значения свойств FixedCols и FixedRows установите равными 0. В соответствии с заданием установите предельные значения количества строк n и столбцов m для компонента StringGrid1: ColCount=8, а RowCount=6 (восемь столбцов и шесть строк). Для компонента StringGrid2 ColCount=1, RowCount=8, а для компонента StringGrid3 ColCount=1, RowCount=6.
По умолчанию в компонент StringGrid запрещен ввод информации с клавиатуры, поэтому для компонента StringGrid1 необходимо в Инспекторе Объектов дважды щелкнуть “мышью” на символе + свойства +Options и в открывшемся списке опций установить значение goEditing в True.
Для удобства работы с компонентами SpinEdit установите для компонента SpinEdit1 значения свойств: MinValue=1, MaxValue=6, а для компонента SpinEdit2: MinValue=1, MaxValue=8.
4.1.2. Создание процедур обработки событий SpinEdit1Change и SpinEdit2Change
События SpinEdit1Change и SpinEdit2Change возникают при любом изменении значения в поле редактора SpinEdit1 и SpinEdit2 соответственно. Создадим процедуры обработки этих событий, в которых присвоим значения n и m, полученные из полей редакторов SpinEdit, свойствам ColCount и RowCount компонентов StringGrid. Это позволит управлять размерами таблиц StringGrid с помощью компонентов SpinEdit без дополнительных кнопок, так как изменение значений в поле редактора SpinEdit сразу приведет к изменению размера таблиц StringGrid. Дважды щелкните “мышью” на компоненте SpinEdit1 – курсор установится в тексте процедуры-обработчика события SpinEdit1Change: procedure TForm1.SpinEdit1Change(Sender: TObject). Внимательно наберите операторы этой процедуры, используя текст модуля UnMas(см. п.4.1.3). Аналогичным образом создайте процедуру-обработчик события SpinEdit2Change: procedure TForm1.SpinEdit2Change(Sender: TObject).
4.1.3. Текст модуля UnMas
Unit UnMas;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Spin, Grids;
type
TForm1 = class(TForm)
Label1: TLabel;
SpinEdit1: TSpinEdit;
SpinEdit2: TSpinEdit;
Label8: TLabel;
StringGrid1: TStringGrid;
StringGrid2: TStringGrid;
StringGrid3: TStringGrid;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
SpinEdit3: TSpinEdit;
SpinEdit4: TSpinEdit;
Label6: TLabel;
Label7: TLabel;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
procedure SpinEdit2Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
var
A:array[1..6,1..8] of extended;// объявление двумерного массива A
X:array[1..8] of extended; // объявление одномерного массива X
Y:array[1..6] of extended; // объявление одномерного массива Y
n,m,p,q:integer; // объявление глобальных переменных
procedure TForm1.FormCreate(Sender: TObject);
begin
SpinEdit1.Text:=’4‘; // начальное значение n
SpinEdit2.Text:=’6‘; // начальное значение m
SpinEdit3.Text:=’2‘; // начальное значение p
SpinEdit4.Text:=’3‘; // начальное значение q
StringGrid1.RowCount:=4; // количество строк массива A
StringGrid1.ColCount:=6; // количество столбцов массива A
StringGrid2.RowCount:=6; // количество строк массива X
StringGrid3.RowCount:=4; // количество строк массива Y
end;
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
n:=StrToInt(SpinEdit1.Text);// n присваивается содержимое поля редактора
StringGrid1.RowCount:=n; // устанавливается количество строк массива A
StringGrid3.RowCount:=n; // устанавливается количество строк массива Y
end;
procedure TForm1.SpinEdit2Change(Sender: TObject);
begin
m:=StrToInt(SpinEdit2.Text);// m присваивается содержимое поля редактора
StringGrid1.ColCount:=m; // устанавливается количество столбцов массива A
StringGrid2.RowCount:=m; // устанавливается количество строк массива X
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer; // объявление локальных переменных
begin
n:=StrToInt(SpinEdit1.Text);
StringGrid1.RowCount:=n;
StringGrid3.RowCount:=n;
m:=StrToInt(SpinEdit2.Text);
StringGrid1.ColCount:=m;
StringGrid2.RowCount:=m;
p:=StrToInt(SpinEdit3.Text);
q:=StrToInt(SpinEdit4.Text);
// Ввод значений из таблицы в массив A
for i:=1 to n do
for j:=1 to m do
A[i,j]:=StrToFloat(StringGrid1.Cells[j-1,i-1]);
for j:=1 to m do // формирование массива X и вывод его значений в таблицу
begin
X[j]:=A[p,j];
StringGrid2.Cells[0,j-1]:=FloatToStrF(X[j],ffFixed,3,1);
end;
for i:=1 to n do // формирование массива Y и вывод его значений в таблицу
begin
Y[i]:=A[i,q];
StringGrid3.Cells[0,i-1]:=FloatToStrF(Y[i],ffFixed,3,1);
end;
end;
end.
4.1.4. Работа с приложением
Запустите созданное приложение. Занесите числовые значения в элементы матрицы A и убедитесь в том, что приложение функционирует в соответствии с заданием.
4.2. Выполнение индивидуального задания
Изучите в приложении 2 описание компонентов StringGrid и DrawGrid.
По указанию преподавателя выберите свое индивидуальное задание. Создайте приложение и протестируйте его работу.
Индивидуальные задания
- 1. Задана целочисленная матрица A размером NxM. Получить массив B, присвоив его k-му элементу значение 0, если все элементы k-го столбца матрицы нулевые, и значение 1 в противном случае(k=1,2,…,M).
- 2. Задана целочисленная матрица A размером NxM. Получить массив B, присвоив его k-му элементу значение 1, если элементы k–й строки матрицы упорядочены по убыванию, и значение 0 в противном случае(k=1,2,…,N).
- 3. Задана целочисленная матрица A размером NxM. Получить массив B, присвоив его k-му элементу значение 1, если k-я строка матрицы симметрична, и значение 0 в противном случае(k=1,2,…,N)..
- 4. Задана целочисленная матрица размером NxM. Определить k–количество “особых” элементов матрицы, считая элемент “особым”, если он больше суммы остальных элементов своего столбца.
- 5. Задана целочисленная матрица размером NxM. Определить k–количество “особых” элементов матрицы, считая элемент “особым”, если в его строке слева от него находятся элементы, меньшие его, а справа – большие.
- 6. Задана символьная матрица размером NxM. Определить k-количество различных элементов матрицы (т.е. повторяющиеся элементы считать один раз).
- 7. Дана вещественная матрица размером NxM. Упорядочить ее строки по неубыванию их первых элементов.
- 8. Дана вещественная матрица размером NxM. Упорядочить ее строки по неубыванию суммы их элементов.
- 9. Дана вещественная матрица размером NxM. Упорядочить ее строки по неубыванию их наибольших элементов.
- 10. Определить является ли заданная квадратная матрица n-го порядка симметричной относительно побочной диагонали.
- 11. Для заданной целой матрицы размером NxM вывести на экран все ее седловые точки. Элемент матрицы называется седловой точкой, если он является наименьшим в своей строке и одновременно наибольшим в своем столбце или, наоборот, является наибольшим в своей строке и наименьшим в своем столбце.
- 12. В матрице n-го порядка переставить строки так, чтобы на главной диагонали матрицы были расположены элементы, наибольшие по абсолютной величине.
Лабораторная работа № 18
Тема: Использование компонентов списков и выпадающих списков
Цель: Научиться работать в среде Delphi с объектами
Проект «Справочник цветов».
Постановка задачи:
Создать программу, с помощью которой можно выполнить следующее: после запуска программы пользователь выбирает с помощью мышки или стрелок название цвета и нажимает клавишу Enter. На экране появляется название цвета на русском языке и код в формате RGB (см. рис. 11.1.).
Рис. 11.1. Окно формы проекта «СПРАВОЧНИК ЦВЕТОВ».
Пояснения к задаче:
Для разработки данного проекта необходимо учесть наличие:
- поля списка, куда будут размещены названия цветов;
- метки для вывода текста;
- поле для вывода выбранного цвета.
Новым в данном проекте является компонент ListBox, который позволит нам ввести список цветов.
Простой список ListBox.
Простой список представляет собой прямоугольную область, в которой располагаются его элементы. Для работы с простым списком служит компонент ListBox.
Если количество строк больше, чем может их поместиться в видимой области списка, то рядом с областью отображения появляется полоса прокрутки. Ориентация полосы прокрутки, а также число колонок, которые одновременно видны в области списка, зависят от свойства columns типа integer. По умолчанию свойство имеет значение 0. Это означает, что все элементы списка расположены в один столбец, и при необходимости автоматически появляется (рис. 11.2, правый список) и исчезает вертикальная полоса прокрутки (рис.11.2, левый список).
Рис. 11.2. Варианты списков.
Если свойство columns имеет значение, большее или равное 1, то в области списка всегда присутствует горизонтальная полоса прокрутки, а элементы разбиваются на такое число колонок (столбцов), чтобы можно было путём прокрутки списка отображается число колонок, определяемое свойством columns.
Иногда необходимо, чтобы список одновременно отображал и вертикальную, и горизонтальную полосы прокрутки. В этом случае нужно задать свойству columns нулевое значение, тогда вертикальная полоса прокрутки будет появляться по мере надобности. Для отображения горизонтальной полосы прокрутки следует списку послать сообщение LB_SetHorizontalExtent. Третьим параметром сообщения является максимальное значение полосы прокрутки в пикселях. Если задать это значение заведомо большим, чем размер списка ListBox, то горизонтальная полоса прокрутки будет отображаться всегда. Четвёртый параметр сообщения в этом случае не требуется и равен нулю. Если горизонтальная полоса прокрутки не нужна, то можно послать ещё одно сообщение, указав в качестве максимального размера значение равное нулю.
Пример 11.1. Список ListBox с двумя полосами прокрутки.
procedure TForm1. FormCreate (Sender: TObject);
begin
ListBox. Columns: = 0;
SendMessage (ListBox. Handle. LB_SetHorizontalExtent, 1000, 0);
end;
При работе со списком программист может управлять номером элемента, который отображается вверху видимой области списка. Эта возможность обеспечивается свойством времени выполнения TopIndex типа integer.
Пример 11.2. Процедура управления отображением элементов списка.
procedure TForm1. UpDown1Click (Sender: TObject; Button: TUBtnType);
begin
ListBox1. TopIndex: = UpDown1. Position;
end;
Вверху в списке ListBox1 отображается элемент, номер которого задаёт реверсивный счётчик upDown1. В данном случае счётчик upDown1 является своего рода скроллером для прокрутки содержимого списка.
Стиль простого списка задаёт свойство style типа TListBoxStyle, принимающее следующие значения:
- lbStandard – стандартный стиль (по умолчанию);
- lbOwnerDrawFixed – список с элементами фиксированной высоты, определяемой свойством ItemHeight;
- lbOwnerDrawVariable – список с элементами, которые могут иметь разную высоту.
Если стиль списка отличён от значения lbStandard, то программист сам отвечает за прорисовку элементов списка. Для этих целей используются графические возможности Delphi.
Список может, иметь обычную рамку или не иметь рамки вообще. Наличие рамки определяет свойство BorderStyle типа TBorderStyle, принимающее два возможных значения:
- bsNone – рамки нет;
- bsSingle – рамка есть (по умолчанию).
Для того чтобы поместить список в компонент необходимо выполнить следующие действия:
- выделить компонент на форме ListBox1;
- перейти в инспектор объектов к странице Properties;
- выбрать свойство Items;
- щёлкнуть на кнопку с тремя точками в правом поле TStrings данного свойства;
- в раскрывшемся окне (рисунок 11.3.) заполнить список в столбик;
- выбрать команду OK.
Списки, находящиеся в компоненте, можно сохранять в именованном файле. В данном случае список поместится в текстовый документ.
Текстовые документы со списками лучше хранить в той же директории, где и сам проект программы.
Для того чтобы сохранить список во внешнем файле необходимо выполнить следующее:
- раскрыть окно свойства Items списка;
- набрать список;
- вызвать контекстное меню (нажать правой кнопкой мыши) в поле окна String List Editor;
- выбрать команду Save;
- задать директорию, в которой сохранён проект;
- ввести имя файла.
Технология выполнения проекта:
Разместим на форме компоненты в соответствии с рисунком 11.4. В таблице 11.1. приведены компоненты, которые понадобятся для решения поставленной задачи, и их назначение.
Рис. 11.4. Конструирование формы проекта «Справочник цветов».
Таблица 11.1.
Компонент | Назначение |
BitBtn1 | Выход из программы |
Label1 1, 2, 3 | Вывод текста |
Panel1 | Для вывода выбранного цвета |
ListBox1 | Компонент для ввода списка цветов |
Установите свойства для компонентов проекта в соответствии с приведённой таблицей 11.2.
Таблица 11.2.
Компонент | Свойство | Значение |
Form1 | Caption | СПРАВОЧНИК ЦВЕТОВ |
Height | 350 | |
Width | 380 | |
Font | Жирный, 10 | |
Label 1 | Caption | Цвет формат RGB |
Label 2 | Caption | Удалить заголовок |
Label 3 | Caption | Удалить заголовок |
ListBox1 | Hint | Выделите цвет в списке и нажмите клавишу Ентер |
ShowHiht | true | |
Items | BLASKWHITEREDGREENTEALBLUEPURPLEYELLOWSILVEROLIVELIMENAVY | |
Panel1 | Caption | Удалить название |
Height | 100 | |
Width | 195 |
Для события OnKeyPress компонента ListBox1 набрать следующий код:
procedure TForm1.ListBox1KeyPress (Sender: TObject; var Key: Char);
begin
If Key = #13 Then
Case ListBox. ItemIndex of
0 : begin
Label 3. Caption : = ‘черный’ 000000′;
Panel1. Color : = S000000;
end;
1 : begin
Label 3. Caption : = ‘белый’ FFFFFF’;
Panel1. Color : = SFFFFFF;
end;
2 : begin
Label 3. Caption : = ‘красный’ 0000FF’;
Panel1. Color : = S0000FF;
end;
3 : begin
Label 3. Caption : = ‘зеленый’ 008000′;
Panel1. Color : = S008000;
end;
4 : begin
Label 3. Caption : = ‘сине-зеленый’ 808000′;
Panel1. Color : = S808000;
end;
5 : begin
Label 3. Caption : = ‘голубой’ FF0000′;
Panel1. Color : = SFF0000;
end;
6 : begin
Label 3. Caption : = ‘фиолетовый’ 800080′;
Panel1. Color : = S800080;
end;
7 : begin
Label 3. Caption : = ‘желтый’ 00FFFF’;
Panel1. Color : = S00FFFF;
end;
8 : begin
Label 3. Caption : = ‘серебряный’ С0С0С0′;
Panel1. Color : = SС0С0С0;
end;
9 : begin
Label 3. Caption : = ‘оливковый’ 008080′;
Panel1. Color : = S008080;
end;
10 : begin
Label 3. Caption : = ‘ярко-зеленый’ 00FF00′;
Panel1. Color : = S00FF00;
end;
11 : begin
Label 3. Caption : = ‘темно-синий’ 800000′;
Panel1. Color : = S800000;
end;
end;
end;
end.
Комментарий к программе:
Во – первых, программа реагирует на выбор элемента из списка цветов и нажатия клавиши <Enter>. Допустим, пользователь выбрал цвет чёрный и нажал <Enter>, то программа тут же закрашивает панель в чёрный цвет и выпадает сообщение о названии цвета и его коде в формате RGB. Здесь используется оператор выбора Case. Выбор первого элемента в данном случае нулевой строки (элементы списка нумеруются, начиная с нуля) задаёт заголовок метки название цвета «Чёрный» и код «000000», панель закрашивается в чёрный цвет.
Дополнительное задание к проекту
- Сохраните список цветов в файле с названием Color.txt в директории, в которой находится проект.
Лабораторная работа №19
ТЕМА: ИСПОЛЬЗОВАНИЕ КОМПЕНЕНТОВ таблиц ДЛЯ работы с многомерными массивами
Цель лабораторной работы: освоить применение компонента StringGrid и создать приложение, в котором используются массивы.
Ход работы:
1. Рассмотрите пример создания приложения в ЛР№17
.2. Выполнение индивидуального задания
Изучите в ЛР№17 описание компонентов StringGrid и DrawGrid.
По указанию преподавателя выберите свое индивидуальное задание. Создайте приложение и протестируйте его работу.
Индивидуальные задания
- 1. Задана целочисленная матрица A размером NxM. Получить массив B, присвоив его k-му элементу значение 0, если все элементы k-го столбца матрицы нулевые, и значение 1 в противном случае(k=1,2,…,M).
- 2. Задана целочисленная матрица A размером NxM. Получить массив B, присвоив его k-му элементу значение 1, если элементы k–й строки матрицы упорядочены по убыванию, и значение 0 в противном случае(k=1,2,…,N).
- 3. Задана целочисленная матрица A размером NxM. Получить массив B, присвоив его k-му элементу значение 1, если k-я строка матрицы симметрична, и значение 0 в противном случае(k=1,2,…,N)..
- 4. Задана целочисленная матрица размером NxM. Определить k–количество “особых” элементов матрицы, считая элемент “особым”, если он больше суммы остальных элементов своего столбца.
- 5. Задана целочисленная матрица размером NxM. Определить k–количество “особых” элементов матрицы, считая элемент “особым”, если в его строке слева от него находятся элементы, меньшие его, а справа – большие.
- 6. Задана символьная матрица размером NxM. Определить k-количество различных элементов матрицы (т.е. повторяющиеся элементы считать один раз).
- 7. Дана вещественная матрица размером NxM. Упорядочить ее строки по неубыванию их первых элементов.
- 8. Дана вещественная матрица размером NxM. Упорядочить ее строки по неубыванию суммы их элементов.
- 9. Дана вещественная матрица размером NxM. Упорядочить ее строки по неубыванию их наибольших элементов.
- 10. Определить является ли заданная квадратная матрица n-го порядка симметричной относительно побочной диагонали.
- 11. Для заданной целой матрицы размером NxM вывести на экран все ее седловые точки. Элемент матрицы называется седловой точкой, если он является наименьшим в своей строке и одновременно наибольшим в своем столбце или, наоборот, является наибольшим в своей строке и наименьшим в своем столбце.
- 12. В матрице n-го порядка переставить строки так, чтобы на главной диагонали матрицы были расположены элементы, наибольшие по абсолютной величине.
Контрольные вопросы
- Что понимается под массивом?
- Как обозначаются в программе элементы массива?
- Как описываются массивы в разделе переменных?
- Как описываются массивы с использованием раздела типов?
- Для чего используются упакованные массивы?
- Как организуется в программе ввод массива?
- Как организуется в программе вывод массива?
- Какие операции разрешены над элементами массива (перечислить)?
Лабораторная работа № 20
Тема: Использование компонентов кнопок обычных, графических и фиксации
Цель: Научиться работать в среде Delphi с объектами
Проект «Светофор»
Постановка задачи:
Создать программу, имитирующую работу светофора. В окне формы проекта имеются три пункта названиями цветов: красный, жёлтый, зелёный. Пользователь выбирает цвет, программа закрашивает соответствующий кружок нужным цветом (см. рисунок 10.1).
Рис. 10.1. Окно формы проекта «СВЕТОФОР».
Пояснения к задаче:
Для разработки данного проекта необходимо учесть наличие:
- пунктов для выбора нужного цвета;
- кругов для вывода цвета;
- рамки для объединения шаров с цветами.
Новым в данном проекте является, во – первых компонент RadioButton, который позволит нам выбрать цвет, во – вторых, компонент Shape.
Переключатель с зависимой фиксацией.
В качестве переключателя с зависимой фиксацией представлен компонент RadioButton, его также называют кнопками выбора. Соответствующие элементы управления отображаются в виде круга с текстовой надписью. Программист не может изменять размеры и цвет круглого окошка компонента.
Кнопки выбора обычно располагаются по отдельным группам, выделены на форме. Выбор переключателя является взаимоисключающим, то есть при выборе одного переключателя другой становится невыбранным. Delphi поддерживает автоматическое группирование переключателей, каждый переключатель, помещенный в контейнер, включается в находящуюся на нем группу (рис. 10.2). Контейнерами обычно служат такие компоненты, как форма From, панель Panel, группа GroupBox.
При работе с группой один из зависимых переключателей рекомендуется делать выбранным, что можно выполнить при проектировании формы или в процессе выполнения приложения. Например, для приведенной на рисунке 10.2 формы – это можно выполнить следующим образом:
procedure TForm1. FormCreate (Sender: TObject);
begin
Radio Button2.Cheecked:=true;
Radio Button3.Cheecked:=true;
Radio Button6.Cheecked:=true;
Radio Button11.Cheecked:=true;
end;
Рис. 10.2. Виды контейнеров для переключателей
Когда в группе выбран один из зависимых переключателей, то, в отличие от независимого переключателя, его состояние нельзя изменить повторным щелчком. Для отмены выбора зависимого переключателя нужно выбрать другой переключатель из этой же группы. Для компонента Radio Button событие On Click возникает только при выборе переключателя. Повторный щелчок на переключателе не приводит к возникновению события On Click.
Кроме уже упомянутых элементов – контейнеров, объединяющих зависимые переключатели в группу, Delphi предлагает специализированный компонент RadioGroup, представляющий собой группу переключателей Radio Button. Такая группа создана для упорядочения переключателей и упрощения организации их взаимодействия по сравнению с добавлением их вручную к обычной группе.
Геометрическая фигура Shape
Для отображения геометрических фигур служит компонент Shape.
Компонент рисует одну из геометрических фигур (прямоугольник, квадрат, скругленный прямоугольник, скругленный квадрат, эллипс, окружность). Фигура полностью занимает все пространство компонента. Если задан квадрат или круг, размеры элемента по горизонтали и вертикали отличаются, фигура чертится с размером меньшего измерения.
Вид фигуры, отображаемый этим компонентом, определяется одноименным свойством Shape, принимающим следующие значения:
- stCircle – круг;
- stEllipse – эллипс;
- stRectangle – прямоугольник;
- stRoundRect- прямоугольник со скругленными углами;
- stRoundRect – квадрат со скругленными углами;
- setsquare – квадрат.
Рис. 10.3. Фигуры, отображаемые компонентом Shape.
Управление цветом и заполнением фигуры выполняется с помощью свойств Pen и Brush.
Например:
Shape1. Pen. Width: = 3;
Shape1. Brush. Color: = clSilver;
Технология выполнения проекта:
Разместим на форме компоненты в соответствии с рисунком 10.4. В таблице 10.1. приведены компоненты, которые понадобятся для решения поставленной задачи, и их назначение.
При размещении компонентов на форме необходимо учесть, что сначала устанавливается компонент Panel1, а затем на него накладываются компоненты геометрических фигур Shape 1, 2, 3. Это позволит создать видимость рамки для светофора и сделать дочерними фигуры. Причём значения ниже перечисленных свойств данного компонента создаёт вид рамки:
- BevelInner;
- BevelOuter;
- BorderWidth;
- BevelWidth.
Рис. 10.4. Конструирование формы проекта «Светофор».
Таблица 10.1.
Компоненты проекта и их назначение.
Компонент | Назначение |
BitBtn1 | Выход из программы |
RadioButton1 | Название цвета «Красный» |
RadioButton2 | Название цвета «Жёлтый» |
RadioButton3 | Название цвета «Зелёный» |
Panel1 | Для объединения шаров с цветами |
Shape1 | Шар для красного цвета |
Shape2 | Шар для жёлтого цвета |
Shape3 | Шар для зелёного цвета |
Установите свойства для компонентов проекта в соответствии с приведённой таблицей 10.2.
Таблица 10.2.
Компонент | Свойство | Значение |
Form1 | Caption | СВЕТОФОР |
Height | 350 | |
Width | 320 | |
Font | Жирный, 12 | |
RadioButton1 | Caption | Красный |
Color | clRed | |
Height | 15 | |
Width | 110 | |
Name | Rb1 | |
RadioButton2 | Caption | Жёлтый |
Color | clYellow | |
Height | 15 | |
Width | 110 | |
Name | Rb2 | |
RadioButton3 | Caption | Зелёный |
Color | clGreen | |
Height | 15 | |
Width | 110 | |
Name | Rb3 | |
Panel1 | Caption | Удалите название |
BevelInner | bvRaised | |
BevelOuter | bvRaised | |
BorderWidth | 5 | |
BevelWidth | 5 | |
Height | 225 | |
Width | 110 | |
Shape 1, 2, 3. | Shape | stCircle |
Height | 50 | |
Width | 50 | |
BitBtn1 | Kind | bkClose |
Поместите в обработчик события OnActivate формы Form1 следующий код:
procedure TForm1. FormCreate (Sender: TObject);
Shape1. Pen. Width: = 3;
Shape2. Pen. Width: = 3;
Shape3. Pen. Width: = 3;
Shape1. Brush. Color: = clSilver;
Shape2. Brush. Color: = clSilver;
Shape3. Brush. Color: = clSilver;
end;
Данная процедура означает следующее:
- ширина рамки компонентов фигур Shape 1, 2, 3 равна3;
- заливка внутренней области фигур серебряного цвета.
Цвета можно задавать с помощью констант, которые приведены в таблице 10.3. с кодами и названиями цветов.
Таблица 10.3.
Константы основных цветов.
Константа | Цвет | Значение |
clAgua | Ярко – голубой | SFFFF00 |
clBlack | Чёрный | S000000 |
clBlue | Голубой | SFF0000 |
clFuchsia | Сиреневый | SFF00FF |
clGray | Серый | S808080 |
clGreen | Зелёный | S008000 |
clLime | Ярко – зелёный | S00FF00 |
clMaroon | Тёмно – красный | S000080 |
clNavy | Тёмно – синий | S800000 |
clOlive | Оливковый | S008080 |
clPurple | Фиолетовый | S800080 |
clRed | Красный | S0000FF |
clSilver | Серебряный | SC0C0C0 |
clTeal | Сине – зелёный | S808000 |
clWhite | Белый | SFFFFFF |
clYellow | Жёлтый | S00FFFF |
Далее в обработчик событий по щелчку для компонентов RadioButton 1, 2, 3 введите следующие коды:
procedure TForm1. RB1Click (Sender: TObject);
begin
if RB1. Checked = true then
Shape1. Brush. Color: = clSilver;
Shape2. Brush. Color: = clSilver;
Shape3. Brush. Color: = clSilver;
end;
procedure TForm1. RB2Click (Sender: TObject);
begin
if RB1. Checked = true then
Shape1. Brush. Color: = clSilver;
Shape2. Brush. Color: = clSilver;
Shape3. Brush. Color: = clSilver;
end;
procedure TForm1. RB3Click (Sender: TObject);
begin
if RB1. Checked = true then
Shape1. Brush. Color: = clSilver;
Shape2. Brush. Color: = clSilver;
Shape3. Brush. Color: = clSilver;
end;
end.
Данные процедуры означают, что при выборе (щелчке) той или иной кнопки нужная фигура принимает свой свет. Например, при выборе первой кнопки первый шар окрашивается в красный цвет, при выборе второй кнопки окрашивается второй шар в жёлтый цвет и т. д.
Проект «Словарь»
Постановка задачи:
Разработать программу, с помощью которой пользователь мог бы составить словарь новых терминов. При необходимости в этот словарь можно вносить изменения, дополнять или сокращать его. При выборе термина на контрольной панели появляется его номер и общее количество слов в словаре (см. рис. 12.1).
Рис. 12.1 Окно формы проекта «СЛОВАРЬ»
Пояснения к задаче:
Для разработки данного проекта необходимо учесть наличие:
- Раскрывающегося списка, в котором будут храниться термины;
- Метки для блокировок кнопок;
- Кнопки для работы со списком терминов.
Новым в данном проекте являются компонент CheckBox, который позволит нам создать метку для блокировки кнопок, а также функция вывода сообщения MessageDlg.
Переключатель с независимой фиксацией CheckBox
Переключатель с независимой фиксацией представлен компонентом CheckBox.
Данный переключатель действует независимо от других подобных переключателей, несмотря на то, что по функциональному назначению их часто объединяют в группу с общим названием.
Переключатель выглядит как прямоугольник с текстовым заголовком. Если в нем находится галочка, то обозначенная этим флажком опция включена, в том случае также говорят, что флажок установлен или отмечен. Если прямоугольник пуст, то флажок брошен. Действия с одним переключателем не отражаются на состоянии других переключателей, если это не было специально предусмотрено.
Для определения состояния флажка используется свойство Checked типа Boolean.
По умолчанию оно имеет значение False, и флажок сброшен.
Пользователь может переключать флажок щелчком мыши. Если флажок сброшен, то после щелчка он становится включенным, и наоборот. При этом соответственно изменяется значение свойства Checked. Флажок можно переключить и с помощью клавиши <Пробел>, когда компонент CheckBox находится в фокусе ввода, и вокруг его заголовка имеется черный пунктирный прямоугольник.
На рисунке 12.2 приведен пример включенных и отключенных флажков.
Рис 12.1 Пример группы переключателей
Пример 12.1. Анализ состояния независимого переключателя
If CheckBox1. Checked Then
MessageDlg ( ‘Время истекло!’, mtError, [mbOK], 0);
Сообщение «Время истекло!» выдается при включенном состоянии флажка CheckBox1, управляющего параметром выдачи сообщения об истечении лимита времени.
Флажком можно управлять программно, устанавливая свойству Checked требуемые значения.
Пример 12.2. Программное управление независимым переключателем (флажком)
CheckBox2. Checked : = true;
CheckBox3. Checked : = False;
Флажок CheckBox2 устанавливается, а флажок CheckBox3 сбрасывается.
Сделать флажок недоступным для изменения, заблокировать его, можно путем установки свойству Enabled значения False, например:
CheckBox1. Enabled : = False;
После перехода переключателя в заблокированный режим он сохраняет свое состояние, которое было до выполнения блокировки. То есть неактивный переключатель может находиться во включенном и в выключенном состояниях.
Кроме двух состояний (включен/выключен) флажок может иметь еще и третье состояние – запрещенное, или отмененное. Наличием или отсутствием отмененного состояния управляет свойство AllowGrayed типа Boolean. Если это свойство имеет значение true, то при щелчке кнопкой мыши флажок циклически переключается между тремя состояниями: включенный, выключенный и отмененный. В отмененном состоянии переключатель выделяется серым цветом, а в прямоугольнике находится знак галочки.
Отображение переключателем в отмененном состоянии галочки способно ввести в заблуждение, так как подобное состояние можно интерпретировать как включенное.
Свойство Checked имеет значение true только для выбранного режима переключателя.
Для анализа и установки одного из трех состояний флажка (рис. 12.3) служит свойство State типа ТCheckBoxState. Оно может принимать следующие значения:
- cbUnchecked — флажок сброшен;
- cbchecked – флажок установлен;
- cbGrayed — флажок запрещен.
Рис. 12.3. Состояние переключателя CheckBox
При изменении состояния переключателя возникает событие OnClick, независимо от того, в какое состояние переходит переключатель. В обработчике события OnClick обычно располагаются операторы, выполняющие состояния переключателя и осуществляющие требуемые действия.
Пример 12.3. Процедура обработки события выбора независимого переключателя.
procedure TForm1. CheckBox3 Click (Sender: TObject);
begin
Case CheckBox3. State of
cbUnchecked : CheckBox3. Caption : = ‘ Переключатель включен ‘;
cbchecked : CheckBox3. Caption : = ‘ Переключатель не включен ‘;
cbGrayed : CheckBox3. Caption : = ‘ Переключатель запрещен ‘;
end;
end;
Флажок CheckBox3 при его переключении отображает в заголовке свое состояние.
Процедуры и функции, реализующие диалоги
В Delphi существует ряд процедур и функций, предлагаемых для отображения простых диалогов общего назначения.
Процедура ShowMessage, функции MessageDlg и MessageDlgPos отображает окно (панель) вывода сообщений; функции InputBox и InpuQuery отображают окно (панель) для ввода информации.
Процедура ShowMessage (const Msg : String) отображает окно сообщение кнопкой ОК. Заголовок содержит название исполняемого файла приложения, а строка Msg выводится как текст сообщения.
Функция MessageDlg (const Msg : String; AType : TmsgDlgType; AButtons : TmsgDlg Buttons; HelpCtx : Longint) : Word отображает окно сообщений в центре экрана она позволяет получить ответ пользователя. Параметр Msg содержит выводимое сообщение.
Окно сообщений может иметь различный тип и наряду с сообщением содержать картинки. Тип окна сообщения определяется параметром AType, который может принимать следующие значения:
- mtWarninig – окно содержит черный восклицательный знак в желтом треугольнике и заголовок Warninig;
- mtError – окно содержит белый крест в красном круге и заголовок Error;
- mtInformation – окно содержит букву j синего цвета в белом круге и заголовок Information;
- mtConfirmation – окно содержит знак ? синего цвета в белом круге и заголовок Confirmation;
- mtCustom – окно содержит картинки, в заголовке выводится названии исполняемого файла приложения.
Параметр AButtons задает набор кнопок окна и может принимать любые комбинации следующих значение, которую задают надпись на кнопке:
- mbYes – Yes;
- mbNo – No;
- mbOK – OK;
- mbCancel – Cancel;
- mbHelp – Help;
- mbAbount – Abount;
- mbRetry – Retry;
- mbIgnore – Ignore;
- mbAll – All.
Для параметра AButtons имеются две константы mbYesNoCancel и mbCancel, определяющие предопределенные наборы кнопок:
mbYesNoCancel = (mbYes, mbNo, mbCancel)
mbOK Cancel = (mbOK, mbCancel)
При нажатии любой из этих кнопок, кроме кнопки Help, закрывается диалог и возвращается функцией MessageDlg модальный результат (свойство ModalResult), проанализировав который, можно управлять выполнением приложения.
Параметр HelpCtx определяет контекст (тему) справки, появляющейся во время отображения диалога при нажатии пользователем клавиши <F1>. Обычно значение этого параметра равно нулю.
Пример 12.4. Использование функции MessageDlg.
procedure TForm1.btnTestDate Click (Sender: TObject);
var
rez : TModalResult;
begin
If longth (edtDate.Text) < 8 then
begin
rez : MessageDlg ( ‘Неправильная дата!’ #10#13 ‘Исправить автоматически?’, mtError (mbOK, mbNo), 0);
If rez = mrOK then edtDate.Text : DateToStr (Date);
If rez = mrNo then edtDate. SetFocus;
end;
end;
При нажатии кнопки btnTestDate производится простейшая проверка даты. Код даты вводится в поле редактирования edtDate, размещенное на форме. Если длина ввода даты меньше допустимой, выдается предупреждение и запрос на автоматическую коррекцию. При утвердительном ответе пользователя в поле даты записывается текущая дата, при отрицательном фокусе ввода передается полю, предназначенному для ввода даты.
Технология выполнения проекта
Разместим на форме компоненты в соответствии с рисунком 12.4. В таблице 12.1 приведены компоненты, которые понадобятся для решения поставленной задачи, и их назначение.
Рис.12.4. Конструирование формы проекта «Справочник цветов»
Таблица 12.1
Компоненты | Назначение |
Button1 | Кнопка для добавления терминов в список |
Button2 | Кнопка для удаления терминов из списка |
Button3 | Кнопка для редактирования терминов в списке |
Button4 | Кнопка для сохранения списка |
Label 1, 2 | Вывод записей |
CheckBox1 | Для блокировки кнопок проекта |
ComboBox1 | Список всех терминов словаря |
Установите свойства для компонентов в соответствии с приведенной таблицей 12.2.
Таблица 12.2
Компонент | Свойство | Значение |
Form1 | Caption | Словарь |
Height | 270 | |
Width | 345 | |
Font | обычный, 10 | |
Label 1, 2 | Caption | Удалить название |
Button1 | Caption | Добавить |
Button2 | Caption | Удалить |
Button3 | Caption | Редактировать |
Button4 | Caption | Сохранить |
CheckBox1 | Caption | Только чтение |
ComboBox1 | Text | Удалить текст |
Items | ИнформатикаПрограммированиеДелфиПроектЦветСтудентУниверситетИнститут |
Для События OnClick компонента Button1 набрать следующий код:
procedure TForm1. Button1Click (Sender: TObject);
begin
ComboBox1. Items. Add (ComboBox1. Text);
If ComboBox1. ItemIndex = — 1
then
ComboBox1. Text : = ‘ ‘;
ComboBox1. Items.SaveToFile ( ‘Словарь. txt’);
end;
Данный код выполняет следующее:
- добавляет строку из поля ComboBox1 в список;
- оператор очищает строку ввода после того, как текст из неё попадает в список;
- сохраняет добавленный элемент в файл с названием ‘Словарь. txt’.
Для события OnClick компонента Button2 набрать следующий код:
procedure TForm1. Button2Click (Sender: TObject);
begin
If MessageDlg ( ‘Вы, действительно хотите удалить запись?’,
mtWarninig, {mbYes, mbNo}, 0) = mrYes
then
ComboBox1. Items.Delete (ComboBox1. ItemIndex);
ComboBox1. Items. SaveToFile ( ‘Словарь. txt’);
end;
Данное условие означает, что при нажатии на кнопке Button2 программа выполняет следующее:
- выводит диалоговое окно с сообщением «’Вы, действительно хотите удалить запись?»
- в случае если пользователь ответил положительно, то программа удаляет запись из списка;
- сохраняет удаление термина из списка в файле с названием ‘Словарь. txt’.
Для события OnClick компонента Button4 набрать следующий код:
procedure TForm1. Button4Click (Sender: TObject);
begin
ComboBox1. Items. SaveToFile ( ‘Словарь. txt’);
end;
Данное условие означает, что при нажатии на кнопке Button4 программа сохраняет весь список в файл с названием ‘Словарь. txt’.
Для загрузки списка из файла ‘Словарь. txt’ при активизации проекта запишем следующий код:
procedure TForm1. FormCreate (Sender: TObject);
begin
ComboBox1. Items.LoadFormFile ( ‘Словарь. txt’);
end;
В разделе описания глобальных переменных необходимо описать переменную num.
Implementation
Var
Num : integer;
Для события OnClick компонента Button3 набрать следующий код:
procedure TForm1. Button3Click (Sender: TObject);
begin
ComboBox1. Items. Delete (num);
ComboBox1. Items. Add (ComboBox1. Text);
If ComboBox1. ItemIndex = — 1
then
ComboBox1. Text : = ‘ ‘;
ComboBox1. Items.SaveToFile ( ‘Словарь. txt’);
end;
Для исправления ошибок, замеченных в строках списка, выделенную строку надо удалить из списка, а исправленную строку (т.е. содержимое строки ввода) добавить в список.
Новая переменная num необходима для сохранения номера выбранной строки. При внесении изменений выбранной строкой становится строка ввода, для которой ItemIndex = — 1.
Для обработчика события OnClick компонента ComboBox1 записать следующий код:
procedure TForm1. ComboBox1Click (Sender: TObject);
begin
num : = ComboBox1. ItemIndex;
Label 2. Caption : = inttostr (ComboBox1. ItemIndex +1);
end;
Данный код позволяет вывести номер выбранной строки в метку Label 2.
Теперь необходимо указать программе, что при выборе переключателя «Только чтение» элементы списка не редактируются и не удаляются. А также кнопки Добавить, Удалить, Редактировать и Сохранить неактивны.
procedure TForm1. CheckBox1Click (Sender: TObject);
begin
If CheckBox1. Checked : = False;
Then ComboBox1.Style : = csDropDown
Else ComboBox1.Style : = csDropDownList;
If CheckBox1. Checked : = False
Then Button1. Enabled : = true
Else Button1. Enabled : = False;
If CheckBox1. Checked : = False;
Then Button2. Enabled : = true
Else Button2. Enabled : = False;
If CheckBox1. Checked : = False;
Then Button3. Enabled : = true
Else Button3. Enabled : = False;
If CheckBox1. Checked : = False;
Then Button4. Enabled : = true
Else Button4. Enabled : = False;
end;
procedure TForm1. ComboBox1Change (Sender: TObject);
begin
Label 1. Caption : = inttostr (ComboBox1. Items.Count);
end;
procedure TForm1. FormCloseQuery (Sender: TObject; var CanClose:Boolean);
begin
ComboBox1. Items.SaveToFile ( ‘Словарь. txt’);
end;
end.
Дополнительные задания к проекту
- Предусмотреть возможность добавления терминов в список не только при нажатии кнопки Добавить, но и при нажатии клавиши <Enter>.
Подсказка. Для компонента ComboBox1 в обработчик события OnKeyPress вставить код: if Key = # 13 Then …..
- Сохранить список проекта в файле с названием ‘Словарь. txt’.
- Добавить две метки и вывести на них общее количество терминов в списке и номер выбранного термина.
Подсказка. Для компонента ComboBox1 в обработчик события OnChange вставить код, присваивающий заголовку панели значение ComboBox1. Items.Count, а в обработчик события OnClick – код, присваивающий заголовку другой панели значение ComboBox1. ItemIndex +1, имея ввиду, что первый термин индекс 0, второй – 1 и т.д.
- Сохранять все изменения словаря при закрытии формы.
Подсказка. Для компонента Form1 в обработчик события OnCloseQuerry вставить код, сохраняющий измененный список в файле ‘glostext.txt’.
- Сделать список отсортированным.
Подсказка. Свойству Sorted компонента ComboBox1 присвоить значение true.
Лабораторная работа №21
Тема: Использование компонента таймер для управления при выполнении программы
Цель: уметь создавать программы в среде Delphi 7
Постановка задачи
Разработать хранитель экрана для Windows (файл с расширением*-. scr). Форма масштабируется на весь экран, заголовок скрывается, а любые действия пользователя должны прекращать работу программы. Случайным образом выбирается цвет формы, затем происходит ее плавное насыщение случайно выбранным цветом. Первоначально форма полностью прозрачная. Когда она станет полностью непрозрачной, следует медленно убирать насыщенность цвета, пока она опять не станет прозрачной. После этого вновь выбирается случайный цвет для насыщения, и описанный процесс повторяется сначала.
Разработка формы
Создадим новый проект Delphi. Как известно, экранные заставки хранятся в файлах с расширением . scr, а по умолчанию проект Delphi компилируется как выполняемый файл . ехе. Для того чтобы наша программа имела расширение . scr, выполним команду меню Project —> Options, на вкладке Application диалогового окна Project Options введем в поле Target file extension значение scr (рис. 5.1) и нажмем кнопку ОК. Все что нам понадобится на форме, — это два компонента Timer категории System. Первый будет служить для реализации постепенного насыщения формы цветом — для этого таймера следует изменить значение свойства Interval на 100. Второй таймер потребуется при постепенном уменьшении насыщенности цвета вплоть до того момента, когда форма вновь станет полностью прозрачной. Для этого таймера свойству interval следует также присвоить значение 100, а значение свойства Enabled изменить на False, поскольку изначально «затухания» происходить не будет.
Рис. 5.1. Выбор расширения для откомпилированной программы
Изменим свойства формы согласно табл. 5.1.
Таблица 5.1. Свойства формы хранителя экрана
Разработка программного кода
Объявите в разделе var переменную mouse типа TPoint. В этой переменой будут храниться координаты указателя мыши, при изменении которых программа должна закрываться:
var
Forml: TForml;
mouse: TPoint;
Программа экранной заставки должна закрываться не только по движению мыши, но при любой активности пользователя. Для этого создадим обработчики некоторых событий главной формы. Создание формы (событие OnCreate):
procedure TForml.FormCreate(Sender: TObject);
begin
GetCursorPos(mouse); //сохраняем координаты курсора мыши
ShowCursor(False); //прячем курсор
end;
Форма должна закрываться по нажатию любой клавиши (событие OnKeyPress) и при движении мышью (событие OnMouseMove). Код обработчика события OnKeyPress:
procedure TForml.FormKeyPress(Sender: TObject; var Key:Char);
begin
Halt; //завершение работы программы
end;
Для события OnMouseMove программный код будет несколько
иным:
procedure TForm1.FormMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if (X <> mouse.X) or (У <> mouse.Y) then Halt;
end;
Здесь сначала выполняется проверка: были ли изменены координаты курсора. Если координаты курсора изменились, то, соответственно, мышь была сдвинута и следует закрыть программу.
Напишем собственную процедуру для выбора случайного цвета: color_check. Объявите ее как закрытый член класса формы:
type
TForml class(TForm)
private
{ Private declarations }
procedure color_check();
public
{ Public declarations }
end;
В разделе implementation создадим реализацию процедуры
Здесь случайным образом выбирается число от 1 до 6, в зависимости от того которого определяем цвет формы. Процедура colorcheck будет вызываться при каждом новом насыщении формы. Обработчик события OnTimer первого таймера должен иметь следующий вид:
procedure TForml.TimerlTimer(Sender: TObject);
begin
if Forml.AlphaBlendValue > 250
then {проверяем: не полностью ли мы закрасили форму}
begin
Timerl.Enabled := False; //выключаем насыщение формы
Timer2.Enabled := True; //включаем обратный процесс
end;
//постепенное насыщение формы
Forml.AlphaBlendValue := Forml.AlphaBlendValue + 1;
end;
Насыщенность постепенно увеличивается на 1, и выполняется проверка: не стала ли форма уже полностью закрашенной выбранным цветом. Если нет, то продолжаем увеличивать насыщенность цвета через каждые 100 мс. Когда форма будет полностью насыщенной, начинаем обратный процесс, который будет происходить под управлением второго таймера (событие Time г 2 . OnTimer):
procedure TForml.Timer2Timer(Sender: TObject);
begin
if Forml.AlphaBlendValue < 5
then //если форма уже полностью прозрачная
begin
color_check(); //выбираем случайный цвет для формы
Timer2.Enabled := False; //выключаем второй таймер
Timerl.Enabled := True; //включаем первый таймер
end;
//Уменьшаем прозрачность на 1
Forml.AlphaBlendValue := Forml.AlphaBlendValue — 1;
end;
Здесь через каждые 100 мс прозрачность формы уменьшается на 1. Когда форма становится полностью прозрачной, мы случайным образом выбираем другой цвет, выключаем таймер, по которому происходит уменьшение насыщенности цвета, и включаем первый таймер, который плавно увеличивает насыщенность цвета. Теперь программу можно откомпилировать, скопировать файл . scr в папку с хранителями экрана (для Windows ХР это папка Windows \System32), открыть окно параметров Рабочего стола и выбрать хранитель экрана, соответствующий нашей программе. Разработанный нами хранитель экрана в действии показан на рис. 5.2. В данном случае был случайным образом выбран желтый цвет заполнения и происходит медленное насыщение этим цветом. Можно разглядеть папки, которые видны сквозь полупрозрачную форму.
Полный исходный код модуля
Полный исходный код модуля программы Хранитель экрана представлен в листинге 5.1.
Рис. 5.2. Хранитель экрана в действии
Лабораторная работа №22
Тема: Использование компонентов зависимых и независимых переключателей
Цель: уметь создавать программы в среде Delphi 7
Проект «Тестирование по информатике».
Постановка задачи:
Создать программу «Тестирование», с помощью которой можно выполнить: после запуска программы появляется изображение аналогичное рисунку 15.1. Пользователь по своему усмотрению выбирает один из переключателей в группе. В зависимости от правильности ответов появляется одно из сообщений «Плохо», «Удовлетворительно», «Хорошо», «Отлично».
Рис. 15.1. Окно формы проекта «ТЕСТИРОВАНИЕ ПО ИНФОРМАТИКЕ».
Пояснение к задаче:
Пользователь отвечает на вопросы выбором одного из варианта ответов на каждый вопрос. После ответа на последний вопрос программа выводит результат тестирования в виде сообщения: хорошо, плохо, удовлетворительно или отлично.
Новым в этой программе является группа переключателей RadioGroup на странице палитры компонентов Standard.
TRadioGroup – группа зависимых переключателей.
Компонент класса TRadioGroup представляет собой специальный контейнер, предназначенный для размещения зависимых переключателей класса TRadioGroup. Каждый размещаемый в нём переключатель помещается в специальный список Items и доступен по индексу, что упрощает обслуживание группы.
Группа переключателей данного компонента создана для упорядочения переключателей и упрощения организации их взаимодействия по сравнению с добавлением их вручную к обычной группе.
Группа переключателей RadioGroup может содержать другие элементы управления, например, независимый переключатель CheckBox или однострочный редактор Edit.
После размещения компонента на форме он пуст. Чтобы создать в нём хотя бы один переключатель, следует раскрыть редактор списка Items и ввести хотя бы одну строку: строки Items используются как поясняющие надписи с права от переключателей, а их количество определяет количество переключателей в группе.
После создания компонента его свойство ItemIndex по умолчанию имеет значение – 1, это означает, что ни один переключатель в группе не выбран. Если в момент появления компонента на экране в каком – то переключателе выбор уже должен быть установлен, необходимо на этапе конструирования с помощью окна Инспектора объектов или программно (например, в обработчике onActivate формы) установить в свойство ItemIndex номер соответствующего переключателя (нумерация начинается с 0). Это же свойство позволяет программе проанализировать выбор пользователя, например:
case RadioGroup1. ItemIndex of
0: . . . ; //Выбран 1 – й переключатель
1: . . . ; //Выбран 2 – й переключатель
Else
… //Не выбран ни один из переключателей
end;
Свойство Columns типа Integer задаёт число столбцов, на которое разбиваются переключатели при расположении в группе (по умолчанию 1). Это свойство действует только на переключатели, принадлежащие массиву Items группы, и не действует на другие управляющие элементы, например, однострочный редактор Edit или надпись Label, размещённые в группе RadioGroup.
При создании формы в группу RadioGroup1 включается 6 переключателей, расположенных в две колонки. Переключатель с заголовком Items становится выбранным.
Технология выполнения проекта:
Разместим на форме компоненты в соответствии с рисунком 15.2. В таблице 15.1. приведены компоненты, которые понадобятся для решения поставленной задачи, и их назначение.
Рис. 15.2. Конструирование формы проекта «Тестирование по информатике».
Таблица 15.1.
Компоненты проекта и их назначение.
Компонент | Назначение |
Label 1, 2, 3, 4, 5, 6 | Метки для вывода вопросов тестирования |
RadioGroup 1, 2, 3, 4, 5 | Группа переключателей для вариантов ответов |
Panel 1 | Панель для вывода результата тестирования |
BitBtn 1 | Кнопка для завершения проекта |
Установите свойства для компонентов проекта в соответствии с приведённой таблицей 15.2.
Таблица 15.2.
Компоненты проекта и их свойства.
Компонент | Свойство | Значение | ||
Form1 | Caption | ТЕСТ | ||
Label 1 | Caption | Удалить заголовок | ||
Label 2 | Caption | Основоположник алгебры логики | ||
Label 3 | Caption | Объём блока начальной загрузки | ||
Label 4 | Caption | Автор первого счётного устройства | ||
Label 5 | Caption | Энергозависимая память | ||
RadioGroup 1 | Caption | Удалить заголовок | ||
Columns | 5 | |||
Items | Урал – 1М – 20ЭВ – 60МЭСМБЭСМ | |||
RadioGroup 2 | Caption | Удалить заголовок | ||
Columns | 4 | |||
Items | ЛейбницБульНейманПаскаль | |||
RadioGroup 3 | Caption | Удалить заголовок | ||
Columns | 4 | |||
Items | 1024 байт512 байт1.5 байт2 Кбайт | |||
RadioGroup 4 | Caption | Удалить заголовок | ||
Columns | 4 | |||
Items | БэббиджПаскальНейманЛавлейс | |||
RadioGroup 5 | Caption | Удалить заголовок | ||
Columns | 3 | |||
Items | ПЗУОЗУВнешняя | |||
Свойство Columns задаёт количество столбцов компонента.
Свойство Items задаёт текст, находящийся в компоненте.
Свойство Kind задаёт вид полосы прокрутки: вертикальный или горизонтальный.
Для обработчика события OnClick компонента RadioGroup введите следующие строки:
procedure TForm1. RadioGrouplClick (Sender: TObject);
begin
sum: =0;
If RadioGroup 1. Itemindex =4
Then sum: =Sum+1;
end;
Данные строки означают, что если в первой группе переключателей выбран 4 пункт, то счётчик sum увеличивается на единицу. Переменная sum – это счётчик, который накапливает в себе правильные ответы и вопросы. Её необходимо описать в разделе объявления глобальных переменных.
Таким же образом необходимо ввести код для каждой группы переключателей, указав номер пункта правильного ответа.
Листинг программы проекта:
unit Unit1;
interfase
uses
Windows, Messages, SysUtils, Classes, Graphics, Control,
Forms, Dialog,
StdCtrls, ExtCtrls;
type
TForm1 = class (TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
RadioGroup1: TRadioGroup;
RadioGroup2: TRadioGroup;
RadioGroup3: TRadioGroup;
RadioGroup4: TRadioGroup;
RadioGroup5: TRadioGroup;
Panel1: TPanel;
BitBtn1: TBitBtn;
procedure RadioGroup1Click (Sender: TObject);
procedure RadioGroup2Click (Sender: TObject);
procedure RadioGroup3Click (Sender: TObject);
procedure RadioGroup4Click (Sender: TObject);
procedure RadioGroup5Click (Sender: TObject);
private
{ Private declaration }
public
{ Public declaration }
end;
var
Form1: TForm;
sum: integer;
implementation
{SR * . DFM}
procedure TForm1. RadioGroup1Click (Sender: TObject);
begin
sum: =0;
If RadioGroup 1. Itemindex =4
Then sum: =Sum+1;
end;
procedure TForm1. RadioGroup2Click (Sender: TObject);
begin
sum: =0;
If RadioGroup 1. Itemindex =2
Then sum: =Sum+1;
end;
procedure TForm1. RadioGroup3Click (Sender: TObject);
begin
sum: =0;
If RadioGroup 1. Itemindex =2
Then sum: =Sum+1;
end;
procedure TForm1. RadioGroup4Click (Sender: TObject);
begin
If RadioGroup 1. Itemindex =1 Then sum: =Sum+1;
end;
procedure TForm1. RadioGroup5Click (Sender: TObject);
begin
If RadioGroup 1. Itemindex =3
Then sum: =Sum+1;
begin
Café sum of
- .2: Panel1. Cartion: =’Плохо!’;
3: Panel1. Cartion: =’Удовлетворительно!’;
4: Panel1. Cartion: =’Хорошо!’;
5: Panel1. Cartion: =’Отлично!’;
ShowMessage (‘Конец теста’)
end;
end;
end.
Контрольные вопросы
- Компонент для создания группы зависимых переключателей
- Основное свойство зависимых переключателей
- Компонент для независимых переключателей
- Основное свойство независимых переключателей
Лабораторная работа № 23
Тема: Использование диалоговых окон. Проект «Анкета студента»
Цель: закрепить знания, умения и навыки по созданию программы с использованием компонентов (Lable, Image, Button, PageControl) на Form, предназначенных для вывода информации. Использование диалоговых окон
Знать: | Уметь: |
назначение свойств компонентов, выводимых на форму проекта (Lable, Image, Button, PageControl).Диалоговые окна | применять свойства различных компонентов |
Используемые компоненты: Label, Button, Image, PageControl.
- вставьте в форму несколько текстовых полей и заполните своими данными;
- Вставьте в форму объект типа Image (картинка). Находящийся на палитре компонентов Additional;
- Вставьте свою портретную фотографию с помощью свойства Picture (иллюстрация) объекта Image 1. Для свойства Stretch — True.
- Наложите свою художественную фотографию на портретную, вставив в форму еще один объект Image.
- установите на форме 2 командные кнопки Button.
- Запрограммируйте кнопку «Портретная фотография», так чтобы после ее нажатия в форме появлялась портретная фотография, а при «Художественная фотография» — художественная, используя свойство Image – Visible (True – истина, False — ложь).
- Поставьте кнопку «Дополнительная информация» при нажатии, которой выходит диалоговое окно
Дополнительное задание: Дополнить проект сведениями о родителях (проект представить в электронном виде, код программы должен содержать комментарии)
Ответьте на контрольные вопросы:
Лабораторная работа №24
Тема: Использование операторов обработки исключений
Цель: уметь создавать программы в среде Delphi 7
Ход работы
- Повторить тему «Обработка исключительных ситуаций. Класс Exception»
- Напишите программу, которая демонстрирует обработку исключений при помощи инструкций try … except
При введении в сопротивление нуля должно выйти сообщение
Общий листинг программы
unit UsTry_;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Edit1: TEdit; // напряжение
Edit2: TEdit; // сопротивление
Label5: TLabel; // результат расчета — ток
Button1: TButton; // кнопка Вычислить
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
u: real; // напряжение
r: real; // сопротивление
i: real; // ток
begin
Label5.Caption := »;
try
// инструкции, которые могут
// вызвать исключение (ошибку)
u := StrToFloat(Edit1.Text);
r := StrToFloat(Edit2.Text);
i := u/r;
except
on EZeroDivide do // деление на ноль
begin
ShowMessage(‘ Сопротивление не может быть равно нулю!’);
exit;
end;
on EConvertError do // невозможно преобразовать строку символов в число
begin
ShowMessage(‘Напряжение и сопротивление должны быть заданы числом.’+#13+
‘При записи дробного числа используйте запятую.’);
exit;
end;
end;
Label5.caption:=FloatToStr(i)+’ А’;
end;
end.
Контрольные вопросы
- Что является исключением в программировании?
- Какие ошибки возникают в процессе разработки и выполнения программ?
- Какие классы исключений используются наиболее часто?
- Какую форму имеет конструкция try … except?
Лабораторная работа №25
Тема: Создание главного и контекстного меню
Цель: уметь создавать программы в среде Delphi 7
Проект «Меню»
Начните новый проект в Delphi и сохраните его в отдельной папке под названием “MENU” (Имя модуля формы – unit1.pas, имя проекта – MENU.dpr).
Расположите на форме перечисленные в левой части рисунка компоненты и придайте им такой же внешний вид за счет изменения необходимых свойств в инспекторе объектов.
Затем поместите на форму компонент MainMenu1. Щелкните по нему дважды и Вы попадете в дизайнер меню. В дизайнере сформируйте пункты меню, показанные в верхней части формы.
После этого перейдите в редактор кода. В редакторе кода в секцию implementation модуля формы введите приведенную ниже процедуру (напечатана жирным шрифтом):
implementation
{$R *.DFM}
procedure Exec(ch : char);
var
A, B, C : real;
code : integer;
S : string;
begin
Val(Form1.Edit1.Text, A, code);
Val(Form1.Edit2.Text, B, code);
if B<>0 then begin
case ch of
‘+’: C:= A+B;
‘-‘: C:= A-B;
‘*’: C:= A*B;
‘/’: C:= A/B
end;
Str(C:8:2, S);
end else S:=’Ошибка !’;
Form1.Panel1.Caption :=S;
end;
После этого войдите снова в дизайнер меню и, щелкая по пунктам меню, создайте приведенные ниже обработчики событий:
procedure TForm1.N1Click(Sender: TObject);
begin
Exec(‘+’);
end;
procedure TForm1.N2Click(Sender: TObject);
begin
Exec(‘-‘);
end;
procedure TForm1.N3Click(Sender: TObject);
begin
Exec(‘*’);
end;
procedure TForm1.N4Click(Sender: TObject);
begin
Exec(‘/’);
end;
Проверьте работу программы, составьте комментарии и объясните преподавателю, как она работает.
Дополнительные задания
Создайте по образцу главного меню контекстное меню.
Вставьте в пункты меню картинки
Контрольные вопросы
- Назовите компонент с помощью которого организуется главное меню
- Назовите компонент с помощью которого организуется контекстное меню
- Напишите алгоритм вставки картинки в пункты меню
- Чем отличается главное меню от контекстного?
- Возможны ли ошибки при работе данной программы и как их избежать?
Лабораторная работа №26
Тема: Создание текстового файла, ввод и вывод данных
Цель: уметь создавать программы в среде Delphi 7
Проект «Редактор текста»
Начните новый проект в Delphi и сохраните его в отдельной папке под названием “MEMO” (Имя модуля формы – unit1.pas, имя проекта – MEMO.dpr).
Прежде всего поместите на форму компонент TMemo и установите его свойство Align в значение alClient, а свойство ScrollBars – в значение ssBoth. Расположите также на форме компоненты со страницы Dialogs, как показано на рисунке.
После этого щелкните дважды по компоненту MainMenu1, и Вы попадете в так называемый дизайнер меню, который показан на рисунке ниже.
В дизайнере Вам будет необходимо сформировать пункты меню.
После этого, не выходя из дизайнера меню, щелкните дважды по пункту
«Открыть файл».
Вы попадете в редактор кода, в котором увидите шаблон для обработки данного пункта меню. Добавьте в него строки, выделенные ниже жирным шрифтом:
procedure TForm1.N2Click(Sender: TObject);
begin
with OpenDialog1 do begin
if Execute then begin
Memo1.Lines.LoadFromFile(FileName);
Form1.Caption:=’Проект «Редактор текстов» ‘+FileName;
end;
end;
end;
Аналогично сформируйте обработчик для пункта «Сохранить файл»:
procedure TForm1.N3Click(Sender: TObject);
begin
with SaveDialog1 do begin
if Execute then begin
Memo1.Lines.SaveToFile(FileName);
end;
end;
end;
Для пункта «Выход» сформируйте следующий обработчик:
procedure TForm1.N4Click(Sender: TObject);
begin
Close;
end;
И, наконец, для пункта «Шрифт»:
procedure TForm1.N5Click(Sender: TObject);
begin
with FontDialog1 do begin
if Execute then Memo1.Font:=Font;
end;
end;
Отметьте на форме компонент OpenDialog1 и в инспекторе объектов щелкните по его свойству Filter, а затем по квадратной кнопке, появившейся в поле ввода этого свойства. Вы попадете в так называемый Filter Editor, поля которого необходимо заполнить так, как показано на рисунке ниже:
Точно так же заполните свойство Filter и для компонента SaveDialog1.
Теперь можно запустить проект на выполнение, выбрать пункт меню «Открыть» и найти какой-либо текстовый файл для загрузки его в редактор. А можно вначале что-нибудь напечатать в редакторе, а затем сохранить как текстовый файл.
Изучите по справке или по тексту лекций свойства использованных Вами компонентов. Объясните преподавателю, как работает эта программа.
Контрольные вопросы
- Назовите типы файлов
- Назовите процедуры для чтения и записи файла, чем они отличаются?
- Напишите алгоритм работы с файлом
Лабораторная работа №27
Тема: Создание типизированного файла, ввод и вывод данных
Цель лабораторной работы: освоить применение компонентов OpenDialog и SaveDialog и создать приложение, в котором используются файлы.
7.1. Пример создания приложения
Задание: создать Windows-приложение для записи в файл и чтения из файла ведомости об успеваемости учащихся в количестве 10 человек. Каждая запись файла должна содержать фамилию, инициалы, а также оценки по физике, математике и сочинению. Вывести список учащихся, отсортированный в алфавитном порядке и записать эту информацию в текстовой файл.
Один из возможных вариантов панели интерфейса создаваемого приложения показан на рис.7.1.
7.1.1. Размещение компонентов на Форме
При работе с файлами чтение и запись информации удобно организовывать с помощью компонентов OpenDialog и SaveDialog.
Компоненты OpenDialog и SaveDialog находятся на странице Dialogs. Все компоненты этой страницы являются невизуальными, т.е. не видны в момент выполнения приложения. Поэтому их можно разместить в любом удобном месте Формы. Оба рассматриваемых компонента имеют идентичные свойства и отличаются только внешним видом.
BitBtn |
Рис. 7.1
Для установки компонентов OpenDialog и SaveDialog на Форму необходимо на странице Dialogs Палитры Компонентов щелкнуть “мышью” соответственно по пиктограмме или и разместить ее в любом свободном месте Формы. При выполнении приложения в момент вызова компонента появляется диалоговое окно, с помощью которого пользователь выбирает имя файла и маршрут к нему. В случае успешного завершения диалога имя выбранного файла и маршрут поиска содержится в свойстве FileName.
Пользователь имеет возможность настроить параметры окна диалога по своему усмотрению. В частности, изменить заголовок окна можно с помощью свойства Title. В свойстве DefaultExt можно указать расширение файла, если оно не задано пользователем. Свойство Filter используется для поиска (фильтрации) файлов, отображаемых в окне. Установка фильтра производится следующим образом. Выделив соответствующий компонент, необходимо дважды щелкнуть по правой (белой) части свойства Filter Инспектора Объектов. В появившемся окне редактора фильтра-Filter Editor необходимо в колонке Filter Name набрать текст, характеризующий соответствующий фильтр, а в колонке Filter–маску. Для компонента OpenDialog1 установим значения масок как показано на рис. 7.2.
Рис.7.2
Маска *.dat означает что, будут видны файлы данных с любым именем и с расширением dat, а маска *.* — что будут видны все файлы (с любым именем и с любым расширением).
Для того, чтобы файл автоматически записывался с расширением dat в свойстве DefaultExt запишем требуемое расширение — dat.
Аналогичным образом настроим компонент SaveDialog1 для текстового файла (расширение txt).
7.1.2 Создание процедур обработки событий
Для удобства работы с несколькими различными процедурами обработки событий в свойстве Name каждого компонента BitBtn замените программные имена кнопок: BitBtn1 – на BitBtnNew, BitBtn2 – на BitBtnOpen, BitBtn3 – на BitBtnSort, BitBtn4 – на BitBtnSave. Двойным нажатием клавиши “мыши” на кнопках BitBtn создайте соответствующие процедуры обработки событий. Пользуясь текстом модуля UnFile, внимательно наберите операторы этих процедур.
7.1.3 Текст модуля UnFile
Unit UnFile;
Interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, Grids, Spin;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
BitBtnNew: TBitBtn;
BitBtnOpen: TBitBtn;
BitBtnSort: TBitBtn;
BitBtnSave: TBitBtn;
SaveDialog1: TSaveDialog;
SpinEdit1: TSpinEdit;
Label1: TLabel;
OpenDialog1: TOpenDialog;
procedure TForm1.FormCreate(Sender: TObject);
procedure BitBtnSortClick(Sender: TObject);
procedure BitBtnNewClick(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
procedure BitBtnOpenClick(Sender: TObject);
procedure BitBtnSaveClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Implementation
{$R *.DFM}
type
zap=record // объявлениезаписи
fio :string[20];
mat,fiz,soch:integer;
end;
var
MZap:array[1..25] of zap; // объявление массива записей
FileZap:file of zap; // объявление файла записей
FileText:TextFile; // объявление текстового файла
FileNameZap,FileNameText:string; // имена файла записей и текстового файла
n:integer; // текущее кол-во элементов массива записей
{ Обработчиксобытия создания Формы }
procedure TForm1.FormCreate(Sender: TObject);
begin
with StringGrid1 do
begin // занесение информации в ячейки StringGrid1
Cells[0,0]:=’№пп’;
Cells[1,0]:=’Фамилия,инициалы’;
Cells[2,0]:=’Математика’;
Cells[3,0]:=’Физика’;
Cells[4,0]:=’Сочинение’;
end;
BitBtnSort.Hide; // спрятать кнопку ”Sort”
BitBtnSave.Hide; // спрятать кнопку “Save”
end;
{ Обработчик нажатия кнопки Sort }
procedure TForm1.BitBtnSortClick(Sender: TObject);
var
i,j :integer;
vper:zap;
begin
for i:=1 to n do
with StringGrid1,MZap[i] do
begin
fio:=Cells[1,i];
mat:=StrToInt(Cells[2,i]);
fiz:=StrToInt(Cells[3,i]);
soch:=StrToInt(Cells[4,i]);
end;
{ сортировка методом «пузырька«}
for i:=2 to n do
for j:=n downto i do
if MZap[j-1].fio>MZap[j].fio then
begin
vper:=MZap[j-1];
MZap[j-1]:=MZap[j];
MZap[j]:=vper;
end;
for i:=1 to n do // заполнение ячеек StringGrid1 полями массива записей
with StringGrid1,MZap[i] do
begin
Cells[0,i]:=IntToStr(i);
Cells[1,i]:=fio;
Cells[2,i]:=IntToStr(mat);
Cells[3,i]:=IntToStr(fiz);
Cells[4,i]:=IntToStr(soch);
end;
end;
{ Создание нового файла записей}
procedure TForm1.BitBtnNewClick(Sender: TObject);
var
i:integer;
begin // вывод на экран окна с предупреждающим сообщением
if MessageDlg(‘Содержимое существующего файла будет уничтожено. Вы уверены?’,
mtConfirmation, mbYesNoCancel, 0)=mrYes then
begin
for i:=1 to n do
with StringGrid1,MZap[i] do
begin // формирование полей массива записей
fio:=Cells[1,i];
mat:=StrToInt(Cells[2,i]);
fiz:=StrToInt(Cells[3,i]);
soch:=StrToInt(Cells[4,i]);
end;
with OpenDialog1 do
begin
Title:=‘Создание файла‘; // заголовок окна диалога
if Execute then // выполнение стандартного диалога выбора имени файла
begin
FileNameZap:=FileName; // присваивание имени файла
AssignFile(FileZap,FileNameZap); // назначить файлу FileZap имя FileNameZap
ReWrite(FileZap); // открыть файл на запись
for i:=1 to n do
write(FileZap,MZap[i]); // запись в файл массива записей
CloseFile(FileZap); // закрытие файла записей
end;
end;
end;
end;
{Обработчик кнопки изменения размера}
procedure TForm1.SpinEdit1Change(Sender: TObject);
var
i,m:integer;
begin
m:=StrToInt(SpinEdit1.Text); // присвоить новое значение размера
with StringGrid1 do
begin
RowCount:=m+1; // пересчитать количество строк
if m>n then // если строки добавлены то
for i:=n+1 to m do // инициализировать новые ячейки
begin
Cells[0,i]:=IntToStr(i);
Cells[1,i]:=»;
Cells[2,i]:=»;
Cells[3,i]:=»;
Cells[4,i]:=»;
end;
end;
n:=m; // запомнить новое значение размера
end;
{ обработчик нажатия кнопки Open }
procedure TForm1.BitBtnOpenClick(Sender: TObject);
var
i:integer;
begin
with OpenDialog1 do
begin
Title:=‘Открытие файла’; // заголовок окна диалога
if Execute then // выполнение стандартного диалога выбора имени файла
begin
FileNameZap:=FileName; // присваивание имени файла
AssignFile(FileZap,FileNameZap); // назначить файлу FileZap имя FileNameZap
ReSet(FileZap); // открыть файл на чтение
n:=0; // инициализация счетчика кол-ва прочитанных из файла элементов
while not EoF(FileZap) do
begin
n:=n+1; // увеличение счетчика
read(FileZap,MZap[n]); // чтение из файла n-го элемента массива записей
end;
SpinEdit1.Text:=IntToStr(n); // занести кол-во прочитанных записей в SpinEdit
StringGrid1.RowCount:=n+1; // присвоить кол-во строк
for i:=1 to n do
with StringGrid1,MZap[i] do
begin // заполнение ячеек StringGrid1 полями массива записей
Cells[0,i]:=IntToStr(i);
Cells[1,i]:=fio;
Cells[2,i]:=IntToStr(mat);
Cells[3,i]:=IntToStr(fiz);
Cells[4,i]:=IntToStr(soch);
end;
CloseFile(FileZap); // закрытие файла записей
end;
end;
BitBtnSort.Show; // показать кнопку “Sort”
BitBtnSave.Show; // показать кнопку “Save”
end;
{ Сохранение данных в текстовом файле}
procedure TForm1.BitBtnSaveClick(Sender: TObject);
var
i:integer;
begin
with SaveDialog1 do
if Execute then // выполнение стандартного диалога выбора имени файла
begin
FileNameText:=FileName; // присваивание имени файла
AssignFile(FileText,FileNameText); // назначить файлу FileText имя FileNameText
ReWrite(FileText); // открыть текстовый файл на запись
for i:=1 to n do
with MZap[i] do // запись в текстовый файл
writeln(FileText,i:3,fio:20,mat:5,fiz:5,soch:5);
CloseFile(FileText); // закрытие текстового файла по окончании записи
end;
BitBtnSort.Hide; // спрятать кнопку ”Sort”
end;
end.
7.1.4 Работа с приложением
Запустите созданное приложение. Занесите в соответствующие поля панели интерфейса информацию об успеваемости учащихся. Кнопкой “New” сохраните данные в файле. Завершите выполнение приложения.
Вновь запустите приложение и кнопкой “Open” откройте только что созданный файл. Убедитесь, что информация не содержит ошибок. При необходимости обнаруженные ошибки можно исправить, а также дополнить ведомость новой информацией. Для сортировки ведомости в алфавитном порядке воспользуйтесь кнопкой “Sort” и сохраните отсортированную информацию кнопкой “New”.
Еще раз завершите и вновь запустите приложение.
Кнопкой “Open откройте файл и убедитесь, что в нем теперь содержится ведомость, отсортированная в алфавитном порядке. Кнопкой “Save” сохраните информацию в текстовом файле. Для просмотра содержимого текстового файла воспользуйтесь, например, приложением “Microsoft Word”.
Используя все управляющие компоненты панели интерфейса, убедитесь в правильном функционировании приложения во всех предусмотренных режимах работы.
7.2 Индивидуальные задания
Во всех заданиях предусмотреть сохранение вводимых данных в файле и возможность чтения из ранее созданного файла. Результаты выводить в панель интерфейса и в текстовый файл.
- 1. Ведомость абитуриентов, сдавших вступительные экзамены в университет содержит: Ф.И.О. абитуриента, оценки. Определить средний балл по университету и вывести список абитуриентов, средний балл которых выше среднего балла по университету. Первыми в списке должны идти студенты, сдавшие все экзамены на 5.
- 2. В радиоателье хранятся квитанции о сданной в ремонт радиоаппаратуре. Каждая квитанция содержит следующую информацию: наименование группы изделий (телевизор, радиоприемник и т. п.), марка изделия, дата приемки в ремонт, состояние готовности заказа (выполнен, не выполнен). Вывести информацию о состоянии заказов на текущие сутки по группам изделий.
- 3. У администратора железнодорожных касс хранится информация о свободных местах в поездах дальнего следования на ближайшую неделю в следующем виде: дата выезда, пункт назначения, время отправления, число свободных мест. Оргкомитет международной конференции обращается к администратору с просьбой зарезервировать m мест до города N на k-й день недели с временем отправления поезда не позднее t часов вечера. Вывести время отправления или сообщение о невозможности выполнить заказ в полном объеме.
- 4. Разработать программу формирования ведомости об успеваемости студентов. Каждая запись этой ведомости должна содержать: номер группы, Ф.И.О. студента, оценки за последнюю сессию. Вывести списки студентов по группам. В каждой группе Ф.И.О. студентов должны быть расположены в порядке убывания среднего балла.
Контрольные вопросы
- Назовите типы файлов
- Назовите процедуры для чтения и записи файла, чем они отличаются?
- Напишите алгоритм работы с файлом
Лабораторная работа №28
Тема: Создание инструментальных панелей
Цель: научится создавать инструментальные панели в среде Delphi
Задание:
- Повторить теоретический материал «Многострочные и инструментальные панели»
- Выполните следующие инструкции
- 3. Сделайте вывод
- Контрольные вопросы
- В чем заключается работа с диапазоном значений?
- Какие компоненты используются для работы с диапазоном значений?
- Что называется реверсивным счетом?
- Что представляет собой панель инструментов?
- Перечислите свойства панели инструментов
Лабораторная работа №29
Тема: Создание графика с помощью компонента Chart. Рисование на холсте Canvas
Цель: научится работать с графикой в среде Delphi
Задание:
Повторить теоретический материал «Компоненты отображения графической информации»
- Теоретический материал
- Выполните следующие инструкции
- Постройте график с помощью компонента Chart
- Сделайте вывод
- Контрольные вопросы
- Какие форматы графических файлов вы знаете?
- Назовите классы для хранения графических объектов?
- Какие компоненты используют для отображения графической информации?
- Составьте алгоритм построения графика?
- Перечислите основные свойства холста.
Лабораторная работа №30
Тема: Создание таблиц базы данных и установка параметров таблиц. Создание приложения для работы с таблицей БД
Цель: Научиться создавать БД в MS Access, устанавливать связь между таблицей и приложением Delphi
Теория
- Системы управления базами данных (СУБД) – это специальные программные средства, предназначенные для работы с файлами баз данных.
- Современные СУБД позволяют хранить в виде файлов данные любых типов: числовые, текстовые, графические, звуковые, видео и прочие.
- Данные в базах хранятся в виде таблиц
- Каждая таблица имеет структуру
- Структура таблицы определяется составом её полей и их свойствами. Важнейшими свойствами полей являются: тип поля и размер поля. Для хранения разных типов данных используют поля соответствующих типов
- Данные, хранящиеся в таблице, можно изменять, удалять, сортировать, фильтровать, размножать и выполнять с ними другие операции.
- Для автоматизации операций по работе с данными, в частности, для отбора нужных данных, применяют специальные объекты, которые называются запросами
- С помощью запросов на выборку производят выбор данных из базы, их обработку, выполнение итоговых вычислений и другие операции. По результатам работы запроса создаётся временная результирующая таблица
- На основе результирующей таблицы, можно создавать новые таблицы или изменять существующие. Для этого служат запросы на изменение.
- Для ввода данных в таблицы или для просмотра данных в наглядной форме служат специальные объекты, называемые формами. Формами – экранные объекты.
- Структура форм состоит из разделов и элементов управления. Проектирование формы состоит в размещении элементов управления на бланке формы и в задании связей между этими элементами и полями или запросов базы данных.
- Создание форм можно выполнять автоматический (авто формы), полуавтоматический (с помощью Мастера) или вручную (в режиме Конструктора).
- Размещение элементов управления на бланке формы автоматизировано. В большинстве случаев при создании нового элемента запускается программа-Мастер, с помощью который происходит настройка свойств элемента управления.
- Для создания печатных документов, которые содержат информацию из базовых таблиц или из результирующие таблиц, полученных по результатам работы запросов, служат специальные объекты отчеты.
- Отчеты отличаются от форм тем, что предназначены не для ввода данных, а только для вывода, а также тем, что создают не экранные, а печатные документы.
- Структура отчетов, как и форм, состоит из разделов и элементов управления. Проектирование отчета состоит в создании структуры его разделов и в размещении элементов управления внутри этих разделов, а также в задании связей между этими элементами и полями таблиц или запросов базы банных.
- Создание отчетов можно выполнять автоматически (авто отчеты), полуавтоматически (с помощью Мастера) или вручную (в режиме Конструктора)
- Таблицы, запросы, формы и отчеты являются основными объектами базы данных. Их разрабатывает разработчик базы. Пользователь базы использует эти объекты без вмешательства в их структуру
- Разработчик базы данных имеет два типа дополнительных объектов: макросы и модули. Эти объекты создают в тех случаях, когда стандартных средств управления базой данных оказывается недостаточно для выполнения операций, необходимых заказчику системы. С помощью макросов создают макрокоманды, упрощающие наиболее утомительные операции с базой, а с помощью модулей, написанных на языке программирования Visual Basic, создают программные процедуры для выполнения нестандартных операций.
Цели работы:
- Познакомиться с основными понятиями данных:
- Научится создавать таблицу базы данных в режиме конструктора;
- Освоить переход из режима конструктора в режим таблицы;
- Освоить основные приемы заполнения и редактирования таблиц базы данных;
- Познакомиться с простой сортировкой значений таблицы;
- Познакомиться с поиском записей по образцу;
- Научиться сохранять и загружать базу данных;
- Научиться распечатывать таблицы.
Задание 1
Создайте базу данных и структуру таблицы с информацией о студентах своей группы.
Порядок выполнения.
- Вызовите программу Access.
- Перед вами откроется окно системы управления базами данных, в котором появиться меню. Щелкните мышью на переключателе Новая база данных, а затем на кнопке ОК. Появиться диалоговое окно. В поле имя файла в качестве базы данных введите свою фамилию. Это будет название вышей личной базы данных.
- Щелкните на кнопке Создать или нажмите клавишу Enter.
- В следующем окне выберите тип создаваемого документа (активируйте соответствующую вкладку). Вы создаете таблицу, поэтому выберите вкладку Таблица (скорее всего вы в ней находитесь). По умолчанию выделена строка Создание таблицы в режиме конструктора. Щелкните по кнопке Конструктор. Появиться окно конструктора
- В верхней левой ячейке появившейся таблицы введите имя поля (набирайте слово фамилия, а не свою фамилию) и нажмите клавишу Enter. В соседней ячейке появиться тип данных, по умолчанию он задаётся как Текстовый. Любой другой выбирается с помощью ниспадающего меню
- Заполните поля в конструкторе, как показано на рисунке. Общие свойства поля оставьте такими, какие задает программа по умолчанию.
- Сохраните таблицу, щелкнув по кнопке Сохранить.
- В появившемся окне введите имя таблицы «Список» и щелкните по кнопке ОК. Появиться запрос на создание ключевого поля – уникального поля записи. По ключевому полю можно однозначно идентифицировать запись – его значение не повторяется у разных записей. Это поле используется для связи записей из разных таблиц. В данном варианте будут самостоятельно появляться числа – номера записей.
- Ответьте ДА
- Перейдите в режим таблицы. Ввод данных вы будите производить в этом режиме, заполняя ячейки таблицы. Значение поля «Код» будет меняться автоматически. Если закончить ввод в ячейку нажатием клавиши Enter, то маркер перейдет на следующую ячейку.
- Заполните поля базы списком своей группы не по алфавиту
- Сохраните введенные данные. В результате вы получили таблицу, с которой можно будет работать.
Задание 2
Выполните редактирование ячеек
Порядок работы
Внимательно просмотрите таблицу и исправьте свои ошибки.
Задание 3
Отсортируйте значения таблицы.
Порядок выполнения работы
Отсортируйте:
- Фамилии – по алфавиту (установите курсор на любую фамилию в столбце «Фамилия» и щелкните на кнопке АЯ)
- Имя – по алфавиту
- Полных лет – по убыванию
- Год рождения – по убыванию
- Группу – по возрастанию
Задание 4
Познакомьтесь с функциями «сохранить», «закрыть», «открыть».
Порядок работы
- Сохраните текущую таблицу
- Закройте текущую таблицу
- Повторите операцию из пункта 2 еще раз, в результате чего вы закроете текущую базу данных, получив пустое окно для новой работы. В этом положении можно создавать новую базу данных, а можно открыть существующую для продолжения работы.
- Откройте снова свою базу данных с помощью команд Файл, открыть, (имя вашей базы данных), Открыть.
- Откройте таблицу «Список».
Задание 5
Выполните поиск записей по образцу.
Порядок работы
- Установите текстовый курсор в поле «Фамилия»
- Щелкните на кнопке , которая позволяет найти запись по введенному значению. В результате появиться диалоговое окно, представленное на рисунке
- Введите в поле Образец фамилию, в поле Поиск в выберите пункт Фамилия и щелкните на кнопке Найти далее.
Задание 6
Подготовьте к распечатке таблицу «Список»
Порядок работы
- Подготовьте таблицу для печати. Для этого щелкните на кнопке Предварительный просмотр. Если таблица не уместилась на листе или видны не все данные, закройте окно предварительного просмотра и поменяйте размеры столбцов. Можно поменять поля листа или развернуть лист поперёк (это можно сделать командой Параметры страницы – Страница – Альбомная – Ок).
Задание 7
Завершите работу Access.
Порядок выполнения
- Выполните команду Файл – Выход
- Если вы производили какие-либо действия в базе данных, появиться вопрос о сохранении изменений. Ответьте утвердительно на этот вопрос.
Задание 8
Создайте связь между созданной базой данных и приложением Delphi
Порядок выполнения
- Запустите Delphi
- Запустите приложение (сделайте отладку программы)
- Сделайте вывод
Литература
Архангельский А.Я. «Программирование в Delphi7»
Культин Н.Б. «Самоучитель Delphi 7»
Лабораторная работа №31
Тема: Создание вычисляемых полей
Цель: научится работать с базой данных в среде Delphi
Задание:
- Повторить теоретический материал «Создание вычисляемых полей и полей выбора»
- Выполните следующие инструкции
- Откройте проект, выполненный на лабораторной работе №30
- Запустите приложение, сделайте отладку
- Сделайте вывод
- Контрольные вопросы
- Какие компоненты используются для связи с базами данных?
- Как изменить свойства полей?
- Какие поля называются вычисляемыми?
- Составьте алгоритм создания вычисляемого поля?
Дополнительное задание к лабораторной работе №31
Лабораторная работа №32
Тема: Навигационный способ доступа к данным
Цель: научится работать с базой данных в среде Delphi
Задание:
- Повторить теоретический материал «Навигационный способ доступа к данным»
- Выполните следующие инструкции
- Создайте приложение из следующего примера
- Запустите приложение, сделайте отладку
- Сделайте вывод
- Контрольные вопросы
- Какие компоненты используются для связи с базами данных?
- Как изменить свойства полей?
- Какие процедуры навигации по базе данных вы знаете?
- Как проще всего осуществить навигационный доступ данных по БД?
Лабораторная работа №33
Тема: Применение фильтрации данных и методов установки диапазона допустимых значений
Цель: научится работать с базой данных в среде Delphi
Задание:
- Повторить теоретический материал «Способы фильтрации»
- Выполните следующие инструкции
- Откройте проект, выполненный на лабораторной работе №30-31
- Сделайте фильтрацию записей, используя примеры следующих кодов
Фрагмент «Фильтрации»procedure TForm1.SpeedButton1Click(Sender: TObject);//Фильтрацияvar F:String;begincase ComboBox1.ItemIndex of0: f:=’FIO like ‘+QuotedStr(‘%’+Edit1.Text+’%’);1: f:=’GR LIKE ‘+QuotedStr(‘%’+Edit1.Text+’%’);2: f:=’N_test LIKE ‘+QuotedStr(‘%’+Edit1.Text+’%’);3: f:=’Rekom_bal LIKE ‘+Edit1.Text;end;ADOTable1.Filtered:=false;ADOTable1.Filter:=f;//производит фильтрацию по выбранным даннымADOTable1.Filtered:=true;//активируем фильтрif ADOTable1.RecordCount=0 then ShowMessage(‘Соответствия не найдены.’);end; | Фрагмент «Фильтрации»procedure TForm2.SpeedButton13Click(Sender: TObject);beginif Edit7.Text=» then ShowMessage(‘Введите критерий фильтрации!’)else beginADOQuery1.Filtered:=true;ADOQuery1.Filter:=’Gruppa=»’+Edit7.Text+»»;sort;if ADOQuery1.FieldByName(‘Gruppa’).AsString<>Edit7.TextthenShowMessage(‘Нет совпадения!’);end;end; |
- Организуйте поиск записи, используя примеры следующих кодов
Фрагмент «Поиска»procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);beginif not AdoTable1.Locate(‘FIO’,edit1.Text,[locaseinsensitive,lopartialkey])thenshowmessage(‘Запись не найдена’);end; | Фрагмент «Поиска»procedure TForm2.SpeedButton1Click(Sender: TObject);beginif Edit6.Text=» then ShowMessage(‘Введите критерий поиска!’)else beginADOQuery1.Filtered:=true;ADOQuery1.Filter:=’FIO=»’+Edit6.Text+»»;if ADOQuery1.FieldByName(‘FIO’).AsString<>Edit6.TextthenShowMessage(‘Фамилия не найдена!’);end;end; |
- Организуйте сортировку данных, используя примеры следующего кода
Фрагмент «Сортировки»
procedure TForm2.SpeedButton9Click(Sender: TObject);
begin
if ComboBox1.Text=’По сальдо’ then s:=’Fio’;
if ComboBox1.Text=’По группе’ then s:=’Gruppa’;
ADOQuery1.Sort:=’fio’;
end;
- Запустите приложение, сделайте отладку
- Сделайте вывод
- Контрольные вопросы
- Какие компоненты используются для связи с базами данных?
- Как изменить свойства полей?
- Какие методы применяются для фильтрации, сортировки и поиска данных?
Лабораторная работа №34
Тема: Создание приложения со связанными таблицами
Цель: научится работать с базой данных в среде Delphi
Задание:
- Повторить теоретический материал «Создание и обработка набора данных нескольких таблиц»
- Выполните следующие инструкции
- Откройте проект, выполненный на лабораторной работе №33
- Создайте новую базу данных
- Свяжите таблице по следующим инструкциям
- Запустите приложение, сделайте отладку
- Сделайте вывод
- Контрольные вопросы
- Какие компоненты используются для связи с базами данных?
- Как изменить свойства полей?
- Напишите алгоритм связывания таблиц в приложении?
Лабораторная работа №35
Тема: Создание отчетов
Цель: научится работать с базой данных в среде Delphi
Задание:
- Повторить теоретический материал «Создание отчетов»
- Выполните следующие инструкции
- 1. Простейший способ создания отчета.
Под отчетом понимается форматированное представление данных, выводимое на экран, принтер или в файл.
Для создания самого простого отчета в MS Access достаточно выполнить всего лишь несколько действий:
- Откройте окно базы данных.
- Убедитесь, что в окне базы данных выбрана категория «Таблицы».
- Установите указатель на таблицу, для которой хотите создать отчет.
- Выполните команду Вставка-Автоотчет или нажмите кнопку Новый объект на панели инструментов и из раскрывшегося списка выберите Автоотчет.
На экране в считанные секунды появится готовый к использованию отчет (рис.1). В этот отчет включены все поля таблицы. Их названия расположены вертикально в том же порядке, в каком они находятся в таблице. Справа от названия каждого поля отображается его значение в таблице.
Рис.1
Вопросы – задания:
- Что такое отчет?
- Как создать простейший отчет?
- Для чего нужен отчет?
- Как вы думаете, что есть общего между отчетом и формой?
Практическое задание:
- Откройте созданную вами базу данных «Проба».
- Создайте отчет, используя любую таблицу вашей базы данных.
- 2. Использование мастера для создания отчета.
Создание отчета с помощью мастера не требует специальных знаний и сводится к выбору таблиц, входящих в отчет, определению списка полей отчета и порядка их размещения.
Для запуска мастера отчетов в окне диалога «Новый отчет» выберите из списка вариантов создания отчетов Мастер отчетов и нажмите ОК. В качестве альтернативного средства вы можете воспользоваться ярлыком Создания отчета с помощью мастера, который отображается в рабочем пространстве окна базы данных при выбранном объекте «Отчеты».
Итак, вы запустили мастер построения отчета. На экране откроется окно диалога (рис.2), в котором необходимо определить поля будущего отчета.
Рис.2
Нажмите кнопку раскрытия списка Таблицы и запросы и из списка таблиц базы данных выберите таблицу, для которой создается отчет. При этом в списке Доступные поля появляется перечень всех полей выбранной таблицы. Вам необходимо из данного перечня перенести в список Выбранные поля поля, которые вы хотите поместить в создаваемый отчет. Завершив выбор полей, нажмите кнопку Далее для перехода к следующему шагу.
На втором шаге создания отчета с помощью мастера необходимо определить, требуется ли сгруппировать данные по какому-либо из полей (рис.3).
Рис.3
Поля, по которым будет осуществляться группировка, помещаются в верхней части правого списка в отдельной рамке и выделяются на экране синим цветом. MS Access предлагает вам вариант группировки данных. Вы можете согласиться с предложенным вариантом или задать свой, используя кнопки окна диалога, помня при этом, что MS Access допускает до 10 уравнений группировки (таб.1).
Таблица 1. Кнопки для группировки.
Кнопка | Выполняемое действие |
Добавляет поле в рамку группировки | |
Удаляет поле из рамки группировки | |
Повышает уровень группировки выделенного в рамке группировки поля | |
Понижает уровень группировки выделенного в рамке группировки поля |
Установив группировку данных, вы можете изменить интервал группировки (рис.4). Для этого нажмите кнопку Группировка.
Рис.4
Для перехода к следующему окну диалога нажмите кнопку Далее.
В следующем окне диалога (рис.5) задайте порядок сортировки записей отчета.
Рис.5
Если вы хотите сформировать в отчете итоговые поля, нажмите кнопку Итоги окна диалога и в открывшемся окне диалога «Итоги» установите требуемые флажки, определяющие тип итоговых вычислений для предложенных полей. Затем нажмите кнопку ОК для возврата в окно сортировки.
На следующих двух шагах создания отчета с помощью мастера необходимо определить вид макета отчета (рис.6) и стиль оформления (рис.7).
Рис.6
Рис.7
На заключительном шаге создания отчета (рис.8) вы можете задать имя отчета и выбрать один из двух вариантов дальнейшей работы с отчетом:
- Просмотр отчета.
- Изменение структуры отчета.
Рис.8
Данный отчет может полностью удовлетворить ваши требования. Однако, если вам потребуются дополнительные возможности, вы можете использовать созданный отчет в качестве чернового наброска и модифицировать его с помощью конструктора отчетов.
Вопросы – задания:
- Как запустить мастер для создания отчета?
- Расскажите работу мастера.
- Как можно сгруппировать данные в мастере?
- Как в дальнейшем можно работать с готовым отчетом?
Практическое задание:
- Откройте созданную вами базу данных «Проба».
- Создайте отчет с помощью мастера для любой таблицы с элементами группировки.
- Просмотрите свой отчет полностью, а так же в окне конструктора.
- 3. Просмотр и печать отчета.
MS Access располагает большим набором средств для просмотра на экране созданного отчета. Можно использовать любое наиболее удобное с вашей точки зрения средство:
- Команда Файл-Предварительный просмотр основного меню.
- Команда Предварительный просмотр контекстного меню.
- Кнопка Просмотр на панели инструментов «База данных».
В окне базы данных для просмотра отчета достаточно выделить имя требуемого отчета и нажать кнопку Просмотр окна базы данных.
При просмотре отчета вы можете использовать кнопки панели инструментов и кнопки перемещения по страницам, расположенные в нижней части окна просмотра. Назначение этих кнопок приведено в табл.2.
Таблица 2. Кнопки, используемые в окне просмотра.
Кнопка | Назначение |
Выводит отчет на печать | |
Изменяет масштаб отображения отчета | |
Переходит в режим просмотра одной страницы отчета | |
Переходит в режим просмотра двух страниц отчета | |
Переходит в режим просмотра нескольких страниц отчета | |
Устанавливает масштаб отображения отчета | |
Закрывает окно просмотра отчета | |
Переходит к просмотру первой страницы отчета | |
Переходит к просмотру предыдущей страницы отчета | |
Переходит к просмотру следующей страницы отчета | |
Переходит к просмотру последней страницы отчета |
Для печати созданного отчета из окна конструктора отчетов или окна базы данных воспользуйтесь одним из следующих способов:
- Выполните команду Файл-Печать. Откроется окно диалога «Печать» (рис.9), позволяющее задать параметры печати.
Рис.9
- Нажмите кнопку Печать на панели инструментов MS Access. В этом случае отчет будет выведен на печать с текущими установками.
В окне диалога «Печать» вы можете указать номера страниц, которые хотите распечатать, количество копий и выбрать режим печати в файл. Для задания номеров печатаемых страниц установите опцию Страницы в области «Печатать» в левом нижнем углу окна диалога. В поле ввода С: укажите номер первой из печатаемых страниц, а в поле ввода По: — номер последней выводимой на печать страницы.
Для задания количества печатаемых копий в области «Копии» с помощью счетчика Число копий установите нужное значение.
Для задания ориентации печати используется опции Книжная (Portrait) и Альбомная (Landscape) окна диалога «Свойства» (рис.10), открываемого при нажатии кнопки Свойства окна диалога «Печать». Если вам нужно максимально увеличить количество полей на одной странице, при этом число записей на странице не имеет решающего значения, используйте опцию Альбомная. В противном случае используйте опцию Книжная.
Рис.10
Для изменения размеров полей страницы используется окно диалога «Параметры страницы» (рис.11), открываемое нажатием кнопки Настройка окна диалога «Печать». В открывшемся окне диалога перейдите на вкладку «Поля», выделите значение поля страницы, которое вы хотите изменить, и введите новое значение с учетом установленных единиц измерения (дюймы или миллиметры).
Изменение ориентации страницы может привести к побочным эффектам – например, поле может попасть между двумя страницами. Если вы изменили расположение страницы, откройте окно «Предварительного просмотра», чтобы посмотреть, как выглядит ваш отчет.
Рис.11
Вопросы – задания:
- Как можно просмотреть отчет перед печатью на листах?
- Расскажите работу кнопок используемых в окне просмотра.
- Как можно отправить отчет на печать?
- Что необходимо сделать в окне «Печать»?
- Что можно изменить в окнах «Параметры страницы» и «Свойства»?
Практическое задание:
- Откройте созданную вами базу данных «Проба».
- Откройте любой отчет.
- Измените, параметры отчета и просмотрите его в окне предварительного просмотра.
- Если к вашему ПК подключен принтер, распечатайте любую страницу отчета.
- 4. Конструктор отчета.
При создании и модификации отчетов конструктор отчетов позволяет удалять, добавлять, перемещать области вместе с расположенными в них объектами. Вы можете установить цвет и управлять параметрами отображения любых элементов и областей отчета.
Для открытия окна конструктора отчетов для модификации созданного ранее отчета выполните следующие действия:
- В окне базы данных перейдите на вкладку «Отчет».
- Установите указатель мыши на модифицируемый отчет.
- Нажмите кнопку Конструктор базы данных.
Для открытия окна конструктора отчетов при создания нового отчета необходимо выполнить следующее:
- В окне базы данных перейдите на вкладку «Отчет».
- Нажмите кнопку Создать.
- В открывшемся окне диалога «Новый отчет» из списка способов создания отчетов выберите Конструктор и нажмите кнопку ОК.
На экране откроется окно конструктора отчетов (рис.12).
Рис.12
Создание отчета выполняется аналогично созданию формы, но есть и несколько особенностей, которые мы и рассмотрим.
Размещение даты печати отчета. Обычно в заголовке отчета или нижнем колонтитуле размещают дату печати отчета. Для создания данного элемента в отчете необходимо выполнить следующие действия:
- Находясь в окне конструктора отчетов, выполните команду меню Вставка-Дата и время.
- В открывшемся окне диалога «Дата и время» (рис.13) выберите форматы отображения даты и времени. Вы можете поместить в отчет только дату или только время, удалив установку соответствующей опции. Завершив установку, нажмите кнопку ОК.
- Выделите созданный объект и перенесите в ту область отчета, где хотите его разместить.
Рис.13
Размещение номера страницы отчета. Для размещения номера страницы отчета, как и даты, существует специальная команда.
- Находясь в окне конструктора отчетов, выполните команду Вставка-Номера страниц.
- В открывшемся окне диалога «Номера страниц» (рис.14) задайте формат и расположение создаваемого объекта. Список Выравнивание определяет расположение объекта на странице.
- Установив все нужные значения, нажмите кнопку ОК.
Рис.14
Вопросы – задания:
- Как открыть конструктор для модификации отчета?
- Как открыть конструктор для создания нового отчета?
- Как создается отчет в конструкторе?
- Как разместить дату печати отчета?
- Как поместить нумерацию страниц отчета?
Практическое задание:
- Откройте созданную вами базу данных «Проба».
- Создайте любой новый отчет в окне конструктора.
- Разместите в отчете дату печати и нумерацию страниц отчета.
- Запустите приложение, сделайте отладку
- Сделайте вывод
- Контрольные вопросы
- Какие компоненты используются для связи с базами данных?
- Как изменить свойства полей?
- Напишите алгоритм связывания таблиц в приложении?
Лабораторная работа №36-37
Тема: Работа с удалёнными базами данных
Цель: научится работать с удалёнными базами данных в среде Delphi
Задание:
- Повторить теоретический материал «Навигационный способ доступа к данным»
- Выполните следующие инструкции
- Создайте приложение из следующего примера
- Запустите приложение, сделайте отладку
- Сделайте вывод
- Контрольные вопросы
- Какие компоненты используются для связи с базами данных?
- Как изменить свойства полей?
- Что называется доменами?
- Что называется триггерами?
Лабораторная работа №38
Тема: Управление базой данных. Создание баз данных paradox
Цель: Научиться работать с базой данных paradox
Ход работы
Для создания первой базы данных тебе понадобиться запустить database desktop, который входит в поставку с delphi. После запуска выполни следующие действия:
Выбери меню file затем new и наконец table
В появившемся окне, выбери из списка paradox 7 .
Нажми «ok».
Можно сказать, что первая база данных готова. Теперь ты должен заполнить её поля, но сначала рассмотрим появившийся перед нами диалог.
Первая колонка — это номер по порядку. database desktop генерирует его автоматически и изменять ты его не можешь.
Имя поля. Здесь ты можешь называть свои поля как угодно.
Тип поля. Щёлкни в этой колонке правой кнопкой мыши и перед тобой появиться меню со всеми допустимыми типами, тебе необходимо только выбрать нужный.
Размер. Это размер поля. Не у всех типов полей можно менять размер, у большинства он задан жёстко. Размер в основном меняется у строковых типов (alpha), бинарных (binary) и др.
Ключ. Если ты дважды щёлкнешь по этой колонке, то текущее поле станет ключевым, то есть по умолчанию по нему будет отсортирована вся таблица. Ключевыми могут быть только первые поля, то есть второе поле сможет быть ключевым только вместе с первым. Без ключевого поля невозможно добавлять новые записи в таблицу.
В качестве примера возьмём классический пример — приём заказов. Самое главное, это правильно представить себе и создать структуру базы данных. В нашем случае будет вестись учёт следующих полей:
ФИО Покупатель
Адрес
Дата заказа товара
Наименование заказанного товара
Количество заказанного товара
Теперь нужно продумать структуру. Если создать все эти поля в одной таблице, то будет не совсем эффективно. Если один и тот же покупатель возьмёт два товара, то у обеих строчек 1-е и 2-е поле будут содержать одинаковые данные. Будет лучше, если мы вынесем первые два поля в отдельную таблицу.
Итак, наша база данных будет состоять из двух таблиц. В первой будут следующие поля (после тире стоит тип поля, а в скобках размер):
Ключ 1 — autoincrement
ФИО Покупатель — alpha (размер 50)
Адрес — alpha (размер 50)
И соответственно 2-я:
Ключ 1 — autoincrement
Ключ 2 — integer
Дата заказанного товара — date
Наименование заказанного товара — alpha (размер 20)
Количество заказанного товара — integer
«Ключ 1» — это будет уникальное ключевое поле в обеих таблицах, поэтому поставь им значок ключевого. «Ключ 2» во второй таблице будет связан с «Ключ 1» из первой. Создай эти таблицы. Первую назови mast.db , а вторую child.db .
После того, как создашь вторую таблицу, ты должен сделать «Ключ 2» во второй таблице индексным, чтобы можно было связать две таблицы с помощью этого поля. Для этого нужно Для этого нужно из меню table выбрать пункт restructure . Перед тобой должно открыться окно.
В выпадающем списке table properties выбери secondary indexes и нажми кнопку define . Выбери свой второй ключ и перемести его в список indexed fields . Можешь нажимать «ok». У тебя запросят имя индекса, введи, например hhh и снова жми «ok». После этого сохраняй таблицу. Индексы готовы, теперь перейдём к последнему этапу подготовки базы.
Запусти sql explorer .
Из меню object нужно выбрать пункт new . database driver name должен быть stamdart . Жми «ОК». Это создаст новый alias. Переименуй его в «sales1».
Теперь в правой половине окна щёлкни по строке path. Перед тобой откроется окно выбора директории. Выбери ту, где находятся созданные нами таблицы и нажми «ОК». Для сохранения того, что ты навоял, выбери из меню object пункт apply .
Вот теперь мы готовы писать собственно программу. Поэтому сделай перерыв и после этого запускай delphi.
Создай новый проект. Помести на него из палитры компонент «data access» два «datasource» и два «ttable». Для первого «datasource» установи свойство «dataset» в table1 , а у второго «table2» . Теперь у table1 измени следующие свойства (желательно в такой последовательности):
В «databasename» выставь sales1 (это alias, который мы создали в sql explorer)
«tablename» выставь в «mast.db». Если ты всё правильно сделал, то имя этой базы будет в выпадающем списке этой строки.
«active» выставь в true .
То же самое сделай и с table2, только в «tablename» выставь «child.db». После того как ты всё это сделаешь, из палитры компонент «datacontrols» поставь на форму два «dbgrid». В свойстве «datasource» у одной из них выставь datasource1 , а у другой datasource2 .
Уже можно запустить программу и убедиться, что всё работает. Но всё ещё не очень красиво, ведь таблицы ещё не связаны, и никому не нужно видеть ключи, да и подписи на английском. Щёлкни по «table2», здесь у тебя должна находиться «child.db». В свойстве «mastersource» выставь datasource1 . После этого дважды щёлкни в поле «masterfields», перед тобой откроется окно как на рис.5. В верхнем списке (available indexes) выбери имя, которое ты задал, когда индексировал key2, в данном случае это «hhh». Теперь выдели key2 в левом окне и key1 в правом и нажми кнопку «add». Нажимай «ОК» и снова ставь в свойствах этой таблицы «active» в «true». теперь дважды щёлкни по «table2». Перед тобой откроется окошко. В этом окне щёлкни правой кнопкой мыши, и в появившемся меню выбери add all fields . После этого, все имена таблицы будут добавлены в это окно. В свойствах key1 и key2 установи «visible» в false . В свойстве поля «data» установи «displayformat» в dddddd , а «editmask» в 99/99/9999 . У всех полей свойство «displaylabel» отвечает за имя отображающее в компонентах это поле, поэтому напиши здесь у всех нормальные русские именна.
После того, как закончишь с этой таблицей, проделай подобные операции со второй. Твоё первое приложение работающее с базой данных готово.
Мы сегодня создали не совсем простенькое приложение, и при этом не написали ни одной строчки кода.
Сделайте вывод
Лабораторная работа №39
Тема: Работа с удалёнными базами данных.
Цель: Получить практические навыки работы c базами данных в среде для быстрой разработки приложений Delphi 7.
ПОРЯДОК ВЫПОЛНЕНИЯ
- Запустить Borland Delphi 7, используя главное меню Windows или ярлык.
- Запустить сервер InterBase, если он еще не запущен: Пуск\Программы\…\InterBase\InterBase Server Manager или запустить файл IBServer.exe из папки …\InterBase\Bin. В появившемся окне (рис. 1) включить нужные выключатели и нажать кнопку Start. Если выбрать режим Automatic, то сервер будет запускаться при загрузке ОС Windows.
- Запустить IBConsole – программу, с помощью которой можно управлять сервером: Пуск\Прогр-мы\…\InterBase\IBConsole.
- Зарегистрировать локальный сервер, если это еще не было выполнено: открыть пункт меню Server, выполнить команду Register. В появившемся окне установить флаг на параметре Local Server, в поле User Name набрать sysdba, в поле Password– masterkey. Кнопка ОК.
ЗАМЕЧАНИЕ: если локальный сервер уже был зарегистрирован ранее, необходимо ввести пароль пользователя SYSDBA: дважды щелкнуть в левой части окна программы IBConsole на ветке дерева Local Serverи в появившемся окне (рис. 2) ввести для зарегистрированного пользователя sysdba пароль masterkey
- Добавить нового пользователя: в левой части окна открыть ветку Local Server, активизировать Users, вызвать контекстное меню, выбрать Add User… (или Server, подпункт User security). Установить в полях следующие значения: Username– 1, Password – 1, Confirm Password – 1. Нажать кнопку Apply – применить. В правой части окна появится новый пользователь с именем 1.
- Создать пустую базу данных, которая будет находиться в файле C:\Work\StudentPL.gdb, указанному в скрипте: войти в пункт меню Tools, выбрать InterаctiveSQL или кнопка . Загрузить скрипт базы данных, который находится по пути, указанном преподавателем: в появившемся окне InterаctiveSQL войти в пункт меню Query, выполнить команду Load script. На панели инструментов выбрать инструмент Execute Query или пункт меню Query, Execute. Если в ходе создания базы данных возникают ошибки, то следует проверить текст скрипта: полное имя файла базы данных, команды SQL.
- Выполнить команды SQL по указанию преподавателя, например, внести данные о группе специальности «Информатика» 1 курса: код группы 1000, название 1Инф, год поступления 2007, куратор Петрова Лариса Федоровна. Изменить фамилию куратора на Петровская. Добавить сведения о своей группе, внести две записи в таблицу Студенты (код студента начинается со 100000), удалить из каждой таблицы по одной записи. Выйти из InterаctiveSQL
- Зарегистрировать базу данных на сервере, чтобы иметь возможность просматривать ее структуру, вводить, удалять, редактировать содержимое таблиц: открыть ветку Local Server, активизировать Database, вызвать контекстное меню и выбрать Register (см. рис. 3), в появившемся окне выбрать файл базы данных, указав его полное имя (см. рис. 4).
- Ознакомиться со свойствами таблиц зарегистрированной базы данных: открыть ветку Database (рис. 5) открыть ветку StudentPl.gdb, выбрать Table,– в правой панели окна отобразятся имена таблиц БД, открыть одну из таблиц и ознакомиться с закладками окна (рис. 6). На вкладке Data можно увидеть содержимое таблиц.
Создать модуль, в котором будут размещены все компоненты, предназначенные для работы с данными: в окне Delphi 6/7 войти в пункт меню File, выполнить команду New и выбрать в списке пункт DataModule – модуль данных. В поле Name его свойств Properties ввести имя модуля DM (рис. 7).
- На закладке InterBase Палитры компонентов найти и расположить в рабочей области модуля DM компоненты IBDatabase, IBTransaction, по два объекта IBUpdateSQL и IBQuery (рис.8). На рис. 8 отображены компоненты с измененными в дальнейшем именами.
- На закладке DataAccess найти и расположить в рабочей области модуля DM два компонента DataSource (рис. 4).
- Для компонента IBDatabase изменить его свойства следующим образом (предварительно щелкнуть на указанном компоненте, свойства выбирать в окне Object Inspector, см. рис. 7):
Свойство | Name | DatabaseName | Connected | DefaulTransaction |
Значение | IBDatabase | C:\work\STUDENTPL.gdbУказать путь из окна обзора. | Trueуказать имя и пароль пользователя, которые указывались при регистрации. | IBTransaction1 |
- Для компонента IBTransaction1 изменить его свойства следующим образом:
Свойство | Name | DefaultDataBase | Active |
Значение | IBTransaction | IBDatabase | True |
- Для компонента IBUpdateSQL1 изменить его свойства следующим образом:
Свойство | Name |
Значение | IBUpdateStudents |
- Для компонента IBQuery1 изменить его свойства следующим образом:
Свойство | Database | Name | Transaction | UpdateObject | Active |
Значение | IBDatabase | IBQStudents | IBTransaction | IBUpdateStudents | Сначала выполнить команду, описанную после таблицы.True |
Вызвать контекстное меню на компоненте IBQStudents, выполнить команду Edit SQL. В появившемся окне выбрать в области Table, таблицу Students, нажать кнопку Add Table to SQL. В области Fields выбрать значок * и нажать на кнопку Add Fields to SQL. В правой части окна появится команда «select * from STUDENTS». Нажать кнопку ОК.
- Для компонента DataSource1 изменить его свойства следующим образом:
Свойство | DataSet | Name |
Значение | IBQStudents | DataSourсeStudents |
- Для компонентов IBUpdateSQL2, IBQuery2 и DataSource2 выполнить соответствующие преобразования таким образом, что бы они были настроены на таблицу Groups.
- Сгенерировать SQL-команды, с помощью которых автоматически вносятся изменения в таблицу Students:вызвать контекстное меню для компонента IBUpdateStudents, выбрать команду UpdateSQL Editor. В появившемся окне нажать кнопку Generate SQL. Открыть на вкладке SQL окна сгенерированные SQL-команды и внести следующие изменения: после слова where удалить все записи, кроме записи о первичном ключе таблицы ID_STUD = :OLD_ ID_STUD (рис. 9).
Рис. 9 – Генерация SQL-команд
- Аналогично, сгенерировать SQL-команды для IBUpdateGroups и удалить записи после слова where, кроме записи о первичном ключе таблицы ID_GROUP = :OLD_ ID_ GROUP
- На форме Form1 установить два компонента DBGrid из закладки Палитры компонентов Data Controls.
- Прописать в модуле Unit1 подключение модуля Unit2: открыть модуль Unit1 (пункт строки меню View, выполнить команду Units, выбрать Unit1), в разделе Implementation набрать «uses unit2;»
- Сохранить весь проект в папку студента в отдельную папку BDStudents: File, Save All…, указать путь и задать имена (согласиться с предложенными именами: project1, unit1, unit2).
- Для компонента DBGrid1 изменить его свойства следующим образом:
Свойство | DataSourсe |
Значение | DM.DatasourсeStudents |
- Выполнить те же операции для компонента DBGrid2, выбрав для отображения таблицу Groups. Нажать кнопку ОК.
- Запустить программу на выполнение: команда Run, пункта меню Run (или F9).
- Закрыть приложение Form1.
- Cохранить изменения: File, Save All…
- Закрыть среду Borland Delphi 6/7,
Отчет должен содержать:
- Тему, цель лабораторной работы.
- Порядок выполнения работы с копиями экранов.
- Ответы на контрольные вопросы.
Заключение
Методическое пособие создано для использования на занятиях по предмету «Основы алгоритмизации и программирования» в технических, профессиональных и средних общеобразовательных учебных заведениях.
Лабораторные работы являются неотъемлемой частью изучения дисциплины и позволяют развивать у учащихся практические умения и навыки программирования.
Перечень тем лабораторных работ по дисциплине «Основы алгоритмизации и программирования» полностью соответствует типовой учебной программе, утвержденной приказом Министерства образования и науки Республики Казахстан №595 от 25.12.2009 г.
Использованная литература
- 1. Архангельский А.Я. Программирование в Delphi 7. М: ООО «Бином-Пресс», 2006г.
- Хомоненко А., Гофман В. Самоучитель. Delphi. Санкт-Петербург, 2005г.;
- Каздаева Н.К., Боржим С.Л., Бурмистрова Т.А. Лабораторный практикум по Turbo Pascal, часть 1,2. Алматы 2000г.;
- Фленов М.Е. Библия Delphi — 2 изд., перераб. и доп. СПб: БХВ-Петербург, 2008г;
- Культин Н.Б. Основы программирования в Delphi 2006 для Windows. Самоучитель, СПб: БХВ-Петербург, 2006г.