25
primat.at.ua Delphi и базы данных Работа с базами данных в Delphi реализована на самом высоком уровне, хотя этот язык и не создавался специально. Даже специали- зированные языки для работы с базами данных (такие, как MS Visual FoxPro) часто уступают по простоте и мощи программирования с ис- пользованием баз данных. Для примеров будут использоваться базы Access и современный фор- мат xml. Рекомендуется использовать эти базы в качестве локаль- ных, потому что они поддерживаются большинством систем и отлича- ются высокой надёжностью. Будут рассмотрены также самые простые и распространённые базы dbf и paradox. Использовать такие базы рекомендуется в тех случаях когда уже есть готовые базы, созданные в других приложениях Эти базы не рекомендуется использовать из-за их ненадёжности (в них регулярно нарушается индексная целостность, что приводит к нера- ботоспособности программ). Но из-за их распространённости, знать принципы работы с ними просто необходимо. Так, например, локаль- ная версия 1C Предприятия использует формат DBF.

primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

  • Upload
    others

  • View
    25

  • Download
    0

Embed Size (px)

Citation preview

Page 1: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua

Delphi и базы данных Работа с базами данных в Delphi реализована на самом высоком уровне, хотя этот язык и не создавался специально. Даже специали-зированные языки для работы с базами данных ( такие, как MS Visual FoxPro) часто уступают по простоте и мощи программирования с ис-пользованием баз данных. Для примеров будут использоваться базы Access и современный фор-мат xml. Рекомендуется использовать эти базы в качестве локаль-ных, потому что они поддерживаются большинством систем и отлича-ются высокой надёжностью. Будут рассмотрены также самые простые и распространённые базы dbf и paradox. Использовать такие базы рекомендуется в тех случаях когда уже есть готовые базы, созданные в других приложениях Эти базы не рекомендуется использовать из- за их ненадёжности ( в них регулярно нарушается индексная целостность, что приводит к нера-ботоспособности программ). Но из- за их распространённости, знать принципы работы с ними просто необходимо. Так, например, локаль-ная версия 1C Предприятия использует формат DBF.

Page 2: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua

Теория реляционных баз данных Ещё десять лет назад, программирование баз данных было очень сложным занятием. За какие- либо достижения в этой области многие программисты получили в своё время докторские степени. Сейчас уже такое трудно себе представить, потому что благодаря Delphi, про-цесс написания программ упростился, а количество разновидностей баз данных уже исчисляется десятками.

Пример простейшей базы данных

Базы данных делятся на локальные ( установленные на компьютере клиента, там же где работает программа) и удалённые ( установлен-ные на сервере, удалённом компьютере). Серверные базы данных рас-полагаются на удалённом компьютере и работают под управлением серверного программного обеспечения. К их главным преимуществам можно отнести возможность работы с одной базой данных одновремен-но несколькими пользователями, и при этом осуществляется мини-мальная нагрузка на сеть. Есть ещё сетевые базы данных, но их мы рассматривать не будем, потому что они создают слишком большую нагрузку на сеть и неудоб-ны в работе, как для программиста, так и для конечного пользова-теля. Поэтому работать с такими базами мы не будем. Почему? Когда программа присоединяется к сетевой базе данных, то она вы-качивает с сервера практически полную его копию. Если внёсти из-менения, то копия полностью закачивается обратно. Это очень не-удобно, потому что создаётся большая нагрузка на сеть из- за из-лишней перекачки данных. При клиент- серверной технологии программа клиент посылает простой текстовый запрос на сервер на получение каких- либо данных. Сервер обрабатывает его и возвращает только необходимую порцию данных. Когда нужно изменить какие- то данные, опять посылается запрос к серверу на их изменение и сервер изменяет данные в своей базе. Таким образом, по сети происходит перекачка в основном только текстовых запросов, которые в основном занимают меньше килобайта. Все данные обрабатывает сервер, а значит, машина клиента загружа-ется намного меньше и не так сильно требовательна к ресурсам. Сервер отсылает клиенту только самые необходимые данные, а зна-чит, отсутствует излишняя перекачка копии все базы. Благодаря всему этому, сетевые базы данных уже устарели и практи-чески не используются. Их практически полностью вытесняет техно-логия клиент- сервер. А вот локальные базы данных будут жить все-

Page 3: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua гда. Может измениться формат их хранения или добавиться какие- то новые функции, но сами базы данных будут существовать. Здесь рассмотрим только локальные базы данных, а серверные рас-смотрим немного позже. Для дальнейшего рассмотрения надо опреде-лить новое понятие - таблица. Таблица базы данных - это двумерный массив, в котором в столбец выстроены данные ( пример таблицы - Excel). База данных - грубо говоря это всего лишь файл, в котором может храниться от одной до нескольких таблиц. Большинство ло-кальных баз данных могут хранить только одну таблицу (dBase, Paradox, XML). Но есть представители локальных баз, где в одном файле заключено несколько таблиц ( например Access, который мы бу-дем рассматривать в этой главе). Локальные базы данных Из локальных баз данных мы будем рассматривать реляционные, как самые распространённые. Что такое реляционная база данных? Это таблица, в которой в качестве столбцов выступают имена хранимых в ней данных, а каждая строка хранит сами данные. Таблица базы дан-ных базы данных похожа на электронную таблицу Excel ( если быть точнее, то Excel хранит свои данные в виде собственного формата, построенного на основе технологии баз данных). Локальные таблицы баз данных могут храниться на локальном жёстком диске или центра-лизовано сохраняться на сетевой диск файлового сервера. Эти файлы можно копировать с помощью стандартных средств как любой другой файл, потому что сами таблицы базы данных не привязаны к опреде-лённому месту расположения. Главное, чтобы программа могла найти твою таблицу. В каждой таблице должно быть одно уникальное поле, которое одно-значно будет идентифицировать строку. Это поле называется ключе-вым. Эти поля очень часто используются для связывания нескольких таблиц между собой ( с этим мы ещё познакомимся). Но даже если у тебя таблица не связана, ключевое поле всё равно обязательно. Представим, что пишется телефонная база данных. Вопрос " Сколько будет " Ивановых"? Как отличать их? Вот тут поможет ключ. В каче-стве ключа желательно использовать численный тип и если позволяет база данных, то будет лучше, если он будет типа "autoincrement" ( автоматически увеличивающееся/ уменьшающееся число или счётчик). Имена столбцов в таблице базе данных, также должны быть уникаль-ными, но в этом случае не обязательно числовыми. Их можно назы-вать как угодно, лишь бы было уникально и понятно. Каждый столбец ( поле базы данных) обязательно должен иметь опре-делённый тип. Количество типов и их разновидности зависят от типа базы данных, например формат dBASE ( файлы с расширением DBF) под-держивает только 6 типов, а Paradox уже до 15. База данных может храниться в одном файле (Access) или в несколь-ких (Paradox, dBase). Точнее сказать, данные таблицы всегда хра-нятся в одном файле, а вот дополнительная информация может распо-лагаться в отдельных файлах. В качестве дополнительной информации

Page 4: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua могут быть индексы, ограничения или список значений по умолчанию для конкретных полей. Если хотя бы один из файлов запортиться или будет удалён, то данные могут стать недоступными для редактирова-ния. Что такое индексы? Очень часто данные из таблиц подвергаются ка-ким- то изменениям, поэтому прежде чем произвести редактирование над какой- либо строкой, необходимо её найти. Даже статические таблицы, использующиеся в качестве справочников, тоже подвергают-ся операциям поиска перед выводом запрашиваемых данных. Поиск достаточно трудоёмкая операция, особенно если таблица содержит очень много строк. Индексы направлены на ускорение этой процеду-ры, а так же могут использоваться в качестве отправной точки при сортировке. На данном этапе достаточно знать, что не проиндекси-рованное поле невозможно упорядочить. Если необходимо, чтобы какая- то таблица была упорядочена по полю «Фамилия», то это поле надо сначала проиндексировать. Затем нужно только указать, что таблица должна работать сейчас с таким- то ин-дексом, и она сортируется автоматически. Для работы с базами в Delphi есть несколько наборов компонент. Каждый набор подходит для решения определённого круга задач. По-чему такое разнообразие компонентов? Все они используют разные технологии доступа к данным и отличаются по возможностям. В отли-чие от Microsoft, которая встроила в свои продукты разработки только технологию доступа к данным ADO собственной разработки, фирма Borland дает разнообразие средств работающих через разные технологии и не ограничивается только своими разработками. Такой подход имеет свои преимущества. Помимо этого есть группы, которые могут использоваться в любом случае. Дадим краткий обзор доступных средств. На закладке Data Access расположены основные компоненты доступа к данным. Эти компоненты общие для всех и могут использоваться со-вместно с другими группами компонентов.

Закладка Data Access палитры компонентов

На закладке Data Controls расположены компоненты для отображения и редактирования данных в таблицах. Эти компоненты так же исполь-зуются в не зависимости от используемой технологии доступа к дан-ным.

Page 5: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua

Закладка Data Controls палитры компонентов

Закладка BDE содержит компоненты, позволяющие получить доступ к базам данных по технологии, разработанной фирмой Borland под на-званием Borland Database Engine. Эта технология сильно устарела и поставляется только для совместимости со старыми версиями. Не смотря на это, она хорошо работает со старыми типами баз данных, такими как Paradox и dBase.

Закладка BDE палитры компонентов

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

Закладка dbExpress палитры компонентов ADO (Active Data Objects) - технология доступа к данным, разрабо-танная корпорацией Microsoft. Очень хорошая библиотека, но реко-мендуется использовать ее только с базами данных Microsoft, а именно MS Access или MS SQL Server. Её так же можно использовать для специфического сервер баз данных, который может работать только через ODBC.

Закладка ADO палитры компонентов

Page 6: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua Работа с базами данных Access идёт через специальную надстройку DAO, которая может устанавливаться на компьютер вместе с програм-мой Office или идти как отдельная установка. Так что если создан-ная программа не будет работать на компьютере клиента, то надо позаботиться о установке DAO на этот компьютер. Создание первой базы данных Access Для последующей работы необходимо, чтобы на компьютере был уста-новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы, а вот работать с ними будем из Delphi. Запустите Access и выберите в меню Файл-> Создать. В мастере соз-дания базы выберите пункт " База данных" и нажмите " ОК" ( см. рисунок) Будет предложено выбрать имя базы и место расположе-ния, укажите что угодно, но назовите файл Database.mdb .

Окно создания новой базы данных

После этого Access создаст базу и сохранит её по указанному пути. Откроется окно ( см. следующий рисунок), в котором и происходит ра-бота с базой. С левой стороны окна находится колонка выбора объ-ектов, с которыми можно работать. Первым находится пункт " Табли-цы" ( он выделен по умолчанию) который и будет нас интересовать. Если этот объект у не выделен, то надо выделить его.

Page 7: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua

Окно создания новой базы данных

В окне справа находится три пункта:

1. Создание таблицы в режиме конструктора 2. Создание таблицы с помощью мастера 3. Создание таблицы путём ввода данных

С помощью этих команд можно создать таблицы внутри созданной базы данных, Access, которая может хранить в одном файле несколько таблиц. Все данные в базах данных хранятся в виде двухмерных таблиц. На сл. рисунке приведен пример простой базы данных, состоящей из семи колонок и множества строк.

Пример простой таблицы.

Колонки в таблицах называются полями. Создадим базу данных теле-фонного справочника. Выберем " Создание таблицы в режиме конструк-тора" чтобы создать новую таблицу в базе данных. Откроется окно

Page 8: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua ( см. сл. рисунок).

Окно создания таблицы.

Сверху находится сетка, в которой вводятся поля таблицы, их тип и описание ( последнее не обязательно). Если вписать в сетку имя но-вого поля и указать тип, внизу окна появляются свойства нового поля. В зависимости от типа поля изменяется и количество свойств. Перечислим основные: Масксимальная длина поля. Для текстового поля размер не может быть больше 255. Если текст длинее, то надо использовать " Поле Memo". Формат поля. Здесь ты можешь указать внешний вид данных. Напри-мер, поле может выглядить как "Yes/No" для логических полей, или например "mmyyyy" для поля даты. Маска ввода. Здесь мы вводим маску, которая отвечает за отображе-ние поляпри редактировании. Если ты щёлкнешь на кнопке с точками "..." в строке " Маска ввода", то увидишь мастер создания маски. Значение по умолчанию. Не требует комментариев. Обязательное поле. Если пользователь не введёт сюда значение, то появится сообщение об ошибке. Такое поле не может быть пустым. Пустые строки. Похоже на предыдущий, потому что это поле тоже не может быть пустым. Индексированное поле. Может быть неиндексированным, индексиро-ванным с допуском совпадений, и индексированным без допуска сов-падений. Основной индекс всегда без допуска совпадений. Осталь-

Page 9: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua ные желательно с допуском. Сжатие Юникод - позволяет сжать данные в соответствии с Юникод. Создадим шесть полей: Имя поля - Key1. Тип - счётчик. Это у нас будет ключик. Размер поля -" Длинное целое". Индексированное поле - " Да ( Совпадения не допускаются)". Имя поля - Фамилия. Тип - текстовый. Размер поля - 50. Индексиро-ванное поле - " Да ( Допускаются совпадения)". Имя поля - Имя. Тип - текстовый. Размер поля - 50. Индексирован-ное поле -" Да ( Допускаются совпадения)". Имя поля - Телефон. Тип - текстовый. Размер поля - 10. Индексиро-ванное поле - " Да ( Допускаются совпадения)". Имя поля - e-mail. Тип - текстовый. Размер поля - 20. Индексиро-ванное поле -" Да ( Допускаются совпадения)". Имя поля - Город. Тип - числовой. Размер поля - Длинное целое. Индексированное поле - " Нет". Почему город не строковый, ведь на-звания городов - это текст? Пока не будем объяснять этот феномен. Помимо этого, у всех полей значение " Обязательно поле" стоит в " Нет", и " Пустые строки" выставлено в " Да". Если сделать поле обязательным, то во всех строках обязательно должно быть заполне-но соответствующее поле. Если запретить пустые строки ( поставишь «Нет»), то в указанном поле должно быть обязательно что- то введе-но, иначе произойдёт ошибка. В реальных условиях, если какое- то поле обязательно должно иметь значение, то лучше сделать его обя-зательным. Не надо надеяться на добропорядочность пользователя. Пусть лучше база данных следит за правильностью данных. Теперь выделите первое поле (Key1), щёлкните правой кнопкой мыши и выберите пункт " Ключевое поле" ( см. рисунок). Задание ключевого поля является обязательным действием, если этого не сделать, то таблица не сможет редактироваться, а это значит, что в неё нельзя будет добавить строки.

Page 10: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua

Задание ключевого поля

Всё, теперь таблицу можно сохранять и закрывать. На вопрос: « Со-хранить таблицу» отвечайте положительно и сохраняйте под именем «Справочник». Первая база данных готова. Закрывайте её. Теперь перейдем к напи-санию примера для работы с базой и таблицей. Пример работы с базами данных Напишем программу, которая будет работать с базой данных MS Access. Для разработок с использованием MS лучше всего использо-вать ADO.

- ADOConnection. Создадим новый проект. Теперь поместим на форму компонент ADOConnection с закладки ADO палитры компонентов. Теперь настроим соединение с сервером, которое должно быть прописано в свойстве ConnectionString. Для этого надо дважды щёлкнуть по строке ConnectionString и открывается окно, как на сл. рисунке

Окно создания подключения к базе

Page 11: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua Здесь возможен выбор:

• Использовать специальный файл (Use Data Link File);

• Использовать строку подключения (Use Connection String). Второе, как правило, более предпочтительно, поэтому рассмотрим, как создать строку подключения. Для этого щёлкнем кнопку Build и открываеться ещё одно окно, показанное на сл. рисунке

Окно создания строки подключения

На закладке Provider перечислены все доступные ADO драйверы дос-тупа к базам данных. Если какого- то драйвера нет, то можно попро-бовать выделенный по умолчанию «Microsoft OLE DB Provider for ODBC Drivers». Этот драйвер позволяет получить доступ к базе дан-ных через ODBC драйвер, которые есть к большинству существующих баз данных ( единственное, он может быть не установленным на ком-пьютере). В нашем случае, для доступа к базам данных MS Access используется драйвер «Microsoft Jet OLE DB Provider». Такой драйвер обязатель-но устанавливается на машину вместе с MS Office, а в последних версиях Windows он устанавливается по умолчанию. После этого нажимаем кнопку Next, или переходим на закладку «Connection».

Page 12: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua Вид закладки Connection зависит от выбранного драйвера. В нашем случае она должна выглядеть, как показано на сл. рисунке:

Закладка Connection

Первым делом, в этом окне надо ввести имя ( если надо то и путь) базы данных в строку «Select or enter a database name». Если база данных будет располагаться в той же директории, что и исполнимый файл, то путь указывать не надо. Рекомендуется хранить базы в одной директории с запускными файлами. Если держать файлы от-дельно от исполнимого, то придётся указывать полный путь, а это может вызвать проблемы при переносе программы на другой компью-тер. Ведь там программа будет искать базу по казанному пути, ко-торый может измениться. Если надо держать файлы в другой директо-рии, то следует указывать относительный путь относительно текущей директории. Чтобы легче было выбрать файл базы данных необходимо щёлкнуть по кнопке с точками справа от строки ввода. Помимо этого нам надо заполнить следующие поля: Имя пользователя (User name), можно оставить по умолчанию, если незаданно иное при создании базы в MS Access; Пароль (Password) - если база имеет пароль, то его необходимо указать;

Page 13: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua Пустой пароль (Blankpassword) - если пароль не нужен, то здесь желательно поставить галочку; Позволять сохранять пароль (Allow saving password). Если здесь поставить галочку, то пароль может быть сохранён. После выбора базы данных, надо нажать кнопку Test Connection, чтобы протестировать соединение. Если всё указано правильно, то должно появиться сообщение «Test connection succeeded». Дальше, можно нажать ОК, чтобы закрыть окно создания строки подключения и ещё раз ОК, чтобы закрыть окно редактора строки подключения. Теперь в свойствах компонента ADOConnection надо отключить свой-ство LoginPrompt, выставив его в False. Это нужно для того, чтобы при каждом обращении к базе нас не появлялось окно ввода пароля. А теперь выставим свойство Connected в True, чтобы произошло со-единение с базой. На этом соединение можно считать оконченным. Теперь надо получить доступ к созданной таблице « Справочник». Для этого поместим на форму компонент ADOTable с закладки ADO палитры компонентов. Сра-зу изменим его свойство Name на BookName.

- TADOTable. В этом компоненте тоже есть свойство ConnectionString и его так же можно настраивать. Почему « можно»? Да потому что, чтобы этого не делать мы поставили на форму компонент ADOConnection. Теперь мы можем указать у нашего компонента BookName в свойстве Connection, созданный нами компонент соединения с базой данных. Щёлкнем по выпадающему списку в свойстве Connection и выберем там единственный пункт ADOConnection1. Теперь не надо заполнять свой-ство ConnectionString. Теперь в свойстве TableName нужно выбрать имя нашей таблицы ( Справочник). Всё, таблица и соединение указаны, можно подключат-ся. Для этого выставь свойство Active в true.

- TDataSource Для отображения данных из таблицы надо ещё установить на форму компонент DataSource с закладки Data Access палитры компонентов. Теперь этому компоненту надо указать, какую именно таблицу он должен отображать. Для этого в свойстве DataSet нужно из выпадаю-щего списка выбрать нашу таблицу BookTable.

- DBGrid Всё!!! Все приготовления готовы, можно приступать к реальному отображению данных. Самый простой способ отобразить таблицу - ус-тановить компонент DBGrid. Это компонент- сетка, которая может отображать данные в виде таблицы. В этом же компоненте можно до-

Page 14: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua бавлять, удалять и редактировать строки нашей таблицы.

Форма нашего приложения

И последний этап создания приложения - связывание компонента сет-ки с компонентом отображения таблицы. Для этого в свойстве DataSоurce компонента DBGrid нужно указать созданный нами компо-нент DataSource1. Теперь приложение готово! Мы не написали ни одной строчки кода. Запустим пример и создадим несколько строк, попробуем отредакти-ровать уже существующие и удалить что- нибудь. Для вставки строки используется клавиша Ins, а для удаления Ctrl+Del. Свойства компонента TADOTable Компонент TADOTable имеет множество полезных свойств. Большинство из них просты в использовании, поэтому чтобы не писать множество примеров на их использование, кратко опишем основные из них. MasterSource - в этом свойстве указывается главная, по отношению к текущей таблица. ReadOnly - если это свойство равно true, то таблицу нельзя редак-тировать. В этом случае данные только отображаются. Обязательно устанавливайте это свойство для тех таблиц, где данные не должны изменяться и пользователь не должен вносить в них изменения. TableDirect - это свойство отображает каким будет доступ к табли-це. Если этот параметр равен true то будет прямой доступ к табли-це по имени. Если false то будет специальный SQL запрос к базе данных. Не все базы данных позволяют работать через прямой дос-туп, поэтому это свойство по умолчанию равно false. TableName - имя таблицы, данные которой мы хотим обрабатывать. CacheSize - размер кэш памяти. Если здесь установить число 50, то при первом подключении к таблице компонент выберет первые 50 строк и поместит их в локальной памяти, что ускорит доступ к ним. CanModify - свойство похоже на ReadOnly и указывает на возмож-ность редактирование данных таблицы.

Page 15: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua CommandTimeout - время ожидания выполнения команды. Когда компо-нент направляет команду базе данных, то он запускает таймер ожи-дания, по истечению которого ( если команда не выполнилась) проис-ходит сообщение об ошибке. Connection - здесь указывается компонент TADOConnection, через который происходит подключение. ConnectionString - строка подключения к базе данных. CursorLocation - расположение курсора, который считывает данные и указывает текущую позицию в таблице. Курсор может находиться на сервере или на машине клиента. CursorType - тип курсора. Тут возможен один из следующих вариан-тов: ctUnspecified расположение курсора не указано ctOpenForwardOnly - курсор может двигаться только вперёд. ctKeyset при этом курсоре изменения внесённые одним пользователем не видны остальным пользователям подключённым к этой таблице. Ес-ли с одной таблицей работают одновременно несколько пользовате-лей, то при таком курсоре для отображения изменений других поль-зователей нужно отключиться от базы и подключиться к ней снова. ctDynamic динамический курсор, при котором изменения одного поль-зователя видят все остальные. ctStatic статический курсор. Изменения одного пользователя не видны остальным Внимание!!! Если курсор расположен на клиенте, то можно использовать только статический курсор. Не все типы курсоров могут работать с определённой базой данных. Одна база данных может поддерживать один тип, а другая может поддержи-вать всё. Filter - строка фильтра. Filtered - является ли таблица фильтруемой. Если здесь установить false то строка фильтра (filter) игнорируется. IndexFieldNames - имя индексированной колонки. Индексы использу-ются для сортировки данных или для связи между таблицами. RecNo - номер текущей выделенной строки. RecordCount - количество строк в таблице. Sort - строка, в которой указывается тип сортировки. Например, для сортировки по полю « Телефон» сюда нужно записать строку: ADOQuery1.Sort := ' Телефон ASC'. Оператор ASC говорит о том, что

Page 16: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua надо сортировать в порядке возрастания. Оператор DESC говорит о сортировании в порядке убывания. Active - если это свойство равно true, то таблица открыта. AggFields - здесь хранятся все агрегатные поля. AutoCalcFields - если здесь true, то надо автоматически пересчи-тывать поля. Воf - на это свойство влиять нельзя, но если оно равно true, то мы находимся в начале файла. Bookmark - здесь находиться текущая закладка. Eof- на это свойство влиять нельзя, но если оно равно true, то мы находимся в конце файла. FieldCount - здесь хранится количество полей в таблице. Fields - через это поле можно получить доступ к значениям полей. Допустим, что надо узнать, какое значение храниться в 4- м поле. Для этого нужно написать Table.Fields.Fields[4].AsString. Метод AsString говорит о том, что нам надо получить значение в виде строки. FieldValues - с помощью этого свойства можно легко получить дос-туп к любому значению указанного поля. Имя поля нужно указывать в квадратных скобках. Пример, Table1.FieldValues[' Телефон']: = '3346598'; FilterOption - настройки фильтра. Здесь можно указывать следующие параметры: foCaseInsensitive фильтр будет не чувствителен к регистру. foNoPartialCompare если стоит этот параметр, то сравнения будут происходить с точной копией указанного значения в фильтре. Если параметр не казан, то в фильтр будут попадать строки содержащие значение в фильтре, но не являющиеся его точной копией. Например, если в фильтре указано показывать слова « са», то в фильтр попадут все слова начинающиеся на « са» ( самолёт, самокат). Modified - если это свойство равно true, то в таблице были внесе-ны изменения.

Методы компонента TADOTable BookmarkValid - этот метод проверяет правильность закладки. В ка-честве единственного параметра нужно указать закладку типа TBookmark и если она является действительной, то результатом бу-

Page 17: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua дет true. CancelUpdates - отменить обновления сохранённые в кэш памяти CompareBookmarks.- сравнение двух закладок. У метода два парамет-ра типа TBookmark. Эти две закладки сравниваются. Если закладки равны, то результат равен нулю. Если первая меньше второй, то ре-зультат будет -1. Если первая больше второй, то результат равен единице. DeleteRecords - удалить записи. У метода один параметр - какие записи удалять. Параметры: arCurrent удалить только текущую запись. arFiltered удалить записи удовлетворяющие установленному фильтру. аrAll - все записи. arAllChapters удалить записи во всех разделах ADO. Append - добавить новую запись в конец таблицы. Cancel - отменить изменения текущей строки, если изменения ещё не были сохранены с помощью метода Post. Close - закрыть таблицу. Delete - удалить текущую строку. Edit - перейти в режим редактирования. После этого можно изменять значения полей. FieldByName - найти поле по имени. В качестве единственного пара-метра нужно указать имя поля виде строки и в результате получаем ссылку на поле в виде объекта TField. First - перейти на первую строку в таблице. Insert - вставить новую строку в таблицу. IsEmpty - если метод вернёт true то в таблице нет записей. Last - перейти на последнюю запись в таблице. Next - перейти на следующую запись. Post - принять все изменения. Prior - двигаться на предыдущую запись в таблице. Refresh - обновить информацию о данных. UpdateRecord - обновить текущую запись.

Page 18: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua Управление отображением данных Чтобы прятать от пользователя не нужные поля и показывать только то, что мы хотим и в том виде, в котором хотим, необходимо нау-читься управлять отображением данных. Но прежде чем приступить к этому, создадим в базе ещё два поля « Дата» и « Мобильник». Загру-зим базу данных в Access, щёлкнем по ней правой кнопкой и в поя-вившемся меню выберем « Конструктор».

Редактирование таблицы

Добавим поле с именем « Дата», тип « Дата/ время». Добавим поле с именем « Мобильник», и тип « Логический». Если в строке находится мобильный телефон, то в этом поле будем ставить true, иначе «false». Закройте таблицу. Теперь переходим в Delphi и попробуем отобра-зить изменения в уже созданном примере. Для начала перенесём компоненты доступа к базе данных в отдельное специальное окно. Выделим компоненты ADOConnection1, DataSource1 и BookTable. Те-перь выберем из меню Edit пункт Cut, что бы эти компоненты скопи-ровались в буфер обмена и сразу удалились с формы. Теперь выберем из меню File->New->Data Module ( см. сл. рисунок).

Page 19: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua Delphi создаст специальное окно Data Module, которое удобно под-ходит для хранения компонентов доступа к базам данных.

Создание модуля Data Module

Теперь выберем из меню Edit пункт Paste, чтобы вставить в это ок-но вырезанные ранее компоненты. Расположим теперь эти компоненты в окне так, чтобы было удобно ( см. сл. рисунок).

Окно Data Module

Теперь все компоненты, которые предназначены для доступа к базе данных будем располагать здесь, чтобы с ними удобно было рабо-тать. Сохраним новый модуль под именем DataModuleUnit. Теперь откройте менеджер проектов ( в меню Project надо выбрать Project Manager) и расположим это окно так, чтобы было удобно в любой момент получить к нему доступ ( например, в правом нижнем углу экрана). Теперь, когда надо перейти из главной формы в модуль данных DataModule или обратно, можно сделать это с помощью менеджера проектов, дважды щёлкнув по нужной форме.

Page 20: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua

Менеджер проектов

Если хоть раз уже открывалась какая- то форма из менеджера проек-тов и не была закрыта, то её можно найти на закладках в окне ре-дактора кода:

Закладки форм в редакторе кода

Напомним, что переключаться между визуальной формой и её кодом очень удобно простым нажатием клавиши F12. Перейдем теперь в главную форму. В сетке DBGrid1 нет данных. По-чему? Причина в том, что она потеряла связь с компонентами досту-па к данным. Выделим сетку и щёлкнем по свойству DataSource,- в выпадающем списке ничего нет. Это потому что все нужные компонен-ты мы убрали в отдельную форму и главная форма пока об этом не знает. Чтобы форма узнала о существовании компонентов, ей нужно указать в разделе uses наш модуль DataModuleUnit. Это можно сделать вруч-ную или выбрать из меню File пункт Use Unit ( в этот момент должно быть выделено окно кода главной формы, потому что мы подключаем новый модуль именно к ней. В появившемся окне ( см. сл. рисунок) нужно выбрать имя нашего нового модуля DataModuleUnit ( пока оно одно в списке) и нажать ОК

Page 21: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua

6 Окно подключения нового модуля

Проверим теперь в редакторе кода, чтобы после ключевого слова implementation появилось «uses DataModuleUnit;»:

implementation uses DataModuleUnit; {$R *.dfm}

Теперь можно выделять нашу сетку DBGrid1 и в свойстве DataSource указывать компонент DataSource, данные которого должны быть ото-бражены в сетке (DataModule1. DataSource1). Теперь переходим в модуль DataModule чтобы настроить отображение данных. Дважды щёлкнем по компоненту BookTable- появиться окно ре-дактирования полей базы данных ( см. сл. рис.).

Окно редактирования полей базы данных.

Пока оно пустое и в него надо добавить все поля базы данных. Для этого щёлкнем в нём правой кнопкой мыши и в появившемся меню вы-берем пункт Add All Field ( Добавить все поля). Окно автоматически заполниться именами полей ( см. сл. рис.).

Page 22: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua

Заполненное окно редактирования

полей базы данных Поля можно переставлять местами двигая мышкой. При этом физиче-ское расположение в базе данных не меняется, зато при отображении данных в сетке, они будут отображаться в том порядке, в котором они выстроены здесь. Можно теперь выделять отдельные поля и в объектном инспекторе редактировать его свойства. Свойства у полей могут быть разные, в зависимости от типа поля. Первое, что надо сделать - убрать из видимости счётчик ( поле Key). Выделим это поле и в объектном инспекторе установим в свой-стве Visible значение false ( это свойство есть у всех полей). Сразу можно перейти в главную форму или запустить программу, что-бы убедиться в том, что поле Key1 больше не отображается. Теперь отредактируем длину отображения колонок. Для этого выделим «Фамилия». В базе данных раньше мы выделили под это поле 50 сим-волов ( на всякий случай). В сетке ширина колонки будет отобра-жаться по умолчанию на всю длину. Но чаще всего фамилии не превы-шают 15 символов, поэтому нет смысла отображать всю длину. На много удобней отображать только 15 символов, а если что- то не по-меститься, то пользователь программы в любой момент сможет раз-двинуть колонку и увидеть недостающие символы. За ширину колонки отвечает свойство DisplayWidth ( это свойство есть у всех полей). По умолчанию в нём стоит значение физической ширины поля, но мы укажем там 15. Опять же, на саму базу данных это не влияет и поле всё ещё имеет размер 50, но ширина отобра-жаемой колонки в сетке будет 15. Сократим и ширину поля « Имя». Ещё несколько интересных свойств: DefaultExpression - здесь можно указать значение по умолчанию. В дальнейшем, когда будут создаваться новые строки, то в поля будут сразу заноситься указанные здесь значения. MaxValue - максимально допустимое значение. Если это числовое по-ле и оно должно изменяться в определённых рамках ( например, от 0 до 100), то желательно указать эти ограничения здесь, чтобы со-кратить вероятность опечатки пользователем. MinValue - минимально допустимое значение.

Page 23: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua ReadOnly - поле только для чтения. Если какое- то поле не должно изменяться, то установим в свойстве ReadOnly значение true. Required - если здесь true, то поле является обязательным и обя-зательно должно иметь какое- то значение. Если пользователь ничего не укажет, то программа сообщит об этом. Допустим, что какое- то поле участвует в расчётах. Если в этом поле не окажется данных, то программа может зависнуть. Есть два пути - при расчёте прове-рять наличие в поле данных или требовать, чтобы пользователь обя-зательно что- то ввёл. Второй путь предпочтительней, если это поле действительно важное. Представьте запись в телефонном справочнике без телефона. Спрашивается, зачем тогда нужна эта запись если не указан телефон. Так что поле для номера телефона можно делать обязательным. Tag- числовое значение, можно использовать по своему усмотрению.

Улучшенное окно программы.

Запустим программу и заполним поле « Дата» у всех записей любыми значениями. При заполнении надо указывать реальные даты. Если ввести недопустимое значение, то появится ошибка. При вводе данных следует учитывать разделитель чисел. В большин-стве русскоязычных ОС Windows в качестве разделителя используется точка или знак косой черты «/». К тому же первым идёт число, по-том месяц и потом год ( в англоязычной версии первым может идти месяц). Пробелы не допустимы. Этот порядок и разделитель настраи-ваются в настройках ОС. Войдите в « Панель управления» и запустите окно « Язык и стандарты» ( см. сл. рисунок). Здесь можно изменить все настройки ввода даты, времени и чисел.

Page 24: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua

Настройка формата ввода и отображения даты

Вернёмся к Delphi. Выделим поле « Дата». Первое, что мы должны сделать - уточнить, какую именно дату здесь надо вводить. Так как это телефонный справочник, то можно, например, указывать дату ро-ждения владельца телефона. Поэтому, вполне разумно будет в заго-ловке сетке отображать не просто « Дата», а « Дата рождения». Тут можно поступить двумя способами - отредактировать имя поля в базе данных ( не совсем разумно) или просто заставить Delphi отображать в заголовке поля нужный текст. За текст отображаемый в заголовке отвечает свойство DisplayLabel ( это свойство есть у всех полей). Введем в нём текст « Дата рожде-ния». Можно проверить, что теперь в заголовке отображается нужный текст. Теперь отредактируем формат отображения даты. За это отвечает свойство DisplayFormat. Тут можно указывать текстовый формат, в котором нужно отображать дату. Как отображать? Вспомним функцию FormatDateTime и её первый параметр. Обычно используют для ото-бражения полный формат - «dddddd». Ну и наконец нужно указать маску ввода для даты. Её нужно указы-вать в свойстве EditMask так же как у компонента TMaskEdit. Для даты обычно указывают маску ввода «99/99/9999». Если запустить пример, то в поле « Дата рождения» все даты будут

Page 25: primat.atprimat.org/_ld/0/5_BasaDelphi.pdf · новлен MS Office и его компонент MS Access. Именно в нём и будут создаваться базы ,

primat.at.ua отображаться в полном формате ( см. сл. рис.). Если щёлкнуть дважды по этому полю в любой строке ( войти в режим редактирования стро-ки), то дата сразу перейдёт в режим редактирования ( см. сл. рис., вторая строка).

Улучшенный вид поля « Датарождения»

Последнее, что надо отредактировать - поле « Мобильник». Пока что здесь отображаются значения true или false, но будет удобнее ви-деть Да или Нет. Выделим это поле и в объектном инспекторе найдем свойство Display Values. Для булевых полей здесь нужно указать два значения в формате «True;False», т. е. сначала указываем поло-жительное значение и после точки с запятой отрицательное ( кавычки указывать не надо). Укажет Да; Нет. Теперь в поле « Мобильник» будут отображаться понятные слова, да и при редактировании теперь нужно вводить не true или false, а Да или Нет.