Опубликован: 07.04.2008 | Уровень: специалист | Доступ: платный
Лекция 30:

Создание собственной таблицы

< Лекция 29 || Лекция 30: 12 || Лекция 31 >
Аннотация: В этой лекции мы научимся устанавливать закладки, перемещать указатель на закладку, удалять закладку. Создадим две собственных таблицы с помощью утилиты Database Desktop, познакомимся с типами данных таблиц формата Paradox 7, начнем приложение с реляционной базой данных, где две таблицы связаны между собой.

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

Закладки (Bookmarks)

Закладки позволяют сохранить положение в наборе данных, чтобы позднее можно было вернуться к этому же месту. В Delphi за это отвечает только одно свойство. Все, что нужно сделать – это объявить переменную типа TBookmarkStr и присвоить ей положение, которое мы хотим запомнить:

var
   bm : TBookmarkStr;
begin
   bm := Table1.Bookmark;

А когда нужно вернуться на закладку, делаем обратное присваивание:

Table1.Bookmark := bm;

Чтобы освободить закладку, нужно ей просто-напросто присвоить пустую строку:

bm := '';

Как видите, закладка реализуется переменной типа TBookmarkStr, а в компоненте Table имеется свойство Bookmark такого же типа.

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

var
  fMain: TfMain;
  bm : TBookmarkStr;

Далее, кнопка "Установить" у нас доступна, остальные кнопки не доступны. Почему? Потому, что мы не можем перейти на закладку, или удалить ее, пока мы эту закладку не установили. Как только мы установим закладку, то наоборот, кнопки "На закладку" и "Удалить" у нас должны стать активными. А вот "Установить" - нет, потому что ее сначала нужно освободить, удалить. Имеем это в виду, и пишем код для кнопки "Установить":

//получаем закладку:
  bm := fDm.Table1.Bookmark;
  //разрешаем или запрещаем кнопки:
  Button5.Enabled := False; //установить
  Button6.Enabled := True; //на закладку
  Button7.Enabled := True; //Удалить

Теперь код для кнопки "На закладку":

//перейти на закладку
  fDM.Table1.Bookmark := bm;

И напоследок, код для кнопки "Удалить":

//удалить закладку:
  bm := '';
  //разрешаем или запрещаем кнопки:
  Button5.Enabled := True; //установить
  Button6.Enabled := False; //на закладку
  Button7.Enabled := False; //Удалить

Вот и вся работа с закладками!

Свойства BOF, EOF и циклическая обработка

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

Table1.First; //перешли на первую запись
while not Table1.EOF do begin
   {какие-то действия с записью}
   Table1.Next;  //переход на следующую запись
end; //while

Точно также, можно от конца таблицы переходить к началу, и использовать при переходе свойство Prev – переход к предыдущей записи.

Открытие и закрытие таблицы или связанных таблиц

В предыдущем примере мы во время разработки установили свойство Active таблицы в True. Однако нередко бывает, что открывать и закрывать таблицу приходится программным путем. Таким образом, для открытия таблицы мы можем использовать свойство Active или методы Open и Close, которые делают одно и то же:

//открываем таблицы:
Table1.Open;
Table2.Active := True;
//закрываем таблицы:
Table1.Close;
Table2.Active := False;

Свойства RecordCount и RecNo таблицы

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

Давайте улучшим наш проект, указав какая запись является текущей, и каково общее количество записей. Откройте предыдущий проект. Событие onDataChange компонента DataSource возникает всякий раз, когда происходят изменения в данных таблицы. Например, перемещение от одной записи к другой. Однако, компонент Label, в который нам нужно прописать эти данные, находится в главном окне, а компонент DataSource – в окне DM. Так что придется открыть модуль DM, и использовать команду File -> Use Unit, в которой указать главное окно fMain.

Теперь выделите компонент DataSource и сгенерируйте для него событие onDataChange. В коде этого события запишем:

fMain.Label1.Caption := 'Позиция: '  +
      IntToStr(Table1.RecNo) + ' из '  +
      IntToStr(Table1.RecordCount);

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

Позиция: 1 из 28

Наш "БД – Навигатор" полностью работоспособен. Можете закрыть этот проект, больше он нам не потребуется.

Создание собственной таблицы

Наиболее простой способ создать собственную таблицу – воспользоваться встроенной утилитой Delphi – Database Desktop. Однако для начала создайте новое приложение. Форму сразу переименуйте в fMain, модуль сохраните под именем Main, а проект – CatBooks. Мы будем делать каталог книг для библиотеки. В свойстве Caption формы можете написать "Библиотечный каталог". Теперь с помощью файлового менеджера создайте на диске D: (Если D: диска у вас нет, то на диске C:) еще одну папку – Data (данные). Таким образом, адрес нашей базы данных будет d:\data.

Теперь запускайте утилиту Database Desktop, которая находится там же, где Delphi. Эта программа – не просто браузер БД, она еще позволяет создавать таблицы и индексные файлы. Сейчас выберем команду File – NewTable. Появится окошко, в котором можно выбрать формат создаваемой таблицы. Откройте список – он довольно внушителен. Таблицы формата dBase наиболее распространены, однако они очень уязвимы и не имеют большого разнообразия типов полей. Поэтому оставим формат по умолчанию – Paradox 7. Сразу, как Вы нажмете "ОК", появится редактор полей. Здесь нам нужно:

  1. В поле Field Name указать название поля (колонки).
  2. В поле Type выбрать тип поля. Для этого достаточно нажать пробел, чтобы открылся список всех полей.
  3. В поле Size указывается длина строк в символах. Если Вы выбрали, к примеру, дату, то это поле недоступно для редактирования, поскольку у всех записей будет фиксированная длина.
  4. Поле Key позволяет указать ключевое поле. Для этого тоже достаточно нажать пробел. Установка на поле ключа приводит к тому, что все записи таблицы будут сортироваться по этому полю. Например, если установить ключ у поля "Фамилия", то все записи отсортируются по фамилиям, от А до Я. Если ключа нет, то записи будут в том порядке, в каком их ввели в таблицу.

Типы данных таблиц Paradox 7

Таблица 30.1. Типы данных таблиц Paradox 7
Тип Буква Описание
Alpha A Строка от 1 до 255 символов. Размер поля указывается в Size.
Number N Целое число от -10307 до 10308 (15 значащих цифр)
$ Money $ Число в денежном формате.
Short S Короткое целое от -32768 до 32767
Long Integer I Длинное целое от -2147483648 до 2147483647
Date D Дата
Time T Время с полуночи в миллисекундах
Timestamp @ Дата и время
Memo M Строковое поле неограниченной длины. В разделе Size можно указать длину от 1 до 240 символов, остальные символы хранятся в файле с таким же именем, но расширением mb.
Formated Memo F Как Memo, но также имеются дополнительные возможности: указать тип и размер шрифта, цвет символов, способ оформления…
Graphic G Графический файл сохраняется прямо в поле.
Logical L Логический тип.
\pm Autoincrement + Целое число, увеличивающееся на единицу автоматически, при добавлении новой записи (счетчик).
Bytes Y Двоичные данные.
Binary B Двоичные данные. Как и Memo, хранятся в отдельном файле. Обычно содержат аудио- или видео-данные.

Итак, вводим такие поля:

Таблица 30.2. Необходимые для программы поля
Field Name Type Size Key
1 Key1 +
2 Avtor I
3 Nazvanie A 100
4 Exemp S
5 Cena $
6 Date D
7 Prim M 200

Теперь нажмите кнопку "Save As", файл назовите books и сохраните его в папке d:\data. Здесь будут храниться данные о книгах. Поле с автором мы установили как целое. Позже мы сделаем еще одну таблицу, и в ней будем вести учет всех авторов. И обе таблицы у нас будут объединены. Теперь, если вы взгляните на папку d:\data, то обнаружите там два файла:

  • books.db – сама таблица
  • books.MB – Memo поле таблицы

Вот теперь настало время создать приложение, которое будет работать с этой таблицей. Главная форма у нас уже есть, так что сразу создаем модуль данных (File – NewData Module). В свойстве Name напишите fDM, а сам модуль сохраните как DM. Сразу же перейдите на главную форму и с помощью File – Use unit свяжите ее с DM.

Теперь устанавливаем на DM компонент Table с вкладки BDE. В свойстве DatabaseName компонента впишите адрес нашей базы: "d:\data". В свойстве TableName выберите нашу таблицу books.db. Изменим имя таблицы, и укажем TBooks в свойстве Name компонента Table1. Так как у нас в приложении будет более одной таблицы, желательно каждой из них дать осмысленное имя, чтобы потом не запутаться.

Сразу же устанавливаем на DM компонент DataSource с вкладки Data Access. Имя компонента изменим на DS1, чтобы было покороче. В свойстве DataSet выберем нашу таблицу.

Переходим на главную форму. Устанавливаем главное меню и создаем такие пункты:

  1. "Файл" - "-", "Выход"
  2. "Редактирование" - "Добавить книгу", "Добавить автора"
  3. "Сортировка" - "По автору", "По названию книги"
  4. "Помощь" - "О программе"

Теперь установим панель, свойству Align присвоим alTop, чтобы она заняла весь верх, свойство Caption очистим и бросим на нее два компонента Label, один под другим. На первой напишем: "Всего книг:", на второй – "На общую сумму:". Как следует из названий, эти данные мы будем выводить на панель.

Ниже устанавливаем сетку DBGrid с вкладки Data Controls. Свойство Align переведем в alClient. В свойстве DataSource выберем наш DS1. Свойство ReadOnly переведем в True, так как для редактирования данных у нас будут другие инструменты, сетка нужна только для просмотра.

< Лекция 29 || Лекция 30: 12 || Лекция 31 >
Виктор Пелих
Виктор Пелих

Здравствуйте.
Прохожу курс "Введение в программирование на Delphi"
Добрался до Лекции 29: Введение в базы данных.

Установлена RAD Studio 11.3, у которой отсутствует вкладка BDE и, соответственно, компонент Table,  который обеспечивает доступ к таблице средствами механизма BDE.
Поиск в интернете подсказал 
BDE Installer for RAD Studio, Delphi, C++Builder 10.3 Rio
Подскажите, имеется ли ещё возможность использовать механизм BDE в Delphi11 и если такая возможность есть, как подключить BDE к Delphi11?
С уважением...

 

Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

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

Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989
Олег Волков
Олег Волков
Россия, Балаково, МБОУ СОШ 19