Базы данных на Delphi

 

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ

Учреждение образования

«Гомельский государственный университет имени Франциска Скорины»

Математический факультет

Кафедра вычислительной математики и программирования









КУРСОВАЯ РАБОТА

Базы данных на DELPHI




Исполнитель:

Студент группы М-21 Ганькин Ян Валерьевич

Научный руководитель:

Ассистент Богданова Татьяна Григорьевна







Гомель

РЕФЕРАТ


Курсовая работа: 54 страниц, 2 таблицы, 12 рисунков, 1 приложение, 5 источников.

Ключевые слова: банк данных, баз данных, архитектура, таблица, поле, запись, набор данных, перемещение, сортировка, поиск, модификация, фильтрация, навигационный способ.

Цель курсовой работы: изучить теорию по работе с базами данных в среде визуального проектирования Delphi , научиться создавать простейшие приложения, используя средства программирования среды Delphi.

Выводы: в результате выполнения курсовой работы изучена теория по работе с базами данных в среде визуального проектирования Delphi, усвоены способы решения задач по организации баз данных на компьютере, решена задача по сортировке электронных файлов.


СОДЕРЖАНИЕ


ВВЕДЕНИЕ

. ОСНОВНЫЕ ПРИНЦИПЫ СОЗДАНИЯ БАЗ ДАННЫХ

1.1 Требования, которым должна удовлетворять организация базы данных

.2 Основы построения банков данных

.3 Организация баз данных и их модели

.4 Проблемы проектирования БД

.5 Принцип работ БД в Delphi

.6 Инструментальные средства баз данных Borland

.7 Архитектуры баз данных

.8 Таблицы баз данных

2. НАВИГАЦИОННЫЙ СПОСОБ ДОСТУПА К БАЗАМ ДАННЫХ

2.1Операции с таблицей БД

2.2Сортировка набора данных

.3Перемещение по набору данных

.4Фильтрация записей

.5Поиск записей

.6Модификация набора данных

3ОПИСАНИЕ ПРИЛОЖЕНИЯ

3.1Файл проекта

3.2Форма заставки

.3Основная форма

.4Форма вставки новых записей

.5Форма добавления разделов

.6Форма просмотра базы данных

.7Дополнительный модуль

ЗАКЛЮЧЕНИЕ

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

ПРИЛОЖЕНИЯ


ВВЕДЕНИЕ


Потоки информации, циркулирующие в мире, который нас окружает, огромны. Во времени они имеют тенденцию к увеличению. Поэтому в любой организации, как большой, так и маленькой, возникает проблема такой организации управления данными, которая обеспечила бы наиболее эффективную работу. Некоторые организации используют для этого шкафы с папками, но большинство предпочитают компьютеризированные способы - базы данных, позволяющие эффективно хранить, структурировать и систематизировать большие объемы данных. И уже сегодня без баз данных невозможно представить работу большинства финансовых, промышленных, торговых и прочих организаций. Не будь баз данных, они бы просто захлебнулись в информационной лавине.

Существует много веских причин перевода существующей информации на компьютерную основу. Сейчас стоимость хранения информации в файлах ЭВМ дешевле, чем на бумаге. Базы данных позволяют хранить, структурировать информацию и извлекать оптимальным для пользователя образом. Использование клиент/серверных технологий позволяют сберечь значительные средства, а главное и время для получения необходимой информации, а также упрощают доступ и ведение, поскольку они основываются на комплексной обработке данных и централизации их хранения. Кроме того ЭВМ позволяет хранить любые форматы данных, текст, чертежи, данные в рукописной форме, фотографии, записи голоса и т.д. Для использования столь огромных объемов хранимой информации, помимо развития системных устройств, средств передачи данных, памяти, необходимы средства обеспечения диалога человек - ЭВМ, которые позволяют пользователю вводить запросы, читать файлы, модифицировать хранимые данные, добавлять новые данные или принимать решения на основании хранимых данных. Для обеспечения этих функций созданы специализированные средства - системы управления базами данных (СУБД).

Современные СУБД - многопользовательские системы управления базой данных, которые специализируется на управлении массивом информации одним или множеством одновременно работающих пользователей.

Современные СУБД обеспечивают:

набор средств для поддержки таблиц и отношений между связанными таблицами;

развитый пользовательский интерфейс, который позволяет вводить и модифицировать информацию, выполнять поиск и представлять информацию в графическом или текстовом режиме;

средства программирования высокого уровня, с помощью которых можно создавать собственные приложения.

И поскольку использование баз данных является одним из краеугольных камней, на которых построено существование различных организаций, пристальное внимание разработчиков приложений баз данных вызывают инструменты, при помощи которых такие приложения можно было бы создавать. Выдвигаемые к ним требования в общем виде можно сформулировать как: "быстрота, простота, эффективность, надежность".отдают предпочтение разработчики с разным стажем, привычками, профессиональными интересами. С помощью Delphi написано колоссальное количество приложений, десятки фирм и тысячи программистов-одиночек разрабатывают для Delphi дополнительные компоненты.

В основе такой общепризнанной популярности лежит тот факт, что Delphi, как никакая другая система программирования, удовлетворяет изложенным выше требованиям. Действительно, приложения с помощью Delphi разрабатываются быстро, причем взаимодействие разработчика с интерактивной средой Delphi не вызывает внутреннего отторжения, а наоборот, оставляет ощущение комфорта.приложения эффективны, если разработчик соблюдает определенные правила (и часто - если не соблюдает). Эти приложения надежны и при эксплуатации обладают предсказуемым поведением.

Пакет Delphi - продолжение линии компиляторов языка Pascal корпорации Borland. Pascal как язык очень прост, а строгий контроль типов данных способствует раннему обнаружению ошибок и позволяет быстро создавать надежные и эффективные программы. Корпорация Borland постоянно обогащала язык. Когда-то в версию 4.0 были включены средства раздельной трансляции, позже, начиная с версии 5.5, появились объекты, а в состав шестой версии пакета вошла полноценная библиотека классов Turbo Vision, реализующая оконную систему в текстовом режиме работы видеоадаптера. Это был один из первых продуктов, содержавших интегрированную среду разработки программ.

В классе инструментальных средств для начинающих программистов продуктам компании Borland пришлось конкурировать со средой Visual Basic корпорации Microsoft, где вопросы интеграции и удобства работы были решены лучше. Когда в начале 70-х годов Н. Вирт опубликовал сообщение о Pascal, это был компактный, с небольшим количеством основных понятий и зарезервированных слов язык программирования, нацеленный на обучение студентов. Язык, на котором предстоит работать пользователю Delphi, отличается от исходного не только наличием множества новых понятий и конструкций, но и идейно: в нем вместо минимизации числа понятий и использования самых простых конструкций (что, безусловно, хорошо для обучения, но не всегда оправдано в практической работе), предпочтение отдается удобству работы профессионального пользователя. Как язык Turbo Pascal естественно сравнивать с его ближайшими конкурентами - многочисленными вариациями на тему языка Basic (в первую очередь с Visual Basic корпорации Microsoft) и с C++. Плюсы применения языка Pascal очевидны: с одной стороны, в отличие от Visual Basic, основанного на интерпретации промежуточного кода, для него имеется компилятор, генерирующий машинный код, что позволяет получать значительно более быстрые программы. С другой - в отличие от C++ синтаксис языка Pascal способствует построению очень быстрых компиляторов.

Опции, включая режимы компиляции, задаются для всего проекта в целом. В этом отношении традиционные make-файлы, используемые в компиляторах языка C, значительно более гибки. Visual Component Library (VCL) Богатство палитры объектов для построения пользовательского интерфейса - один из ключевых факторов при выборе инструмента визуального программирования. При этом для пользователя имеет значение как число элементов, включенных непосредственно в среду, так и доступность элементов соответствующего формата на рынке.

Для разработки программы сортировки электронных книг с последующей записью их в базу данных, была выбрана интегрированная среда разработки Delphi для WINDOWS - приложений.


1. ОСНОВНЫЕ ПРИНЦИПЫ СОЗДАНИЯ БАЗ ДАННЫХ


1.1Требования, которым должна удовлетворять организация базы данных


Изучением этого вопроса долгое время занимались различные группы людей в учреждениях, использующих ЭВМ, в правительственных комиссиях, на вычислительных центрах коллективного пользования. Комитет CODASYL опубликовал отчеты на эту тему (CODASYL-организация, разработавшая язык КОБОЛ). Организации пользователей IBM SHARE и GUIDE в своем отчете сформулировали требования к системе управления базами данных. Организация ACiM (Association for Computing Machinery) также занималась изучением этого вопроса.

Ниже перечислены основные требования к организации базы данных.

1.Установление многосторонних связей. Различным программистам требуются различные логические файлы. Эти файлы получаются из одной и той же совокупности данных. Между элементами запоминаемых данных могут существовать различные связи. Метод организации данных должен быть таким, чтобы обеспечивалась возможность удобного представления этих взаимосвязей и быстрого согласования вносимых в них изменений. Система управления базами данных должна обеспечивать возможность получения требуемых логических файлов из имеющихся данных и существующих между ними связей.

2.Производительность. Базы данных, специально разработанные для использования их оператором терминала, обеспечивают время ответа, удовлетворительное для диалога человек - терминал. Кроме того, система баз данных должна обеспечивать соответствующую пропускную способность. В системах, рассчитанных на небольшой поток запросов, пропускная способность накладывает незначительные ограничения на структуру базы данных. В системах, предназначенных только для пакетной обработки, время ответа не так важно и метод физической организации может выбираться из условий обеспечения эффективной пакетной обработки.

3.Минимальные затраты. Для уменьшения затрат на создание и эксплуатацию базы данных выбираются такие методы организации, которые минимизируют требования к внешней памяти. При использовании этих методов физическое представление данных в памяти может сильно отличаться от того представления, которое использует прикладной программист. Преобразование одного представления в другое осуществляет программное обеспечение либо, если возможно, аппаратные или микропрограммные средства. В таких случаях приходится выбирать между затратами на алгоритм преобразования и экономией памяти.

4.Минимальная избыточность. В системах обработки, существовавших до использования систем управления базами данных, информационные фонды обладали очень высоким уровнем избыточности. Большинство ленточных библиотек содержало большое количество избыточных данных. Даже при использовании баз данных по мере возрастания информации, объединяемой в интегрированные базы данных, потенциальная возможность появления избыточных данных постепенно увеличивается. Целью организации базы данных должно быть уничтожение избыточных данных там, где это выгодно, и контроль за теми противоречиями, которые вызываются наличием избыточных данных.

5.Возможности поиска. Пользователь базы данных может обращаться к ней с самыми различными вопросами по поводу хранимых данных. Возросшие требования к системам заключаются в обеспечении обработки таких запросов или формирования таких ответов, которые заранее не запланированы.

6.Целостность. Если база данных содержит данные, используемые многими пользователями, очень важно, чтобы элементы данных и связи между ними не разрушались. Необходимо, чтобы вычислительная система гарантировала целостность хранимых в ней данных.

7.Безопасность и секретность. Данные в системах баз данных должны храниться в тайне и сохранности. Для увеличения жизнестойкости информации в базе данных важно защищать ее от аппаратных или программных сбоев, от некомпетентного или злонамеренного использования лицами

8.Простота использования. Средства, которые используются для представления общего логического описания данных, должны быть простыми и изящными. Интерфейс программного обеспечения должен быть ориентирован на конечного пользователя и учитывать возможность того, что пользователь не имеет необходимой базы знаний по теории баз данных.


1.2Основы построения банков данных


Современными информационными системами являются банки данных, включающие:

·Вычислительную систему

·Одну или несколько баз данных

·Систему управления базами данных (СУБД)

·Набор прикладных программ

Вычислительная техника с каждым годом все шире применяется в различных сферах человеческой деятельности. Резкий рост объемов перерабатываемой информации и накопленный опыт пользования электронно-вычислительной техникой в различных областях человеческой деятельности приводят к необходимости пересматривать такую, традиционную область обработки информации, как управление данными.

База данных может быть определена как совокупность предназначенных для машинной обработки данных, которая служит для удовлетворения нужд многих пользователей в рамках одной или нескольких организаций. Основным моментом является то, что база данных предназначена для использования всеми членами организации, которым необходима информация, содержащаяся в базе данных. Информация хранится в базе данных, которая может включать много различных типов логических записей. База данных ориентирована на интегрированные требования, а не на одну программу, как было с частными файлами данных.

Однако наличие только базы данных само по себе не разрешает полностью проблем организации в области обработки данных и принятия решений. Управление базой данных, являющейся достоянием многих пользователей внутри организации, должно осуществляться с пользой для всей организации и с точки зрения организации в целом, а не отдельных пользователей. Без централизованного управления базой данных ее полезность со временем снижается.

Для решения проблемы регулирования и управления базами данных были развиты две концепции:

1.Программное обеспечение развито в направлении, обеспечивающем поддержание общего интерфейса между всеми пользователями и интегрированной базой данных. Пользователи не могут хранить информацию независимым образом, они должны использовать и обновлять информацию в соответствии с требованиями организации. Обеспечение, известное как система управления базами данных (СУБД), позволяет осуществить контроль данных с использованием ЭВМ.

В каждой СУБД прежде всего есть трансляторы или интерпретаторы с языка описания данных (ЯОД) и с языка манипулирования данными (ЯМД), единые для всей базы данных (БД).

Описание структуры данного некоторого типа на формализованном языке называют схемой этого данного. Язык описания данных (ЯОД) - это язык высокого уровня, предназначенный для задания схемы базы данных. С его помощью описываются типы данных, подлежащих хранению в базе или выборке из нее, их структура и связи между собой. Исходные тексты, написанные на этом языке, после трансляции отображаются в управляющие таблицы: адресных констант, констант и другую информацию, необходимую для работы с данными программ СУБД. В соответствии с полученным описанием СУБД может найти в базе требуемые данные, правильно преобразовать их и переработать, например, в прикладную программу, которой они потребовались. При записи данных в базу СУБД определяет место в памяти ЭВМ, куда их требуется поместить, преобразует к заданному виду, устанавливает необходимые связи.

ЯМД представлен системой команд манипулирования данными. В нем могут быть, например, следующие команды:

·Произвести выборку из базы данных конкретного данного, значение которого удовлетворяет заданным условиям;

·Произвести выборку из БД всех данных определенного типа, значения которых удовлетворяют заданным условиям и т.д.

Системы управления базой данных подразделяют на две группы в зависимости от способа реализации ЯМД:

·СУБД с включающим языком;

·СУБД с базовым языком.

В СУБД с базовым языком разрабатывается собственный алгоритмический язык, позволяющий кроме манипулирования данными выполнять арифметические операции, операции ввода - вывода на терминалы и т.д.

Во многих СУБД имеются специальные средства обеспечения защиты данных от некомпетентного их использования и сбоев технических средств, средства контроля достоверности данных, средства автоматического накопления статистики использования тех или иных данных различными категориями пользователей.

2.Другой концепцией является концепция администратора базы данных

(АБД). Администратор базы данных - это лицо (или группа лиц), реализующие управление базой данных. Он должен уметь поддерживать взаимосвязи как с руководством высшего уровня, так и с пользователем, обрабатывающим данные, а также руководить штатом технических специалистов.


1.3Организация баз данных и их модели


При создании баз данных (БД) необходимо уделить особое внимание тому, чтобы данные можно было широко использовать в различного рода приложениях и чтобы способы использования данных можно было легко и быстро изменять. До появления БД было чрезвычайно трудно изменить способ организации используемых данных.

Для обеспечения гибкости использования данных необходимо учитывать два условия разработки БД:

1.Данные должны быть независимы от программ для того, чтобы данные можно было добавлять или перестраивать без изменения программ;

2.Должна быть обеспечена возможность запрашивать и отыскивать нужную информацию в БД без трудоемкого написания программ на обычном языке программирования. Таким образом, проектирование БД должно основываться на вполне определенной системе положений - четко сформулированной концепции.

БД содержит данные, используемые некоторой прикладной системой (например, системами "Сирена" и "Экспресс" продажи авиа- и железнодорожных билетов). В зависимости от вида организации данных различают следующие важнейшие модели БД:

·Иерархическую

·Сетевую

·Реляционную

·Объектно-ориентированную

В иерархической БД данные представляются в виде древовидной структуры. Подобная структура БД удобна для работы с данными, упорядоченными иерархически. При оперировании данными со сложными логическими связями иерархическая модель оказывается слишком громоздкой.

В сетевой БД данные организуются в виде графа. Недостатком сетевой модели является жесткость структуры и сложность ее организации.

Реляционная БД получила свое название от английского термина relation (отношение), предложена в 70-х годах сотрудником фирмы IВМ Эдгаром Коддом. Реляционная БД представляет собой совокупность таблиц, связанных отношениями. Достоинствами реляционной модели данных являются простота, гибкость структуры. Кроме того, ее удобно реализовать на компьютере. Большинство современных БД для персональных компьютеров являются реляционными.

Объектно-ориентированные БД объединяют сетевую и реляционную модели и используются для создания крупных БД с данными сложной структуры.


1.4Проблемы проектирования БД


Объединение программного обеспечения СУБД, прикладного программного обеспечения, реализованной базы данных, операционной системы (ОС) и аппаратных средств в одну систему для информационного обслуживания пользователей известно под названием система баз данных. Хотя технология применения СУБД, ОС и прикладных программ, хорошо известна, необходимо уделить внимание эффективному использованию этих средств с различными структурами баз данных. Так, главная проблема, стоящая перед администратором БД, заключается не в том, как использовать ее наиболее эффективно. Эта проблема может быть сформулирована в виде нескольких вопросов, возникающих в течение жизненного цикла приложения:

·Что представляют собой требования пользователей и в какой форме они могут быть выражены?

·Как эти требования могут быть преобразованы в эффективную структуру базы данных?

·Как часто и каким образом структура базы данных должна перестраиваться в соответствии с новыми и/или изменяющимися требованиями?

Процесс разработки структуры базы данных в соответствии с требованиями пользователей называется проектированием базы данных.

Достижение приемлемого для всех пользователей уровня эксплуатационных характеристик базы данных является сложной задачей. Проектировщик БД должен постоянно помнить о стоимости различных услуг, предоставляемых пользователем одной или нескольких интегрированных БД. Ожидаемая экономия памяти и широкое использование базы данных в деятельности организации должна сопровождаться критическим анализом потенциального снижения качества обслуживания некоторых пользователей. Этой невозможности необходимо избегать. Целью должно быть - приемлемые эксплуатационные характеристики для всех пользователей.

Другим аспектом функционирования БД является ее гибкость. БД, тесно привязанные к текущим приложениям, могут иметь слишком ограниченную сферу применения в других подобных организациях. Быстрое изменение требований и введение новых типов элементов данных могут иметь следствием повышение стоимости сопровождения программ, разложение временных файлов и сортировок, а также снижение производительности системы.


1.5Принцип работ БД в Delphi


Мощность Delphi при работе с базами данных основана на низкоуровневом ядре - процессоре баз данных Borland Database Engine (BDE). Его интерфейс с прикладными программами называется Integrated Database Application Programming Interface (IDAPI). В принципе, сейчас не различают эти два названия (BDE и IDAPI) и считают их синонимами. BDE позволяет осуществлять доступ к данным как с использованием традиционного record-ориентированного (навигационного) подхода, так и с использованием set-ориентированного подхода, используемого в SQL-серверах баз данных. Кроме BDE, Delphi позволяет осуществлять доступ к базам данных, используя технологию (и, соответственно, драйверы) Open DataBase Connectivity (ODBC) фирмы Microsoft. ODBC драйвера работают через специальный "ODBC socket", который позволяет встраивать их в BDE.

Все инструментальные средства баз данных Borland - Paradox, dBase, Database Desktop - используют BDE. Все особенности, имеющиеся в Paradox или dBase, наследуются BDE, и поэтому этими же особенностями обладает и Delphi. Библиотека объектов содержит набор визуальных компонент, значительно упрощающих разработку приложений для СУБД с архитектурой клиент-сервер. Объекты инкапсулируют в себя нижний уровень - Borland Database Engine.

Предусмотрены специальные наборы компонент, отвечающих за доступ к данным, и компонент, отображающих данные. Компоненты доступа к данным позволяют осуществлять соединения с БД, производить выборку, копирование данных, и т.п. Компоненты визуализации данных позволяют отображать данные виде таблиц, полей, списков. Отображаемые данные могут быть текстового, графического или произвольного формата.

Таблицы сохраняются в базе данных. Некоторые СУБД сохраняют базу данных в виде нескольких отдельных файлов, представляющих собой таблицы (в основном, все локальные СУБД), в то время как другие состоят из одного файла, который содержит в себе все таблицы и индексы (InterBase). Например, таблицы dBase и Paradox всегда сохраняются в отдельных файлах на диске. Директорий, содержащий dBase .DBF файлы или Paradox .DB файлы, рассматривается как база данных. Другими словами, любой директорий, содержащий файлы в формате Paradox или dBase, рассматривается Delphi как единая база данных. Для переключения на другую базу данных нужно просто переключиться на другой директорий. InterBase сохраняет все таблицы в одном файле, имеющем расширение .GDB, поэтому этот файл и есть база данных InterBase.

Объекты БД в Delphi основаны на SQL и включают в себя полную мощь Borland Database Engine. В состав Delphi также включен Borland SQL Link, поэтому доступ к СУБД Oracle, Sybase, Informix и InterBase происходит с высокой эффективностью. Кроме того, Delphi включает в себя локальный сервер Interbase для того, чтобы можно было разработать расширяемые на любые внешние SQL-сервера приложения в онлайновом режиме. Разработчик в среде Delphi, проектирующий информационную систему для локальной машины (к примеру, небольшую систему учета медицинских карточек для одного компьютера), может использовать для хранения информации файлы формата .dbf (как в dBase или Clipper) или .db (Paradox). Если же он будет использовать локальный InterBase (это локальный SQL-сервер, входящий в поставку), то его приложение безо всяких изменений будет работать и в составе большой системы с архитектурой клиент-сервер.

Масштабируемость на практике - это когда одно и то же приложение можно использовать как для локального, так и для более серьезного клиент-серверного вариантов.


1.6Инструментальные средства баз данных Borland


Database Desktop - это утилита, во многом похожая на Paradox, которая поставляется вместе с Delphi для интерактивной работы с таблицами различных форматов локальных баз данных - Paradox и dBase, а также SQL-серверных баз данных InterBase, Oracle, Informix, Sybase (с использованием SQL Links). Она позволяет создавать как структуру реляционных таблиц, так и всевозможные ограничения целостности таблиц, индексы, первичные ключи и внешние ключи. WISQL (Windows Interactive SQL) - интерактивное средство посылки SQL-запросов к InterBase (в том числе и локальному InterBase), входящее в поставку Delphi, позволяет создавать таблицы - через посылку SQL-запросов. Database Desktop не обладает всеми возможностями по управлению SQL-серверными базами данных. Поэтому с помощью Database Desktop удобно создавать или локальные базы данных, или только простейшие SQL-серверные базы данных, состоящие из небольшого числа таблиц, не очень сильно связанных друг с другом. Если же необходимо создать базу данных, состоящую из большого числа таблиц, имеющих сложные взаимосвязи, можно воспользоваться языком SQL. Можно записать всю последовательность SQL-предложений в один так называемый скрипт и послать его на выполнение. Конкретные реализации языка SQL незначительно отличаются в различных SQL-серверах, однако базовые предложения остаются одинаковыми для всех реализаций. Практика показывает, что если нет необходимости создавать таблицы во время выполнения программы, то лучше воспользоваться WISQL.

InterBase - это система управления реляционными базами данных, поставляемая корпорацией BORLAND для построения приложений с архитектурой клиент-сервер произвольного масштаба: от сетевой среды небольшой рабочей группы с сервером под управлением Novell NetWare или Windows NT на базе IBM PC до информационных систем крупного предприятия на базе серверов IBM, Hewlett-Packard, SUN и т.п. В пакет Delphi входит однопользовательская версия InterBase для Windows - Local InterBase. Используя Local InterBase можно создавать и отлаживать приложения, работающие с данными по схеме клиент-сервер, без подключения к настоящему серверу. В дальнейшем потребуется только перенастроить используемый псевдоним базы данных и программа будет работать с реальной базой без перекомпиляции. Кроме того, Local InterBase можно использовать в приложениях для работы с данными вместо таблиц Paradox.

Важной составной частью приложения является вывод данных на печать - получение отчета. В пакет Delphi входит средство для генерации и печати отчетов - ReportSmith. Вы можете объединить отчет с приложениями Delphi. Также, библиотека визуальных компонент Delphi включает специальный компонент TReport. В данном уроке показано, как использовать компоненту TRepor и рассмотрены основные принципы проектирования отчетов в ReportSmith.ReportSmith является инструментом для получения отчетов и интегрирован в среду Delphi. Отчет может быть добавлен к приложениям Delphi. Отчеты могут быть созданы для SQL БД или локальных БД и не требуют знания сложных команд БД. Интерфейс ReportSmith использует стандартные инструменты Windows типа tool bar, formatting ribbon, и "drag and drop". Если пользователь уже знаком с интерфейсом стандартных Windows-программ, типа Word for Windows, ему будет "знаком" и интерфейс ReportSmith. ReportSmith предлагает 4 типа отчетов: Табличный, Кросс-таблица(CrossTab), Форма(Form) и Наклейка(Label).использует концепцию "живых данных", т.е. работа происходит с настоящими данными все время, а не только тогда, когда запускается просмотр (preview). Кроме этого, ReportSmith легко работает с чрезвычайно большими БД при помощи адаптивной технологии управления памятью. В ReportSmith можно управлять тем, где сохраняется результат выборки данных из БД: в локальный памяти клиентской PC, на жестком диске клиентской PC, или на сервере.


1.7Архитектуры баз данных


Расположение БД в значительной степени влияет на разработку приложения, обрабатывающее данные, содержащиеся в этой базе. В зависимости от расположения таблиц и приложений, БД могут быть:

·Локальными

·Удаленными

Приложение Delphi осуществляет доступ к БД через ВDЕ (Borland Database Engine - Процессор баз данных фирмы Borland). BDE представляет собой набор драйверов, обеспечивающих доступ к данным. Система BDE должна устанавливаться на всех компьютерах, на которых работают с БД приложения Delphi.

Локальные БД расположены на том же компьютере, что и приложения, работающие с ними (рис.1.1). Работа с БД происходит, как правило, в однопользовательском режиме. При необходимости можно запустить на компьютере другое приложение, одновременно осуществляющее доступ к этим же данным.

Для управления совместным доступом к БД необходимы специальные средства контроля и защиты. Эти средства могут понадобиться, например, в том случае, когда приложение пытается изменить запись, которую редактирует другое приложение. Каждая БД любой модели осуществляет подобный контроль своими способами и обычно имеет встроенные средства разграничения доступа.


Рис.1.1. Локальная БД


При использовании локальной БД в сети возможна организация многопользовательского доступа к ней (рис. 1.2). В этом случае файлы БД и приложение, предназначенное для работы с этой БД, располагаются на сервере сети.


Рис. 1.2. Архитектура файл-сервер


Каждый пользователь может запускать приложение, находящееся на сервере, при этом на компьютере пользователя запускается копия приложения. Такой вариант использования локальной БД соответствует архитектуре файл-сервер. В принципе, приложение может быть записано и на все компьютеры сети, но тогда приложению, находящемуся на компьютере сети, должно быть известно, где расположена общая БД.

Когда пользователь сети работает с БД, на его компьютере появляется локальная копия общей БД. Эта копия периодически обновляется данными, содержащимися в БД, расположенной на сервере.

Архитектура файл-сервер обычно используется в таких сетях, где имеется немного компьютеров. Для ее реализации предназначены персональные СУБД, например, Paradox или dBase.

Достоинствами архитектуры файл-сервер являются простота реализации, а также то, что приложение фактически разрабатывается в расчете на одного пользователя, поэтому не зависит от компьютера сети, на который оно устанавливается. Однако архитектура файл-сервер имеет и существенные недостатки:

·Каждый пользователь работает со своей локальной копией БД, данные в которой обновляются при каждом запросе к какой-либо из таблиц. При этом с сервера пересылается новая копия всей таблицы, содержащей затребованные данные. Таким образом, даже если пользователю необходимо всего несколько записей таблицы, с сервера по сети будет переслана вся таблица. В результате циркуляции в сети больших объемов ненужной информации резко возрастает нагрузка на сеть, что приводит к значительному снижению ее быстродействия и производительности информационной системы в целом.

·Поскольку на каждом компьютере имеется своя копия БД, то изменения, сделанные в ней одним пользователем, в течение некоторого времени неизвестны другим пользователям. В связи с этим необходимо постоянное обновление БД. Кроме того, возникает необходимость синхронизации работы отдельных пользователей, связанная с блокировкой в таблицах тех записей, которые редактирует другой пользователь.

·Управление БД осуществляется с разных компьютеров, поэтому затруднена организация контроля доступа, соблюдения конфиденциальности и поддержания целостности БД.

Удаленная БД размещается на компьютере-сервере сети, а приложение, работающее с этой БД, находится на компьютере пользователя. В этом случае речь идет об архитектуре клиент-сервер (рис. 1.3). Информационная система состоит из неоднородных частей - сервер и клиент БД. Компьютер-сервер также называется удаленным сервером.


Рис. 1.3. Архитектура клиент-сервер


Клиент - это приложение пользователя, которое также называют приложением-клиентом. Для получения данных приложение-клиент формирует и отсылает запрос удаленному серверу, на котором размещена БД. Запрос формируется на языке SQL, который является стандартным средством доступа к серверу при использовании реляционных БД. После получения запроса удаленный сервер направляет его SQL-серверу (серверу баз данных). SQL-сервер - это программа, которая управляет удаленной БД и обеспечивает выполнение запроса и выдачу клиенту его результатов - требуемых данных. Вся обработка запроса выполняется на удаленном сервере. Достоинствами такой архитектуры являются:

·Низкая нагрузка на сеть, в которой циркулирует только нужная информация

·Безопасность информации, т. к. обработка запросов всех клиентов выполняется единой программой, расположенной на сервере. Сервер устанавливает общие для всех пользователей правила пользования БД, управляет режимами доступа клиентов к данным, запрещая одновременное изменение одной записи различными пользователями

·В клиентских приложениях отсутствует код, обеспечивающий управление базой данных и разграничением доступа к ней

Для реализации архитектуры клиент-сервер обычно применяются многопользовательские СУБД, например, Oracle или Microsoft SQL Server. Подобные СУБД также называют промышленными, так как они позволяют организовать информационную систему, состоящую из большого числа пользователей. Доступ к этим СУБД осуществляется с помощью драйверов SQL-Links.


1.8Таблицы баз данных


Реляционная БД состоит из взаимосвязанных таблиц. Обычно таблицы, образующие БД, находятся в каталоге на жестком диске. Таблицы хранятся в файлах. Они похожи на отдельные документы или электронные таблицы, их можно перемешать и копировать обычным способом, например, с помощью проводника Windows. Однако, в отличие от документов, таблицы БД поддерживают многопользовательский режим доступа, т. е. с ними одновременно могут работать несколько приложений.

Для одной таблицы создается несколько файлов, содержащих данные, индексы, ключи и т. п. Имя главного файла таблицы (файла, содержащего данные) - оно же является именем таблицы - задается при создании таблицы. Имена остальных файлов таблицы назначаются автоматически, причем имена всех этих файлов совпадают с именем таблицы, за исключением расширений имен - разные расширения указывают на содержимое соответствующего файла.

Каждая таблица БД, состоящая из строк и столбцов, предназначена для хранения информации об однотипных объектах системы. Строка таблицы называется записью, а столбец таблицы - полем (рис.1.4). Каждое поле должно иметь уникальное в пределах таблицы имя. Поле содержит данные одного из допустимых типов, например, целочисленного или типа даты. Когда пользователь вводит значение в поле таблицы, автоматически производится проверка соответствия типа значения и типа поля, и в том случае, если преобразование типа невозможно, генерируется исключительная ситуация. Особенности организации таблиц зависят от конкретной СУБД, используемой для создания и ведения БД.


Рис. 1.4. Таблица БД


В таблицах могут определяться ключи и индексы. Ключ - это комбинация полей, данные в которых однозначно определяют каждую запись в таблице. Простой ключ состоит из одного поля, а сложный (составной) - из нескольких полей. Поля, по которым построен ключ, называются ключевыми. Ключ служит для однозначной идентификации записей таблицы, а также для предотвращения повторения значений ключа. При этом значения отдельных полей составного ключа (но не всех одновременно) могут повторяться.

Индекс, как и ключ, строится по полям таблицы, однако он может допускать повторение значений составляющих его полей. Поля, по которым построен индекс, называют индексными. Индексы именуются при их создании. Индекс служит для сортировки таблиц по индексным полям. Кроме того, при использовании индексирования повышается скорость поиска данных в таблице. Индекс представляет собой своеобразное оглавление таблицы, просмотр которого выполняется перед обращением к записям таблицы. В некоторых СУБД, например, dBase и Paradox, индексы хранятся в специальных файлах.

Ключевые поля в СУБД обычно автоматически индексируются. В таблицах Paradox ключ также является главным (первичным) индексом, который не именуется. Для таблиц dBase ключ не создается и его роль выполняет один из индексов.

Таким образом, использование ключей и индексов позволяет:

·Однозначно идентифицировать записи

·Избегать дублирования значений в ключевых полях

·Выполнять сортировку таблиц

·Ускорять операции поиска в таблицах

·Устанавливать связи между отдельными таблицами БД

Delphi не имеет своего формата таблиц, однако поддерживает два вида локальных таблиц - а dBase и Paradox. Каждый из этих видов таблиц имеет свои особенности.

Таблицы dBase являются одним из первых форматов таблиц для персональных компьютеров и поддерживаются многими системами, предназначенными для разработки и обслуживания приложений, работающих с БД. Основные достоинства таблиц dBase:

·Простота использования

·Совместимость со многими приложениями

В табл. 1.1 приведен список типов полей таблиц dBase IV. Для каждого типа указан символ, используемый для обозначения этого типа в программе Database Desktop (создания и редактирования таблиц, SQL-запросов и запросов QBE), а также описание значений, которые может содержать поле рассматриваемого типа.

Таблицы dBase достаточно просты. Для их хранения на дисках требуется немного физических файлов. Имена этих файлов имеют следующие расширения:

·DBF - таблица с данными

·DBT - данные двоичных объектов, занимающие большой объем памяти -данные (Binary Large Object, - BLOD). К ним относятся двоичные, Memo- или OLE-поля

·MDX - поддерживаемые индексы

·NDX - индексы, не поддерживаемые форматом dBase непосредственно. При использовании этих индексов программист должен обрабатывать их самостоятельно.


Таблица 1.1

Типы полей таблиц dBase IV

ТипОбозначениеОписание значенияCharacterCСтрока символов. Длина не более 255 символовFloatFЧисло с плавающей точкой. Диапазон -10308 -10308 Точность 15NumberNDateDДатаLogicalLЛогическое значение. Допустимы значения T и Y (Истина), F и N (Ложь). Разрешается использование прописных буквMemoMСтрока символов. Длина не ограничена. Символы хранятся в файле с расширением DBTOLEOДанные в формате, который поддерживается технологией OLE. Данные хранятся в файле с расширением ОВТBinaryBПоследовательность байтов. Длина не ограничена. Байты содержат произвольное двоичное значение. Хранятся в файле с расширением ОВТ

Имя поля в таблице dBase должно состоять из букв и цифр и начинаться с буквы, причем его длина не должна превышать 10 символов. В имени нельзя использовать специальные символы, в том числе и пробел.

К недостаткам таблиц dBase относится то, что они не поддерживают автоматическое использование зашиты с помощью пароля и контроль целостности связей, поэтому, если требуется, программист должен кодировать эти действия самостоятельно.

Таблицы Paradox являются достаточно развитыми и удобными при создании БД. Основные достоинства таблиц Paradox:

·Имеется много различных типов полей для представления данных

·Поддерживается целостность данных

·Возможность организации проверки вводимых данных

·Поддерживается защита таблиц с помощью паролей

Поскольку предоставляется широкий выбор типов полей, можно точнее представлять данные, хранимые в БД. Например, для представления числовой информации можно использовать один из пяти числовых типов. В табл. 1.2 представлен список типов полей таблиц Paradox 7. Для каждого типа приводится символ, используемый для обозначения этого типа в программе Database Desktop, а также описание значений, которые может содержать поле рассматриваемого типа.


Таблица 1.2

Типы полей таблиц Paradox 7

ТипОбозначениеОписание значенияAlphaAСтрока символов. Длина не более 255 символовNumberNЧисло с плавающей точкой. Диапазон -10307 -10308 Точность 15 цифр мантиссыMoney$Денежная сумма. Отличается от типа Number тем, что в значении отображается денежный знак. Обозначение денежного знака зависит от установок WindowsShortSЦелое число. Диапазон -32 768 - 32 767LongIntegerIЦелое число. Диапазон -2 147 483 648 - 2 147 483 647DateDДата. Диапазон 01.01.9999 до н.э.- 31.12.9999LogicalLЛогическое значение. Допустимы значения T (Истина), F (Ложь). Разрешается использование прописных буквMemoMСтрока символов. Длина не ограничена. Первые 240 символов хранятся в файле таблицы, остальные в файле с расширением МВOLEOДанные в формате, который поддерживается технологией OLE. Данные хранятся в файле с расширением MBBinaryBПоследовательность байтов. Длина не ограничена. Первые 240 байт хранятся в файле таблицы, остальные в файле с расширением МВFormsttedMemoFСтрока символов. Отличается от типа Мето тем, что строка может содержать форматированный текстGraphicGГрафическое изображение. Форматы ВМР, РСХ, ТIF, GIF и EPS. Для хранения изображения используется файл с расширением МВAutoincrement+Автоинкрементное поле. При добавлении к таблице новой записи в поле автоматически заносится уникальное значение. Значение такого поля доступно для чтения и обычно используется в качестве ключевого.BytesYПоследовательность байтов. Длина не более 255 байт

Имя поля в таблице Paradox должно состоять из букв (в том числе из букв кириллицы) и цифр и начинаться с буквы. Максимальная длина имени составляет 25 символов. В имени можно использовать такие символы, как "пробел", "#", "$" и некоторые другие. Не рекомендуется применять в имени символы ".","!" и "|", так как они зарезервированы в Delphi для других целей.

Ключевые поля должны быть первыми в структуре таблицы. При поддержке целостности данных обеспечивается правильность ссылок между таблицами. Например, если в БД имеются таблицы клиентов и сделанных ими заказов, эти таблицы могут быть связаны следующим образом: каждая запись таблицы заказов ссылается через специальное индексное поле на запись в таблице клиентов, которая соответствует клиенту, сделавшему заказ. Если в таблице клиентов любым способом удалить запись с информацией о каком-либо клиенте, то BDE автоматически удалит в таблице заказов все записи этого клиента. Подобное удаление взаимосвязанных записей называется каскадным.

Для полей можно определить специальный диапазон, в котором должны находиться значения, вводимые в эти поля, а также определить минимально и максимально допустимое значение. При попытке ввода в поле значения, выходящего за границы допустимого диапазона, возникнет исключительная ситуация, значение не будет введено и содержимое поля не изменится. Кроме диапазона допустимых значений, для каждого поля можно задать значение по умолчанию, которое автоматически заносится в поле при добавлении к таблице новой записи.

При работе с конфиденциальной информацией может потребоваться защита таблиц и их полей. Для каждой таблицы Paradox можно указать основной пароль, который используется при изменениях во всей таблице, связанных со сменой структуры таблицы или с редактированием данных в любом поле. При наличии паролей они автоматически запрашиваются и контролируются при попытке доступа к таблице.

Недостатком таблиц Paradox является наличие относительного большого количества файлов, требуемых для хранения данных, содержащихся в таблице. При копировании или перемещении какой-либо таблицы из одного каталога в другой необходимо обеспечить копирование или перемещение всех файлов, относящихся к этой таблице. Файлы таблиц имеют следующие расширения:

·DB - таблица с данными

·MB - BLOB-данные

·PX - главный индекс (ключ)

·XG? и YG? - вторичные индексы

·VAL - параметры для проверки данных и целостности ссылок

·TV и FAM - форматы вывода таблицы в программе Database Desktop


2. НАВИГАЦИОННЫЙ СПОСОБ ДОСТУПА К БАЗАМ ДАННЫХ


Достоинство навигационного способа доступа к базе данных - простота кодирования операций с набором данных. Его основной недостаток состоит в том, что если требуется обработать только одну запись, все равно приложение получает все записи набора данных. Это приводит к большой нагрузке на сеть, особенно при интенсивном обмене данными. Поэтому применение навигационного способа доступа обычно ограничивается локальными БД.

В этом разделе рассматриваются основные операции, применяемые в локальных БД, которые также можно использовать в небольших сетях для организации работы с удаленными БД. Для операций с таблицами используются наборы данных Table и Query. С помощью структурированного языка запросов (SQL) и набора данных Query можно реализовать реляционный доступ к БД (см. раздел «Реляционный способ доступа к базе данных»).

При отсутствии каких-либо ограничений для работы с локальными БД лучше использовать набор данных Table, т. к. операции с его записями выполняются несколько быстрее, чем для записей набора данных Query, а для доступа к удаленным БД - набор данных Query, поскольку он позволяет реализовать реляционный доступ к данным, уменьшающий число передаваемых по сети записей.

При навигационном способе доступа операции выполняются с отдельными записями. Каждый набор данных имеет невидимый указатель текущей записи. Этот указатель определяет запись, поля которой можно редактировать и удалять. Компоненты Table и Query позволяют управлять положением указателя текущей записи.

При использовании навигационного способа доступа к набору данных возможны следующие операции:

·Сортировка записей

·Перемещение по набору данных

·Редактирование записей

·Вставка и удаление записей

·Фильтрация записей

Отметим, что аналогичные операции применимы к набору данных и при реляционном доступе к БД, реализуемом с помощью SQL-запроса.


2.1 Операции с таблицей БД


Кроме действий с отдельными записями, с помощью компонента Table можно выполнять также действия с таблицей БД, например, создавать, удалять или переименовывать таблицы, устанавливать режимы доступа к ним.

Создание, удаление и переименование. Обычно таблицы создаются на этапе разработки приложения с помощью соответствующих программ (например, Database Desktop). Удаление таблицы также выполняется при разработке приложения, например, с помощью проводника Windows. Используя инструментальные средства, можно создавать и удалять таблицы, а также изменять их структуру. Программист может создать или удалить таблицу динамически в процессе выполнения приложения, например, при создании резервной или архивной копии всей таблицы пли ее части.

Для создания таблицы используется метод CreateTable. В результате на диске появится пустая таблица. Перед вызовом метода нужно подготовить необходимые данные, на основании которых выполняется создание таблицы. Эти данные следует присвоить в качестве значений соответствующим свойствам набора данных. Перед вызовом метода CreateTable набор данных должен быть закрыт и установлены значения следующих свойств:

·DatabaseName - расположение БД (псевдоним)

·TableName - название таблицы

·TableType - тип таблицы

·FieldDefs - описание полей

·IndexDefs - описание индексов

TableName задает имя файла таблицы, который будет находиться в каталоге, указанном для размещения БД (свойство DatabaseName).

Формат таблицы TableName типа TTableName может быть следующим:

·ttDefault - формат таблицы (по умолчанию) определяется на основании следующих расширений имен файлов таблиц:

oDB - Paradox

oDBF - dBase

oТХТ - ASCII

·ttParadox - Paradox

·ttDBase - dBASE

·ttFoxPro - FoxPro

·ttASCII - ASCII (файл, содержащий текст, который разбит на колонки)

Для новой таблицы в свойстве FieldDefs типа TFieldDefs обязательно должно быть определено хотя бы одно поле. Перед описанием полей таблицы значение этого свойства следует очистить (удалить предыдущее значение), т. к. в нем может находиться информация о полях предыдущей таблицы, с которой был связан набор данных. Для очистки значения свойства можно применить метод Clear, для занесения информации о полях новой таблицы - метод Add.

Процедура Add (const Name: String; DateType: TFieldType; Size: Word; Required: Boolean) добавляет к массиву полей описание нового поля. Параметр Name указывает название нового поля, а DateType - тип поля, который можно выбирать из следующего списка: ftUnknown, ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat… В перечисленных значениях префикс ft указывает. что значение относится к типу поля (Field Type), а последующая часть значения определяет сам тип.

Параметр Size определяет размер поля. Если для полей некоторых типов, например, поля даты (ftDate), размер не задается, то параметр Size принимает нулевое значение. Логический параметр Required определяет, должно ли поле содержать значение (True) или может быть пустым (False).

В таблице можно определить индексы, описание которых заносится в свойство IndexDefs типа TIndexDefs. После предварительной очистки значения этого свойства методом Clear данные об индексах заносятся методом Add. После создания таблицы для нее можно создать индекс или удалить его с помощью методов AddIndex и DeleteIndex.

Для удаления таблицы используется метод DeleteTable, в результате выполнения которого происходит физическое удаление всех файлов указанной таблицы БД. Путь и имя удаляемой таблицы определяют свойства DatabaseName и TableName набора данных. Перед удалением таблицы набор данных должен быть закрыт.

Для переименования таблиц dBase и Paradox можно использовать метод RenameTable (const NewTableName: String), при выполнении которого переименовываются все файлы, относящиеся к таблице. Параметр NewTableName задает новое название таблицы. Напомним, что имя таблицы совпадает с названиями файлов, за исключением расширения имени файла, которое отражает содержимое файла (например, файл содержит данные или индексы).

Установка уровня доступа. В случае многопользовательского доступа к БД для таблицы можно установить уровни доступа, которые будут действовать для других приложений. Уровень доступа определяет возможность записи данных в таблицу и их чтения.

Метод LockTable (LockTepy: TLockТуре) устанавливает блокировку для таблицы, параметр LоскТуре задает тип блокировки:

·ltReadLock - запрещены запись в таблицу и чтение ее; этот режим является своего рода режимом монопольного доступа

·ltWriteLock - запрещена запись в таблицу; другие приложения не могут выполнять модификацию таблицы, но чтение данных разрешено

Метод UpLockTable (LockType: TLockТуре) снимает установленную ранее блокировку.


2.2 Сортировка набора данных

база данных delphi фильтрация

Порядок расположения записей в наборе данных может быть неопределенным. По умолчанию записи не отсортированы или сортируются, например, для таблиц Paradox по ключевым полям, а для таблиц dBase в порядке их поступления в файл таблицы.

Для удобной работы с набором данных его записи можно отсортировать. Сортировка - это упорядочение записей по определенному полю в порядке возрастания или убывания значений, содержащихся в этом поле. Сортировать можно по нескольким полям. Например, при сортировке по двум полям записи сначала упорядочиваются в соответствии со значениями первого поля, а группы записей, имеющих одинаковое значение первого поля, сортируются по второму полю.

Сортировка наборов данных Table и Query выполняется различными способами. Рассмотрим сортировку набора данных Table. Для компонента Query вопросы сортировки рассмотрены в пункте «Реляционный способ доступа к базе данных».

Сортировка наборов данных Table выполняется автоматически по текущему индексу. При смене индекса происходит автоматическое переупорядочение записей. Таким образом, сортировка возможна по полям, для которых создан индекс. Для сортировки по нескольким полям нужно создать индекс, включающий эти поля.

Направление сортировки определяет признак ixDescending текущего индекса. По умолчанию он выключен, поэтому упорядочение происходит в порядке возрастания значений. Если для индекса установлен признак ixDescending, то сортировка выполняется в порядке убывания значений.

Задать индекс, по которому будут сортироваться записи, можно с помощью установки значений свойств IndexName или IndexFieldNames. В качестве значения свойства IndexName указывается имя индекса, которое определяется при создании таблицы. При использовании свойства IndexFieldNames указывается имена полей, образующих соответствующий индекс.


2.3 Перемещение по набору данных


Перемещение по набору данных заключается в управлении указателем текущей записи (курсором). Этот указатель определяет запись, с которой будут выполняться такие операции, как редактирование или удаление.

Перемещение по записям. Перед перемещением указателя текущей записи набор данных автоматически переводится в режим просмотра. Если текущая запись находилась в режиме редактирования или вставки, то перед перемещением указателя сделанные в записи изменения вступают в силу. Для этого автоматически вызывается метод CheckBrowseMode набора данных.

Для перемещения указателя текущей записи в наборе данных используются:

·Процедура First - первая запись

·Процедура Next - следующая запись (при вызове метода Next для последней записи указатель не перемещается)

·Процедура Last - последняя запись

·Процедура Prior - предыдущая запись (при вызове метода Prior для первой записи указатель не перемещается)

·Функция MoveBy (Distance: Integer): Integer - перемещает указатель на число записей, определяемое параметром Distance. Если его значение больше нуля, то происходит перемещение вперед, если меньше нуля - назад. При нулевом значении параметра указатель не перемещается. В качестве результата возвращается число записей, на которое переместился указатель.

При перемещении указателя текущей записи учитываются ограничения и фильтр, определенные для набора данных. Таким образом, перемещение выполняется по записям набора данных, которые он содержит в текущий момент времени. Число записей определяется свойством RecordCount.

Значения указателя текущей записи изменяют также методы, связанные с поиском записей, например, метод FindFirst.

Для контроля за положением указателя текущей записи можно использовать свойство RecNo, которое содержит номер записи, начиная от начала набора данных (для локальных таблиц dBase и Paradox).

Для таблиц Paradox свойство RecNo также можно использовать с целью перехода к записи с известным номером, такой переход выполняется установкой свойству RecNo значения, равного номеру нужной записи.

Для определения начала и конца набора данных при перемещении указателя текущей записи можно использовать свойства BOF и EOF типа Воо1eаn. Эти свойства доступны для чтения при выполнении приложения. Свойство BOF показывает, находится ли указатель на первой записи набора данных. Этому свойству устанавливается значение True при размещении указателя на первой записи, например, сразу после вызова метода First. Свойство EOF показывает, находится ли указатель на последней записи набора данных. Этому свойству устанавливается значение Ture, когда указатель находится на последней записи.


.4 Фильтрация записей


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

·По выражению

·По диапазону

По умолчанию фильтрация записей не ведется и набор данных Table содержит все записи связанной с ним таблицы БД, а набор данных Query составляют все записи, удовлетворяющие SQL-запросу, содержащемуся в свойстве SQL.

Фильтрация похожа на SQL-запросы, однако не настолько мощное средство. По сравнению с SQL-запросами фильтрация менее эффективна, т.к. ограничивается количество записей, видимых в наборе.

Фильтрация по выражению. При использовании фильтрации по выражению набор данных ограничивается записями, удовлетворяющими фильтру, задающему условия отбора записей.

Достоинство фильтрации по выражению состоит в том, что она применима к любым полям, в том числе к неиндексированным. Поскольку в процессе отбора просматриваются все записи таблицы, фильтрация по выражению эффективна при небольшом количестве записей.

Для определения выражения фильтра используется свойство Filter типа String. Выражение фильтра представляет собой конструкцию, в состав которой могут входить следующие элементы:

·Имена полей таблиц

·Литералы

·Операции сравнения

·Арифметические операции

·Логические операции

·Круглые и квадратные скобки

Если имя поля содержит пробелы, то его заключают в квадратные скобки, в противном случае квадратные скобки необязательны.

Литерал представляет собой значение, заданное явно ( например, число, строка или символ).

В качестве логических операций можно использовать and, or и not .

Для активизации и деактивизации фильтра используется свойство Filtered типа Воо1еап. По умолчанию это свойство имеет значение false, т.е. фильтрации не происходит.

Фильтрация по диапазону. При фильтрации по диапазону в набор данных будут включены те записи, значения полей которых соответствуют заданному диапазону. Таким образом, условием фильтрации является выражение вида значение > нижней границы AND значение < верхней границы, в котором вместо операций сравнения < и > могут указываться операции <= и >=. Такая фильтрация применяется к наборам данных Table.

Достоинством указанного способа фильтрации является скорость обработки записей. В отличие от способа фильтрации по выражению, когда последовательно просматриваются все записи таблицы, фильтрация происходит с использованием индексов индексно-последовательным методом. Однако этот способ фильтрации можно применять только для индексированных полей. Индекс поля, диапазон которого действует для отбора записей, должен быть установлен как текущий индекс с помощью свойства IndexName или IndexFieldNames. Если текущий индекс не установлен, то по умолчанию используется главный индекс.

Для включения и выключения фильтрации по диапазону применяются методы ApplyRange и CancelRange. Первый активизирует фильтр, а второй -деактивизирует. Предварительно для индексного поля (полей), по которому выполняется фильтрация, следует задать диапазон допустимых значении.

Методы SetRangeStart и SetRangeEnd устанавливают границы диапазона. Эти процедуры не имеют параметров, поэтому нужно использовать оператор присваивания.

Таким образом, методы SetRangeStart и SetRangeEnd переводят набор данных в режим dsSetKey, а с помощью оператора присваивания задается диапазон.

Для изменения границ диапазона предназначены методы EditRangeStart и EditRangeEnd, действие которых аналогично действию методов SetRangeStart и SetRangeEnd.

Совместно с этими методами используется свойство KeyExclusive типа Boolean, которое определяет, как учитывать заданное граничное значение при анализе записей. Если свойство KeyExclusive имеет значение False (по умолчанию), то записи c значением поля, по которому выполняется фильтрация, равным границе диапазона, включаются в состав набора данных. Если свойство имеет значение True, то записи с названным значением поля в набор данных не включаются.

Для отмены фильтрации, выполненной с помощью методов ApplyRange или SetRange, используется метод CancelRange. Другой вариант отмены предыдущей фильтрации - задание новых границ диапазона, например, методами SetRangeStart и SetRangeEnd.


2.5 Поиск записей


Поиск записи, удовлетворяющей определенным условиям, означает переход на данную запись. Поиск во многом похож на фильтрацию, в процессе поиска также выполняется проверка полей записей. Отличие заключается в том, что в результате поиска количество записей набора данных не изменяется, а осуществляется переход на найденную запись.

При организации поиска записей важное значение имеет наличие индекса для полей, по которым ведется поиск. При использовании индексов значительно повышается скорость обработки данных. Кроме того, ряд методов может работать только с индексированными полями.

Рассмотрим средства, с помощью которых выполняется поиск записей в наборах данных Table и Query. Отметим, что к средствам поиска можно отнести также методы FindFirst, FindLast, FindNext и FindPrior - Переход на записи, удовлетворяющие условиям фильтра.

Поиск в наборах данных. Для поиска записей по полям в Delphi служат методы Locate и LookUp. Поля могут быть не индексированными.

Функция Locate (Const KeyFields: String; const KeyValues: Variant; Options: TLocateOption): Boolean ищет записи, содержащие заданные поля. Если записи, удовлетворяющие условиям поиска, существуют, то указатель текущей записи устанавливается на первую из них. Когда запись найдена, функция возвращает значение True, в противном случае - значение False.

KeyFields - список полей, по которым ведется поиск.

KeyValues - указывает значения полей для поиска.

Options - позволяет задать значения, которые обычно используются при поиске строк.

Метод LookUp, работает так же, как метод Locate. Функция LookUp (Const KeyFields: String; const KeyValues: Variant; const ResultField: String): Variant осуществляет поиск записи, удовлетворяющей определенным условиям, но, в отличие от метода Locate, не перемещает указатель текущей записи на найденную запись, а считывает информацию из полей записи. Еще одно отличие между этими двумя методами заключается в том, что метод LookUp осуществляет поиск, причем значения в полях записей (с учетом регистра) должны точно соответствовать значениям, заданным для поиска.

Параметры KeyFields и KeyValues имеют такое же назначение, как и в методе Locate, и используются аналогичным образом при поиске по одному или нескольким полям.

Для параметра ResultField через точку с запятой перечисляются названия полей, значения которых будут получены в случае успешного поиска.

Поиск по индексным полям. Для набора данных Table существуют методы, позволяющие вести поиск записей только по индексным полям. Перед вызовом любого из этих методов следует установить в качестве текущего индекс, построенный по полям, используемым для поиска. Методы поиска можно разделить на две группы, в первую из которых входят методы FindKey, SetKey, EditKey и GotoKey, предназначенные для поиска на точное соответствие, а другую группу - методы FindNearest, SetNearest, EditNearest И GotoNearest, допускающие частичное совпадение заданных для поиска значений и значений полей записей.

Метод FindKey (const KeyValues: array of const): Boolean выполняет поиск в наборе данных Table той записи, значения полей которой совпадают со значениями, указанными параметром KeyValues. Список полей для поиска не задается, а используются индексные поля в соответствии с текущим индексом. Если поиск завершился успешно, то найденная запись становится текущей, а метод возвращает значение True. При неудачном поиске указатель текущей записи не перемещается, а результатом метода будет значение False.

Если заданным условиям поиска соответствует несколько записей, то указатель текущей записи устанавливается на первую из них. Порядок сортировки и, соответственно, порядок расположения записей в наборе данных определяется текущим индексом, по которому и ведется поиск.

Вместо метода FindKey можно использовать методы SetKey, EditKey и GotoKey, которые применяются совместно. Их использование похоже на использование уже рассмотренных методов SetRangeStart, EditRangeStart и ApplyRange для фильтрации набора данных по диапазону значений.

Метод SetKey переводит набор данных в режим dsSetKey поиска записи. Этот метод вызывается один раз для текущего индекса. Впоследствии для перехода в режим поиска можно вызывать метод EditKey. Если набор данных находится в режиме поиска, значения полей устанавливаются с помощью операторов присваивания. Метод GotoKey: Boolean выполняет собственно поиск записи, удовлетворяющей заданному условию.

Метод FindNearest, в отличие от метода FindKey, производит поиск значений полей записей набора данных Table, которые частично совпадают со значениями, заданными для поиска. Частичное совпадение допускается для начала значения поля записи. Такой поиск можно применять к строкам и к данным другого типа, например, целочисленного. Поиск с помощью процедуры FindNearest (const KeyValues: array of const) Всегда является успешным и перемешает указатель текущей записи на запись, в наибольшей степени отвечающую условиям поиска.

Вместо метода FindNearest можно использовать комбинацию методов SetNearest, EditNearest И GotoNearest, работа с которыми аналогична работе с соответствующими методами поиска, требующими точного соответствия значений полей и значений, заданных для поиска.


2.6 Модификация набора данных


Модификация набора данных - это редактирование, добавление и удаление его записей. Отметим, что фильтрация не приводит к изменению набора данных, в результате фильтрации только изменяется количество записей, видимых в наборе данных.

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

Управлять изменением набора данных Table можно с помощью свойства ReadOnly типа Boolean, при установке которому значения True изменения записей запрещены. По умолчанию свойство ReadOnly имеет значение False, т. е. набор данных можно модифицировать.

Значение свойства ReadOnly можно изменять только для закрытого набора данных. В отличие от многих управляющих элементов, например, редакторов Edit и Memo, запрет редактирования относится к визуальному (пользователем) и программному изменению записей набора данных.

Возможность модификации набора данных Query определяет свойство RequestLive типа Boolean. По умолчанию это свойство имеет значение False, т. е. набор данных Query доступен только для чтения. Для получения возможности редактирования записей свойству RequestLive нужно установить значение True. Кроме этого свойства, возможность изменения набора данных Query зависит также от содержания SQL-запроса. Например, если в результате запроса отбираются записи из нескольких таблиц, то набор данных нельзя модифицировать, и значение True свойства RequestLive не учитывается.

Для проверки возможности изменения набора данных предназначено свойство CanModify типа Boolean, действующее при выполнении приложения и доступное только для чтения. Если свойство CanModify имеет значениеTrue, то набор данных можно изменять, редактируя, вставляя записи, а также удаляя их. Если свойство CanModify имеет значение False, то набор данных изменять нельзя и попытка сделать это визуально или программно вызывает исключительную ситуацию.

Редактирование записей. Редактирование записей заключается в изменении значений их полей. Отредактирована может быть только текущая запись, поэтому перед действиями, связанными с редактированием, обычно выполняются операции по поиску и перемещению на требуемую запись. После того как указатель текущей записи установлен на нужную запись и набор данных находится в режиме просмотра, для редактирования записи следует:

·Перевести набор данных в режим редактирования

·Изменить значения полей записи

·Подтвердить сделанные изменения или отказаться от них, в результате чего набор данных снова переходит в режим просмотра

Если набор данных является модифицируемым, и исключительная ситуация не возбуждается.

После перевода набора данных в режим редактирования можно изменять значения полей текущей записи с помощью операторов присваивания. При этом нужно учитывать тип поля, при необходимости выполняя преобразования типов значений.

Для проверки, вносились ли изменения в запись, можно проанализировать свойство Modifid типа Boolean. Если свойство имеет значение True, то было изменено значение, как минимум, одного поля текущей записи.

После ввода информации сделанные изменения должны быть или подтверждены, или отменены.

Метод Post записывает модифицированную запись в таблицу БД, снимает блокировку записи и переводит набор данных в режим просмотра. Если набор данных не находился в режиме редактирования, то вызов метода Post приведет к генерации исключительной ситуации.

Добавление записей. Добавлять записи можно только к модифицируемому набору данных, в противном случае при попытке выполнить операции, связанные с изменением набора данных возникает исключительная ситуация.

Для добавления записи нужно выполнить следующие действия:

·Перевод набора данных в режим вставки

·Задание значений полей новой записи

·Подтверждение сделанных изменений или отказ от них, в результате на бор данных переходит в режим просмотра

Для добавления записей используются методы Insert, InsertRecord, Append и AppendRecord.

Метод Insert переводит набор данных в режим вставки и добавляет к нему новую пустую запись. Новая запись добавляется в позицию, на которой находится указатель текущей записи. При необходимости перед вызовом метода Insert следует переместить текущий указатель в требуемую позицию набора данных.

Метод InsertRecord выполняет те же действия, что и методы Insert и SetFields. Процедура InsertRecord (const Values: array of const) вставляет в позицию указателя текущей записи новую запись, задавая значения всех или некоторых ее полей.

Методы Append и AppendRecord отличаются от методов Insert и InsertRecord тем, что вставляют запись в конец набора данных, а не в текущую позицию указателя.

Удаление записей. Удаление текущей записи выполняет метод Delete, который работает только с модифицируемым набором данных. В случае успешного удаления, текущей становится следующая запись, если же удалялась последняя запись, то курсор перемещается на предыдущую запись, которая после удаления становится последней. В отличие от некоторых СУБД, в Delphi удаляемая запись действительно удаляется из набора данных.

Обычно метод Delete вызывается для удаления просматриваемой записи, однако он удаляет и редактируемую запись. Таким образом, метод Delete удаляет текущую запись набора данных, который находится в режимах просмотра или редактирования. Если набор данных находится в режиме вставки или поиска, то вызов метода Delete аналогичен вызову метода Cancel, отменяя вставку или поиск записи.

При вызове метода Delete в цикле перебора нескольких последовательно расположенных удаляемых записей не нужно вызывать методы, перемещающие указатель текущей записи. После удаления текущей записи указатель автоматически устанавливается на следующую запись.


3. ОПИСАНИЕ ПРИЛОЖЕНИЯ


В данном разделе будет приведено описание форм и модулей приложения.


3.1 Файл проекта


При входе в программу первым запускается файл проекта, который был изменен для добавления дополнительных функций. Пароль для входа - " zybr".

В данный файл сначала подключены дополнительные модули dialogs, controls, sysUtils для работы с типизированными файлами, диалогами… До создания какой либо формы проверяется пароль методом функции inputQuery (рис. 3.1.), которая присваивает параметру Pas значение введённое в окне диалога.


Рис. 3.1. Диалог inputQuery


Если пароль подтвердился, то дальше создаются формы. В противном случае приложение закрывается. Первой создается форма fZastavka (Рис. 3.2) которая тут же выводится на экран и обновляется. После чего таймеру присваивается значение FALSE и форма уничтожается.


3.2 Форма заставки


На форму помещен элемент Timer1 с установленным значением Interval = 1000 (1 сек). После срабатывания таймера его свойству ENABLED:=False, что и приводит к закрытию формы и после удалению.


Рис. 3.2. Форма заставки


3.3 Основная форма


Данная форма является главной в программе, т.к. программа предназначена для сортировки, просмотра и создания базы данных абсолютно любых файлов компьютера.

Для просмотра (открытия) какого-нибудь файла необходимо указать путь и щелкнуть дважды по его имени в окне проводника.

Для копирования (перемещения) файла необходима указать папку куда будет скопирован (перемещен) данный файл и зажав кнопку мыши перетащить в соседнее окно (так же можно воспользоваться кнопками на форме). Предварительно указав действие (Копировать или перемещать), нажав кнопку в панели управления соответствующие команде.


Рис. 3.3. Основная форма программы


Также можно форме установить свойство «Всегда наверху», установив галочку на панели инструментов.

В пункте «ФАЙЛ» можно выбрать пункт открыть базу, что приведёт к открытию формы базы (Более детально она будет рассмотрена ниже).

Кнопка «Удалить»- удаляет файл с компьютера.

Также в системном меню есть пункт, не имеющий названия, в нем расположены подпункты выключения, перезагрузки компьютера и смены пользователя.

При выборе файла и нажатии кнопки «Добавить файл» будет открыта форма добавления записи в базу данных (Будет рассмотрена ниже).

Также на форме предусмотрено отображение подсказок в панели состояния и там же отображается некоторая системная информация.

Т.к. проект предназначен только для ознакомления с основными возможностями среды DELPHI, то код нижнего окна не писался с целью экономии времени и бумаги).

3.4 Форма вставки новых записей


Данная форма (Рис. 3.5) предназначена для добавления выдранного файла, с указанием необходимой информации, в базу данных. Возможно так же редактирование дополнительной базы «Раздел», хранящую информацию о типе файла (пр. Матан, художественная…). Для добавления книги необходимо ввести обязательную информацию, иначе будет показано предупреждение(рис. 3.4). Поле «Адрес», о выбранном файле, заполняется автоматически. После добавления форма закрывается.


Рис. 3.4. Предупреждение


Рис. 3.5. Форма вставки записи


3.5 Форма добавления разделов


Данная форма предназначена для редактирования разделов, т.е. дополнительной информации о книге. Информация о разделах сохраняется в отдельной базе - Raz.DB, Находящейся в папке с программой.


Рис. 3.6. Форма редактирования разделов


3.6 Форма просмотра базы данных


Форма предназначена для просмотра и редактирования базы данных (Рис. 3.8). На форме также использована система отображения подсказок и функция отображения Фомы «поверх всех окон», возможна сортировка информации и последовательный поиск записи. Также возможен запуск файла при двойном клике по записи файла или нажатии соответствующей кнопки. Для удобства в использовании максимальная высота и минимальная ширина формы ограничены (Рис. 3.7).


Рис. 3.7. Форма с измененными размерами

Рис. 3.8. Фома просмотра базы


3.7 Дополнительный модуль


Дабы не изобретать велосипед и не тратить всем драгоценное время, модуль был взят из примеров, поставляемых вмести с DELPHI. Данный модуль используется главной форой для копирования и перемещения файлов.


ЗАКЛЮЧЕНИЕ


В ходе данной работы были изучены основные цели и требования, предъявляемые к разработчикам баз данных:

1. Возможности поиска. Пользователь базы данных может обращаться к ней с различными вопросами по поводу хранимых данных. Возросшие требования к системам заключаются в обеспечении обработки таких запросов или формирования таких ответов, которые заранее не запланированы.

.Безопасность и секретность. Изучены некоторые методы ограничения доступа к базам данных.

.Простота использования. Интерфейс программного обеспечения максимально ориентирован на конечного пользователя и учитывает возможность того, что пользователь не имеет необходимой базы знаний.

Были проведены соответствующие исследования в интерфейсах других приложений для организации наиболее эргономичного управления программой.

Т.к. приложение рассчитано на локального пользователя, то был выбран навигационный способ доступа к базам данных. Достоинство навигационного способа доступа к базе данных - простота кодирования операций с набором данных.

Особую роль для хранения информации на компьютере играет объектно-ориентированное программирование. Общую ее цель можно сформулировать так: доступ и обработка информации осуществляется без определенных знаний и опыта работы с компьютером.


СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ


1 Тейксейра. Delphi 5. Руководство разработчика, том 1. Основные методы и техники программирования / Тейксейра, Стив, Пачеко, Ксавье - Издательский дом «Вильямс», 2001.- 780с.

Тейксейра. Delphi 5. Руководство разработчика, том 2. Разработка компонентов и программирование баз данных / Тейксейра, Стив, Пачеко, Ксавье - Издательский дом «Вильямс», 2001.- 821с.

3 Гофман, В.Э. Delphi / В.Э. Гофман.- СПб.: БХВ - Петербург, 2001.-800с.

Фаронов, В. Delphi 6: учебный курс / В. Фаронов - СПб.: Питер, 2002.-512с.


ПРИЛОЖЕНИЯ


ПРОГРАММА ДЛЯ СОРТИРОВКИ ЭЛЕКТРОННЫХ ФАЙЛОВ


//Текст файла проекта

program Project1;,,,,in 'Unit1.pas' {Form1},in 'Modulepas.pas',in 'InsRec.pas' {InsertRec},in 'UZastavka.pas' {FZastavka},in 'URazdel.pas' {Razdel},in 'UBase.pas' {FBase};

{$R *.RES}:string;:TextFile;inputQuery('Вход','Введите пароль',pas) thenpas='zybr' then begin.Initialize;.CreateForm(TFZastavka, FZastavka);.Show;.Update;fzastavka.Timer1.enabled do.processMessages;.free;.CreateForm(TForm1, Form1);.CreateForm(TInsertRec, InsertRec);.CreateForm(TRazdel, Razdel);.CreateForm(TFBase, FBase);not FileExists(extractFilePath(application.exeName)+'Base\ListBase.txt') then begin(ListBase, extractFilePath(application.exeName)+'Base\ListBase.txt');(ListBase);;else MessageDlg('Не тот пароль !'+#13+'Проверь пароль!!', mtError,[mbOk],0);.Run;.

//Текст файла заставки

unit UZastavka;, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,;= class(TForm): TTimer;: TImage;Timer1Timer(Sender: TObject);

{ Private declarations }

{ Public declarations };: TFZastavka;

{$R *.DFM}

procedure TFZastavka.Timer1Timer(Sender: TObject);.Enabled:=false;

end;

end.

//Текст файла основной формы

unit Unit1;

interface, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,, StdCtrls, Menus, FileCtrl, ComCtrls, ToolWin, AppEvnts, Grids,, DirOutln, shellApi, ExtCtrls, jpeg, ImgList;= class(TForm): TStatusBar;: TToolBar;: TScrollBox;: TSpeedButton;: TSpeedButton;: TSpeedButton;: TDriveComboBox;: TDirectoryListBox;: TFileListBox;: TFilterComboBox;: TSpeedButton;: TSpeedButton;: TSpeedButton;: TSpeedButton;: TFileListBox;: TFileListBox;: TLabel;: TLabel;: TApplicationEvents;: TMainMenu;: TMenuItem;: TMenuItem;: TPopupMenu;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TToolButton;: TSpeedButton;: TMenuItem;: TMenuItem;: THeaderControl;: TBitBtn;: TBitBtn;: TMenuItem;: TBitBtn;: TBitBtn;: TMenuItem;: TMenuItem;: TMenuItem;: TLabel;: TCheckBox;: TToolButton;PmRefClick(Sender: TObject);ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);FormCreate(Sender: TObject);ButDir2Click(Sender: TObject);ButDir3Click(Sender: TObject);Dir3Change(Sender: TObject);AllDirDbl(Sender: TObject);MnCopyClick(Sender: TObject);MNMoveClick(Sender: TObject);ConfChange(const ACaption, FromFile, ToFile: string);SBDir12Click(Sender: TObject);SBDir21Click(Sender: TObject);SBDir13Click(Sender: TObject);SBDir31Click(Sender: TObject);Dir1DragOver(Sender, Source: TObject; X, Y: Integer;: TDragState; var Accept: Boolean);Dir2DragOver(Sender, Source: TObject; X, Y: Integer;: TDragState; var Accept: Boolean);Dir3DragOver(Sender, Source: TObject; X, Y: Integer;: TDragState; var Accept: Boolean);Dir2DragDrop(Sender, Source: TObject; X, Y: Integer);Dir3DragDrop(Sender, Source: TObject; X, Y: Integer);Dir1DragDrop(Sender, Source: TObject; X, Y: Integer);TBSBDeleteClick(Sender: TObject);MnExitClick(Sender: TObject);MnOpenBaseClick(Sender: TObject);BbIns2Click(Sender: TObject);BbIns3Click(Sender: TObject);BbDir2Click(Sender: TObject);BitBtn1Click(Sender: TObject);Dir2Change(Sender: TObject);MnShutDownClick(Sender: TObject);MnReBootClick(Sender: TObject);N8Click(Sender: TObject);FormKeyPress(Sender: TObject; var Key: Char);Dir1Enter(Sender: TObject);Dir2Enter(Sender: TObject);CBOnTopClick(Sender: TObject);

{ Private declarations }

{ Public declarations };: TForm1;:string;modulepas, Insrec, UBase, URazdel;

{$R *.DFM}

procedure TForm1.PmRefClick(Sender: TObject);.Panels[2].Text:=IntToStr(diskSize(3) div 1024000)+' Mb';.Panels[4].Text:=IntToStr(diskSize(4) div 1024000)+' Mb';.Update;.Update;.Update;

end;TForm1.ApplicationEvents1Idle(Sender: TObject;Done: Boolean);.Caption:=TimeTostr(time);.Title:=TimeToStr(Time);.Panels[5].Text:=application.Hint;.statusBar1.Panels[0].Text:=statusBar1.Panels[5].Text;

end; TForm1.FormCreate(Sender: TObject);.Panels[2].Text:=IntToStr(diskSize(3) div 1024000)+' Mb';.Panels[4].Text:=IntToStr(diskSize(4) div 1024000)+' Mb';.Checked:=true;.Down:=true;.KeyPreview := True;

end; TForm1.Dir3Change(Sender: TObject);.Caption:=dir3.Directory;

end; TForm1.Dir2Change(Sender: TObject);.Caption:=dir2.Directory;

end; TForm1.AllDirDbl(Sender: TObject);(form1.Handle, nil, PChar((sender as tFileListBox).FileName), nil, nil, sw_ShowNormal);

end;

{////////////////////////////////////////////////////////////////////////////////////////}

procedure TForm1.MnCopyClick(Sender: TObject);MnCopy.Checked then begin.Checked:=false;.Down:=false;.Checked:=True;.Down:=True;else begin.Checked:=true;.Down:=true;.Checked:=False;.Down:=False;;

end; TForm1.MNMoveClick(Sender: TObject);MnMove.Checked then begin.Checked:=false;.Down:=false;.Checked:=True;.Down:=True;else begin.Checked:=true;.Down:=True;.Checked:=False;.Down:=false;;

end;

{////////////////////////////////////////////////////////////////////////////////////////}

procedure TForm1.ConfChange(const ACaption, FromFile, ToFile: string);MessageDlg(Format('%s %s '+#13+'В %s?', ['Копировать', FromFile,ToFile]),,[mbYes, mbNo],0) = mrYes then beginACaption = 'Copy' then CopyFile(FromFile, ToFile) elseACaption = 'Move' then MoveFile(FromFile, ToFile);.Update;.Update;.Update;;

end;

{//////////////////////////////////////////////////////}

procedure TForm1.SBDir12Click(Sender: TObject);,FromFileName,ToFileName,s:string;TBsbCopy.Down then s:='Copy' elseTBsbMove.Down then s:='Move' else Exit;:=dir1.FileName;:=dir2.Directory;(s, FromFileName, ToFileName);

end;TForm1.SBDir21Click(Sender: TObject);,FromFileName,ToFileName,s:string;TBsbCopy.Down then s:='Copy' elseTBsbMove.Down then s:='Move' else Exit;:=dir2.FileName;:=Dir1.Directory;(s, FromFileName, ToFileName);

end;

{///////////////////////////////////////////////////}

procedure TForm1.SBDir13Click(Sender: TObject);,FromFileName,ToFileName,s:string;TBsbCopy.Down then s:='Copy' elseTBsbMove.Down then s:='Move' else Exit;:=dir1.FileName;:=dir3.Directory;(s, FromFileName, ToFileName);

end; TForm1.SBDir31Click(Sender: TObject);,FromFileName,ToFileName,s:string;TBsbCopy.Down then s:='Copy' elseTBsbMove.Down then s:='Move' else Exit;:=dir3.FileName;:=Dir1.Directory;(s, FromFileName, ToFileName);

end;

{////////////////////////////////////////////////////}

procedure TForm1.Dir1DragOver(Sender, Source: TObject; X, Y: Integer;: TDragState; var Accept: Boolean);(source=Dir2) or(source=dir3) then accept:=true else accept:=false;

end;TForm1.Dir2DragOver(Sender, Source: TObject; X, Y: Integer;: TDragState; var Accept: Boolean);source=Dir1 then accept:=true else accept:=false;

end;TForm1.Dir3DragOver(Sender, Source: TObject; X, Y: Integer;: TDragState; var Accept: Boolean);source=Dir1 then accept:=true else accept:=false;

end;TForm1.Dir2DragDrop(Sender, Source: TObject; X, Y: Integer);.Click;

end;TForm1.Dir3DragDrop(Sender, Source: TObject; X, Y: Integer);.Click;

end;TForm1.Dir1DragDrop(Sender, Source: TObject; X, Y: Integer);source=dir2 then SBDir21.Click else SBDir31.Click;

end;

{////////////////////////////////////////////////////////////////////////////////////////}

procedure TForm1.TBSBDeleteClick(Sender: TObject);dir1.Focused thendir1 doMessageDlg('Delete ' + FileName + '?', mtConfirmation,

[mbYes, mbNo], 0) = mrYes thenDeleteFile(FileName) then begin;.Update;.Update;;dir2.Focused thendir2 doMessageDlg('Delete ' + FileName + '?', mtConfirmation,

[mbYes, mbNo], 0) = mrYes thenDeleteFile(FileName) then begin;.Update;.Update;;dir3.Focused thendir3 doMessageDlg('Delete ' + FileName + '?', mtConfirmation,

[mbYes, mbNo], 0) = mrYes thenDeleteFile(FileName) then begin;.Update;.Update;;

end; TForm1.MnExitClick(Sender: TObject);;

end;TForm1.MnOpenBaseClick(Sender: TObject);.showmodal;

end;TForm1.BbIns2Click(Sender: TObject);.Table1.Active:=true;.Table2.Active:=true;insertrec.Table1.RecordCount<>0 then insertrec.table1.Lastinsertrec.Table1.First;.Table1.Insert;.Table1.FieldByName('Адрес').asString:=Dir2.FileName;.ShowModal;(0);

showmessage('Обязательный ввод "Название" и "Раздел"');

end;

end; TForm1.BbIns3Click(Sender: TObject);.Table1.Active:=true;.Table2.Active:=true;insertrec.Table1.RecordCount<>0 then insertrec.table1.Lastinsertrec.Table1.First;.Table1.Insert;.Table1.FieldByName('Адрес').asString:=Dir3.FileName;.ShowModal;

end; TForm1.BbDir2Click(Sender: TObject);dir:string;selectDirectory(dir,[sdAllowCreate, sdPerformCreate,sdPrompt],0) then Dir2.directory:=dir;

end;TForm1.BitBtn1Click(Sender: TObject);dir:string;selectDirectory(dir,[sdAllowCreate, sdPerformCreate,sdPrompt],0) then Dir3.directory:=dir;

end;TForm1.MnShutDownClick(Sender: TObject);Check(exitWindowsEx(ewx_ShutDown,0));

end;TForm1.MnReBootClick(Sender: TObject);Check(exitWindowsEx(ewx_ReBoot,0));

end; TForm1.N8Click(Sender: TObject);Check(exitWindows(0,0));

end; TForm1.FormKeyPress(Sender: TObject; var Key: Char);key = #27 then Close;

end; TForm1.Dir1Enter(Sender: TObject);

{if (dir2.ItemIndex<>-1) then begin.Selected[dir2.ItemIndex]:=false;.Selected[dir1.ItemIndex]:=True;;}

end;TForm1.Dir2Enter(Sender: TObject);

{if dir1.ItemIndex<>-1 then begin.Selected[dir1.ItemIndex]:=false;.Selected[dir2.ItemIndex]:=True;;}

end;TForm1.CBOnTopClick(Sender: TObject);CBOnTop.Checked then form1.FormStyle:=fsStayOnTopform1.FormStyle:=fsNormal;

end;

end.

//Текст файла вставки записей

unit InsRec;

interface, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,, Db, DBTables, Mask, DBCtrls;= class(TForm): TGroupBox;: TLabel;: TLabel;: TLabel;: TLabel;: TButton;: TButton;: TButton;: TLabel;: TDataSource;: TTable;: TDBEdit;: TDBEdit;: TDBEdit;: TDBMemo;: TDataSource;: TTable;: TDBLookupComboBox;Button1Click(Sender: TObject);Button2Click(Sender: TObject);Button3Click(Sender: TObject);FormCreate(Sender: TObject);


{ Private declarations }

{ Public declarations };: TInsertRec;Unit1,URazdel;

{$R *.DFM}

procedure TInsertRec.Button1Click(Sender: TObject);Adres:String;((DBEdit1.Text<>'')and(DBLookupComboBox1.Text<>'')) then begin.Active:=true;.Active:=true;.FieldByName('Название').asString:=DBedit1.Text;.FieldByName('Автор').asString:=DBedit2.Text;.FieldByName('Раздел').asString:=DBLookupComboBox1.Text;.FieldByName('Описание').asString:=DBMemo1.Text;.Post;.Active:=false;.Active:=false;;;

ShowMessage('Возмлжно уже существует запись с такими полями.');

DBEdit1.Text:='';.Text:='';.Text:='';; end else begin

showmessage('Обязательный ввод "Название" и "Раздел"');

table1.cancel;;

end; TInsertRec.Button2Click(Sender: TObject);.cancel;;

end; TInsertRec.Button3Click(Sender: TObject);.ShowModal;

end; TInsertRec.FormCreate(Sender: TObject);.table1.dataBaseName:=extractFilePath(application.exeName)+'Base';.table2.dataBaseName:=extractFilePath(application.exeName)+'Base';

end;

end.

//Текст файла редактирования разделов

unit URazdel;, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,, DBGrids, StdCtrls, Mask, DBCtrls, Db, DBTables;= class(TForm): TTable;: TDataSource;: TButton;: TButton;: TDBGrid;: TButton;: TEdit;Button3Click(Sender: TObject);Button1Click(Sender: TObject);Button2Click(Sender: TObject);FormActivate(Sender: TObject);FormCreate(Sender: TObject);

{ Private declarations }

{ Public declarations };: TRazdel;

{$R *.DFM}

procedure TRazdel.Button3Click(Sender: TObject);;

end; TRazdel.Button1Click(Sender: TObject);.table1.Active:=true;.table1.Append;.table1.FieldByName('Раздел').asString:=edit1.Text;.table1.Refresh;

end; TRazdel.Button2Click(Sender: TObject);.table1.Delete;

end; TRazdel.FormActivate(Sender: TObject);edit1.CanFocus then edit1.SetFocus;

end;TRazdel.FormCreate(Sender: TObject);

begin.table1.dataBaseName:=extractFilePath(application.exeName)+'Base';

end;.

//Текст файла просмотра базы данных

unit UBase;, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,, StdCtrls, ExtCtrls, DBCtrls, Grids, DBGrids, ComCtrls, Db,, Buttons, shellApi, AppEvnts;= class(TForm): TScrollBox;: TMainMenu;: TMenuItem;: TDBGrid;: TDataSource;: TTable;: TDBMemo;: TStatusBar;: TApplicationEvents;: TScrollBox;: TRadioGroup;: TRadioGroup;: TGroupBox;: TCheckBox;: TEdit;: TRadioGroup;: TDBNavigator;: TDBNavigator;: TBitBtn;: TDBNavigator;: TDBNavigator;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TMenuItem;FormActivate(Sender: TObject);RadioGroup2Click(Sender: TObject);BitBtn1Click(Sender: TObject);Edit1Change(Sender: TObject);CheckBox1Click(Sender: TObject);RadioGroup3Click(Sender: TObject);RadioGroup1Click(Sender: TObject);ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);FormCreate(Sender: TObject);FormKeyPress(Sender: TObject; var Key: Char);MnFBTopClick(Sender: TObject);OnTop1Click(Sender: TObject);

{ Private declarations }

{ Public declarations };: TFBase;

{$R *.DFM}


procedure TFBase.FormActivate(Sender: TObject);.Active:=true;.Refresh;.Columns[4].Visible:=false;.ItemIndex:=0;

end; TFBase.RadioGroup2Click(Sender: TObject);radioGroup2.ItemIndex of

: Table1.IndexDefs[table1.IndexDefs.IndexOf(table1.indexName)].Options:=.IndexDefs[table1.IndexDefs.IndexOf(table1.indexName)].Options+[ixDescending];

: Table1.IndexDefs[table1.IndexDefs.IndexOf(table1.indexName)].Options:=.IndexDefs[table1.IndexDefs.IndexOf(table1.indexName)].Options-[ixDescending];;

end; TFBase.BitBtn1Click(Sender: TObject);(fBase.Handle, nil, PChar(table1.fieldbyname('Адрес').asString), nil, nil, sw_ShowNormal);;TFBase.Edit1Change(Sender: TObject);strField:string;not checkbox1.Checked then exit;radiogroup3.ItemIndex of

: strField:='Название';

: strField:='Раздел';

: strField:='Автор';;.Locate(strField, edit1.text, [loCaseInsensitive, loPartialKey]);

end; TFBase.CheckBox1Click(Sender: TObject);Change(sender);

end; TFBase.RadioGroup3Click(Sender: TObject);Change(sender);

end; TFBase.RadioGroup1Click(Sender: TObject);radioGroup1.ItemIndex of

: table1.IndexName:='indNazv';

: table1.IndexName:='indRaz';table1.IndexName:='';;.OnClick(sender);

end; TFBase.ApplicationEvents1Idle(Sender: TObject;Done: Boolean);radioGroup1.ItemIndex=-1 then radioGroup2.Enabled:=false else radioGroup2.Enabled:=True;

end; TFBase.FormCreate(Sender: TObject);.KeyPreview := True;.table1.dataBaseName:=extractFilePath(application.exeName)+'Base';

end; TFBase.FormKeyPress(Sender: TObject; var Key: Char);key = #27 then Close;;TFBase.MnFBTopClick(Sender: TObject);.Checked:= not MnFBTop.Checked;MnFBTop.Checked then begin.FormStyle:=fsStayOnTop;.Caption:='Всегда наверху'endbegin.FormStyle:=fsnormal;.Caption:='Base';;

end; TFBase.OnTop1Click(Sender: TObject);

close;

end;

end.

//Текст файла дополнительного модуля

unit Modulepas;SysUtils, Windows, Classes, Consts;= class(EStreamError);= class(EStreamError);CopyFile(const FileName, DestName: string);MoveFile(const FileName, DestName: string);GetFileSize(const FileName: string): LongInt;FileDateTime(const FileName: string): TDateTime;HasAttr(const FileName: string; Attr: Word): Boolean;ExecuteFile(const FileName, Params, DefaultDir: string;: Integer): THandle;Forms, ShellAPI;= 'Destination %s does not exist';= 'Cannot move file %s';

procedure CopyFile(const FileName, DestName: string);: Pointer; { buffer for copying }: Longint;, Dest: Integer; { handles }: Integer;: TFileName; { holder for expanded destination name }: Longint = 8192; { copy in 8K chunks }:= ExpandFileName(DestName); { expand the destination path }HasAttr(Destination, faDirectory) then { if destination is a directory... }:= Length(Destination);Destination[Len] = '\' then:= Destination + ExtractFileName(FileName) { ...clone file name }:= Destination + '\' + ExtractFileName(FileName); { ...clone file name };(CopyBuffer, ChunkSize); { allocate the buffer }:= FileOpen(FileName, fmShareDenyWrite); { open source file }Source < 0 then raise EFOpenError.CreateFmt(SFOpenError, [FileName]);:= FileCreate(Destination); { create output file; overwrite existing }Dest < 0 then raise EFCreateError.CreateFmt(SFCreateError, [Destination]);:= FileRead(Source, CopyBuffer^, ChunkSize); { read chunk }BytesCopied > 0 then { if we read anything... }(Dest, CopyBuffer^, BytesCopied); { ...write chunk }BytesCopied < ChunkSize; { until we run out of chunks }(Dest); { close the destination file };(Source); { close the source file };(CopyBuffer, ChunkSize); { free the buffer };

end;

{ MoveFile procedure }

{ Moves the file passed in FileName to the directory specified in DestDir.to just rename the file. If that fails, try to copy the file andthe original.

an exception if the source file is read-only, and therefore cannotdeleted/moved.}

procedure MoveFile(const FileName, DestName: string);: string;:= ExpandFileName(DestName); { expand the destination path }not RenameFile(FileName, Destination) then { try just renaming }HasAttr(FileName, faReadOnly) then { if it's read-only... }EFCantMove.Create(Format(SFCantMove, [FileName])); { we wouldn't be able to delete it }(FileName, Destination); { copy it over to destination...}(Pchar(FileName)); { ...and delete the original };

end;

{ GetFileSize function }

{ Returns the size of the named file without opening the file. If the file't exist, returns -1.}

function GetFileSize(const FileName: string): LongInt;: TSearchRec;FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then:= SearchRec.SizeResult := -1;.FindClose(SearchRec);;

end; FileDateTime(const FileName: string): System.TDateTime;:= FileDateToDateTime(FileAge(FileName));

end; HasAttr(const FileName: string; Attr: Word): Boolean;: Integer;:= FileGetAttr(FileName);FileAttr = -1 then FileAttr := 0;:= (FileAttr and Attr) = Attr;

end; ExecuteFile(const FileName, Params, DefaultDir: string;: Integer): THandle;, zParams, zDir: array[0..79] of Char;:= ShellExecute(Application.MainForm.Handle, nil,(zFileName, FileName), StrPCopy(zParams, Params),(zDir, DefaultDir), ShowCmd);

end;.


МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ Учреждение образования «Гомельский государственный университет имени Франциска Скорины» Математи

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2019 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ