
- •Оглавление
- •Часть 1. Краткое описание Delphi 8
- •Часть 2. Технология ado для баз данных access 186
- •9.1. Общие сведения 289
- •Введение
- •Часть 1. Краткое описание Delphi
- •1. Работа со средой delphi
- •1.1. Ознакомление с delphi
- •1.2. Вкладка дизайнера формы (design)
- •1.3. Вкладка редактора кода программы
- •1.4. Окно object inspector
- •1.5. Окно project manager
- •1.6. Окно палитры инструментов
- •1.7. Создание первого проекта приложения
- •1.8. Сохранение проекта
- •1.8. Сохранение проекта
- •1.9. Компиляция
- •2. Основа языка delphi
- •2.1. Основные понятия языка
- •2.1.1. Элементы языка
- •2.1.2. Пример простой программы
- •2.1.3. Типы данных
- •2.1.4. Операции и выражения
- •2.1.5. Стандартные функции
- •2.1.6. Ввод и вывод на дисплей
- •2.1.7. Оператор присваивания
- •2.2. Операторы языка паскаль
- •2.2.1. Составной оператор
- •2.2.2. Условный оператор
- •2.2.3. Сложные условия
- •2.2.4. Оператор выбора case
- •2.2.5. Оператор цикла for
- •2.2.6. Оператор цикла while
- •2.2.7. Оператор цикла repeat
- •2.2.8. Вложенные циклы
- •2.2.9. Прочие операторы
- •2.3. Общая структура программы
- •2.3.1. Перечень разделов программы
- •2.4. Массивы
- •2.4.1. Одномерные массивы
- •2.4.2. Сортировка массивов и поиск элемента в массиве
- •2.4.3. Многомерные массивы
- •2.5. Функции и процедуры
- •2.5.1. Описание функций
- •2.5.2. Обращение к функции
- •2.5.3. Процедуры
- •2.5.4. Параметры-значения и параметры-переменные
- •2.5.5. Локальные и глобальные переменные
- •2.5.6. Pекурсия
- •2.6. Строки символов
- •2.6.1. Задание строк
- •Var имя: string[длина];
- •2.6.2. Функции и процедуры для обработки строк
- •2.7. Порядковые типы данных
- •2.7.1. Перечисляемый тип данных
- •2.7.2. Интервальный тип данных
- •2.7.3. Порядковые типы данных
- •2.7.4. Дополнение:тип данных tDateTime (дата-время)
- •2.8. Множества
- •2.8.1. Значения типа множество
- •2.8.2. Операции на множествах
- •2.9. Записи
- •2.9.1. Поля записи
- •2.9.2. Оператор with
- •2.9.3. Последовательный поиск в массиве записей
- •2.9.4. Двоичный поиск в массиве записей
- •2.10. Файлы
- •2.10.1. Основные свойства файлов
- •2.10.2. Типизированные файлы
- •2.10.3. Текстовые файлы
- •2.10.4. Поиск файлов
- •2.11. Динамическая память
- •2.11.1. Динамические переменные и указатели
- •2.11.2. Динамические списки
- •2.11.3. Деревья
- •2.12. Программные модули
- •2.12.1. Модули, формируемые пользователем
- •2.12.2. Стандартные модули
- •2.12.3. Примеры программ
- •3. Главная форма
- •3.1. Свойства главной формы
- •3.2. События главной формы
- •4. Описание некоторых компонентов
- •4.1. Компонент tpanel (панели)
- •4.2. Компонент tbutton (кнопка)
- •4.3. Дополнительные кнопки
- •4.4. Компонент tlabel (надписи)
- •4.5. Компонент tedit (Строки ввода)
- •4.6. Компонент тМето (многостроч. Поле ввода)
- •4.7. Свойства и методы класса tstrings
- •4.8. Компонент checkbox (флажок)
- •4.9. Компонент tradiobutton (кнопки выбора)
- •4.10. Компонент MainMenu (главное меню программы)
- •4.11. Компонент timage
- •4.12. Компонент tstringgrid (сетка)
- •4.13. Компонент ttimer(таймер)
- •5. Отладка программ
- •5.1. Типы ошибок
- •5.2. Отладка программы
- •5.2.1. Трассировка программы
- •5.2.2. Точки останова программы
- •5.2.3. Наблюдение значений переменных
- •Часть 2. Технология ado для баз данных access
- •6. Создание баз данных access
- •6.1. Определение понятия баз данных
- •6.2. Интерфейс программы access
- •6.3. Создание базы данных в access 2007
- •6.3.1. Создание двухтабличной базы данных
- •6.3.2. Создание базы данных с вычисляемыми полями
- •6.4. Выбop формата для новой базы данных
- •6.5. Создание пустой базы данных
- •6.6. Открытие и закрытие базы данных
- •6.7. Создание таблиц в режиме конструктора
- •6.7.1. Выбор первичного ключа
- •6.7.2. Изменение полей и таблиц
- •6.7.3. Копирование полей
- •6.7.4. Перемещение полей
- •6.7.5. Удаление полей
- •6.7.6. Операции с таблицами
- •6.8. Создание базы данных в access 2003
- •6.9. Установление связей между таблицами
- •6.10. Обеспечение целостности записей в базе данных
- •6.11. Редактирование и удаление связей
- •7. Система доступа к данным ado
- •7.1. Общие сведения
- •7.2. Компонент adoConnection
- •7.2.1. Свойства компонента adoConnection.
- •7.2.2. Методы компонента adoConnection
- •7.3.Компонент аdоТable
- •7.3.1. Свойства компонента tadoTable
- •7.3.2. Методы компонента tadoTable
- •7.4. Компонент adoQuery
- •7.5. Компонент adoDataSet
- •7.5.1.Свойства компонента adoDataSet
- •7.5.2. Методы компонента adoDataSet
- •7.5.3. Cобытия компонента adoDataSet
- •7.6. Компонент DataSource
- •7.7.Комнонент DataGrid
- •7.7.1 Cвойства компонента DataGrid
- •7.7.2. Методы и события компонента DataGrid
- •7.8. Компонент adocommand
- •8. Управление базами данных
- •8.1. Приложение для управления базами данных
- •8.2. Свойства полей базы данных
- •8.3. Редактирование базы данных
- •8.4. Сортировка данных
- •8.5. Поиск данных в базе
- •8.5.1. Фильтрация данных в базе
- •8.5.2. Нахождения информации методом Locate
- •9.1. Общие сведения
- •9.2. Основные операторы запроса
- •9.2.1. Агрегатные функции
- •9.2.2. Подзапросы
- •9.3. Операторы наполнения баз данных sql
- •9.3.1. Ввод значений
- •9.3.2. Удаление значений
- •9.3.3. Изменение значений
- •9.4. Операторы создания баз данных sql
- •9.4.1. Команда создания таблицы.
- •9.4.2. Первичные ключи таблицы
- •9.4.3. Индексы таблицы
- •9.4.4. Добавление в таблицу новых столбцов
- •10. Реализация sql- запросов
- •10.1. Компонент tadoQuery для sql- запросов
- •10.2. Форма для реализация sql-запроса
- •11. Генератор отчетов Quick Reports
- •11.1.Описание Quick Reports
- •11.2. Печать записи с помощью Quick Reports
- •11.3. Печать таблиц с помощью Quick Reports
- •394026 Воронеж, Московский просп., 14
2.2.4. Оператор выбора case
Оператор выбора CASE позволяет выбрать одну из нескольких альтернатив, по которой пойдет выполнение программы. Схема оператора выбора:
CASE селектор OF
список констант_1: оператор_1;
список констант_2: оператор_2;
список констант_N: onepaтop_N;
END
или
CASE селектор OF
список констант_1: оператор_1; список констант_2: оператор_2;
.
.
.
список констант_N: оператор_N
else
оператор_еlsе; END
Селектор - выражение скалярного типа, кроме действительного. Списки констант того же типа, что и селектор. Никакие два списка не должны иметь общих констант. В качестве операторов могут использоваться составные операторы.
Значение селектора вычисляется, и затем отыскивается в одном из списков констант. После этого выполняется оператор, соответствующий списку. Если значение селектора не найдено в списках, то не выполняется ни один оператор (при первой схеме) * или выполняется оператор еlsе (при второй схеме).
Пример. Программа вводит цифру и печатает ее прописью. Если цифра больше трех, печатается слово «много». Если введена не цифра, то печатается сообщение об этом
program digit_to_word;
var N: integer; begin
Write ('Введите цифру ') read(N);
case N of
0: writeln ('ноль');
1: writeln ('один1):
2: writeln ('два');
3: writeln ('три');
4,5,6,7,8,9: writeln ('много');
end;
end.
Пример. Программа вводит символ и печатает сообщение, если это большая или маленькая латинская буква или цифра или иной символ.
program letters_and_digits;
var Ch: char;
begin
write('Bвeдите символ '); read(Ch);
case Ch of
'a'..V: writeln ('Введена маленькая буква');
'A'..'Z': writeln ('Введена большая буква');
'0'..'9': writeln (' Введена цифра')
else writeln ('Введен неизвестный символ1);
end;
end.
Запись 'a'..z означает все символы подряд от 'а' до z.
Запись 'A'..'Z' означает все символы подряд от 'А' до 'Z'.
Запись '0'..'9' означает все символы подряд от '0' до '9'.
2.2.5. Оператор цикла for
Цикл позволяет многократно выполнять некоторые действия. Он является ключевым фактором в реализации различных алгоритмов и делает применение ЭВМ обоснованным.
В Паскале имеется три оператора цикла - FOR, WHILE и REPEAT.
Вначале рассмотрим оператор FOR.
Оператор FOR обеспечивает повторение цикла, управляемое параметром цикла.
Оператор цикла FOR позволяет выполнять некоторые действия определенное (фиксированное) число раз.
Общая форма оператора цикла FOR имеет вид
FOR параметр_цикла:= начальное_значение ТО конечное_значение DO
оператор; (* этот оператор выполняется *) (*конечное_значение - начальное_значение + 1 раз *)
или при использовании составного оператора
FOR параметр_цикла:= начальное_значение ТО конечное_значение DO
begin
оператор_1; (* эти операторы выполняются *)
оператор_2; (* конечное_значение - начальное_значение + 1 раз *)
оператор_N; end;
где параметр_цикла — переменная скалярного типа, кроме действительного;
начальное_значение и конечное_значение - выражения того же типа, что и параметр_цикла. Выполняемые в цикле оператор или операторы называются телом цикла.
Выполнение оператора FOR начинается с вычисления значений выражений начальное_значение и конечное_значение. Затем переменной параметр_цикла присваивается начальное_значение и делается проверка, не превышает ли оно конечное_значение. Если не превышает, то выполняется тело цикла. После завершения выполнения параметр_цикла получает следующее по порядку значение и все повторяется, начиная с проверки.
Когда значение параметра_цикла становится равным ко-нечному_значению., тело цикла выполняется последний раз.
Таким образом:
• если начальное_значение > конечное_значение, тело цикла не выполняется ни разу;
если начальное_значение = конечное_значение, тело цикла выполняется один раз. При этом параметр_цикла будет равен начальному_значению;
если начальное_значение < конечное_значение, тело цикла выполняется ( конечное_значение - начальное_значение + 1) раз. При этом параметр _цикла при каждом выполнении будет получать последовательные значения своего типа (если параметр_цикла целого типа, то будет увеличиваться на единицу).
Пример. Вычислить сумму целых чисел от 1 до 100. program Summa_l_100;
var s,i:integer;
begin
s:=0;
for i:=l to 100 do s:=s+i;
writeln('сумма целых чисел от 1 до 100 равна ',s);
end.
Также следует иметь в виду, что изменение параметра_цикла в теле цикла каким-либо другим способом недопустимо, так как это в зависимости от реализации либо вызовет ошибку при трансляции, либо изменит число повторений цикла.
Например, оператор
For i:=1to 10 do i:=i+l;
либо вызовет ошибку, либо (в Турбо-Паскале) выполнит тело цикла не 10 как можно было ожидать, а 5 раз.
Возможен вариант оператора FOR, когда параметр_цикла принимает последовательно убывающие значения:
FOR параметр_цикла:= начальное_значение DOWNTO конечное_значение DO
оператор; (* этот оператор выполняется *)
(*начальное значение - конечное значение + 1 раз *)
или
FOR параметр_цикла:= начальное_значение DOWNTO
конечное_значение DO
begin
оператор_1; (* эти операторы выполняются *)
оператор_2;(*начальное значение - конечное значение + 1 раз *)
оператор_N; end;
В этом случае:
если начальное_значение < конечное_значение, тело цикла не выполняется ни разу;
если начальное_значение = конечное_значение., тело цикла выполняется один раз. При этом параметр_цикла будет равен начальному_значению;
если начальное_значение > конечное_значение, тело цикла выполняется (начальное значение - конечное значение + 1) раз. При этом параметр_цикла при каждом выполнении будет получать последовательно убывающие значения своего типа (если параметр_цикла целого типа, то будет уменьшаться на единицу).
Пример. Напечатать латинский алфавит в обратном
порядке.
program Z_A; var C:char;
begin
for С := 'Z' downto 'A1 do write (C, ' ‘); end.
В том случае, когда необходимо обеспечить изменение какой-либо переменной в теле цикла с постоянным шагом, отличным от плюс-минус единицы, необходимо вычислять значение этой переменной через параметр цикла.
Пример - Вычислить сумму целых четных чисел от 2 до 100.
program Summa_2 100;
var s л.j: integer,
begin s:=0:
for i.=l to 50 do begin
j:=2*i;
s:=s+j;
end;
writeln('cyммa целых четных чисел от 2 до 100 равна ',s); end.
Пример. Вычислить значения синусов углов от 0 до 90 градусов с шагом 10 градусов.
program SINUS;
var i, angle_grad:integer;
pi, angle_rd:real; begin
pi:=3.14159;
for i:=0 to 9 do begin
angle_grad:=10*i;
angle_rd := angle_grad*pi / 180;
writeln('yгoл= ',angle_grad, ' синус= ',sin(angle_rd));
end;
end.
Данная задача может быть также решена по другому, с использованием в теле цикла условного оператора:
program SINUS _with_IF;
var angle_grad:integer;
pi:real; begin
pi:=3.14159;
for angle_grad:=0 to 90 do
if angle_grad mod 10 = 0 then (* угол кратен 10° *) writeln(yron= ', angle_grad, ' синус= ',
sin(angle_grad*pi/180)); end.
Пример. Вычислить сумму S первых 100 членов ряда
1 + 1/2 + 1/3 + 1/4+... + 1/п.
Program Summa;
var
s: real;
n: integer;
begin
s:=0;
for n:=l to 100 do s—s+l/n;
writeln (Сумма 100 членов ряда равна ',s);
end.
Задача. Необходимо ввести с клавиатуры N чисел, найти из них наибольшее и вывести его.
Для решения этой задачи можно предложить следующий алгоритм.
Ввести первое число в переменную Мах.
Ввести следующее число в переменную Next.
Если Next > Мах, то Мах := Next.
Пункты 2 и 3 повторять, пока не будут введены все числа.
4. Вывести значение переменной Мах.
Докажем логически правильность этого алгоритма.
После выполнения первого пункта в переменной Мах находится наибольшее из уже введенных чисел. Это справедливо, так как введено лишь одно число.
Повторение пунктов 2 и 3. в сущности, представляет собой цикл, который выполняется, пока не будут введены все числа. Если перед очередным повторением цикла в переменной Мах находилось наибольшее из введенных чисел, то после выполнения пунктов 2 и 3 там снова будет наибольшее из введенных чисел.
Свойство переменной Мах содержать наибольшее из введенных чисел сохраняется после каждого повторения цикла (такие свойства называют инвариантом цикла). Естественно, инвариант цикла сохранится и после завершения цикла, т.е. после ввода всех чисел.
В последнем пункте значение Мах будет выведено. Этот пример показывает, что правильность алгоритма можно доказать, как доказывают математическую теорему.
Программируя доказанный алгоритм, можно не опасаться ошибок в алгоритме, конечно, если нет ошибок в доказательстве.
program MAX_NUMBER;
var Max, Next, N, i:integer;
begin
write('Введите количество чисел '); Read(N);
write('Введите первое число '); Read(Max);
for i:=2 to N do
begin
write(' Введите следующее число '): Read(Next);
if Next > Max then
Max := Next; end;
write ('Максимальное число равно ', Max); end.