Шаг 51.
Работа с локальными БД в Delphi.
Последовательная навигация по записям (окончание)

    На этом шаге мы рассмотрим создание приложения, использующего последовательную навигацию по записям.

    Вернемся же к нашему приложению SchoolProject. Поместите на главную форму компонент TDBGrid и свяжите его с источником DataSourceClass, не забыв включить имя модуля в секцию Uses. Создайте компоненты TField для компонентов TTable. Измените свойство DisplayLabel этих компонентов так, чтобы заголовки таблиц отображались на русском языке. Поместите на форму компонент TButton, присвоив свойству Caption значение "Добавить". В итоге форма должна принять примерно такой вид:


Рис.1. Главная форма приложения SchoolProject

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

    Для начала создадим новую форму. Для этого из меню File выберите пункт New. Delphi должен создать новую форму. Сохраните ее в файле InsertClass.pas. Сразу измените имя формы c Form2 на InsertForm и задайте заголовок формы "Добавить класс". Разместите на новой форме пару компонентов TEdit и компонент TButton (рисунок 2). Чтобы не дать возможность пользователю изменять записи в компоненте TDBGrid, расположенном на форме Form1, присвойте его свойству ReadOnly значение True.


Рис.2. Форма InsertForm

    Теперь нужно показать это окно. Создайте обработчик события OnClick для кнопки "Добавить", расположенной на главной форме.

procedure TForm1.Button1Click(Sender: TObject);
begin
  InsertForm.ShowModal;
end;

    В данном обработчике события вызывается метод ShowModal формы InsertForm. Этот метод показывает форму в режиме Modal. В этом режиме окно получает полное управление, и пока оно не закроется, переключиться на главную форму невозможно.

    Если сейчас откомпилировать код, то Delphi выдаст ошибку, говорящую о том, что форма InsertForm не найдена. Это происходит потому, что форма InsertForm находится в модуле InsertUnit, а мы используем ее в модуле ClassUnit. Чтобы ClassUnit смог увидеть форму, описанную в InsertUnit, нужно включить имя модуля в секцию Uses, как мы это делали с ModuleUnit. Запустите программу и убедитесь в ее работоспособности: теперь при нажатии кнопки "Добавить" появляется дочернее окно.

    На форме InsertForm мы разместили два компонента TEdit. В Edit1 пользователь будет вводить класс, в Edit2 - классного руководителя. При нажатии кнопки OK необходимо проверить корректность введенных данных и внести изменения в таблицу Class.

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

    Включите ModuleUnit в секцию Uses модуля InsertClass. Напишите такой обработчик события для кнопки OK.

procedure TInsertForm.Button1Click(Sender: TObject);
var 
  flag:boolean;
begin
  flag:=False;
  DataModule2.TableClass.First;
  if (Edit1.Text = '') or (Edit2.Text = '') then ShowMessage('Не все поля заполнены')  
  else
    begin
      if length(Edit1.Text) > 3 then
       ShowMessage('Значение поля "Класс" не должно превышать трех символов ')
      else
       begin
         repeat
           if DataModule2.TableClassClass.Value = Edit1.Text then flag:=True;
         until not DataModule2.TableClass.FindNext;
         if flag then ShowMessage('Запись для этого класса уже существует')
         else
           begin
             DataModule2.TableClass.Insert;
             DataModule2.TableClassClass.Value:=Edit1.Text;
             DataModule2.TableClassTeacher.Value:=Edit2.Text;
             DataModule2.TableClass.Post;
             InsertForm.Close;
           end;
       end;
    end;
end;

    В данной процедуре мы ввели логическую переменную flag. Если при выполнении процедуры флаг будет установлен (flag:=True), то добавление записи не выполняется. Сначала мы проверяем, все ли поля ввода были заполнены пользователем, и если нет, то выдаем соответствующее сообщение. Если все поля были заполнены, то проверяем длину введенного текста в Edit1. Если она окажется больше 3, то сообщаем пользователю о вводе некорректных данных. Если же длина не превышает трех символов, то выполняется цикл:

repeat
   if DataModule2.TableClassClass.Value =Edit1.Text then flag:=True;
until not DataModule2.TableClass.FindNext;

    Тело цикла выполняется, пока не будет достигнута последняя запись. В начале процедуры мы поместили курсор на первую запись. В теле цикла мы сравниваем введенное в Edit1 значение с уже имающимися значениями поля Class. Если на каком либо шаге цикла обнаружится совпадение, то устанавливаем флаг (flag:=True).

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

    Запустите и протестируйте программу. Если вы все сделали правильно, то при вводе корректных данных в таблицу Класс добавляется новая запись. При повторном добавлении записи, в полях TEdit останутся данные, которые вы до этого вводили. Чтобы этого избежать, напишите такой обработчик для события OnShow формы InsertForm.

procedure TInsertForm.FormShow(Sender: TObject);
begin
  Edit1.Clear; //Очищаем Edit1
  Edit2.Clear; //Очищаем Edit2
end; 

    Событие OnShow происходит непосредственно перед выводом формы на экран. К этому времени все элементы управления и компоненты созданы и инициализированы.


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

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

procedure TForm1.FormClose (Sender: TObject; var Action: TCloseAction);
begin
  DataModule1.TableClass.FlushBuffers;
  DataModule1.TablePupils.FlushBuffers;
end;
Созданное приложение можно взять здесь.

    На следующем шаге мы рассмотрим использование закладок.




Предыдущий шаг Содержание Следующий шаг