- •Постановка задачи
- •Проектирование базы данных
- •2.1. Основные понятия
- •2.2. Нормализация баз данных
- •Создание таблиц.
- •Создание псевдонима
- •Инструментальные средства
- •Компоненты
- •Псевдоним базы данных
- •Создание базы данных
- •Создание псевдонима.
- •Создание таблиц
- •Создание форм
- •Доступ к базе данных
- •Использование модуля данных
- •Навигация по таблицам базы данных
- •Форма Список команд
- •Перемещение по записям
- •Форма Список матчей
- •Форма Список голов
- •Задание для самостоятельной работы
- •Список литературы
- •Приложение. Пример реализации поиска
Форма Список матчей
Активизируйте форму Список матчей. Поместите на нее компонент DBGrid и выполните аналогичные действия п.4.5.1 для таблицы Match.
По таблице можно перемещаться программно, без использования компоненты DBNavigator. Для этого внесем изменения в этот компонент, становим свойства, которые позволят использовать для навигации по таблице Match только четыре кнопки First, Prior, Next, Last (см. таблицу 12). Установите эти свойства в соответствии с рисунком 12.
Рис.12
Добавьте на форму компоненты Button (Изменить, Добавить, Удалить, Подтвердить, Отменить), Label для вывода состояния записи (Просмотр, Удаление, Редактирование, Вставка) и CheckBox для включения или выключения режима редактирования, как показано на рисунке 13. А так же разместите на форме компоненты меток и рядом с ними соответствующие компоненты для редактирования полей.
Рисунок 13
При заполнении полей Команда – хозяин, Команда – гость таблицы Список матчей, целесообразно значения этих полей выбирать из списка. Если для поля задана таблица выбора, то в него можно ввести только значение, содержащееся в таблице выбора. Это гарантирует, что в поле не будет введено недопустимое значение. Для этого воспользуемся компонентом DBLookupComboBox, с помощью которого можно выбирать нужную информацию из таблицы Team.
Выполните действия, приведенные в таблице 16.
Таблица 16
Выделенная компонента |
Окно инспектора объектов |
Имя свойства |
Действие |
Label1 |
Properties |
Caption |
Дата матча |
DBEdit1 со страницы Data Control |
Properties |
DataSource |
DataModule1.DS_Match |
DataField |
Dat_M |
||
Label2 |
Properties |
Caption |
Команда - хозяин |
DBLookupComboBox1 |
Properties |
DataSource |
DataModule1.Ds_Match |
DataField |
HOST_M |
||
ListSource |
DataModule1.DS_Team |
||
KeyField |
ID_T |
||
ListField |
NAME_T |
||
Label3 |
Properties |
Caption |
Команда - гость |
DBLookupComboBox2 |
Properties |
DataSource |
DataModule1.DS_Match |
DataField |
GUEST_M |
||
ListSource |
DataModule1.DS_Team |
||
KeyField |
ID_T |
||
ListField |
NAME_T |
Для того чтобы программа, которую мы будем писать, легко читалась, введем обозначения созданных кнопок и меток. Для этого необходимо изменить свойство Name у соответствующих компонентов (см. таблицу 17).
Таблица 17
Компонента |
Условное обозначение |
Свойство Name |
TButton |
Изменить |
BtnEdit |
TButton |
Добавить |
BtnInsert |
TButton |
Удалить |
BtnDelete |
TButton |
Подтвердить |
BtnChangeOK |
TButton |
Отменить |
BtnChangeCancel |
TButton |
Закрыть |
BtnClose |
TLabel |
Состояние записи |
LblChangeKind |
TDBEdit |
Дата матча |
DbeDat |
TDBLookupComboBox |
Команда - хозяин |
DBLHost |
TDBLookupComboBox |
Команда - гость |
DBLGuest |
TDBGrid |
Таблица |
DBGridMatch |
TCheckBox |
Режим редактирования |
cbCanEdit |
В окне редактора форм перейдите в форму UnitMatch.
1. В разделе Use должны быть включены следующие стандартные модули:
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
DB, DBTables, Dialogs, ExtCtrls, DBCtrls, Grids, DBGrids, StdCtrls, Mask;
2. А в разделе описания переменных перед implementation должна быть запись:
var
FormSpisok: TFormSpisok;
3. После записи {$R *.dfm} вставим две вспомогательные процедуры:
procedure TFormMatch.StateChange(Sender: TObject);
begin
btnEdit.Enabled:=false;
btnInsert.Enabled:=false;
btnDelete.Enabled:=false;
btnChangeOK.Enabled:=true;
btnChangeCancel.Enabled:=true;
end;
procedure TFormMatch.StateBrowse(Sender: TObject);
begin
cbCanEditClick(Sender);
btnChangeCancel.Enabled:=false;
btnChangeOK.Enabled:=False;
end;
4. Перед разделом private { Private declarations }в раздел описания Type вставим две строки:
procedure StateChange(Sender: TObject);
procedure StateBrowse(Sender: TObject);
5. Для каждой кнопки напишите соответствующую процедуру.
BtnEdit – Изменить – OnClick
DataModule1.DS_Match.Dataset.Edit; lblChangeKind.Font.Color:=clTeal; lblChangeKind.Caption:='РЕДАКТИРОВАНИЕ ЗАПИСИ'; StateChange(Sender); if DbeDat.CanFocus then DbeDat.SetFocus;
|
BtnInsert – Добавить – OnClick
Var Nomer : Integer; . . . // Подтверждение в режим вставки If MessageDlg('Добавить запись?', mtConfirmation, [mbYes, mbNo], 0) <> mrYes then Exit; DataModule1.DS_Match.Dataset.Last; Nomer:=DataModule1.DS_Match.Dataset.FieldByName('ID_M').AsInteger; DataModule1.DS_Match.Dataset.Append; // Номер матча формируется автоматически, путем увеличения номера в последней записи DataModule1.DS_Match.Dataset.FieldByName('ID_M').AsInteger:=Nomer+1; lblChangeKind.Font.Color:=clGreen; lblChangeKind.Caption:='ВСТАВКА ЗАПИСИ'; StateChange(Sender); if DbeDat.CanFocus then DbeDat.SetFocus;
|
BtnDelete – Удалить – OnClick
// Запрос на подтверждение перехода в режим просмотра удаляемой записи If MessageDlg('Удалить запись?', mtConfirmation, [mbYes, mbNo], 0) <> mrYes then Exit; lblChangeKind.Font.Color:=clRed; lblChangeKind.Caption:='УДАЛЕНИЕ ЗАПИСИ'; StateChange(Sender); if btnChangeCancel.CanFocus then btnChangeCancel.SetFocus;
|
BtnChangeOK – Подтвердить – OnClick
// Утверждение изменений в текущей записи (редактируемой или новой) // или удаления текущей записи (просматриваемой) If DataModule1.TableMatch.State in [dsEdit, dsInsert] then begin // Проверка заполнения полей If dbeDat.Text='' then begin Beep; MessageDlg('Не задана дата матча', mtError, [mbOK], 0); if DbeDat.CanFocus then DbeDat.SetFocus; Abort; end; If DBLHost.Text='' then begin Beep; MessageDlg('Не задана команда - хозяин', mtError, [mbOK], 0); if DBLHost.CanFocus then DBLHost.SetFocus; Abort; end; If DBLGuest.Text='' then begin Beep; MessageDlg('Не задана команда - гость', mtError, [mbOK], 0); if DBLGuest.CanFocus then DBLGuest.SetFocus; Abort; end; DataModule1.TableMatch.Post end else if lblChangeKind.Caption='УДАЛЕНИЕ ЗАПИСИ' then DataModule1.TableMatch.Delete; StateBrowse(Sender); |
BtnChangeCancel – Отменить – OnClick
// Если набор данных находился в режиме просмотра (при удалении записи), // то никаких действий метод Cancel не выполняет DataModule1.TableMatch.Cancel StateBrowse(Sender);
|
BtnClose – Закрыть – OnClick
Close;
|
cbCanEdit – OnClick
var bm1: TBookmark; . . . // Запоминание положения текущей записи bm1:=DataModule1.Ds_Match.Dataset.GetBookmark; // Отключение отображения изменений данных в визуальных компонентах DataModule1.Ds_Match.Dataset.DisableControls; If not cbCanEdit.Checked then begin DataModule1.TableMatch.Active:=false; DataModule1.TableMatch.ReadOnly:=true; DataModule1.TableMatch.Active:=true; // Блокировка элементов, связанных с переходом // в режиме изменения записей btnEdit.Enabled:=false; btnInsert.Enabled:=false; btnDelete.Enabled:=false; btnChangeCancel.Enabled:=false; btnChangeOK.Enabled:=false; lblChangeKind.Font.Color:=clBlue; lblChangeKind.Caption:='ПРОСМОТР ЗАПИСИ'; DBEDat.Enabled:=false; DBLHost.Enabled:=false; DBLGuest.Enabled:=false; end else begin DataModule1.TableMatch.Active:=false; DataModule1.TableMatch.ReadOnly:=false; DataModule1.TableMatch.Active:=true; // Разблокирование элементов, связанных с переходом // в режиме изменения записей btnEdit.Enabled:=true; btnInsert.Enabled:=true; btnChangeCancel.Enabled:=true; btnChangeOK.Enabled:=true; DBEDat.Enabled:=true; DBLHost.Enabled:=true; DBLGuest.Enabled:=true; // Если набор данных пуст, то удаление записей запрещено If DataModule1.Ds_Match.Dataset.RecordCount>0 then btnDelete.Enabled:=true else btnDelete.Enabled:=false; end; // Возврат в текущую запись If DataModule1.Ds_Match.Dataset.BookmarkValid(bm1) then DataModule1.Ds_Match.Dataset.GotoBookmark(bm1); If DataModule1.Ds_Match.Dataset.BookmarkValid(bm1) then DataModule1.Ds_Match.Dataset.FreeBookmark(bm1); // Включение отображения изменений данных в визуальных компонентах DataModule1.Ds_Match.Dataset.EnableControls; |
FormMatch – OnCreate
// Первоначально изменение записей запрещено cbCanEdit.Checked:=false; // Запрет автоматического перехода в режим редактирования DataModule1.DS_Match.AutoEdit:=false; DBGridMatch.Columns[0].ReadOnly:=True; |
FormMatch – OnShow
// Исходное состояние управляющих элементов StateBrowse(Sender);
|
