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

    На этом шаге мы рассмотрим использование закладок при создании приложения.

    Вновь обратимся к нашему проекту SchoolProject. На данном этапе в приложении имеется возможность добавлять записи в таблицу Class, но нет возможности редактировать записи.

    Давайте исправим это неудобство. Добавьте на главную форму еще одну кнопку, присвойте ее свойству Caption значение "Изменить". Сразу обговорим, как будет происходить изменение записи. Удобнее будет это сделать через ту же форму, с помощью которой мы добавляем записи. Но тогда возникает вопрос, как обработчик события OnClick кнопки OK, расположенной на форме InsertForm узнает, что нужно делать: добавлять или редактировать запись. Для этого объявим в модуле ClassUnit глобальную переменную Edit типа Boolean. Добавим в обработчик события нажатия кнопки "Изменить" строки InsertForm.ShowModal;, строчку Edit:=True;. Чтобы эта переменная была видна в модуле InsertClass, необходимо включить модуль ClassUnit в секцию Uses.

    Теперь в обработчике события OnClick кнопки OK замените строчку

DataModule2.TableClass.Insert;
на
if Edit then DataModule2.TableClass.Edit
else DataModule2.TableClass.Insert;

    Запустив приложение и поэкспериментировав с редактированием БД, вы обнаружите, что программа работает неправильно. При изменении записи изменяется последняя запись, а не та, на которой находится курсор. Это вполне объяснимо, ведь когда вы нажимаете кнопку OK, курсор перемещается от 1 к последней записи, тем самым мы теряем положение курсора. Очевидно, что нужно как-то сохранить положение курсора. В этом нам помогут закладки.

    Объявите в процедуре OnClick кнопки OK, две переменные MyBookMark1 и MyBookMark2 типа TBookMark. При нажатии кнопки OK, необходимо запомнить, на какой записи находится курсор. Для этого в самом начале процедуры напишите

MyBookMark1:=DataModule2.TableClass.GetBookmark;

    Установив закладку, двигаемся дальше. В теле цикла Repeat выполняется проверка, не совпадает ли значение в поле Edit1 с уже имающимися значениями поля Class. Но может возникнуть такая ситуация, когда при изменении записи поле Class должно остаться прежним, например классу назначили другого классного руководителя. Но приложение не даст вам этого сделать, выдав сообщение что "Запись для этого класса уже существует". Для правильной работы приложения необходимо исключить сравнение значения поля Edit1 со значением поля Class редактируемой записи. Чтобы реализовать это исключение мы воспользуемся сравнением двух закладок - методом CompareBookmarks НД. Для этого на каждом шаге будем создавать закладку MyBookMark2. Если мы не редактируем запись (Edit = False), или MyBookMark1 и MyBookMark2 не идентичны, то сравниваем введенное значение в Edit1 со значениями поля Class текущей записи. Цикл тогда будет выглядеть так:

repeat
  MyBookMark2:= DataModule2.TableClass.GetBookmark;
  if not Edit or
    (DataModule2.TableClass.CompareBookmarks
    (MyBookMark1,MyBookMark2) = 1) then
       if DataModule2.TableClassClass.Value = Edit1.Text then flag:=True;
until not DataModule2.TableClass.FindNext;

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

procedure TInsertForm.Button1Click(Sender: TObject);
var
  flag:boolean;
  MyBookMark1,MyBookMark2:TBookMark;
begin
  MyBookMark1:=DataModule2.TableClass.GetBookmark;
  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
           MyBookMark2:= DataModule2.TableClass.GetBookmark;
           if not Edit or
            (DataModule2.TableClass.CompareBookmarks
            (MyBookMark1,MyBookMark2) = 1) then
               if DataModule2.TableClassClass.Value = Edit1.Text then flag:=True;
         until not DataModule2.TableClass.FindNext;
         if flag then
           ShowMessage('Запись для этого класса уже существует')
         else
           begin
            DataModule2.TableClass.GotoBookmark(MyBookMark1);
             if Edit then DataModule2.TableClass.Edit
             else DataModule2.TableClass.Insert;
             DataModule2.TableClassClass.Value:=Edit1.Text;
             DataModule2.TableClassTeacher.Value:=Edit2.Text;
             DataModule2.TableClass.Post;
             InsertForm.Close;
           end;
       end;
    end;
  DataModule2.TableClass.FreeBookmark(MyBookMark1);
  if DataModule2.TableClass.BookmarkValid(MyBookMark2) then
     DataModule2.TableClass.FreeBookmark(MyBookMark2);
end;
Созданное приложение можно взять здесь.

    В заключение этого раздела предлагаем выполнить вам небольшое задание.

    Напишите обработчик события OnShow для InsertForm. Если форма вызывается нажатием кнопки "Изменить", то в полях ввода TEdit отображались бы значения полей изменяемой записи. Если же форма вызвана нажатием кнопки "Добавить", то эти поля должны быть пусты.

    Со следующего шага мы начнем знакомиться с фильтрацией записей.




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