Мегаобучалка Главная | О нас | Обратная связь


Создание форм просмотра/корректировки таблиц и размещение в них визуальных компонент



2016-09-16 311 Обсуждений (0)
Создание форм просмотра/корректировки таблиц и размещение в них визуальных компонент 0.00 из 5.00 0 оценок




Будем придерживаться следующей технологии: из главной формы будем вызывать формы просмотра таблиц, а каждая такая форма будет вызывать форму корректировки (добавления и изменения) для соответствующей таблицы.

Формы просмотра будут содержать экземпляр компоненты TDBGrid со страницы Data Controls. TDBGrid используется для показа содержимого набора данных в табличной форме, когда строки соответствуют записям НД, а столбцыполям записи.

Так как редактирование таблиц будет проводиться путем нажатия кнопок, то свойство OptionsкомпонентыTDBGridдолжно иметь следующие значения:

dgEditing =falseне разрешать редактирование на самой визуальной таблице;

dgRowSelect =trueразрешать выбор строки для редактирования.

Кроме того, свойство ReadOnly нужно задать равным True, что означает запрет редактирования таблицы визуально.

Свойство TDataSourceкомпоненты TDBGridвыбирается равным одному из экземпляров TDataSource, соответствующим либо таблице TTable (если отображаются данные из одной таблицы), либо запросу TQuery(если отображаются данные из нескольких таблиц).

Для указания столбцов таблицы используется редактор столбцов. Для его вызова необходимо при нахождении курсора мыши в области таблицы нажать правую кнопку мыши и из контекстного меню выбрать пункт ColumnsEditor (рис. 98):

Рис. 98. Доступные столбцы таблицы

Порядок следования столбцов в TDBGrid определяется порядком следования определений столбцов в редакторе столбцов.

Свойства отдельного столбца устанавливаются в окне Object Inspector. Они определяют особенности отображения столбца в TDBGrid.

Установку заголовка выделенного столбца можно сделать, выбрав в групповом свойстве столбца Title свойство Caption (рис. 99).

Здесь же можно поменять шрифт и цвет подписи (Font), установить выравнивание (Alignment), видимость поля (Visible).

Поле Num_teacher следует сделать недоступным, для чего следует установить его свойство Visible равным False.

Рис. 99. Свойства столбца

Также на форме размещаются кнопки Добавить, Изменить, Удалить. После настройки форма учителей примет вид (рис. 100):

Рис. 100. Форма «Учителя»

В ее событии OnShow следует выполнить открытие таблицы БД:

 

DM.TTeacher.Open;//Открытие таблицы TTeacher

//NN: integer должно быть объявлено в модуле данных!

NN:=DM.PoiskMax(DM.TTeacher); //Вызов функции определения
//максимального существующего значения первичного ключа

 

В событии OnClose формы следует закрыть таблицу:

 

DM.TTeacher.Close;//Закрытие таблицы TTeacher

 

С событием OnClick кнопки Добавитьсвяжем процедуру вида:

 

procedure TTeacher.Button1Click(Sender: TObject);

begin

DM.TTeacher.Insert; //Перевод НД в состояние dsInsert

Edit_Teacher.ShowModal; //Вызов формы редактирования

end;

 

Функция определения максимального значения первичного ключа должна располагаться в модуле данных и иметь вид:

 

function TDM.PoiskMax(Table:TTable):Integer;

var N:integer;

begin

Table.First;//Переход на 1-ую запись, таблица должна быть открыта

N:=0;

while not Table.EOF do //пока не конец таблицы

begin

{поле с нулевым индексом – ключевое}

if Table.Fields.Fields[0].AsInteger>N then

//Сравнение значения первого поля (ключа) таблицы с максимумом

N:=Table.Fields.Fields[0].AsInteger;//Запоминание максимума

Table.Next;//переход к следующей записи

end;

PoiskMax:=N;

end;

 

Заголовок этой функции следует добавить в описание класса модуля данных:

type

TDM = class(TDateModule)

 

...

function PoiskMax(Table:TTable):Integer;

...

С событием OnClick кнопки Изменитьсвяжем процедуру вида:

 

procedure TFTeacher.Button2Click(Sender: TObject);

begin

if not DM.TTeacher.isEmpty then {таблица не пуста?}

begin

DM.TTeacher.Edit; //Перевод НД в состояние dsEdit

Edit_Teacher.ShowModal; //Вызов формы редактирования

end;

end;

 

С событием OnClick кнопки Удалитьсвяжем процедуру вида:

 

procedure TFTeacher.Button3Click(Sender: TObject);

begin

if not DM.TTeacher.isEmpty then {таблица не пуста?}

if MessageDlg('Подтвердите удаление записи',

mtConfirmation,[mbYes,mbNo],0)=mrYes then

begin

DM.TTeacher.Delete;//Удаление текущей записи таблицы

DM.TTeacher.Close; //Закрытие и открытие таблицы с тем,
// чтобы изменение отразилось на форме

DM.TTeacher.Open;

end;

end;

 

Форма редактирования должна содержать поля ввода для отображения и редактирования полей и, возможно, компоненты TDBLookupComboBoxдля выбора значений из связанной таблицы.

Например, для нашего примера форма редактирования учителей Edit_teacher может выглядеть так (рис. 101):

Рис. 101. Форма корректировки учителя

На форме размещена компонента TDBEdit, свойство DataSource которой следует установить равным DM.DSTeacher, а DataFieldFIO_teacher.

Проверьте, чтобы был подключен модуль DBв списке используемых модулей (uses), в нем описан метод dsInsert.

При нажатии кнопки должна произойти корректировка НД:

 

procedure TEdit_Teacher.Button1Click(Sender: TObject);

begin

if DM.TTeacher.State=dsInsert then

begin

//Получение следующего значения первичного ключа

NN:=NN+1;

DM.TTeacher.FieldByName('Num_teacher').AsInteger := NN;

End;

DM.TTeacher.Post;//Сохранение изменений

DM.TTeacher.Close; //Закрытие и открытие таблицы с тем,
// чтобы изменение отразилось в НД

DM.TTeacher.Open;

Close;//Закрытие формы редактирования

end;

 

При нажатии кнопки Отмена должна произойти отмена возможной корректировки НД:

 

procedure TEdit_Teacher.Button2Click(Sender: TObject);

begin

DM.TTeacher.Cancel;//Отмена изменений

Close;//Закрытие формы редактирования

end;

 

Аналогично создадим формы FClass,FPredmet,Edit_classиEdit_predmet.

Форма для отображения информации об учениках будет выглядеть следующим образом (рис. 102):

Рис. 102. Форма «Ученики»

DBGrid здесь связан с запросом DSQCl_pupil.

События, связанные с отображением формы и ее закрытием, будут теперь содержать следующий код:

 

procedure TFPupil.FormShow(Sender: TObject);

begin

DM.TPupil.Open;//Открытие таблицы учеников для редактирования

DM.TClass.Open;//Открытие таблицы классов для редактирования

DM.QCl_pupil.Open;//Открытие запроса

NN:=DM.PoiskMax(DM.TPupil);//Вызов процедуры определения //максимального существующего значения первичного ключа

 

end;

 

procedure TFPupil.FormClose(Sender: TObject; var Action: TCloseAction);

begin

DM.QCl_pupil.Close;//Закрытие запроса

DM.TPupil.Close;//Закрытие таблицы

DM.TClass.Close;//Закрытие таблицы

end;

 

Процедура, связанная с событием нажатия кнопки Добавить, содержит код для вставки новой записи непосредственно в таблицу Pupil:

 

procedure TFPupil.Button1Click(Sender: TObject);

begin

DM.TPupil.Insert; //Перевод НД в состояние dsInsert

Edit_Pupil.ShowModal; //Вызов формы редактирования

end;

 

Процедуры, связанные с событием OnClick кнопок ИзменитьиУдалить,будут немного отличаться для случаев, когда на форме отображается сама таблица и когда на форме отображается запрос. Для кнопки Изменить код следующий:

 

procedure TFPupil.Button2Click(Sender: TObject);

var v:integer;

begin

if not DM.QCl_pupil.isEmpty then {запрос не пуст?}

begin

//Запоминание ключевого поля текущей записи запроса

V:=DM.QCl_pupil.FieldByName('num_pupil').AsInteger;

DM.TPupil.First;//Установка таблицы на начало

//Поиск в таблице записи с определенным значением ключа

DM.TPupil.Locate('num_pupil',V,[]);

DM.TPupil.Edit; //Перевод НД в состояние dsEdit

Edit_Pupil.ShowModal; //Вызов формы редактирования

end;

end;

 

Код для кнопки Удалить:

 

procedure TFPupil.Button3Click(Sender: TObject);

var v:integer;

begin

if not DM.QCl_pupil.isEmpty then {запрос не пуст?}

if MessageDlg('Подтвердите удаление записи',

mtConfirmation,[mbYes,mbNo],0)=mrYes then

begin

//Запоминание ключевого поля текущей записи запроса

V:=DM.QCl_pupil.FieldByName('num_pupil').AsInteger;

DM.TPupil.First;//Установка таблицы на начало

//Поиск в таблице записи с определенным значением ключа

DM.TPupil.Locate('num_pupil',V,[]);

DM.TPupil.Delete;//Удаление текущей записи таблицы

DM.TPupil.Close;//Переоткрытие таблицы

DM.TPupil.Open;

DM.QCl_pupil.Close;//Закрытие и открытие запроса с тем,

DM.QCl_Pupil.Open;// чтобы изменение отразилось на форме

end;

end;

 

Форма редактирования таблицы, у которой есть поля связи с другими таблицами (для нашего примера это ученики) имеет вид (рис. 103):

Рис. 103. Форма редактирования ученика

Компонеты DBEdit1 и DBEdit2 свяжем с источником данных (свойство DataSource) DSPupil, свойство DataField компонент установим равным FIO_pupilи ball соответственно.

Компонента TDBLookupComboBox применяется для выбора значений в поле одного набора данных (назовем его НД1) из списка значений, источником которого служат значения какого-либо поля из другого набора данных (НД2).

Например, в нашей форме редактирования учеников компонента TDBLookupComboBox будет служить для отображения списка классов из таблицы Class и требует следующей настройки:

cвойство DataSource= DSPupil (связан с НД1),

DataField = num_class (содержит поле НД1, в которое будет помещаться значение из НД2),

ListSource = DSClass (определяет НД2),

ListField = nameclass (определяет поля НД2, значения которых будут показываться в списке выбора; по умолчанию равно значению свойства KeyField),

KeyField = num_class (устанавливает поле связи между НД1 и НД2).

 

Событие OnShow такой формы содержит следующий код:

 

procedure TEdit_Pupil.FormShow(Sender: TObject);

begin

//Если нажата кнопка "Добавить"

if DM.TPupil.State=dsInsert then

//Установка на первую строку списка классов

DBLookupComboBox1.KeyValue:=1;

end;

 

При нажатии кнопки Ok на форме редактирования добавляемые или изменяемые данные должны попасть в таблицу и отобразиться на форме просмотра:

 

procedure TEdit_Pupil.Button1Click(Sender: TObject);

begin

if DM.TPupil.State=dsInsert then

//Получение следующего значения первичного ключа

begin

NN:NN+1;

DM.TPupil.FieldByName('Num_pupil').AsInteger := NN;

End;

DM.TPupil.Post;//Сохранение изменений

DM.TPupil.Close; //Закрытие и открытие таблицы с тем, чтобы изменение отразилось в НД

DM.TPupil.Open;

DM.QCl_pupil.Close;//Закрытие запроса

DM.QCl_pupil.Open;//Открытие запроса

Close;//Закрытие формы

end;

 

Остается показать, как отображать и изменять данные связующей таблицы, созданной для реализации связи «Многие ко многим» (в нашем примере это таблица Teach_Pred).

Форма с компонентой DBGrid, связанной с запросом DSQT_Pred, выглядит следующим образом (рис. 104):

Рис. 104. Форма «Учителя-предметы»

События OnShow и OnClose такой формы содержат код для активизации/деактивизации запроса и связанных таблиц:

 

procedure TFTeach_pred.FormShow(Sender: TObject);

begin

DM.QT_Pred.Open;//Открытие запроса

DM.TPredmet.Open;//Открытие таблицы предметов

DM.TTeacher.Open;//Открытие таблицы учителей

DM.TTeach_Pred.Open;//Открытие связующей таблицы

end;

 

procedure TFTeach_pred.FormClose(Sender: TObject;

var Action: TCloseAction);

begin

DM.QT_Pred.Close;//Закрытие запроса

DM.TPredmet.Close;//Закрытие таблицы предметов

DM.TTeacher.Close;//Закрытие таблицы учителей

DM.TTeach_Pred.Close;//Закрытие связующей таблицы

end;

 

Реакция на нажатие кнопки Добавить:

 

procedure TFTeach_pred.Button1Click(Sender: TObject);

begin

DM.TTeach_pred.Insert; //Перевод НД в состояние dsInsert

Edit_T_pred.ShowModal; //Вызов формы редактирования

end;

 

Реакция на нажатие кнопки Изменить:

 

procedure TFTeach_pred.Button2Click(Sender: TObject);

var

v1,v2:integer;

begin

if not DM.QT_Pred.isEmpty then {запрос не пуст?}

begin

//Запоминание ключевых полей текущей записи запроса

V1:=DM.QT_Pred.FieldByName('num_teacher').AsInteger;

V2:=DM.QT_Pred.FieldByName('num_predmet').AsInteger;

DM.TTeach_pred.First;//Установка таблицы на начало

//поиск записи по составному ключу

DM.TTeach_pred.FindKey([v1,v2]);

DM.TTeach_pred.Edit; //Перевод НД в состояние dsEdit

Edit_T_pred.ShowModal; //Вызов формы редактирования

end;

end;

 

Реакция на нажатие кнопки Удалить:

 

procedure TFTeach_pred.Button3Click(Sender: TObject);

var

v1,v2:integer;

begin

if not DM.QT_Pred.isEmpty then {запрос не пуст?}

if MessageDlg('Подтвердите удаление записи',

mtConfirmation,[mbYes,mbNo],0)=mrYes then

begin

//Запоминание ключевых полей текущей записи запроса

V1:=DM.QT_Pred.FieldByName('num_teacher').AsInteger;

V2:=DM.QT_Pred.FieldByName('num_predmet').AsInteger;

DM.TTeach_pred.First;//Установка таблицы на начало

DM.TTeach_pred.FindKey([v1,v2]);//поиск записи по ключу

DM.TTeach_pred.Delete;//Удаление текущей записи таблицы

DM.TTeach_pred.Close;//Переоткрытие таблицы

DM.TTeach_pred.Open;

DM.QT_pred.Close;//Закрытие и открытие запроса с тем,

DM.QT_pred.Open; чтобы изменение отразилось на форме

end;

end;

 

Форма для редактирования предметов учителей и их нагрузки по ним может выглядеть следующим образом (рис. 105):

Рис. 105. Форма редактирования предметов

DBEdit1 связан с полем Nagruzka таблицы Teach_pred.

DBLookupComboBox1 показывает фамилии учителей из таблицы Teacher.

DBLookupComboBox2 показывает список предметов из таблицы Predmet.

Компоненты настраиваются аналогично их настройке для формы редактирования учеников.

С событием отображения формы редактирования таблицы «предмет-учитель» свяжем следующий код:

 

procedure TEdit_t_pred.FormShow(Sender: TObject);

begin

//если нажата кнопка "Добавить"

if DM.TTeach_pred.State=dsInsert then

begin

//Установка списков на первые записи списка

DBLookupComboBox1.KeyValue:=1;

DBLookupComboBox2.KeyValue:=1;

end;

end;

 

Реакция на нажатие кнопки ОК на форме редактирования:

 

procedure TEdit_t_pred.Button1Click(Sender: TObject);

var v1,v2:integer;

begin

//Запоминание ключевого поля текущей записи таблицы

//Teacher после выбора учителя из списка

V1:=DM.TTeacher.FieldByName('num_teacher').AsInteger;

//Запоминание ключевого поля текущей записи таблицы
//Predmet после выбора предмета из списка

V2:=DM.TPredmet.FieldByName('num_predmet').AsInteger;

//Установка ключевых полей для связующей таблицы

DM.TTeach_pred.FieldByName('num_teacher').Value:=v1;

DM.TTeach_pred.FieldByName('num_predmet').Value:=v2;

DM.TTeach_pred.Post;//Сохранение изменений в таблице

DM.TTeach_pred.Close; //Закрытие и открытие таблицы с тем, чтобы изменение отразилось в НД

DM.TTeach_pred.Open;

DM.QT_Pred.Close;//Переоткрытие запроса

DM.QT_Pred.Open;

Close;

end;

 

Для отображения записей НД также можно использовать следующие визуальные компоненты:

TDBText применяется для показа значения текстового поля текущей записи НД. Изменять значение, показываемое при помощи данной компоненты, нельзя.

TDBListBox применяется, когда нужно выбрать значение поля из списка возможных значений.

TDBComboBox – аналогичен компоненте TDBListBox, за исключением того, что в режиме dsBrowse текущее значение поля показывается аналогично TDBEdit, а в режимах dsInsert и dsEdit появляется выпадающий список.

TDBMemo предназначен для показа многострочных полей комментариев (мемо-полей).

TDBRadioGroup служит для представления фиксированного набора возможных значений поля при помощи группы зависимых переключателей. Количество и названия вариантов возможных значений поля определяются в свойстве Items: TString.

TDBCheckBox обладает функциональностью стандартной компоненты TСheckBox (используется для отображения логических полей), но источником данных и их приемником для него служит поле НД.

Рассмотрим использование последнего компонента подробнее. Пусть, например, таблица содержит поле логического типа уценка Uzenka. Требуется выводить '+', если значение поля равно True.

Такая функциональность реализуется в следующем обработчике события OnGetText (наступает перед показом содержимого каждой записи в визуальных компонентах) для поля Uzenka:

 

Procedure Tform1.TableUzenkaGetText(Sender: TField; var Text: String; DisplayText: Boolean);

Begin

If DisplayText and Table1Uzenka.Value = True then Text := '+';

End;

 

Возможна связь с символьным полем с помощью свойств
ValueChecked и ValueUnChecked:

 

DBCheckBox1.ValueChecked := 'True;Yes;On;Да;Д';

DBCheckBox1.ValueUnChecked := 'False;No;Off;Нет;Н';

 



2016-09-16 311 Обсуждений (0)
Создание форм просмотра/корректировки таблиц и размещение в них визуальных компонент 0.00 из 5.00 0 оценок









Обсуждение в статье: Создание форм просмотра/корректировки таблиц и размещение в них визуальных компонент

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (311)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)