Рис 16 – Изменить имя учителя
procedure TForm_edit_teacher.Button1Click(Sender: TObject); // Кнопка сохранить
var
//f:textfile;
s:string;
begin
s:=edit1.Text;
if s='' then
ShowMessage ('Нельзя ввести пустое поле!')
else
if FileExists('db\teach_pr\' + s + '.db') then
ShowMessage ('Такой учитель уже есть!')
else
begin
RenameFile('db\teach_pr\' + Form_zavych.edit_tchr + '.db', 'db\teach_pr\' + s +'.db' );
Form_Zavych.ListBox_teacher(Sender);
Form_Zavych.ComboBox_teacher(Sender);
close;
end;
end;
Рис 17 – Кнопка сохранить
Кнопка «Закрепить за учителем предмет».
procedure TForm_Zavych.Button2Click(Sender: TObject);// Закрепить за учителем предмет!
begin
if (ListBox1.ItemIndex < 0 ) then ShowMessage ('Выберите учителя!') else
begin
edit_tchr:= ListBox1.Items[ListBox1.ItemIndex];
Form_teacher_pr.showmodal;
end;
end;
Рис 18 – Закрепить за учителем предмет
В Combobox есть подготовленный список предметов в поле Edit есть возможность изменить или сохранить свое название. При нажатии кнопки Добавить/Удалить данные вносятся в listbox.
procedure TForm_teacher_pr.Button3Click(Sender: TObject); // удалить
begin
begin
Form_danger.show ;
Form_Zavych.danger:=5;
end;
end;
if Form_Zavych.danger=5 then begin
Form_teacher_pr.Button3Click_1 (Sender);
close;
end;
procedure TForm_teacher_pr.Button3Click_1(Sender: TObject); // удалить
begin
if ListBox1.ItemIndex >= 0 then
ListBox1.Items.Delete(ListBox1.ItemIndex);
end;
procedure TForm_teacher_pr.Button1Click(Sender: TObject); //добавить
var
i,j:integer; begin
j:=0;
if Edit1.Text='' then begin
ShowMessage ('Нельзя ввести пустое поле!');
j:=1;
end else
for i:=0 to ListBox1.Items.Count-1 do begin
if ListBox1.Items[i] = Edit1.Text then begin
ShowMessage ('Такой предмет уже есть!');
j:=1;
end
end;
if j<>1 then
ListBox1.Items.addText(Edit1.Text);
end;
Рис 19 – Схема кнопка добавить
procedure TForm_teacher_pr.Button4Click(Sender: TObject); //Сохранить
begin
ListBox1.Items.SaveToFile('db\teach_pr\' + Form_zavych.edit_tchr + '.db');
Form_Zavych.ComboBox_teacher(Sender);
end;
Блок для управления списком класс ученики:
Рис 20 – Блок класс/ученики
Реализован по тому же принципу, как и блок (учитель/предмет).
Рис 21 – Редактировать список класса
Вся Работа данного блока построена на тех же алгоритмах что описаны выше.
Блок для входа в журнал:
Реализован при помощи ряда combobox-ов информация в них загружается при открытии формы, а также при редактировании данных
procedure TForm_Zavych.ComboBox_kl_1(Sender: TObject); // При открытии
var
tsr : tsearchrec;
s : string;
begin
ComboBox5.Clear;
if FindFirst('db\person_kl\' + '*.*',faAnyFile,tsr) = 0 then
repeat
s:= tsr.name;
if s <> '.' then
if s <> '..' then
begin
S:=StringReplace(s, '.db', '', [rfReplaceAll]);
ComboBox5.Items.Add(s);
end;
until FindNext(tsr) <> 0;
FindClose(tsr);
end;
Рис 22 Схема загрузки данных в CB; Блок открытия журнала.
Кнопка открыть журнал:
procedure TForm_Zavych.BitBtn2Click(Sender: TObject); // Открыть журнал
begin
if Combobox1.ItemIndex < 0 then ShowMessage ('Выберите учителя!') else
if Combobox2.ItemIndex < 0 then ShowMessage ('Выберите учителя и его предмет!')else
if Combobox3.ItemIndex < 0 then ShowMessage ('Выберите класс!') else
if Combobox4.ItemIndex < 0 then ShowMessage ('Выберите четверть!') else
begin
Form_jurnal.teacher_j:= Combobox1.text;
Form_jurnal.predmet_j:= Combobox2.text;
Form_jurnal.klass_j:= Combobox3.text ;
Form_jurnal.quarter_j:=Combobox4.text ;
Form_jurnal.Showmodal;
end;
end;
Блок для открытия отчета:
Рис 23 – Блок для открытия отчета ученика
Заполнение и ComboBox-ов реализовано аналогично алгоритмам описанным выше. Открытие отчета происходит по нажатию кнопки с предварительной проверкой наполненности ComboBoxComboBox-ов.
Отчет (Form_report) Представляет из себя форму с растянутым полем Memo куда загружается информация о выбранном ученике
Отчет имеет возможность сохранять информацию в текстовый файл.
Реализован на принципе последовательного открытия всех страниц журнала.
Рис 24 – Форма отчета ученика
procedure TForm_report.FormShow(Sender: TObject); // при открытии
begin
Caption:='Отчет ученика: ' + person;
Form_report.Search(Sender); // Поиск всех файлов этого класса!
Form_report.Big(Sender); // Делаем отчет!
end;
procedure TForm_report.Search(Sender: TObject); // ПОИСК файлов и внесение данных в массив files_arr
var
FindFile: TSearchRec;
Path: String;
begin
Path:='db\jurnal\*_' + klass + '_?.db';
if FindFirst(Path, faAnyFile, FindFile)=0 then // ищем первый файл
begin
setlength(files_arr,Length(files_arr)+1);
files_arr[Length(files_arr)-1] := FindFile.Name;
while FindNext(FindFile)=0 do // ищем второй+ файл
begin
setlength(files_arr,Length(files_arr)+1);
files_arr[Length(files_arr)-1] := FindFile.Name;
end;
FindClose(FindFile); //Освобождаем память
end;
end;
Рис 25 – Схема поиска файлов
procedure TForm_report.big(Sender: TObject);
var
i,j,sr,k:integer;
sr1:real;
s,m,m1,d:string;
f:textfile;
begin
if Length(files_arr)=0 then begin
memo1.Lines.add('У данного класса отсутствуют какие либо записи в журнале.');
exit;
end;
for i:=0 to Length(files_arr)-1 do
begin
AssignFile (f, 'db\jurnal\' + files_arr[i]);
Reset(f);
While not (EOF (f)) do begin
Readln (f, s);
if s = person then
begin
setlength(marks_arr,Length(marks_arr)+1,3);
Readln (f, s); //день
marks_arr[Length(marks_arr)-1,0] :=strtoint(s);
Readln (f, s); //месяц
marks_arr[Length(marks_arr)-1,1] :=strtoint(s);
Readln (f, s); //оценка
marks_arr[Length(marks_arr)-1,2] :=strtoint(s);
readln(f);
end;
end;
if Length(marks_arr)>0 then begin
s:= files_arr[i];
while pos('_',s)>0 do begin
memo1.Lines.add('Преподаватель:'+ copy(s,1,pos('_',s)-1));
delete(s,1,pos('_',s));
memo1.Lines.add('Предмет:'+ copy(s,1,pos('_',s)-1));
delete(s,1,pos('_',s));
memo1.Lines.add('Класс:'+ copy(s,1,pos('_',s)-1));
delete(s,1,pos('_',s));
memo1.Lines.add('Четверть:'+ copy(s,1,pos('.db',s)-1));
end;
memo1.Lines.add('|День|месяц|оценка|');
for j:=0 to Length(marks_arr)-1 do begin
case marks_arr[j,1] of
1: m := 'янв';
2: m := 'фев';
3: m := 'мар';
4: m := 'апр';
5: m := 'май';
6: m := 'июн';
7: m := 'июл';
8: m := 'авг';
9: m := 'сен';
10: m := 'окт';
11: m := 'ноя';
12: m := 'дек';
end;
case marks_arr[j,2] of
0: m1:='1';
1: m1:='2';
2: m1:='3';
3: m1:='4';
4: m1:='5';
5: m1:='6';
6: m1:='7';
7: m1:='8';
8: m1:='9';
9: m1:='10';
10: m1:='н';
11: m1:='*';
end;
d:= inttostr(marks_arr[j,0]);
memo1.Lines.add('| ' + d + ' | ' + m + ' | ' + m1 + ' |');
end;
sr:=0;
for k:=0 to Length(marks_arr)-1 do
if marks_arr[k,2] < 10 then
sr:= sr+ marks_arr[k,2]+1;
sr1:= SimpleRoundTo((sr/Length(marks_arr)),-2);
memo1.Lines.add('Средний балл: ' + FloatToStr(sr1) + ';');
memo1.Lines.add('');
memo1.Lines.add('');
marks_arr:=nil;
end;
end;
if Memo1.Lines.Count = 0 then begin
memo1.Lines.add('У данного ученика отсутствуют какие либо записи в журнале.');
end;
end;
Рис 26 – Схема считывания данных и внесения их в поле MEMO
Сохранение происходит через Dialog.
procedure TForm_report.MenuItem2Click(Sender: TObject); //Сохранить как
begin
If Form_report.SaveDialog1.Execute then
Form_report.Memo1.Lines.SaveToFile(Form_report.SaveDialog1.FileName);
end;
Форма учителя (Form_teacher)
Рис 27 – Форма учителя
Форма учителя (Form_teacher)
Рис 28 – Форма родителя
Реализованы аналогично блокам на Form_zavuch с помощью ряда ComboBox-ов. Действия производятся по тем же алгоритмам что описаны выше.
Форма Журнал (Form_jurnal) самая большая форма в работе программы
Рис 29 – Форма журнала
При загрузке формы
procedure TForm_jurnal.FormShow(Sender: TObject); // При загрузке
begin
if prnts = 1 then begin // Если открытие произошло с формы Родителей – отключаем
ComboBox4.Enabled:=False;
ComboBox5.Enabled:=False;
ComboBox6.Enabled:=False;
ComboBox1.Enabled:=False;
ComboBox2.Enabled:=False;
ComboBox3.Enabled:=False;
ComboBox7.Enabled:=False;
Button1.Enabled:=False;
Button2.Enabled:=False;
Button3.Enabled:=False;
Button4.Enabled:=False;
Button5.Enabled:=False;
Memo1.ReadOnly:=True;
end;
label12.Caption:=' Учитель: ' + teacher_j+'; '+'Предмет: '+predmet_j+ // Заголовок
'; '+'Класс: '+klass_j+'; ' + 'Четверть: ' + quarter_j +';';
Form_jurnal.persons_array(Sender); // Заполняем учеников в массив из класса
Form_jurnal.Updategrid (Sender); // Заносим учеников в SG + добавляем номера
Form_jurnal.ComboBox1_update (Sender); // Заносим в CB1 данные учеников
Form_jurnal.newFile (Sender); // Проверяем наличие файла и считываем если есть !
Form_jurnal.update_tems (Sender); // Загружаем темы
end;
При открытии журнала с формы родителя – отключаем все кнопки для невозможности редактирования журнала. Заполнение ComboBox-ов для работы журнала происходит по тем же алгоритмам что описны выше.
Form_jurnal.persons_array(Sender); Заполнение учеников в массив
procedure TForm_jurnal.persons_array(Sender: TObject); // При открытии заполняем учеников в массив
var
i:integer;
f:text;
begin
i := 1;
AssignFile(f, 'db\person_kl\' + klass_j + '.db');
Reset(f);
while not Eof(f) do begin
SetLength(persons_arr, i+1);
Readln(f, persons_arr[i]);
inc(i);
end;
arrcount:=i-1;
CloseFile(f);
end;
Рис 30 – Схема внесения данных в массив
Form_jurnal.Updategrid (Sender); Заносим учеников в SG и добавляем номера
procedure TForm_jurnal.Updategrid(Sender: TObject); // SG Ученики, номера
var
i:integer;
begin
StringGrid1.RowCount:=arrcount+2;
if arrcount = 0 then begin
ShowMessage ('В данном классе нет учеников!') ;
close;
exit;
end;
for i:=0 to arrcount do
begin
StringGrid1.Cells[1, i+1] := persons_arr[i];
StringGrid1.Cells[0, i+1] := inttostr(i) ;
end;
StringGrid1.Cells[1, 1] := 'Список учеников: '+klass_j+' класса;';
StringGrid1.Cells[0, 1] := '№';
StringGrid1.Cells[1, 0] := 'Сегодня: '+ DateToStr(Date);
end;
Рис 31 – Схема обновления SG
Form_jurnal.newFile (Sender); Проверяем наличие файла и заполняем даты и оценки если есть. Обновление ComboBox, StringGrid с оценками и StringGrid с датами происходит по тем же алгоритмам что описны выше.
procedure TForm_jurnal.newFile(Sender: TObject);
var
f:textfile;
i,j,f1,d,m,mr: integer;
s: string;
begin
if FileExists('db\jurnal\' + teacher_j + '_' + predmet_j + '_' + //ПРОВЕРКА наличия файла!
klass_j + '_' + quarter_j +'.db') then //Считываем если есть!!!
begin
AssignFile (f, 'db\jurnal\' + teacher_j + '_' + predmet_j + '_' +
klass_j + '_' + quarter_j +'.db');
Reset(f);
// ЗАНОСИМ ДАТЫ!!!!!!!
readln(f,s); // Считываем первую строку
i:=0;
while pos(' ',s)>0 do begin
setlength(date_arr,Length(date_arr)+1,2);
date_arr[i,0]:= strtoint(copy(s,1,pos(' ',s)-1));
delete(s,1,pos(' ',s));
date_arr[i,1]:= strtoint(copy(s,1,pos(' ',s)-1));
delete(s,1,pos(' ',s));
inc(i);
end;
Form_jurnal.ComboBox6_update (Sender);
Form_jurnal.ComboBox2_update (Sender);
Form_jurnal.Updategrid_2 (Sender);
readln(f); //Считываем оценки!!!
While not (EOF (f)) do begin
Readln (f, s); //Считываем ФИО записываем в s 1
if Length(s)>0 then begin
for i:=0 to Length(persons_arr)-1 do
if persons_arr[i] = s then
begin
setlength(marks_arr,Length(marks_arr)+1,4);
marks_arr[Length(marks_arr)-1,0] := i-1;
Readln (f, s); //2
marks_arr[Length(marks_arr)-1,1] :=strtoint(s);
Readln (f, s); //3
marks_arr[Length(marks_arr)-1,2] :=strtoint(s);
Readln (f, s); //4
marks_arr[Length(marks_arr)-1,3] :=strtoint(s);
readln(f); //5
end;
end;
end;
CloseFile(f);
for i:=0 to Length(marks_arr)-1 do // Сортировка по Фамилии
for j:=0 to Length(marks_arr)-2 do
if marks_arr[j,0]>marks_arr[j+1,0] then begin
f1:= marks_arr[j,0];
d:= marks_arr[j,1];
m:= marks_arr[j,2];
mr:= marks_arr[j,3];
marks_arr[j,0]:= marks_arr[j+1,0];
marks_arr[j,1]:= marks_arr[j+1,1];
marks_arr[j,2]:= marks_arr[j+1,2];
marks_arr[j,3]:= marks_arr[j+1,3];
marks_arr[j+1,0]:=f1;
marks_arr[j+1,1]:=d;
marks_arr[j+1,2]:=m;
marks_arr[j+1,3]:=mr;
end;
for i:=0 to Length(marks_arr)-1 do // Сортировка по дате МЕСЯЦ
for j:=0 to Length(marks_arr)-2 do
if marks_arr[j,0]=marks_arr[j+1,0] then
if marks_arr[j,1]>marks_arr[j+1,1] then begin
f1:= marks_arr[j,0];
d:= marks_arr[j,1];
m:= marks_arr[j,2];
mr:= marks_arr[j,3];
marks_arr[j,0]:= marks_arr[j+1,0];
marks_arr[j,1]:= marks_arr[j+1,1];
marks_arr[j,2]:= marks_arr[j+1,2];
marks_arr[j,3]:= marks_arr[j+1,3];
marks_arr[j+1,0]:=f1;
marks_arr[j+1,1]:=d;
marks_arr[j+1,2]:=m;
marks_arr[j+1,3]:=mr;
end;
for i:=0 to Length(marks_arr)-1 do // Сортировка по дате День
for j:=0 to Length(marks_arr)-2 do
if marks_arr[j,0]=marks_arr[j+1,0] then
if marks_arr[j,1]=marks_arr[j+1,1] then
if marks_arr[j,2]>marks_arr[j+1,2] then
begin
f1:= marks_arr[j,0];
d:= marks_arr[j,1];
m:= marks_arr[j,2];
mr:= marks_arr[j,3];
marks_arr[j,0]:= marks_arr[j+1,0];
marks_arr[j,1]:= marks_arr[j+1,1];
marks_arr[j,2]:= marks_arr[j+1,2];
marks_arr[j,3]:= marks_arr[j+1,3];
marks_arr[j+1,0]:=f1;
marks_arr[j+1,1]:=d;
marks_arr[j+1,2]:=m;
marks_arr[j+1,3]:=mr;
end;
Form_jurnal.Updategrid_marks (Sender);
Form_jurnal.ComboBox7_update (Sender);
end; end;
Рис 32 – Схема Form_jurnal.newFile
Form_jurnal.Updategrid_SB. Расчет среднего бала и добавление в SG при наличии оценок.
procedure TForm_jurnal.Updategrid_SB(Sender: TObject); // Средний бал
var
i,j,m,n:integer;
s,s1:real;
begin
if length(marks_arr)>0 then
begin
StringGrid1.ColCount:=Length(date_arr)+3;
StringGrid1.Cells[Length(date_arr)+2, 0] := 'СР';
StringGrid1.Cells[Length(date_arr)+2, 1] := 'БЛ';
n:=0;
m:=0;
s:=0;
for j:=0 to length(persons_arr)-2 do
begin
for i:=0 to length(marks_arr)-1 do
begin
if j = marks_arr[i,0] then
if marks_arr[i,3] < 10 then begin
inc(n);
m:= m + marks_arr[i,3]+1;
end;
if n>0 then begin
s1:= m / n;
s:= SimpleRoundTo(s1, -2);
StringGrid1.Cells[Length(date_arr)+2, j+2] := FloatToStr(s);