На этом шаге мы рассмотрим использование закладок при создании приложения.
Вновь обратимся к нашему проекту 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 отображались бы значения полей изменяемой записи. Если же форма вызвана нажатием кнопки "Добавить", то эти поля должны быть пусты.
Со следующего шага мы начнем знакомиться с фильтрацией записей.