Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit MainUnit;
- interface
- uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
- System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.CustomizeDlg,
- Vcl.ToolWin, Vcl.ActnMan, Vcl.ActnCtrls, Vcl.ActnMenus, Vcl.ActnColorMaps,
- Vcl.Mask, Vcl.ExtCtrls, Vcl.Buttons, Vcl.CheckLst, Vcl.CategoryButtons,
- Vcl.ButtonGroup, Vcl.ComCtrls, Vcl.JumpList, CommCtrl, Vcl.Menus,
- Vcl.WinXCtrls, System.ImageList, Vcl.ImgList;
- type
- TGroup = record
- Code, Students: Integer;
- GroupNumber: Integer;
- YearOfStart: Integer;
- end;
- TStudent = record
- FullName: String[50];
- Code: String[6];
- Marks: LongInt;
- end;
- PStudent = ^TStudent;
- TArrStudent = Array [0 .. 30] of TStudent;
- TAllInfo = Record
- Data: TGroup;
- GroupStudents: TArrStudent;
- End;
- STGroup = ^TGroupNode;
- TGroupNode = Record
- Info: TAllInfo;
- Next: STGroup;
- end;
- TGroupList = record
- Head: STGroup;
- Tail: STGroup;
- end;
- TListView = class(Vcl.ComCtrls.TListView)
- end;
- TMainForm = class(TForm)
- LViewTeam: TListView;
- BitBtn2: TBitBtn;
- PanelAnalysis: TPanel;
- PanelAdd: TPanel;
- StudentListView: TListView;
- PanelStudents: TPanel;
- AddStudentBtn: TBitBtn;
- MainMenu: TMainMenu;
- PopupMenu: TPopupMenu;
- N1: TMenuItem;
- OpenFile: TMenuItem;
- SaveFile: TMenuItem;
- StudentRatings: TMenuItem;
- AnalysisButton: TMenuItem;
- OpenDialog: TOpenDialog;
- SaveDialog: TSaveDialog;
- SplitView1: TSplitView;
- FindStudent: TMenuItem;
- Procedure InsertInDataList(InsertNode: TGroupNode);
- Procedure RemoveGroup(Code: Integer);
- procedure LViewGroupSelectItem(Sender: TObject; Item: TListItem;
- Selected: Boolean);
- procedure LViewGroupDblClick(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- procedure FormShow(Sender: TObject);
- procedure LViewGroupKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- procedure BitBtn2Click(Sender: TObject);
- Procedure AddToListView;
- Function FindGroupByCode(GroupNumber: Integer): STGroup;
- Procedure ChangeRowInListView(Item: TListItem; CurrentNode: STGroup);
- procedure AddStudentBtnClick(Sender: TObject);
- Procedure AddToStudentListView(Index: Integer; CurrentNode: STGroup);
- Procedure ShowStudent(Temp: STGroup);
- procedure StudentListViewDblClick(Sender: TObject);
- Procedure SetNewStudent(Item: TListItem; Temp: STGroup);
- procedure StudentListViewKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- procedure StudentRatingsClick(Sender: TObject);
- procedure SaveFileClick(Sender: TObject);
- procedure OpenFileClick(Sender: TObject);
- Procedure ClearLinkedList;
- procedure AnalysisButtonClick(Sender: TObject);
- procedure FormClose(Sender: TObject; var Action: TCloseAction);
- procedure FindStudentClick(Sender: TObject);
- public
- private
- end;
- var
- MainForm: TMainForm;
- BuferFGroupList: TGroupList;
- GroupList: TGroupList;
- implementation
- {$R *.dfm}
- uses GroupAddUnit, StudentAddUnit, RatingsOfAllStudents, StudentInGroups, FindStudentInGroups;
- Procedure TMainForm.AddToListView;
- Var
- Item: TListItem;
- Begin
- Item := LViewTeam.Items.Add;
- Item.Caption := IntToStr(GroupList.Tail^.Info.Data.GroupNumber);
- Item.SubItems.Add(IntToStr(GroupList.Tail^.Info.Data.YearOfStart));
- Item.SubItems.Add(IntToStr(GroupList.Tail^.Info.Data.Code));
- Item.SubItems.Add(IntToStr(GroupList.Tail^.Info.Data.Students));
- End;
- Procedure TMainForm.ChangeRowInListView(Item: TListItem; CurrentNode: STGroup);
- Begin
- Item.Caption := IntToStr(CurrentNode^.Info.Data.GroupNumber);
- Item.SubItems.Strings[0] := IntToStr(CurrentNode^.Info.Data.YearOfStart);
- Item.SubItems.Strings[1] := IntToStr(CurrentNode^.Info.Data.Code);
- Item.SubItems.Strings[2] := IntToStr(CurrentNode^.Info.Data.Students);
- End;
- Procedure TMainForm.AddToStudentListView(Index: Integer; CurrentNode: STGroup);
- Var
- Item: TListItem;
- Begin
- Item := StudentListView.Items.Add;
- Item.Caption := CurrentNode^.Info.GroupStudents[Index].Code;
- Item.SubItems.Add(CurrentNode^.Info.GroupStudents[Index].FullName);
- Item.SubItems.Add(IntToStr(CurrentNode^.Info.GroupStudents[Index].Marks));
- End;
- procedure TMainForm.AnalysisButtonClick(Sender: TObject);
- begin
- TeamForm.CalculatePlayers(GroupList.Head);
- TeamForm.ShowModal;
- end;
- procedure TMainForm.AddStudentBtnClick(Sender: TObject);
- var
- I: Integer;
- begin
- If StudentListView.GetCount < 25 Then
- Begin
- AddStudentForm.AddBtn.Visible := True;
- AddStudentForm.ChangeBtn.Visible := False;
- AddStudentForm.FCurrentIndex := StudentListView.GetCount;
- AddStudentForm.ShowModal;
- If AddStudentForm.ModalResult = MrYes Then
- Begin
- AddToStudentListView(StudentListView.GetCount,
- AddStudentForm.FCurrentNode);
- End;
- End
- Else
- MessageBox(Handle, 'У вас достигнуто максимальное число студентов',
- 'Внимание', MB_ICONINFORMATION);
- end;
- procedure TMainForm.BitBtn2Click(Sender: TObject);
- begin
- AddForm.ChangeBtn.Visible := False;
- AddForm.AddBtn.Visible := True;
- AddForm.ShowModal;
- If AddForm.ModalResult = MrYes Then
- Begin
- AddToListView;
- SaveFile.Enabled := True;
- End;
- end;
- procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
- begin
- ClearLinkedList;
- end;
- procedure TMainForm.FormCreate(Sender: TObject);
- begin
- LViewTeam.Columns[2].Width := LVSCW_AUTOSIZE_USEHEADER;
- end;
- procedure TMainForm.FormShow(Sender: TObject);
- begin
- LViewTeam.Width := LViewTeam.Width + 1;
- LViewTeam.Width := LViewTeam.Width - 1;
- end;
- Function TMainForm.FindGroupByCode(GroupNumber: Integer): STGroup;
- Var
- CurrentNode: STGroup;
- IsFounded: Boolean;
- Begin
- Result := Nil;
- IsFounded := False;
- CurrentNode := GroupList.Head;
- While (CurrentNode <> nil) and Not(IsFounded) do
- Begin
- If CurrentNode^.Info.Data.GroupNumber = GroupNumber Then
- Begin
- IsFounded := True;
- Result := CurrentNode;
- End;
- CurrentNode := CurrentNode^.Next;
- End;
- End;
- Procedure TMainForm.RemoveGroup(Code: Integer);
- Var
- CurrentNode, PreviousNode: STGroup;
- begin
- CurrentNode := GroupList.Head;
- PreviousNode := nil;
- While (CurrentNode <> nil) and (CurrentNode.Info.Data.Code <> Code) do
- begin
- PreviousNode := CurrentNode;
- CurrentNode := CurrentNode.Next;
- end;
- If CurrentNode <> nil then
- begin
- If CurrentNode = GroupList.Head then
- GroupList.Head := GroupList.Head^.Next
- Else
- PreviousNode.Next := CurrentNode^.Next;
- If CurrentNode = GroupList.Tail then
- GroupList.Tail := PreviousNode;
- Dispose(CurrentNode);
- end;
- end;
- procedure TMainForm.InsertInDataList(InsertNode: TGroupNode);
- Var
- NewNode: STGroup;
- begin
- New(NewNode);
- NewNode^.Info.Data := InsertNode.Info.Data;
- NewNode^.Info.GroupStudents := InsertNode.Info.GroupStudents;
- NewNode^.Next := nil;
- If GroupList.Head = nil Then
- Begin
- GroupList.Head := NewNode;
- GroupList.Tail := NewNode;
- End
- Else
- Begin
- GroupList.Tail^.Next := NewNode;
- GroupList.Tail := GroupList.Tail^.Next;
- End;
- end;
- procedure TMainForm.LViewGroupDblClick(Sender: TObject);
- var
- Item: TListItem;
- CurrentNode: STGroup;
- begin
- Item := LViewTeam.Selected;
- If Assigned(Item) and Item.Selected then
- begin
- CurrentNode := FindGroupByCode(StrToInt(Item.Caption));
- AddForm.SetTeamEdits(CurrentNode);
- AddForm.AddBtn.Visible := False;
- AddForm.ChangeBtn.Visible := True;
- AddForm.ShowModal;
- If AddForm.ModalResult = MrYes Then
- ChangeRowInListView(Item, CurrentNode);
- end;
- end;
- procedure TMainForm.LViewGroupKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- begin
- // Var X := LViewTeam.Selected.Caption; //код команды
- If (Key = VK_DELETE) and (LViewTeam.ItemIndex <> -1) and
- (MessageBox(MainForm.Handle, 'Вы хотите удалить данную команду?',
- 'Удаление', MB_YESNO + MB_ICONQUESTION) = ID_YES) Then
- Begin
- RemoveGroup(StrToInt(LViewTeam.Selected.Caption));
- LViewTeam.Delete(LViewTeam.Selected);
- SaveFile.Enabled := Not(LViewTeam.GetCount = 0);
- End;
- end;
- Procedure TMainForm.ShowStudent(Temp: STGroup);
- Var
- I: Integer;
- Begin
- For I := Low(Temp^.Info.GroupStudents) to High(Temp^.Info.GroupStudents) do
- Begin
- If Temp.Info.GroupStudents[I].Code <> '' Then
- Begin
- AddToStudentListView(StudentListView.GetCount, Temp);
- End;
- End;
- End;
- procedure TMainForm.LViewGroupSelectItem(Sender: TObject; Item: TListItem;
- Selected: Boolean);
- begin
- If Selected Then
- Begin
- AddStudentForm.FCurrentNode := FindGroupByCode(StrToInt(Item.Caption));
- StudentListView.Clear;
- ShowStudent(AddStudentForm.FCurrentNode);
- AddStudentBtn.Enabled := True;
- End
- Else
- Begin
- StudentListView.Clear;
- AddStudentBtn.Enabled := False;
- End;
- end;
- procedure TMainForm.FindStudentClick(Sender: TObject);
- begin
- BuferFGroupList := GroupList;
- FindStudentInGroups.Form1.ShowModal;
- end;
- procedure TMainForm.ClearLinkedList;
- Var
- Current, NextNode: STGroup;
- begin
- Current := GroupList.Head;
- while Current <> nil do
- begin
- NextNode := Current^.Next;
- Dispose(Current);
- Current := NextNode;
- end;
- GroupList.Head := nil;
- GroupList.Tail := nil;
- end;
- procedure TMainForm.OpenFileClick(Sender: TObject);
- Var
- FileInput: File of TAllInfo;
- Temp: STGroup;
- Item: TListItem;
- begin
- If OpenDialog.Execute Then
- Begin
- Try
- Try
- AssignFile(FileInput, ChangeFileExt(OpenDialog.FileName, '.txt'));
- Reset(FileInput);
- ClearLinkedList;
- StudentListView.Clear;
- LViewTeam.Clear;
- While Not Eof(FileInput) do
- Begin
- New(Temp);
- Temp^.Next := Nil;
- Read(FileInput, Temp^.Info);
- InsertInDataList(Temp^);
- Dispose(Temp);
- End;
- Temp := GroupList.Head;
- While Temp <> Nil do
- Begin
- Item := LViewTeam.Items.Add;
- Item.Caption := IntToStr(Temp^.Info.Data.GroupNumber);
- Item.SubItems.Add(IntToStr(GroupList.Tail^.Info.Data.YearOfStart));
- Item.SubItems.Add(IntToStr(GroupList.Tail^.Info.Data.Code));
- Item.SubItems.Add(IntToStr(GroupList.Tail^.Info.Data.Students));
- Temp := Temp^.Next;
- End;
- SaveFile.Enabled := True;
- Except
- MessageBox(Handle, 'Файл некорректен!', 'Внимание!',
- MB_OK + MB_ICONWARNING);
- End;
- Finally
- If FileExists(ChangeFileExt(SaveDialog.FileName, '.txt')) Then
- Begin
- CloseFile(FileInput);
- End;
- End;
- End;
- end;
- procedure TMainForm.SaveFileClick(Sender: TObject);
- Var
- FileOutput: File of TAllInfo;
- Temp: STGroup;
- begin
- If SaveDialog.Execute Then
- Begin
- Try
- Try
- AssignFile(FileOutput, ChangeFileExt(SaveDialog.FileName, '.txt'));
- Rewrite(FileOutput);
- Temp := GroupList.Head;
- While Temp <> Nil do
- Begin
- Write(FileOutput, Temp^.Info);
- Temp := Temp^.Next;
- End;
- Except
- MessageBox(Handle, 'Файл некорректен!', 'Внимание!',
- MB_OK + MB_ICONWARNING);
- End;
- Finally
- CloseFile(FileOutput);
- End;
- End;
- end;
- Procedure TMainForm.SetNewStudent(Item: TListItem; Temp: STGroup);
- Begin
- Item.Caption := Temp^.Info.GroupStudents[Item.Index].Code;
- Item.SubItems.Strings[0] := Temp^.Info.GroupStudents[Item.Index].FullName;
- Item.SubItems.Strings[1] :=
- IntToStr(Temp^.Info.GroupStudents[Item.Index].Marks);
- Item.SubItems.Strings[2] :=
- (Temp^.Info.GroupStudents[Item.Index].Code);
- Item.SubItems.Strings[3] :=
- (Temp^.Info.GroupStudents[Item.Index].Code);
- End;
- procedure TMainForm.StudentListViewDblClick(Sender: TObject);
- var
- Item: TListItem;
- //CurrentNode: PGroup;
- begin
- Item := StudentListView.Selected;
- If Assigned(Item) and Item.Selected then
- begin
- AddStudentForm.AddBtn.Visible := False;
- AddStudentForm.ChangeBtn.Visible := True;
- AddStudentForm.FCurrentIndex := Item.Index;
- AddStudentForm.SetStudentEdits;
- AddStudentForm.ShowModal;
- If AddStudentForm.ModalResult = MrYes Then
- Begin
- SetNewStudent(Item, AddStudentForm.FCurrentNode);
- End;
- end;
- end;
- procedure TMainForm.StudentListViewKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- Var
- Item: TListItem;
- Index, I: Integer;
- CurrentNode: STGroup;
- begin
- If (Key = VK_DELETE) and (StudentListView.ItemIndex <> -1) and
- (MessageBox(MainForm.Handle, 'Вы хотите удалить данного студента?',
- 'Удаление', MB_YESNO + MB_ICONQUESTION) = ID_YES) Then
- Begin
- Item := StudentListView.Selected;
- Index := Item.Index;
- CurrentNode := AddStudentForm.FCurrentNode;
- For I := Index to High(CurrentNode^.Info.GroupStudents) - 1 do
- Begin
- CurrentNode^.Info.GroupStudents[I] :=
- CurrentNode^.Info.GroupStudents[I + 1];
- End;
- CurrentNode^.Info.GroupStudents[10] := AddForm.FStartArr[10];
- StudentListView.Clear;
- ShowStudent(CurrentNode);
- End;
- end;
- procedure TMainForm.StudentRatingsClick(Sender: TObject);
- begin
- RatingForm.FindGoodStudents(GroupList.Head);
- RatingForm.ShowModal;
- end;
- end.
- unit GroupAddUnit;
- interface
- uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
- System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Mask, Vcl.ExtCtrls,
- Vcl.Buttons, MainUnit, Vcl.CheckLst, Vcl.ComCtrls;
- type
- TAddForm = class(TForm)
- TeamNameEdit: TLabeledEdit;
- TeamCodeEdit: TLabeledEdit;
- TeamCountryEdit: TLabeledEdit;
- TeamRankEdit: TLabeledEdit;
- AddBtn: TBitBtn;
- InfoLabel: TLabel;
- ChangeBtn: TBitBtn;
- procedure StrKeyPress(Sender: TObject; var Key: Char);
- procedure LabeledEditChange(Sender: TObject);
- procedure NumberPress(Sender: TObject; var Key: Char);
- procedure LabeledEditKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- procedure SpeedButtonClick(Sender: TObject);
- procedure AddBtnClick(Sender: TObject);
- Procedure ClearEdits;
- Function NormalizeString(const AStr: String): String;
- procedure ChangeBtnClick(Sender: TObject);
- Procedure SetTeamFields(Temp: STGroup);
- Procedure SetTeamEdits(Temp: STGroup);
- procedure FormClose(Sender: TObject; var Action: TCloseAction);
- Function SimilarGroups(Head, Temp: STGroup): Boolean;
- Function WasNotChanged(Temp: STGroup): Boolean;
- private
- FCurrentPointer: STGroup;
- public
- FStartArr: TArrStudent;
- end;
- var
- AddForm: TAddForm;
- implementation
- {$R *.dfm}
- procedure TAddForm.NumberPress(Sender: TObject; var Key: Char);
- Var
- CursorPosition, NewCursorPosition: Integer;
- TempAll, TempSelected, TempBeforeCursor, TempAfterCursor: String;
- begin
- If Not(Key In ['0' .. '9', #08]) Then
- Key := #0;
- NewCursorPosition := Length(TEdit(Sender).Text) -
- Length(TEdit(Sender).SelText);
- TempSelected := TEdit(Sender).SelText;
- TempAll := TEdit(Sender).Text;
- CursorPosition := TEdit(Sender).SelStart;
- If (TEdit(Sender).SelStart = 0) and
- (TEdit(Sender).SelLength < TEdit(Sender).GetTextLen) and (Key = '0') Then
- Key := #0;
- If (Key <> #0) and (TempSelected <> '') Then
- Begin
- Try
- Delete(TempAll, CursorPosition + 1, Length(TempSelected));
- Insert(Key, TempAll, CursorPosition + 1);
- If (StrToInt(TempAll) < 1) or (StrToInt(TempAll) > 9999) Then
- Key := #0
- Else
- Begin
- TEdit(Sender).Text := TempAll;
- TEdit(Sender).SelStart := NewCursorPosition + 1;
- Key := #0;
- End;
- Except
- Key := #0;
- End;
- End;
- TempBeforeCursor := Copy(TEdit(Sender).Text, 1, TEdit(Sender).SelStart);
- TempAfterCursor := Copy(TEdit(Sender).Text, TEdit(Sender).SelStart + 1,
- TEdit(Sender).GetTextLen);
- // SelStart идет с 0
- If (Key <> #0) and (Key <> #08) and
- ((StrToInt(TempBeforeCursor + Key + TempAfterCursor) < 1) or
- (StrToInt(TempBeforeCursor + Key + TempAfterCursor) > 9999)) Then
- Key := #0;
- end;
- procedure TAddForm.LabeledEditKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- begin
- If (Shift = [ssCtrl]) and (Key = Ord('A')) then
- TLabeledEdit(Sender).SelectAll;
- end;
- Function TAddForm.WasNotChanged(Temp: STGroup): Boolean;
- Begin
- WasNotChanged := (FCurrentPointer.Info.Data.GroupNumber = Temp.Info.Data.
- GroupNumber) and
- (FCurrentPointer.Info.Data.YearOfStart = Temp.Info.Data.YearOfStart) and
- (FCurrentPointer.Info.Data.Code = Temp.Info.Data.Code) and
- (FCurrentPointer.Info.Data.Students = Temp.Info.Data.Students);
- End;
- procedure TAddForm.ChangeBtnClick(Sender: TObject);
- Var
- Temp: STGroup;
- begin
- New(Temp);
- SetTeamFields(Temp);
- Temp^.Info.GroupStudents := FStartArr;
- Temp^.Next := Nil;
- If WasNotChanged(Temp) Then
- Begin
- SetTeamFields(FCurrentPointer);
- Self.Close;
- ModalResult := mrYes;
- Dispose(Temp);
- End
- Else If SimilarGroups(FCurrentPointer, Temp) Then
- Application.MessageBox
- ('Некоторые из поле данной команды уже заняты другой командой в списке!',
- 'Ошибка', MB_ICONERROR)
- Else
- Begin
- SetTeamFields(FCurrentPointer);
- Self.Close;
- ModalResult := mrYes;
- Dispose(Temp);
- End;
- end;
- Procedure TAddForm.SetTeamEdits(Temp: STGroup);
- Begin
- FCurrentPointer := Temp;
- TeamNameEdit.Text := IntToStr(Temp^.Info.Data.GroupNumber);
- TeamCodeEdit.Text := IntToStr(Temp^.Info.Data.YearOfStart);
- TeamCountryEdit.Text := IntToStr(Temp^.Info.Data.Code);
- TeamRankEdit.Text := IntToStr(Temp^.Info.Data.Students);
- End;
- Procedure TAddForm.SetTeamFields(Temp: STGroup);
- Begin
- Temp^.Info.Data.GroupNumber := StrToInt(TeamNameEdit.Text);
- Temp^.Info.Data.YearOfStart := StrToInt(TeamCountryEdit.Text);
- Temp^.Info.Data.Code := StrToInt(TeamCodeEdit.Text);
- Temp^.Info.Data.Students := StrToInt(TeamRankEdit.Text);
- End;
- procedure TAddForm.ClearEdits;
- Begin
- TeamNameEdit.Clear;
- TeamCodeEdit.Clear;
- TeamCountryEdit.Clear;
- TeamRankEdit.Clear;
- End;
- procedure TAddForm.FormClose(Sender: TObject; var Action: TCloseAction);
- begin
- ClearEdits;
- end;
- procedure TAddForm.SpeedButtonClick(Sender: TObject);
- begin
- ClearEdits;
- end;
- Function TAddForm.NormalizeString(const AStr: String): String;
- Var
- LowerStr, RestOfString: String;
- FirstLetter: String[1];
- Begin
- LowerStr := AnsiLowerCase(AStr);
- FirstLetter := AnsiUpperCase(Copy(LowerStr, 1, 1));
- RestOfString := Copy(LowerStr, 2, Length(LowerStr) - 1);
- NormalizeString := FirstLetter + RestOfString;
- End;
- Function TAddForm.SimilarGroups(Head, Temp: STGroup): Boolean;
- Var
- IsCorrect: Boolean;
- Current: STGroup;
- Begin
- Current := Head;
- IsCorrect := False;
- While Not(IsCorrect) and (Current <> Nil) do
- Begin
- IsCorrect := (Current^.Info.Data.GroupNumber = Temp^.Info.Data.GroupNumber)
- or (Current^.Info.Data.YearOfStart = Temp^.Info.Data.YearOfStart) or
- (Current^.Info.Data.Students = Temp^.Info.Data.Students);
- Current := Current^.Next;
- End;
- SimilarGroups := IsCorrect;
- End;
- procedure TAddForm.AddBtnClick(Sender: TObject);
- Var
- Temp: STGroup;
- begin
- New(Temp);
- SetTeamFields(Temp);
- Temp^.Info.GroupStudents := FStartArr;
- Temp^.Next := Nil;
- If SimilarGroups(GroupList.Head, Temp) Then
- Application.MessageBox
- ('Некоторые из поле данной команды уже заняты другой командой в списке!',
- 'Ошибка', MB_ICONERROR)
- Else
- Begin
- MainForm.InsertInDataList(Temp^);
- Self.Close;
- ModalResult := mrYes;
- End;
- Dispose(Temp);
- end;
- procedure TAddForm.LabeledEditChange(Sender: TObject);
- Var
- I: Integer;
- begin
- AddBtn.Enabled := (TeamNameEdit.GetTextLen > 0) and
- (TeamCodeEdit.GetTextLen > 0) and (TeamCountryEdit.GetTextLen > 0) and
- (TeamRankEdit.GetTextLen > 0);
- ChangeBtn.Enabled := (TeamNameEdit.GetTextLen > 0) and
- (TeamCodeEdit.GetTextLen > 0) and (TeamCountryEdit.GetTextLen > 0) and
- (TeamRankEdit.GetTextLen > 0);
- If (TLabeledEdit(Sender).GetTextLen > 0) and
- (TLabeledEdit(Sender).Text[1] = '0') then
- begin
- I := 1;
- While TLabeledEdit(Sender).Text[I] = '0' do
- Inc(I);
- TLabeledEdit(Sender).Text := Copy(TLabeledEdit(Sender).Text, I,
- TLabeledEdit(Sender).GetTextLen - I + 1);
- end;
- end;
- procedure TAddForm.StrKeyPress(Sender: TObject; var Key: Char);
- begin
- If ((not(Key in ['0' .. '9'])) and (Key <> #08)) Then
- Key := #0;
- end;
- end.
- unit RatingsOfAllStudents;
- interface
- uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
- System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, MainUnit, Vcl.ComCtrls, Vcl.Grids,
- CommCtrl;
- type
- TRating = Record
- TeamCode, Marks: Integer;
- FullName: String[50];
- Code: String[6];
- End;
- PRating = ^TRating;
- PAllRating = ^TAllRating;
- TAllRating = Record
- Current: TRating;
- Next: PAllRating;
- End;
- TLinkedList = Record
- Head, Tail: PAllRating;
- End;
- TListView = class(Vcl.ComCtrls.TListView)
- end;
- TRatingForm = class(TForm)
- ListView1: TListView;
- Procedure FindGoodStudents(Temp: STGroup);
- Procedure InsertElement(Var List: TLinkedList; NewRating: TRating);
- Procedure OutputToTable;
- procedure FormClose(Sender: TObject; var Action: TCloseAction);
- private
- GoodStudentsList: TLinkedList;
- public
- end;
- var
- RatingForm: TRatingForm;
- implementation
- {$R *.dfm}
- procedure ClearLinkedList(var List: TLinkedList);
- var
- Current, nextNode: PAllRating;
- begin
- Current := List.Head;
- while Current <> nil do
- begin
- nextNode := Current^.Next;
- Dispose(Current);
- Current := nextNode;
- end;
- List.Head := nil;
- List.Tail := nil;
- end;
- procedure TRatingForm.InsertElement(Var List: TLinkedList; NewRating: TRating);
- var
- NewNode: PAllRating;
- begin
- New(NewNode);
- NewNode^.Current := NewRating;
- NewNode^.Next := nil;
- If List.Head = nil Then
- Begin
- List.Head := NewNode;
- List.Tail := NewNode;
- End
- Else
- Begin
- List.Tail^.Next := NewNode;
- List.Tail := List.Tail^.Next;
- End;
- end;
- procedure TRatingForm.FormClose(Sender: TObject; var Action: TCloseAction);
- begin
- ListView1.Clear;
- ClearLinkedList(GoodStudentsList);
- end;
- procedure SplitLinkedList(var Source, FrontList, BackList: PAllRating);
- var
- FastPtr, SlowPtr: PAllRating;
- begin
- SlowPtr := Source;
- FastPtr := Source^.Next;
- // Используется два указателя: slowPtr и fastPtr.
- // fastPtr перемещается вдвое быстрее, чем slowPtr,
- // чтобы разделить список пополам.
- while (FastPtr <> nil) do
- begin
- FastPtr := FastPtr^.Next;
- if (FastPtr <> nil) then
- begin
- SlowPtr := SlowPtr^.Next;
- FastPtr := FastPtr^.Next;
- end;
- end;
- // frontList указывает на начало первой половины списка,
- // а backList указывает на начало второй половины списка.
- FrontList := Source;
- BackList := SlowPtr^.Next;
- SlowPtr^.Next := nil; // Разрываем связь между двумя половинами.
- end;
- // Функция для объединения двух отсортированных списков
- function SortedMerge(listA, listB: PAllRating): PAllRating;
- var
- MergedList: PAllRating;
- begin
- // Если один из списков пуст, возвращаем другой список.
- if (listA = nil) then
- Result := listB
- else if (listB = nil) then
- Result := listA
- else
- begin
- if (listA^.Current.Marks >= listB^.Current.Marks) then
- begin
- MergedList := listA;
- MergedList^.Next := SortedMerge(listA^.Next, listB);
- end
- else
- begin
- MergedList := listB;
- MergedList^.Next := SortedMerge(listA, listB^.Next);
- end;
- Result := MergedList;
- end;
- end;
- procedure MergeSort(var headList: PAllRating);
- var
- headPtr, firstHalf, secondHalf: PAllRating;
- begin
- headPtr := headList;
- // Базовый случай: если список пуст или состоит из одного элемента,
- // он уже отсортирован.
- if (headPtr = nil) or (headPtr^.Next = nil) then
- Exit;
- // Разделяем список на две половины.
- SplitLinkedList(headPtr, firstHalf, secondHalf);
- // Рекурсивно сортируем каждую половину списка.
- MergeSort(firstHalf);
- MergeSort(secondHalf);
- // Объединяем отсортированные половины в один список.
- headList := SortedMerge(firstHalf, secondHalf);
- end;
- // Процедура для сортировки однонаправленного списка (TLinkedList)
- procedure SortList(var LinkedList: TLinkedList);
- begin
- // Вызываем MergeSort, передавая указатель на начало списка.
- MergeSort(LinkedList.Head);
- // Находим указатель на последний элемент списка (Tail).
- LinkedList.Tail := LinkedList.Head;
- If LinkedList.Tail <> Nil Then
- while (LinkedList.Tail^.Next <> nil) do
- LinkedList.Tail := LinkedList.Tail^.Next;
- end;
- Procedure TRatingForm.FindGoodStudents(Temp: STGroup);
- Var
- CurrentNode: STGroup;
- Info: PRating;
- I: Integer;
- Begin
- CurrentNode := Temp;
- While CurrentNode <> Nil do
- Begin
- For I := Low(CurrentNode.Info.GroupStudents)
- to High(CurrentNode.Info.GroupStudents) do
- Begin
- If CurrentNode.Info.GroupStudents[I].FullName <> '' Then
- Begin
- New(Info);
- Info^.TeamCode := CurrentNode.Info.Data.Code;
- Info^.FullName := CurrentNode.Info.GroupStudents[I].FullName;
- Info^.Code := CurrentNode.Info.GroupStudents[I].Code;
- Info^.Marks := CurrentNode.Info.GroupStudents[I].Marks;
- InsertElement(GoodStudentsList, Info^);
- End;
- End;
- CurrentNode := CurrentNode^.Next;
- End;
- SortList(GoodStudentsList);
- OutputToTable;
- End;
- Procedure TRatingForm.OutputToTable;
- Var
- TempOutputBest: PAllRating;
- Item: TListItem;
- Begin
- TempOutputBest := GoodStudentsList.Head;
- While (TempOutputBest <> Nil) do
- Begin
- Item := ListView1.Items.Add;
- Item.Caption := IntToStr(TempOutputBest.Current.TeamCode);
- Item.SubItems.Add(TempOutputBest.Current.Code);
- Item.SubItems.Add(TempOutputBest.Current.FullName);
- Item.SubItems.Add(IntToStr(TempOutputBest.Current.Marks));
- TempOutputBest := TempOutputBest^.Next;
- End;
- While (TempOutputBest <> Nil) do
- Begin
- Item := ListView1.Items.Add;
- Item.Caption := IntToStr(TempOutputBest.Current.TeamCode);
- Item.SubItems.Add(TempOutputBest.Current.Code);
- Item.SubItems.Add(TempOutputBest.Current.FullName);
- Item.SubItems.Add(IntToStr(TempOutputBest.Current.Marks));
- TempOutputBest := TempOutputBest^.Next;
- End;
- End;
- end.
- unit StudentAddUnit;
- interface
- uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
- System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, MainUnit, Vcl.StdCtrls, Vcl.ExtCtrls,
- Vcl.Buttons, Vcl.Grids;
- type
- TAddStudentForm = class(TForm)
- StudentNameEdit: TLabeledEdit;
- StudentCodeEdit: TLabeledEdit;
- AddBtn: TBitBtn;
- ChangeBtn: TBitBtn;
- GridOfMarks: TStringGrid;
- Label2: TLabel;
- Button1: TButton;
- Function NormalizeString(const AStr: String): String;
- procedure StudentStrKeyPress(Sender: TObject; var Key: Char);
- procedure StudentCodeEditKeyPress(Sender: TObject; var Key: Char);
- procedure StudentNameEditKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- procedure SBRefreshClick(Sender: TObject);
- Procedure ClearEdits;
- procedure AddBtnClick(Sender: TObject);
- Procedure SetStudentFields(Temp: PStudent);
- procedure StudentNameEditChange(Sender: TObject);
- procedure FormClose(Sender: TObject; var Action: TCloseAction);
- Procedure SetStudentEdits;
- procedure ComboBoxPositionKeyPress(Sender: TObject; var Key: Char);
- procedure ChangeBtnClick(Sender: TObject);
- procedure GridOfMarksKeyPress(Sender: TObject; var Key: Char);
- procedure Button1Click(Sender: TObject);
- procedure GetMarks;
- procedure StudentNameEditKeyPress(Sender: TObject; var Key: Char);
- private
- { Private declarations }
- public
- FCurrentNode: STGroup;
- FCurrentIndex: Integer;
- { Public declarations }
- end;
- Const
- Digits = '0123456789';
- var
- AddStudentForm: TAddStudentForm;
- Keys: Integer;
- IsEnabled: Boolean;
- implementation
- Procedure TAddStudentForm.SetStudentEdits;
- Var
- Temp: String[6];
- Begin
- StudentNameEdit.Text := FCurrentNode^.Info.GroupStudents
- [FCurrentIndex].FullName;
- Temp := FCurrentNode^.Info.GroupStudents[FCurrentIndex].Code;
- Delete(Temp, 1, 1);
- StudentCodeEdit.Text := Temp;
- Label2.Caption :=
- IntToStr((FCurrentNode^.Info.GroupStudents[FCurrentIndex].Marks));
- End;
- Function TAddStudentForm.NormalizeString(const AStr: String): String;
- Var
- LowerStr, RestOfString: String;
- FirstLetter: String[1];
- Begin
- LowerStr := AnsiLowerCase(AStr);
- FirstLetter := AnsiUpperCase(Copy(LowerStr, 1, 1));
- RestOfString := Copy(LowerStr, 2, Length(LowerStr) - 1);
- NormalizeString := FirstLetter + RestOfString;
- End;
- {$R *.dfm}
- procedure TAddStudentForm.StudentCodeEditKeyPress(Sender: TObject;
- var Key: Char);
- begin
- If Not(Key In ['A' .. 'Z', 'a' .. 'z', '0' .. '9', #08]) Then
- Begin
- Key := #0;
- End;
- end;
- procedure TAddStudentForm.StudentNameEditChange(Sender: TObject);
- Var
- I: Integer;
- begin
- AddBtn.Enabled := (StudentNameEdit.GetTextLen > 0) and
- (StudentCodeEdit.GetTextLen > 0) and (Button1.Enabled = True);
- ChangeBtn.Enabled := (StudentNameEdit.GetTextLen > 0) and
- (StudentCodeEdit.GetTextLen > 0) and (Button1.Enabled = True);
- If (TLabeledEdit(Sender).GetTextLen > 0) and
- (TLabeledEdit(Sender).Text[1] = '0') then
- begin
- I := 1;
- While TLabeledEdit(Sender).Text[I] = '0' do
- Inc(I);
- TLabeledEdit(Sender).Text := Copy(TLabeledEdit(Sender).Text, I,
- TLabeledEdit(Sender).GetTextLen - I + 1);
- end;
- end;
- procedure TAddStudentForm.StudentNameEditKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- begin
- If (Shift = [ssCtrl]) and (Key = Ord('A')) then
- Begin
- TLabeledEdit(Sender).SelectAll;
- End;
- end;
- procedure TAddStudentForm.StudentNameEditKeyPress(Sender: TObject;
- var Key: Char);
- begin
- if (Key in ['a' .. 'z', 'A' .. 'Z','0'..'9']) then
- Key := #0;
- end;
- procedure TAddStudentForm.StudentStrKeyPress(Sender: TObject; var Key: Char);
- begin
- If (TEdit(Sender).SelLength > 0) and Not((Key < #192) and (Key <> #08)) Then
- Begin
- TEdit(Sender).SelText := #0;
- End;
- If (Key < #192) and (Key <> #08) Then
- Begin
- Key := #0;
- End;
- If (Key = '№') Then
- Begin
- Key := #0;
- End;
- If (Length(TEdit(Sender).Text) = 50) and (Key <> #08) Then
- Begin
- Key := #0;
- End;
- end;
- Procedure TAddStudentForm.SetStudentFields(Temp: PStudent);
- Begin
- Temp^.FullName := NormalizeString(StudentNameEdit.Text);
- Temp^.Code := '#' + StudentCodeEdit.Text;
- Temp^.Marks := Keys;
- End;
- procedure TAddStudentForm.AddBtnClick(Sender: TObject);
- Var
- Temp: PStudent;
- begin
- New(Temp);
- SetStudentFields(Temp);
- FCurrentNode^.Info.GroupStudents[FCurrentIndex] := Temp^;
- Self.Close;
- ModalResult := AddBtn.ModalResult;
- Dispose(Temp);
- end;
- procedure TAddStudentForm.ChangeBtnClick(Sender: TObject);
- Var
- Temp: PStudent;
- begin
- Temp := @FCurrentNode^.Info.GroupStudents[FCurrentIndex];
- SetStudentFields(Temp);
- Self.Close;
- ModalResult := AddBtn.ModalResult;
- end;
- Procedure TAddStudentForm.ClearEdits;
- Var
- I: Integer;
- Begin
- StudentNameEdit.Clear;
- StudentCodeEdit.Clear;
- for I := 0 to GridOfMarks.RowCount - 1 do
- GridOfMarks.Rows[I].Clear;
- Label2.Caption := '';
- End;
- procedure TAddStudentForm.ComboBoxPositionKeyPress(Sender: TObject;
- var Key: Char);
- begin
- Key := #0;
- end;
- procedure TAddStudentForm.FormClose(Sender: TObject; var Action: TCloseAction);
- begin
- ClearEdits;
- end;
- procedure TAddStudentForm.Button1Click(Sender: TObject);
- begin
- GetMarks;
- end;
- procedure TAddStudentForm.GetMarks;
- Var
- Marks: Integer;
- begin
- if ((GridOfMarks.Cells[0, 0]) = '') or ((GridOfMarks.Cells[1, 0]) = '') or
- ((GridOfMarks.Cells[0, 0]) = '') or ((GridOfMarks.Cells[3, 0]) = '') or
- ((GridOfMarks.Cells[4, 0]) = '') then
- IsEnabled := False
- else
- begin
- Marks := StrToInt(GridOfMarks.Cells[0, 0]) +
- StrToInt(GridOfMarks.Cells[1, 0]) + StrToInt(GridOfMarks.Cells[2, 0]) +
- StrToInt(GridOfMarks.Cells[3, 0]) + StrToInt(GridOfMarks.Cells[4, 0]);
- Keys := Marks div 5;
- Label2.Caption := 'Средний балл:' + IntToStr(Keys);
- end;
- end;
- procedure TAddStudentForm.GridOfMarksKeyPress(Sender: TObject; var Key: Char);
- Var
- IsEnabledButton: Boolean;
- I: Integer;
- begin
- with TStringGrid(Sender) do
- if Not(Length(Cells[Col, Row]) = 0) and Not CharInSet(Key, [#08]) then
- Begin
- Key := #0;
- End;
- for I := 0 to GridOfMarks.ColCount - 1 do
- if not(Key in ['1' .. '9']) then
- Key := #0;
- for I := 0 to GridOfMarks.ColCount - 1 do
- if GridOfMarks.Cells[I, 0] = '' then
- IsEnabledButton := True;
- if not IsEnabledButton then
- Button1.Enabled := True
- else
- Button1.Enabled := False;
- end;
- procedure TAddStudentForm.SBRefreshClick(Sender: TObject);
- begin
- ClearEdits;
- end;
- end.
- unit FindStudentInGroups;
- interface
- uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, MainUnit, Vcl.StdCtrls, Vcl.ExtCtrls,
- Vcl.ComCtrls;
- type
- TForm1 = class(TForm)
- EEnterName: TEdit;
- Label1: TLabel;
- Button1: TButton;
- ListView: TListView;
- procedure Button1Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- Form1: TForm1;
- implementation
- {$R *.dfm}
- procedure TForm1.Button1Click(Sender: TObject);
- Var
- Name: String[50];
- I: Integer;
- NotFind: Boolean;
- Item: TListItem;
- begin
- Name := EEnterName.Text;
- NotFind := True;
- while ((BuferFGroupList.Head <> Nil) and NotFind) do
- Begin
- for I := Low(BuferFGroupList.Head.Info.GroupStudents) to High(BuferFGroupList.Head.Info.GroupStudents) do
- Begin
- if (BuferFGroupList.Head.Info.GroupStudents[I].FullName = Name) then
- Begin
- NotFind := False;
- //как-то вывести результат по аналогии с другим модулем:
- Item := ListView.Items.Add;
- Item.Caption := IntToStr(BuferFGroupList.Head.Info.Data.Code); //код специальности
- Item.SubItems.Add(IntToStr(BuferFGroupList.Head.Info.Data.Students)); //кол-во студентов в группе
- Item.SubItems.Add(IntToStr(BuferFGroupList.Head.Info.Data.GroupNumber)); //код группы
- Item.SubItems.Add(IntToStr(BuferFGroupList.Head.Info.Data.YearOfStart)); //год начала
- Item.SubItems.Add(BuferFGroupList.Head.Info.GroupStudents[I].FullName); //фио
- Item.SubItems.Add((BuferFGroupList.Head.Info.GroupStudents[I].Code)); //код студента
- Item.SubItems.Add(IntToStr(BuferFGroupList.Head.Info.GroupStudents[I].Marks)); //средний балл
- //взято из TeamForm
- End;
- End;
- BuferFGroupList.Head := BuferFGroupList.Head.Next;
- End;
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement