Материал: ПЗ

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Рис 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);

Источник: https://studfile.net/preview/16486423/