Главная » C++, C++ Builder » Я хочу сделать это сам! БД в CBuilder

0

У меня две маленькие дочки, и они часто заявляют, что хотят сделать что-нибудь сами, несмотря на то, что мне кажется, что у них это не получится. И что же — я постоянно не угадываю, и они справляются лучше, чем справился бы я сам. Мне кажется, таков уж  удел  родителей.  Фирма Borland столкнулась с такой же проблемой, когда ее программисты стали писать объекты VCL для работы с базами данных. Многие программисты напоминают моих дочерей в своем нежелании допустить, чтобы VCL делала всю работу по изменению, записи и удалению в базах данных посредством объекта DBNavigator. Они предпочитают сами проделать всю работу по перезаписи базы данных при добавлении, изменении или удалении. CBuilder позволяет вам делать собственноручно все, что вы сами пожелаете.

На рис. 7.5 показана форма, которую мы будем использовать в нашем следующем примере. Она сделана по образу и подобию формы, которую сгенерировал Мастер форм баз данных CBuilder. Главное отличие состоит в добавлении в нижнюю часть формы наших собственных кнопок перемещения по базе данных и удалении с формы компонента DBNavigator. Кроме  этого,  в данном примере мы, конечно, не собираемся опять отображать на форме панель состояния.

Воплощение этой формы довольно просто. Редактируемые поля все также привязаны к источнику данных (data source), который, в свою очередь, привязан к компоненту dataset (таблице). Сама же таблица указывает на наш файл базы данных адресов. Поэтому единственное, для чего требуется специальное решение, —это добавленные нами кнопки перемещения по базе. Давайте займемся всеми ими одновременно.

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

void __fastcall TForm1::FormCreate(TObject *Sender)

{

// Добавляем новую запись в базу

Table1->Append();

}

Рис. 7.5. Форма редактора баз данных

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

void __fastcall TForm1::Button1Click(TObject *Sender)

{

if (Table1->State == dsInsert || Table1->State == dsEdit) Table1->Post();

Table1->Append();

}

Важным моментом для нас является выяснение, позволит нам таблица записать (Post) изменения в базу данных или нет, перед тем как мы добавим новую запись. Если текущая запись не находится в режиме редактирования (что произойдет, например, если мы передвинемся назад по базе данных и не станем разрешать редактирование записей), Post потерпит неудачу, и мы опять увидим гадкое окно сообщения об ошибке. Унаследовав от VCL привычку разрешать проблемы, если только это возможно, программа не обрушится, если вы так сделаете (VCL, в

отличие от некоторых других компонентных  систем, не доверяет макросу ASSERT и не останавливает программу), но и не будет вести себя так, как вы от нее ожидаете. Поэтому мы проверяем режим, в  котором находится база данных, исследуя, соответственно, свойство State (состояние, здесь — режим). Если текущим является режим редактирования или добавления, мы разрешаем выполнение Post, в противном случае мы игнорируем текущие изменения в записи.

Кнопка  Удаление  действует  абсолютно   прямолинейно.  Вот  код,  обрабатываю  щий  нажатие кнопки Удаление:

void __fastcall TForm1::Button2Click(TObject *Sender)

{

Table1->Delete;

}

В данном примере нет необходимости не разрешать пользователю удалять записи, поэтому мы не делаем никаких попыток ограничить его в этом. В  ваших  серьезных  приложениях  вы,  скорее всего, захотите проверить его решение, используя для этого окно  диалога  («Вы  уверены,  что хотите удалить эту запись?» с кнопками Да и Нет), но сейчас мы не будем этого делать. Обратите внимание, что в этом примере нам не надо волноваться за вызов метода Abort, поскольку мы контролируем только операции с данными, а не саму базу.

Кнопки перемещения по базе вперед (>) и назад (<) также не сложны. Они лишь проверяют, не находимся ли мы в конце или начале базы данных соответственно. Если не верно ни то ни другое, мы перемещаемся в указанном направлении к следующей записи. Вот обработчики для кнопок:

void __fastcall TForm1::Button3Click(TObject *Sender)

{

if (!Table->Bof) Table1->Prior();

}

//————————————————————————————

void __fastcall TForm1::Button4Click(TObject *Sender)

{

if (!Table->Eof) Table1->Next;

}

Обратите внимание на использование свойств базы данных Bof (Beginning of File, начало файла) и

Eof (End of File, конец файла) для проверки, сможем ли мы выполнить просьбу пользователя.

На этом написание примера закончено. Я думаю, вы убедились, насколько просто можно работать с базами данных на том уровне доступа, на котором вы хотите. Вы даже можете убрать поля DBEdit и заменить их обычными полями редактиро вания (Edit). Если вы решите так сделать, вам надо будет присваивать значения полям с помощью свойств FieldValues базы данных, например:

Table1->Fields["LASTNAME"] = "Иванов";

Эта строка установит значения поля с фамилиями (LASTNAME) в Иванов (не так уж редко встречающееся значение). Это все, что делает компонент DBEdit. Аналогично, чтобы установить поле редактирования равным значению поля базы данных, вам надо написать:

Edit1->Text = Table1->Fields["LASTNAME"];

Вот, собственно, и все с редактированием баз данных. Теперь давайте обратимся к проблеме просмотра данных в полном объеме.

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

  • Комментарии