Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {
- Об этом модуле:
- 1. Не надо пугаться размера кода, тут много повторяющегося, но я не знаю,
- как этого избежать.
- 2. Модуль получает на вход данные: студенческая группа.
- 3. Модуль обращается к файлу со списком студентов и их данными по
- внеучебной деятельности так же в процессе работы будет создаваться
- временная копия этого файла, для того чтобы туда сохранялись все данные.
- Это нужно потому, что делфи может дописывать данные только в конец файла,
- но в 99.9% случаев требуется запись в разные места файла.
- 4. На форме располагаются:
- Лейбл с номером группы;
- Список со студентами;
- Список с событиями;
- Лейбл "балл" и поле для ввода этого самого балла;
- Кнопка "добавить" - нужна для добавления выбранного события в список
- событий, в которых принимал участие студент;
- Лейбл "внеучебная деятельность студента";
- Листбокс - поле, в которое будут выводиться события, в которых принимал
- участие студент;
- Кнопка "удалить" - для удаления события из списка.
- 5. Структура файла с внеучебным рейтингом такая: (представь таблицу)
- Группа | ФИО | Баллы за внеучебную деятельность.
- Думаю, первые два столбца понятные, но вот насчет третьего столбца:
- Данные в третьем столбце хранятся в виде одномерного массива.
- У одномерного массива есть элементы, у них свое значение, и каждый
- элемент имеет свой индекс (порядковый номер). Так вот, значение
- элемента - это балл, а порядковый номер элемента - это событие.
- Дальше в коде будет понятно, что каждое событие имеет свой идентификатор
- (id - это легче). Например, такая таблица:
- id | Событие
- ----------------
- 0 | Событие_1
- ----------------
- 1 | Событие_2
- Если будет непонятно, то нарисую в универе на листочке и объясню.
- }
- unit RatingVneUcheb;
- interface
- uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids, strutils,
- Auth, FilesControl;
- type
- TForm5 = class(TForm)
- Label1: TLabel;
- ComboBox1: TComboBox;
- ComboBox2: TComboBox;
- Edit1: TEdit;
- Label2: TLabel;
- Button1: TButton;
- Label3: TLabel;
- Button2: TButton;
- ListBox1: TListBox;
- procedure FormCreate(Sender: TObject);
- procedure ComboBox1Change(Sender: TObject);
- procedure ComboBox2Change(Sender: TObject);
- procedure Button1Click(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- Form5: TForm5;
- // vuGr - переменная для группы, vuName - переменная для ФИО студента
- // "vu" - значит "внеучебный рейтинг"
- vuGr, vuName: string[30];
- vuRating: integer; // переменная для рейтинга
- implementation
- {$R *.dfm}
- uses
- TeacherMode;
- {Эта функция как бы определяет, что для СОБЫТИЯ предусмотрено определенное
- количество БАЛЛОВ}
- function EventToRating(event: integer):integer;
- begin
- case event of
- {Сначала у событий баллы как константы, они установлены и не меняются}
- 0: EventToRating:=50;
- 1: EventToRating:=40;
- 2: EventToRating:=30;
- 3: EventToRating:=25;
- 4: EventToRating:=10;
- 5: EventToRating:=40;
- 6: EventToRating:=35;
- 7: EventToRating:=30;
- 8: EventToRating:=30;
- 9: EventToRating:=25;
- 10: EventToRating:=20;
- 11: EventToRating:=20;
- 12: EventToRating:=15;
- 13: EventToRating:=10;
- 14: EventToRating:=15;
- 15: EventToRating:=10;
- 16: EventToRating:=5;
- {Но для вот этих событий по сути можно ставить баллы самому от 0 до
- максимального значения, которое установлено. Поэтому тут баллы - это
- максимальное значение.}
- 17: EventToRating:=10;
- 18: EventToRating:=5;
- 19: EventToRating:=10;
- 20: EventToRating:=15;
- 21: EventToRating:=25;
- end;
- end;
- {Эта функция определяет, какое СОБЫТИЕ соответствует ИДЕНТИФИКАТОРУ}
- function IdToEvent(id: integer):string;
- begin
- case id of
- {Например, НУЛЮ соответствует вот это}
- 0: IdToEvent:='Публикация научной статьи в зарубежном журнале или доклад на международной конференции';
- {а ЕДИНИЦЕ соответствует вот это}
- 1: IdToEvent:='Публикация научной статьи в центральном отечественном журнале или доклад на Всероссийской конференции';
- {и т.д.}
- 2: IdToEvent:='Публикация научной статьи в межвузовском сборнике или доклад на региональной конференции';
- 3: IdToEvent:='Доклад на вузовской научно-технической конференции';
- 4: IdToEvent:='Доклад на вузовской студенческой научной конференции';
- 5: IdToEvent:='Призер Всероссийского конкурса студенческих научных работ (1 место)';
- 6: IdToEvent:='Призер Всероссийского конкурса студенческих научных работ (2 место)';
- 7: IdToEvent:='Призер Всероссийского конкурса студенческих научных работ (3 место)';
- 8: IdToEvent:='Призер регионального конкурса студенческих научных работ (1 место)';
- 9: IdToEvent:='Призер регионального конкурса студенческих научных работ (2 место)';
- 10: IdToEvent:='Призер регионального конкурса студенческих научных работ (3 место)';
- 11: IdToEvent:='Призер вузовского конкурса студенческих научных работ (1 место)';
- 12: IdToEvent:='Призер вузовского конкурса студенческих научных работ (2 место)';
- 13: IdToEvent:='Призер вузовского конкурса студенческих научных работ (3 место)';
- 14: IdToEvent:='Призер тематической олимпиады, проводимой в вузе (1 место)';
- 15: IdToEvent:='Призер тематической олимпиады, проводимой в вузе (2 место)';
- 16: IdToEvent:='Призер тематической олимпиады, проводимой в вузе (3 место)';
- 17: IdToEvent:='Выполнение творческих программ по заданиям кафедр';
- 18: IdToEvent:='По результатам итогового междисциплинарного экзамена по естественно - научному блоку дисциплин';
- 19: IdToEvent:='По результатам итогового междисциплинарного экзамена по специальности (направлению)';
- 20: IdToEvent:='Выполнение заданий Ученого совета факультета';
- 21: IdToEvent:='Выполнение задания Ученого совета ИГЭУ';
- end;
- end;
- {А вот эта функция делает обратное действие,
- определяет для СОБЫТИЯ его ИДЕНТИФИКАТОР}
- function EventToId(event: string):integer;
- begin
- case AnsiIndexText(event, [
- 'Публикация научной статьи в зарубежном журнале или доклад на международной конференции',
- 'Публикация научной статьи в центральном отечественном журнале или доклад на Всероссийской конференции',
- 'Публикация научной статьи в межвузовском сборнике или доклад на региональной конференции',
- 'Доклад на вузовской научно-технической конференции',
- 'Доклад на вузовской студенческой научной конференции',
- 'Призер Всероссийского конкурса студенческих научных работ (1 место)',
- 'Призер Всероссийского конкурса студенческих научных работ (2 место)',
- 'Призер Всероссийского конкурса студенческих научных работ (3 место)',
- 'Призер регионального конкурса студенческих научных работ (1 место)',
- 'Призер регионального конкурса студенческих научных работ (2 место)',
- 'Призер регионального конкурса студенческих научных работ (3 место)',
- 'Призер вузовского конкурса студенческих научных работ (1 место)',
- 'Призер вузовского конкурса студенческих научных работ (2 место)',
- 'Призер вузовского конкурса студенческих научных работ (3 место)',
- 'Призер тематической олимпиады, проводимой в вузе (1 место)',
- 'Призер тематической олимпиады, проводимой в вузе (2 место)',
- 'Призер тематической олимпиады, проводимой в вузе (3 место)',
- 'Выполнение творческих программ по заданиям кафедр',
- 'По результатам итогового междисциплинарного экзамена по естественно - научному блоку дисциплин',
- 'По результатам итогового междисциплинарного экзамена по специальности (направлению)',
- 'Выполнение заданий Ученого совета факультета',
- 'Выполнение задания Ученого совета ИГЭУ'
- ]) of
- 0: EventToId:=0;
- 1: EventToId:=1;
- 2: EventToId:=2;
- 3: EventToId:=3;
- 4: EventToId:=4;
- 5: EventToId:=5;
- 6: EventToId:=6;
- 7: EventToId:=7;
- 8: EventToId:=8;
- 9: EventToId:=9;
- 10: EventToId:=10;
- 11: EventToId:=11;
- 12: EventToId:=12;
- 13: EventToId:=13;
- 14: EventToId:=14;
- 15: EventToId:=15;
- 16: EventToId:=16;
- 17: EventToId:=17;
- 18: EventToId:=18;
- 19: EventToId:=19;
- 20: EventToId:=20;
- 21: EventToId:=21;
- end;
- end;
- {Процедура, которая добавляет выбранное событие к списку всех событий, в которых
- принимал участие студент}
- procedure AddRating(e, r: integer);
- begin
- Rewrite(f2); // Открытие основного файла для перезаписи
- Reset(tmp2); // Открытие временного файла для чтения
- while not eof(tmp2) do begin // Пока временный файл не закончился
- Read(tmp2, Std2); // Читать строку с данными
- {Условие: если прочитанная группа соответствует выбранной группе и
- прочитанные ФИО студента соответствуют выбранному студенту, то}
- if (Std2.gr=vuGr) and (Std2.sname=vuName) then
- Std2.rating[e]:=r; { Добавление рейтинга. e - идентификатор события
- r - количество баллов.}
- Write(f2, Std2); // Запись в основной файл
- end;
- // Закрытие всех файлов
- CloseFile(tmp2);
- CloseFile(f2);
- end;
- {То, что происходит, когда нажимают кнопку "Добавить"}
- procedure TForm5.Button1Click(Sender: TObject);
- var
- event, rating, rate, err: integer;
- {
- event - идентификатор события
- rating - рейтинг, который определен для события
- rate - переменная для рейтинга (для преобразования строки в число)
- err - переменная, которая будет содержать в себе код ошибки (потом будет
- понятно зачем)
- }
- begin
- event:=ComboBox2.ItemIndex; // получаем идентификатор события
- {Если идентификатор больше или равен 17, значит это те события, для которых
- мы сами ставим рейтинг от 0 до максимально возможного}
- if event >= 17 then begin
- {Проверка: если в поле для балла что-то ввели, тогда дальше проверяем балл,
- а если не ввели, то надо вывести сообщение "Введите балл".}
- if Edit1.Text <> '' then begin
- {Функция, которая попытается преобразовать строку в число. Если удачно,
- то код ошибки будет 0}
- Val(Edit1.Text, rate, err);
- {Проверяем, что код ошибки - 0. Если НЕ 0, то надо вывести сообщение
- "Балл должен быть числом". То есть скорее всего человек ввел туда не
- число, а какие-то символы}
- if err=0 then begin
- {В переменную rating попадет максимальное значение балла}
- rating:=EventToRating(event);
- {Если поставленный балл >= 0 и <= максимума, тогда продолжаем, а если
- нет, тогда надо вывести ошибку "Балл меньше или больше возможного
- значения"}
- if (rate >= 0) and (rate <= rating) then begin
- vuRating:=rate;
- //Проверка: если файл с внеучебной деятельностью существует, то
- if FileExists(fileVneUcheb) then
- // Создать временный файл для сохранения данных
- FilesControl.SaveFileVneUcheb(fileVneUcheb)
- else begin
- // Иначе создать файл
- FilesControl.CreateFileVneUcheb(fileVneUcheb);
- end;
- {Вообще это условие с файлами нужно если какой-то дурак решит
- удалить файл с внеучебным рейтингом во время работы с программой}
- AddRating(event, vuRating); // Процедура для добавления рейтинга
- {В Листбокс тоже надо добавить строчку, вот и добавляем
- В ней происходит вызов функции, которая преобразует идентификатор в
- событие и функция, которая преобразует число (баллы) в строку}
- ListBox1.Items.Add(IdToEvent(event) + ' : ' + IntToStr(vuRating) + ' баллов.');
- // Сообщение о том, что все хорошо
- ShowMessage('Данные успешно добавлены');
- end
- else
- ShowMessage('Балл меньше или больше возможного значения');
- end
- else
- ShowMessage('Балл должен быть числом');
- end
- else ShowMessage('Введите балл');
- end
- {Тут все, что будет происходить, если идентификатор события меньше 17, то
- есть это те события, для которых уже определены свои баллы и их вписывать
- самому не надо}
- else begin
- {В переменную rating попадет назначенное количество баллов}
- rating:=EventToRating(event);
- vuRating:=rating;
- //Проверка: если файл с внеучебной деятельностью существует, то
- if FileExists(fileVneUcheb) then
- // Создать временный файл для сохранения данных
- FilesControl.SaveFileVneUcheb(fileVneUcheb)
- else begin
- // Иначе создать файл
- FilesControl.CreateFileVneUcheb(fileVneUcheb);
- end;
- AddRating(event, vuRating); // Процедура для добавления рейтинга
- {В Листбокс тоже надо добавить строчку, вот и добавляем
- В ней происходит вызов функции, которая преобразует идентификатор в
- событие и функция, которая преобразует число (баллы) в строку}
- ListBox1.Items.Add(IdToEvent(event) + ' : ' + IntToStr(vuRating) + ' баллов.');
- // Сообщение о том, что все хорошо
- ShowMessage('Данные успешно добавлены');
- end;
- end;
- {То, что произойдет если нажать кнопку "удалить"}
- procedure TForm5.Button2Click(Sender: TObject);
- var
- id, i, j: integer;
- str: string;
- begin
- {Цикл: от 0 до количества всех строчек в списке}
- for i:=0 to ListBox1.Items.Count-1 do begin
- {Если мышкой нажали по событию в списке, тогда}
- if ListBox1.Selected[i] then begin
- {В переменную str поступит выбранная строка}
- str:=ListBox1.Items.Strings[i];
- {Так, у нас в str будет строка вида "Событие : кол-во баллов". Нам надо
- из этой строки сделать строку, в которой нет ничего про баллы, только само
- событие, чтобы потом можно было преобразовать событие в его идентификатор,
- поэтому цикл: от 0 до конца строки}
- for j:=0 to length(str)-1 do begin
- {Если встретился символ ":", тогда }
- if (str[j]=':') then begin
- {Удалить часть строки, чтобы осталось только событие}
- delete(str, j-1, length(str)-j+2);
- break; // Выход из цикла
- end;
- end;
- {Вызов функции для преобразования события в идентификатор и занесение
- значения в переменную id}
- id:=EventToId(str);
- {Опять проверка на существование файла, по аналогии с предыдущими такими
- проверками}
- if FileExists(fileVneUcheb) then
- FilesControl.SaveFileVneUcheb(fileVneUcheb)
- else begin
- FilesControl.CreateFileVneUcheb(fileVneUcheb);
- end;
- {Открытие файлов и обнуление выбранного события}
- Rewrite(f2);
- Reset(tmp2);
- while not eof(tmp2) do begin
- Read(tmp2, Std2);
- if (Std2.gr=vuGr) and (Std2.sname=vuName) then
- Std2.rating[id]:=0;
- Write(f2, Std2);
- end;
- CloseFile(tmp2);
- CloseFile(f2);
- end;
- end;
- // Удаление строки из списка
- ListBox1.DeleteSelected;
- end;
- {То, что происходит когда выбирают студента}
- procedure TForm5.ComboBox1Change(Sender: TObject);
- var
- i: integer;
- str: string;
- begin
- ComboBox2.Visible:=true; // Появляется список событий
- Label3.Visible:=true; // Появляется лейбл3
- Button2.Visible:=true; // Появляется кнопка "Удалить"
- ListBox1.Visible:=true; // Появляется список событий этого студента
- ListBox1.Clear; // На всякий случай этот список отчищается
- vuGr:=Auth.fio; // назначается группа
- vuName:=ComboBox1.Text; // назначается имя (судя по выбранному студенту)
- // Опять проверка наличия файла
- if FileExists(fileVneUcheb) then
- FilesControl.SaveFileVneUcheb(fileVneUcheb)
- else begin
- FilesControl.CreateFileVneUcheb(fileVneUcheb);
- end;
- {Дальше читается файл, в нем ищутся строки где совпадет группа и выбранный
- студент. Дальше просматривается его рейтинг, если значение для какого-либо
- события не равно 0, то оно записывается в список его событий, иначе -
- игнорируется}
- Reset(f2);
- while not eof(f2) do begin
- str:='';
- Read(f2, Std2);
- if (Std2.gr=vuGr) and (Std2.sname=vuName) then begin
- for i:=0 to 21 do begin
- if Std2.rating[i] <> 0 then begin
- str:=IdToEvent(i) + ' : ' + IntToStr(Std2.rating[i]) + ' баллов.';
- ListBox1.Items.Add(str);
- end;
- end;
- end;
- end;
- CloseFile(f2);
- end;
- {То, что происходит когда выбирают событие}
- procedure TForm5.ComboBox2Change(Sender: TObject);
- begin
- Button1.Visible:=true; // Появляется кнопка "добавить"
- {Если идентификаторы события от 17 до 21, то появляется надпись "балл" и
- поле для ввода балла}
- if ComboBox2.ItemIndex in [17..21] then begin
- Label2.Visible:=true;
- Edit1.Visible:=true;
- end
- {Иначе скрыть надпись и поле для ввода}
- else begin
- Label2.Visible:=false;
- Edit1.Visible:=false;
- end;
- end;
- {То, что происходит при создании формы}
- procedure TForm5.FormCreate(Sender: TObject);
- var
- students: array [1..50] of string;
- i, j: integer;
- same: boolean;
- begin
- // Назначается заголовок
- Self.Caption:='Журнал - Выставление оценок за внеучебную деятельность';
- Self.Position:=poDesktopCenter; // Назначается позиция формы (центр экрана)
- // Назначение файлов
- AssignFile(f2, fileVneUcheb);
- AssignFile(tmp2, fileVneUchebTmp);
- // Список мероприятий
- ComboBox2.Text:='Выберите мероприятие';
- ComboBox2.Items.Clear;
- ComboBox2.Items.Add('Публикация научной статьи в зарубежном журнале или доклад на международной конференции - 50 баллов.');
- ComboBox2.Items.Add('Публикация научной статьи в центральном отечественном журнале или доклад на Всероссийской конференции - 40 баллов.');
- ComboBox2.Items.Add('Публикация научной статьи в межвузовском сборнике или доклад на региональной конференции - 30 баллов.');
- ComboBox2.Items.Add('Доклад на вузовской научно-технической конференции - 25 баллов.');
- ComboBox2.Items.Add('Доклад на вузовской студенческой научной конференции - 10 баллов.');
- ComboBox2.Items.Add('Призер Всероссийского конкурса студенческих научных работ (1 место) - 40 баллов.');
- ComboBox2.Items.Add('Призер Всероссийского конкурса студенческих научных работ (2 место) - 35 баллов.');
- ComboBox2.Items.Add('Призер Всероссийского конкурса студенческих научных работ (3 место) - 30 баллов.');
- ComboBox2.Items.Add('Призер регионального конкурса студенческих научных работ (1 место) - 30 баллов.');
- ComboBox2.Items.Add('Призер регионального конкурса студенческих научных работ (2 место) - 25 баллов.');
- ComboBox2.Items.Add('Призер регионального конкурса студенческих научных работ (3 место) - 20 баллов.');
- ComboBox2.Items.Add('Призер вузовского конкурса студенческих научных работ (1 место) - 20 баллов.');
- ComboBox2.Items.Add('Призер вузовского конкурса студенческих научных работ (2 место) - 15 баллов.');
- ComboBox2.Items.Add('Призер вузовского конкурса студенческих научных работ (3 место) - 10 баллов.');
- ComboBox2.Items.Add('Призер тематической олимпиады, проводимой в вузе (1 место) - 15 баллов.');
- ComboBox2.Items.Add('Призер тематической олимпиады, проводимой в вузе (2 место) - 10 баллов.');
- ComboBox2.Items.Add('Призер тематической олимпиады, проводимой в вузе (3 место) - 5 баллов.');
- ComboBox2.Items.Add('Выполнение творческих программ по заданиям кафедр - до 10 баллов.');
- ComboBox2.Items.Add('По результатам итогового междисциплинарного экзамена по естественно - научному блоку дисциплин - до 5 баллов.');
- ComboBox2.Items.Add('По результатам итогового междисциплинарного экзамена по специальности (направлению) - до 10 баллов.');
- ComboBox2.Items.Add('Выполнение заданий Ученого совета факультета - до 15 баллов.');
- ComboBox2.Items.Add('Выполнение задания Ученого совета ИГЭУ - до 25 баллов.');
- // конец списка мероприятий
- Label1.Caption:=Label1.Caption+Auth.fio; //Будет написана выбранная группа
- ComboBox2.Visible:=false; //
- Label2.Visible:=false; //
- Edit1.Visible:=false; //
- Button1.Visible:=false; // Все эти элементы будут скрыты
- Label3.Visible:=false; //
- Button2.Visible:=false; //
- ListBox1.Visible:=false; // Эти тоже
- {Заполнение массива со студентами}
- j:=1;
- Reset(f2);
- while not eof(f2) do begin
- same:=false;
- students[j]:=''; // создание пустого элемента массива (имя)
- Read(f2, Std2); // чтение данных из файла
- // Если прочитанная группа соответствует выбранной группе
- if Std2.gr=Auth.fio then begin
- for i:=1 to j do // проверка каждого элемента массива
- // если имя и группа уже есть в массиве
- if Std2.sname = students[i] then
- same:=true; // повтор = правда
- if same=false then begin // если нет повторения
- students[j]:=Std2.sname; // добавляем имя в массив
- j:=j+1;
- end;
- end;
- end;
- CloseFile(f2); // Закрытие файла
- for i:=1 to j-1 do // заполняем ComboBox данными из массива
- ComboBox1.Items.Add(students[i]);
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement