Разработка приложения в Delphi

 

Запустим Delphi и создадим новый проект (File\New\Application). Сохраним новый проект под название «ElJur», первую форму сохраним под именем «Main». Теперь нужно найти страницу с установленными компонентами. С нее нам понадобятся 3 компоненты: Adocommand, AdoConnection и AdoDataSet (расположены они на вкладке ADO). После того как мы нашли установленные компоненты нужно создать форму, на которой будут находиться все не визуальные компоненты. В качестве такой формы используем Data Module (File\New\Data Module), сохраним его под именем «datm» а само имя изменим на «dm». Все это делается для простоты обращение к данной форме в будущем. После того как мы добавили в наш проект Data Module, поместим на него нашу компоненты для подключения к базе данных (AdoConnection), после чего переименуем ее в «Conn». Выделим этот компонент и найдем в Object Inspector, после чего увидим оно изображенное на рисунке 5.

 

Рисунок 5 – «Соединение с БД»

 

В поле ConnectionString жмем на «…» после чего появится окно, изображенное на рисунке 6.

Рисунок 6 – «Использование строки соединения для подключения к базе»

 

После этого жмем на кнопку «Build» и в появившемся окне выбираем то что изображено на рисунке 7.

Рисунок 7 – «Выбор провайдера для подключения к БД»

 

После этого жмем «ОК» и увидим окно, изображенное на рисунке 8 и в строке «Выберите или введите базу данных» нажмите на «…».

Рисунок 8 – «Установление связи с БД»

 

После этого выберите БД и нажмите «Открыть» после чего окно измениться на то, что изображено на рисунке 9.

Рисунок 9 – «Установленное соединение с БД»

 

После этого появится следующее окно с прописанным путем к файлу базы данных. Для удобной работы программы с базой данных нужно немного изменить путь к БД. На рисунке 10 изображено подключение к заполненной «ConnectionString».

Рисунок 10 – «Подключение к БД с прописанной строкой подключения»

 

Значение «Source» в данном случае равно «D:\Access+Delphi\Программа\BD_ElJur.mdb;». Изменим его на «BD_ElJur.mdb;». и нажмем «ОК».

Проверить подключение можно присвоив свойству Connected (в Object Inspector) значение TRUE. Если не выдало никаких ошибок, то подключение прошло успешно.

После того как мы убедились, что мы можем подключиться к БД, приступим к разработке приложения. Сначала изменим имя первой формы с «Form1» на «FMain». После этого нужно сделать так чтобы размещенные нами компоненты на Data Module были доступны и на форме «FMain». Для этого найдем в коде этой формы надпись «implementation» и ниже нее нужно написать «uses Datm;» (в этом месте мы перечисляем все формы, с которыми будем взаимодействовать этой формы). Теперь нам нужно сделать так чтобы при запуске приложения автоматически шло соединение с базой данных. Для этого нужно, выделив форму, перейти в «Object Inspector» и там перейти на вкладку «Events» и найти событие «OnShow» и дважды щелкнуть правее. После этого мы перейдем в код, где нужно написать: «dm.Conn.Connected:=true;». Теперь при запуске программы будет происходить подключение к базе данных (конечно можно сделать, чтобы сам пользователь из программы сначала вводил параметры подключения, такие как password, name и host, но для простоты мы сделаем, так как указано выше).

Первая форма не будет содержать никаких данных из БД, с нее мы будем выходить на другие формы, на которых уже и будут данные.

Для доступа к формам используем компонент «MainMenu» с вкладки «Standart». Поместим этот компонент на «Data Module» и переименуем его в «MM». При создании БД мы отмечали, что есть вспомогательные таблицы и основные мы и сейчас произведем деление таблиц. Перейдем на форму «Data Module» и дважды щелкнем по компоненту «MainMenu». Нужно ввести название таблиц, так как изображено на рисунке 11.

 

 

Рисунок 11 – «Таблицы»

 

После этого перейдем на форму «FMain» и в «Object Inspector» найдем «Menu» и там выберем «DM.MM» После чего ваша главная форма должна стать похожа на ту что изображена на рисунке 12.

 

 

Рисунок 12 – «Внешний вид главной формы»

 

В дальнейшем эта форма еще измениться, но это будет потом, а сейчас мы ее оставим в таком виде.

Теперь приступим к созданию форм, на которых будут находиться данные из справочников. Начнем с формы преподавателей. Создадим новую форму и сохраним ее под именем «Prep» и зададим имя форме «FPrep». На форму «DM» поместим следующие компоненты: «ADODataSet» с вкладки «ADO», «DataSource» с «Data Access» и «ImageList» с «Win32» и переименуем их в «Pr», «SPr» и «IL» соответственно. Теперь выделим компонент «Pr» и в «Object Inspector» в свойстве «Connection» выберем «Conn» так как показано на рисунке 13. С помощью данного компоненты мы будем обращаться к базе данных, и выполнять определенные запросы.

Рисунок 13 – «Соединение компонентов»

 

После нужно выделить компонент «Spr» и в «Object Inspector» в свойстве «DataSet» выберем «Pr» так как показано на рисунке 14. С помощью данного компонента мы будем передавать данные в визуальную таблицу.

Рисунок 14 – «Соединение компонентов»

 

Вернемся теперь к созданной нами форме «FPrep» на нее нам нужно поместить таблицу, кнопки, с помощью которых будет происходить редактирование таблиц и поля, из которых будут браться данные. Вариантов расположения объектов очень много, мы представим вам один из них. Сначала сделаем заготовку. Разместим на форме 3 компонента: «ToolBar» с вкладки «Win32» и два компонента «Panel» с вкладки «Standart». На первом компоненте свойство «Align» установим в положение «Bottom» а во втором в положение «Client». Так же переименуем первый компонент в «p2». На компоненте «ToolBar» щелкнем правой кнопкой мыши и добавим 3 кнопки «New button», кнопки можно разделять, чтобы они не стояли рядом друг с другом с помощью команды «New Separator». В итоге должна получиться форма, изображенная на рисунке 15 (или похожая на нее). Теперь разместим на нее следующие компоненты: «DBGrid» с вкладки «Data Control», «Edit» с вкладки «Standart» и две кнопки «BitBtn» с вкладки «Additional» (кнопки можно брать и другие, но в данном примере мы будем использовать эти). У нас есть две панели с именами «Panel1» и «p2». «DBGrid» разместим на «Panel1» и свойство «Align» установим в положение «Client». Компонент «Edit1» переименуем в «e1» (очистим свойство компонента «Text») и разместим его на панель «p2» вместе с двумя кнопками «BitBtn». В итоге должна получиться форма, изображенная на рисунке 16 (или похожая на нее).

 

Рисунок 15 – «Заготовка формы 1»

 

Рисунок 16 – «Заготовка формы 2»

 

Теперь зайдем в код формы и подключим другие формы, так как мы это делали ранее (нужно написать: «uses datm,main;»).

После этого выберем компонент «DbGrid1» и в его свойстве «DataSourse» выберем «spr».

Теперь перейдем на форму «Fmain» на ней в меню выберем пункт «Справочники» и выберем «Преподаватели» после чего мы автоматически перейдем в код, там нужно набрать:

 


dm.pr.Active:=false;

dm.pr.CommandText:='Select * FROM Prep';

dm.pr.Active:=true;

Fprep.ShowModal;

 


 

Можете запустить приложение и проверить то при нажатии на «Преподаватели» вызывается форма «Fprep» но выглядит таблица некрасиво. Сейчас мы это изменим. Перейдем на форму «DM» выберем компонент «Conn» и свойство «Connected» установим в «True». Выделим компонент «» и в свойстве «» наберем «Select * FROM Prep»,а свойство «Active в «True». Теперь, если мы посмотрим на форму «Fprep» то увидим, что табличка на ней активна. Перейдем на эту форму и дважды щелкнем по компоненту «DBGRID1». Увидим форму изображенную на рисунке 17. Теперь два раза нажмем на кнопку обведенную, на рисунке 17. Выделим «0 - TColumn» и в «Object Inspector» сделаем те изменения что указаны на рисунке 18. Изменния для «1 - TColumn» показаны на рисунке 19.

Рисунок 17 – «Изменение внешнего вида таблицы»

 

Рисунок 18 – «Настройка DBFrid 1»

 

Рисунок 19 – «Настройка DBFrid 2»

 

Теперь таблица приняла, более ли менее нормальный вид. Теперь перейдем к заполнению нашей таблицы и редактированию данных. Панель «P2» всегда отображаться не должна, поэтому в ее свойстве «Visible» выберем «False». То, что панель больше не отображается можно проверить, запустив программу и открыв форму «Преподаватели».

Дважды щелкнем по первой из кнопок на «Toolbar» и добавим следующий код (в дальнейшем будем называть эту кнопку «Добавить»):

 


e1.Text:=''; //Очищаем поле ввода

p2.Visible:=true; //Делаем видимой панель "P2"


Теперь изменим свойства «Caption» в «BitBtn» (обеих). Первую кнопку назовем «Подтвердить», а вторую «Отмена». В свойствах кнопок «Kind» установить «bkOK» и «bkCancel» а в свойстве «Modal Result» установить «mrNone». На форму «FMain» добавим глобальную переменную «Ed», тип данных – integer. Должно получиться следующее:

Var

FMain: TFMain;

ed:integer;

Теперь вернемся на форму «Преподаватели» и добавим еще одну строчку в код первой кнопки из «ToolBar». Ed:=1; Теперь на форму «DM» поместим еще один компонент «Adodataset» и переименуем его в «TEMP4» и подключимся к «Conn». Теперь дважды щелкнем по второй кнопке из «ToolBar» и туда добавим код(в дальнейшем будем называть эту кнопку «Изменить»):

 


e1.Text:=dm.pr.Fields[1].AsString; //Очищаем поле ввода

p2.Visible:=true; //Делаем видимой панель "P2"

Ed:=2;//Режим редактирования записи

 


Теперь добавим код в действие кнопки «Отмена». Код будет следующий:

 


e1.Text:='';

p2.visible:=false;

 


 

Теперь дважды щелкнем по кнопке с надписью «Подтвердить» и напишем следующий код:

 


{1}if e1.Text='' then showmessage ('Вы не заполнили все поля')

{2}else

{3} begin

{4} if ed=1 then

{5} begin

{6} dm.TEMP4.Active:=false;

{7} dm.TEMP4.CommandText:='Select * FROM Prep WHERE (fio_pr = "'+TRIM(e1.Text)+'")';

{8} dm.TEMP4.Active:=true;

{9} if dm.TEMP4.Fields[0].AsString<>'' then

{10} begin

{11} showmessage('Данная запись уже есть в БД');

{12} exit;

{13} end

{14} else

{15} begin

{17} dm.COM.CommandText:='INSERT INTO Prep (fio_pr) values ("'+TRIM(e1.Text)+'")';

{18} dm.COM.Execute;

{19} showmessage('Запись добавлена');

{20} e1.Text:='';

{21} dm.pr.active:=false;

{22} dm.pr.Active:=true;

{23} BitBtn2Click(Sender);

{24} end;

{25} end

{26} else

{27} begin

{28} dm.TEMP4.Active:=false;

{29} dm.TEMP4.CommandText:='Select * FROM Prep WHERE (fio_pr = "'+TRIM(e1.Text)+'")';

{30} dm.TEMP4.Active:=true;

{31} if dm.TEMP4.Fields[0].AsString<>'' then

{32} begin

{33} if dm.TEMP4.Fields[0].AsString <>dm.pr.Fields[0].AsString then

{34} begin

{35} showmessage('Данная запись уже есть в БД');

{36} exit;

{37} end;

{38} end

{39} else

{40} begin

{42} dm.com.CommandText:='Update Prep SET fio_pr = "'+TRIM(e1.Text)+'" WHERE id_pr = '+dm.pr.Fields[0].AsString+'';

{43} dm.com.Execute;

{44} showmessage('Запись изменена');

{45} e1.Text:='';

{46} dm.pr.active:=false;

{47} dm.pr.Active:=true;

{48} BitBtn2Click(Sender);

{49} end;

{50} end;

{51} end;

 


Представленный выше код представляет собой код добавления и изменения записи. Какая именно часть кода будет выполняться, зависит от значения переменной «ed». Если она равна 1, то выполниться добавление если же 2, то тогда будет выполняться код изменения.

Теперь поясним что тут написано построчно.

{1}. В данной строке мы поверяем, заполнены ли обязательные поля. В данном примере разобран случай, когда такое поле одно если же их несколько, то код может выглядеть следующим образом:

if (e1.text='') OR (e2.text='') OR … then showmessage('Введены не все параметры ')

{4} идет поверка, в каком режиме должен работать алгоритм (добавление или изменение)

{6} - {13} Проверка на наличие в БД записей аналогичных той что мы пытаемся внести.

{6} Мы отключаем набор данных, т.к. во включенном режиме нельзя задавать новые запросы.

{7} Набору данных присваиваем новый запрос, а именно «Выбрать все записи из таблицы «Prep» где «fio_pr» равняется введенной нами Ф.И.О.»

{8} Включаем набор данных тем самым, выполняя запрос.

{9} Проверяем, есть ли в БД хоть одно совпадение с введенной нами фамилией.

{10} - {13} Если есть, то выводим сообщение об этом и прекращаем выполнение данной процедуры.

{14} - {15} если совпадений нет, то продолжаем дальше выполнение кода.

{17} Задаем новый запрос, а именно «Вставить в таблицу «Prep» а именно в поля «fio_pr» следующие значения: Ф.И.О.». С помощью функции TRIM мы убираем пробелы до и после Ф.И.О. преподавателя.

{18} Выполняем SQL-запрос.

{19} Показываем сообщение о том, что добавление записи прошло успешно.

{20} Очищаем поля для ввода данных.

{21} - {22} Перезагружаем, набор данных, для того чтобы он смог отобразить произошедший изменения.

{23} Выполнение процедуры нажатия кнопки «Отмена»

{27} С данного места начинается выполнение кода для изменения записи (если переменная «ed» равна 2).

{28} - {38} проверка на наличие в БД информации аналогичной той, что мы вводим.

{39} -{40} если совпадений не обнаружено, то выполняется дальнейший код

{41} отключаем набор данных.

{42} Задаем новый запрос, а именно «Изменить таблицу «Prep», а именно значение «fio_pr» на Ф.И.О., где код преподавателя равен коду выделенной записи».

{43} Выполняем запрос.

{44} - {48} аналогично с {19} - {23}.

 

Теперь можно поставить защиту на кнопку «Изменить». Данная защита будет проверять наличие данных для изменения. Код будет выглядеть следующим образом.

 


If dm.pr.Fields[0].AsString='' then

Begin

showmessage('Нет данных для изменения');

exit;

end;

 


Данный код нужно вставить перед тем, что уже есть в кнопке «Изменить».

Теперь дважды нажмем на 3-ью кнопку с панели «ToolBar». В дальнейшем будем назвать эту кнопку «Удалить».

 


If application.MessageBox('Вы хотите удалить запись?','Удаление', mb_yesno+mb_iconquestion)=idyes then

Begin

dm.TEMP4.CommandText:='DELETE Prep FROM Prep WHERE id_pr = "'+dm.pr.Fields[0].AsString+'"';

dm.TEMP4.Execute;

showmessage('Удаление прошло успешно');

dm.pr.Active:=false;

dm.pr.Active:=true;

end;

 


 

Также перед этим кодом вставим защиту, такую же, как и на кнопке «Изменить». Теперь сделаем так чтобы наши кнопки и внешне говорили нам о своем назначении. Для этого выберем «ToolBar» и найдем свойство «Images» и в нем выберем «Dm.il». После чего зайдем ан «DM» и дважды щелкнем по «ImageList» и добавим нужные иконки. После чего вернемся на форму преподаватели и выберем «ToolBar». Теперь нужно выделить кнопку и в свойстве «Image» выбрать, необходим рисунок. В итоге должно получиться примерно то, что изображено на рисунке 20. Также переименуем саму форму, в свойстве «Caption» напишем «Преподаватели».

Рисунок 20 – «Форма «Преподаватели»

 

Первая форма практически готова, мы внесем в нее еще изменения, но это будет чуть позже. Теперь нужно разработать остальные формы, но это вы уже сделаете сами по аналогии с приведенным выше примером. Вам будет представлено только несколько примеров разработки некоторых элементов форм, которые не были использованы в форме «Преподаватели».

После того как мы закончим создавать справочники у вас должно получиться нечто похожее на то, что изображено на рисунке 21 для формы «Национальность», на рисунке 22 для формы «Учебная группа», на рисунке 23 для формы «Тип занятия» и на рисунке 24 для формы «Звание».

 

Рисунок 21 – «Национальность»

Рисунок 22 – «Учебная группа»

Рисунок 23 – «Тип занятия»

Рисунок 24 – «Звание»

 

После того как созданы справочники, мы начинаем создавать основные формы. Первой из таких форм будет «Кадры». И тут нужно будет пояснить некоторые моменты, а именно связывание таблиц и использование выпадающих списков (даны для них будут браться из заранее созданных нами справочников.). Форма «Кадры» будет использовать 3 справочника: «Национальность», «Учебная группа» и «Звание».

Для связывания нашей основной формы со справочниками запрос в том виде что мы делали ранее не подойдет, т.к. тогда будут выведены на экран не название национальности или звания а их коды. Это не является информативным и будет путать пользователя. Поэтому нам нужно чтоб вместо кодов, которых хранятся в таблицы «Кадры» выводились названия. Для этого для вызова таблицы используем следующий запрос:

«Select id_st,fio_st,nazv_n,nazv_ug,nazv_zv FROM kadri,nac,uchgr,zvanie WHERE (id_n = id_nc_st) AND (id_ug = id_ug_st) AND (id_zv = id_zv_st)».

Как видно в запросе мы берем поля не только из таблицы «kadri» но и из других, т.е. мы берем необходимые нам названия учебной группы, звания и т.д. В блоке «FROM» мы перечисляем все таблицы, данные из которых мы хотим увидеть, а в блоке «WHERE» связываем коды, хранящиеся в таблицы «kadri» с ключевыми полями наших справочников благодаря этому в таблицу выводятся не коды, а названия.

 

Сейчас мы разберем, как заполнять выпадающие списки из этих справочников. Способов для этого несколько, но мы рассмотрим 1, другие вы можете рассмотреть самостоятельно и в дальнейшем использовать тот, что вам больше понравится. Ниже приведен код для заполнения выпадающего списка («Combobox» на вкладке «Standart», в нашем случаем имя этого выпадающего списка «cb1»).

 


{1}dm.TEMP4.Active:=false;

{2}dm.TEMP4.CommandText:='select * FROM nac ORDER by id_n';

{3}dm.TEMP4.Active:=true;

While not dm.TEMP.Eof do

Begin

{6} fkadr.cb1.Items.Add(dm.TEMP4.Fields[1].AsString);

{7} dm.TEMP.Next;

{8} end;

 


 

{1} Мы отключаем набор данных (делаем его неактивным).

{2} Мы задаем запрос для набора данных. Обратите внимание, в запросе используется команда «Order BY». Она используется для сортировки по определенному полю.

{3} Мы выполняем запрос, сделав набор данных активным.

{4} Цикл. Пока не достигнут конец набора данных.

{6} Добавить новую запись в выпадающий список.

{7} перейти на следующую запись набора данных.

 

Данный код целесообразно разместить в кнопку, которая вызывает форму «Кадры». Т.к. вызываться форма может часто то нам надо очищать выпадающий список каждый раз перед его заполнением. Для очищения набора данных можно использовать следующий код: «cb1.clear;». Для того чтобы нельзя было в выпадающие списки самому заносить данные нужно поставить защту от этого. Нужно зайти в событие «OnKeyPress» и добавить туда следующий код: «key:=#0;»

 

Теперь нужно осуществить следующие действия:

В том месте где мы описывали переменную «ed» описать еще 3 переменных «id_n, id_ug, id_zv» и задать для них тип «string». У на уже должна быть готова форма «Кадры» и внешний вид у нее должен быть примерно такой как на рисунке 25.

 

Рисунок 25 – «Форма «Кадры»

 

Выделим компонент «Combobox» для «Национальность» и в «Events» данного компонента в «OnClick» добавить следующий код:

 


dm.TEMP4.Active:=false;

dm.TEMP4.CommandText:='Select id_n FROM nac WHERE nazv_n = "'+cb1.Text+'"';

dm.TEMP4.Active:=true;

id_n:=dm.temp.fields[0].asstring;

 


Как видно, после того как мы выбираем что-то из выпадающего списка, выполняется код, приведенный выше, в котором производится поиск кода выбранной нами записи и присвоение этого кода переменной. Для того чтобы каждый раз не писать данный код каждый раз когда он нужен можно заменить его одной строчкой: «cb1Click(Sender);». Эта команда выполнит процедуру нажатия выбора из списка чего-то. После того как мы закончили работать с формой нужно «обнулить» наши переменные «id_n, id_ug, id_zv». Это можно сделать в коде кнопки «Отмена». Пример: «id_n:='';» и так для каждой переменной.

В итоге кнопка «Изменить» будет выглядеть следующим образом:

 


{+Proverka}

If dm.st.Fields[0].AsString='' then

Begin

showmessage('Нет данных для изменения');

exit;

end;

{-Proverka}

ed:=2;

p1.Visible:=true;

e1.Text:=TRIM(dm.st.Fields[1].AsString);

cb1.Text:=TRIM(dm.st.Fields[2].AsString);

cb2.Text:=TRIM(dm.st.Fields[4].AsString);

cb3.Text:=TRIM(dm.st.Fields[3].AsString);

cb1Click(Sender);cb2Click(Sender);cb3Click(Sender);

 


 

А кнопка «Подтвердить» следующим:

 


{1}if (e1.Text='') OR (id_n='') OR (id_ug='') OR (id_zv='') then showmessage ('Вы не заполнили все поля')

Else

Begin

{4} if ed=1 then

Begin

{6} dm.TEMP4.Active:=false;

{7} dm.TEMP4.CommandText:='Select * FROM kadri WHERE (fio_st = "'+TRIM(e1.Text)+'") AND (id_nc_st = '+id_n+') AND (id_ug_st = '+id_ug+') AND (id_zv_st = '+id_zv+')';

{8} dm.TEMP4.Active:=true;