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