- •Оглавление
- •Часть 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.9.2. Оператор with
Этот оператор позволяет сократить обращение к полям записи. Его схема:
WITH имя записи DO оператор;
Всюду внутри оператора WITH можно опускать имя записи в составном имени поля.
Пример. Применение оператора WITH для типа записи Book.
var X: Book; begin
with X do begin
readln (Title, Author, Year);
write (Title, Author, Year);
end;
end.
Пример. Применение оператора WITH в программе вычисления среднего балла.
(*вычисление среднего балла по матанализу в группе ЗИ *) for i:=l to number_student do
begin
with first_course.zi[i] do
for j:=l to number_subject do
begin
if subject[j ] title='матанализ' then
summa:=summa+ subject[j].mark;
end;
end;
Допускается вложенность операторов WITH один в другой. Поэтому данную часть программы можно модифицировать так (*вычисление среднего балла по матанализу в группе ЗИ *) with first_course do
for i:=l to number_student do begin
withzi[i]do
for j:=1 to number_subject do
begin
if subject[j|]].title='матанализ' then
summa:=summa+ subject[j].mark;
end;
end;
2.9.3. Последовательный поиск в массиве записей
Массив записей подходит для хранения большого объема разнородной информации, например для создания телефонного справочника, адресной книгой, библиотечного каталога.
Пример. Описание библиотечного каталога
type
Book = record
Title: string [100];
Author: string [40];
Year: integer;
end;
Catalog = array [1..1000] of Book;
Возникает задача поиска элемента массива, одно из полей которого имеет заданное значение, например, сведений о книге по фамилии автора. Найти - значит определить номер записи в массиве или сообщить об отсутствии такой записи.
Самый простой алгоритм поиска — последовательный. Он состоит в том, что у всех записей последовательно, начиная с первой, проверяется значение признака, по которому ведется поиск. Пусть требуется найти книгу определенного автора. Это можно сделать так
program serial_search;
type
Book = record
Title: string [40];
Author: string [12];
Year: integer;
end;
Catalog = array [1..1000] of Book; var
cat: Catalog;
s:string;
i:integer;
Year: integer;
end;
Catalog = array [1..1000] of Book;
Var
Cat:Catalog;
s: string; i,j,k,m:integer;
begin
Write ('Введите имя автора ');read(s);
i:=l;j:=1000;
k:=0;
while (k=0) and ((j-i)> 1) do
begin
m:=(i+j) div 2;
if(Cat[m].Author = s) then k:=m
else
begin
if Cat[m] .Author < s then i:=m else j :=m;
end;
end;
if (k =0) and (Cat[i].Author = s) then k:=i;
if (k =0) and (CatOLAuthor = s) thenk:=j;
if (k<>0) then writeln('Нужная книга под номером ', k)
else writeln('Hyжнaя книга отсутствует ');
end.
2.9.4. Двоичный поиск в массиве записей
Общим свойством алгоритмов последовательного поиска является то, что время поиска прямо пропорционально количеству записей. Если массив записей отсортирован по значению искомого признака, то можно искать быстрее.
Рассмотрим следующий алгоритм поиска книги нужного автора в каталоге, упорядоченном в алфавитном порядке по фамилиям авторов.
Открыть каталог посередине.
Сравнить искомую фамилию с той, что в середине каталога.
Если фамилии совпадают, поиск завершен.
Если фамилия в середине по алфавиту позже искомой, продолжить поиск в первой половине каталога.
Если фамилия в середине по алфавиту раньше искомой, продолжить поиск во второй половине каталога.
Слова «продолжить поиск» означают применение алгоритма в целом к половине каталога, т.е. открыть его посередине и т.д. В конце концов, либо фамилия будет найдена, либо делить пополам будет нечего, значит, фамилии в каталоге нет.
program binary_search;
type
Book = record
Title: string [100]; Author: string [40];
Year: integer;
end;
Catalog = array [1..1000] of Book;
var
cat: Catalog; s: string; i,j,k,m:integer;
begin
Write ('Введите имя автора ');read(s); i:=l;j:=1000;
k:=0;
while (k=0) and ((j-i)> 1) do
begin
m:=(i+j) div 2;
if (Cat[m].Author = s) then k:=m
else
begin
if Cat[m].Author < s then i:=m else j:=m;
end ,
end;
if (k =0) and (Cat[i].Author = s) then k:=i;
if (k =0) and (Cat[j].Author = s) thenk:=j;
if (k<>0) then writeln('Нужная книга под номером ', k)
else writeln('Нужная книга отсутствует ');
end.
Сравним скорость последовательного и двоичного поиска. Первый сокращает область поиска на одну запись за каждый шаг алгоритма. Второй за один шаг уменьшает область поиска в два раза. Следовательно, при удвоении числа записей время последовательного поиска возрастет в два раза, а время двоичного поиска увеличится лишь на один шаг алгоритма.