Advertisement
altervisi0n

Untitled

Jun 1st, 2023
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 36.23 KB | None | 0 0
  1. unit MainUnit;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  7.   System.Classes, Vcl.Graphics,
  8.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.CustomizeDlg,
  9.   Vcl.ToolWin, Vcl.ActnMan, Vcl.ActnCtrls, Vcl.ActnMenus, Vcl.ActnColorMaps,
  10.   Vcl.Mask, Vcl.ExtCtrls, Vcl.Buttons, Vcl.CheckLst, Vcl.CategoryButtons,
  11.   Vcl.ButtonGroup, Vcl.ComCtrls, Vcl.JumpList, CommCtrl, Vcl.Menus,
  12.   Vcl.WinXCtrls, System.ImageList, Vcl.ImgList;
  13.  
  14. type
  15.  
  16.   TGroup = record
  17.     Code, Students: Integer;
  18.     GroupNumber: Integer;
  19.     YearOfStart: Integer;
  20.   end;
  21.  
  22.  
  23.   TStudent = record
  24.     FullName: String[50];
  25.     Code: String[6];
  26.     Marks: LongInt;
  27.   end;
  28.  
  29.   PStudent = ^TStudent;
  30.  
  31.   TArrStudent = Array [0 .. 30] of TStudent;
  32.  
  33.  
  34.   TAllInfo = Record
  35.     Data: TGroup;
  36.     GroupStudents: TArrStudent;
  37.   End;
  38.  
  39.   STGroup = ^TGroupNode;
  40.  
  41.   TGroupNode = Record
  42.     Info: TAllInfo;
  43.     Next: STGroup;
  44.   end;
  45.  
  46.   TGroupList = record
  47.     Head: STGroup;
  48.     Tail: STGroup;
  49.   end;
  50.  
  51.   TListView = class(Vcl.ComCtrls.TListView)
  52.  
  53.   end;
  54.  
  55.   TMainForm = class(TForm)
  56.     LViewTeam: TListView;
  57.     BitBtn2: TBitBtn;
  58.     PanelAnalysis: TPanel;
  59.     PanelAdd: TPanel;
  60.     StudentListView: TListView;
  61.     PanelStudents: TPanel;
  62.     AddStudentBtn: TBitBtn;
  63.     MainMenu: TMainMenu;
  64.     PopupMenu: TPopupMenu;
  65.     N1: TMenuItem;
  66.     OpenFile: TMenuItem;
  67.     SaveFile: TMenuItem;
  68.     StudentRatings: TMenuItem;
  69.     AnalysisButton: TMenuItem;
  70.     OpenDialog: TOpenDialog;
  71.     SaveDialog: TSaveDialog;
  72.     SplitView1: TSplitView;
  73.     FindStudent: TMenuItem;
  74.     Procedure InsertInDataList(InsertNode: TGroupNode);
  75.     Procedure RemoveGroup(Code: Integer);
  76.     procedure LViewGroupSelectItem(Sender: TObject; Item: TListItem;
  77.       Selected: Boolean);
  78.     procedure LViewGroupDblClick(Sender: TObject);
  79.     procedure FormCreate(Sender: TObject);
  80.     procedure FormShow(Sender: TObject);
  81.     procedure LViewGroupKeyDown(Sender: TObject; var Key: Word;
  82.       Shift: TShiftState);
  83.     procedure BitBtn2Click(Sender: TObject);
  84.     Procedure AddToListView;
  85.     Function FindGroupByCode(GroupNumber: Integer): STGroup;
  86.     Procedure ChangeRowInListView(Item: TListItem; CurrentNode: STGroup);
  87.     procedure AddStudentBtnClick(Sender: TObject);
  88.     Procedure AddToStudentListView(Index: Integer; CurrentNode: STGroup);
  89.     Procedure ShowStudent(Temp: STGroup);
  90.     procedure StudentListViewDblClick(Sender: TObject);
  91.     Procedure SetNewStudent(Item: TListItem; Temp: STGroup);
  92.     procedure StudentListViewKeyDown(Sender: TObject; var Key: Word;
  93.       Shift: TShiftState);
  94.     procedure StudentRatingsClick(Sender: TObject);
  95.     procedure SaveFileClick(Sender: TObject);
  96.     procedure OpenFileClick(Sender: TObject);
  97.     Procedure ClearLinkedList;
  98.     procedure AnalysisButtonClick(Sender: TObject);
  99.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  100.     procedure FindStudentClick(Sender: TObject);
  101.  
  102. public
  103.  
  104. private
  105.  
  106.   end;
  107.  
  108. var
  109.   MainForm: TMainForm;
  110.   BuferFGroupList: TGroupList;
  111.   GroupList: TGroupList;
  112.  
  113. implementation
  114.  
  115. {$R *.dfm}
  116.  
  117. uses GroupAddUnit, StudentAddUnit, RatingsOfAllStudents, StudentInGroups, FindStudentInGroups;
  118.  
  119.  
  120. Procedure TMainForm.AddToListView;
  121. Var
  122.   Item: TListItem;
  123. Begin
  124.   Item := LViewTeam.Items.Add;
  125.   Item.Caption := IntToStr(GroupList.Tail^.Info.Data.GroupNumber);
  126.   Item.SubItems.Add(IntToStr(GroupList.Tail^.Info.Data.YearOfStart));
  127.   Item.SubItems.Add(IntToStr(GroupList.Tail^.Info.Data.Code));
  128.   Item.SubItems.Add(IntToStr(GroupList.Tail^.Info.Data.Students));
  129. End;
  130.  
  131. Procedure TMainForm.ChangeRowInListView(Item: TListItem; CurrentNode: STGroup);
  132. Begin
  133.   Item.Caption := IntToStr(CurrentNode^.Info.Data.GroupNumber);
  134.   Item.SubItems.Strings[0] := IntToStr(CurrentNode^.Info.Data.YearOfStart);
  135.   Item.SubItems.Strings[1] := IntToStr(CurrentNode^.Info.Data.Code);
  136.   Item.SubItems.Strings[2] := IntToStr(CurrentNode^.Info.Data.Students);
  137. End;
  138.  
  139. Procedure TMainForm.AddToStudentListView(Index: Integer; CurrentNode: STGroup);
  140. Var
  141.   Item: TListItem;
  142. Begin
  143.   Item := StudentListView.Items.Add;
  144.   Item.Caption := CurrentNode^.Info.GroupStudents[Index].Code;
  145.   Item.SubItems.Add(CurrentNode^.Info.GroupStudents[Index].FullName);
  146.   Item.SubItems.Add(IntToStr(CurrentNode^.Info.GroupStudents[Index].Marks));
  147.  
  148. End;
  149.  
  150. procedure TMainForm.AnalysisButtonClick(Sender: TObject);
  151. begin
  152.   TeamForm.CalculatePlayers(GroupList.Head);
  153.   TeamForm.ShowModal;
  154. end;
  155.  
  156. procedure TMainForm.AddStudentBtnClick(Sender: TObject);
  157. var
  158.   I: Integer;
  159. begin
  160.  
  161.   If StudentListView.GetCount < 25 Then
  162.   Begin
  163.     AddStudentForm.AddBtn.Visible := True;
  164.     AddStudentForm.ChangeBtn.Visible := False;
  165.     AddStudentForm.FCurrentIndex := StudentListView.GetCount;
  166.     AddStudentForm.ShowModal;
  167.     If AddStudentForm.ModalResult = MrYes Then
  168.     Begin
  169.       AddToStudentListView(StudentListView.GetCount,
  170.         AddStudentForm.FCurrentNode);
  171.     End;
  172.  
  173.   End
  174.   Else
  175.     MessageBox(Handle, 'У вас достигнуто максимальное число студентов',
  176.       'Внимание', MB_ICONINFORMATION);
  177. end;
  178.  
  179. procedure TMainForm.BitBtn2Click(Sender: TObject);
  180. begin
  181.   AddForm.ChangeBtn.Visible := False;
  182.   AddForm.AddBtn.Visible := True;
  183.   AddForm.ShowModal;
  184.   If AddForm.ModalResult = MrYes Then
  185.   Begin
  186.     AddToListView;
  187.     SaveFile.Enabled := True;
  188.   End;
  189. end;
  190.  
  191. procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
  192. begin
  193.   ClearLinkedList;
  194. end;
  195.  
  196. procedure TMainForm.FormCreate(Sender: TObject);
  197. begin
  198.   LViewTeam.Columns[2].Width := LVSCW_AUTOSIZE_USEHEADER;
  199. end;
  200.  
  201. procedure TMainForm.FormShow(Sender: TObject);
  202. begin
  203.   LViewTeam.Width := LViewTeam.Width + 1;
  204.   LViewTeam.Width := LViewTeam.Width - 1;
  205. end;
  206.  
  207.  
  208. Function TMainForm.FindGroupByCode(GroupNumber: Integer): STGroup;
  209. Var
  210.   CurrentNode: STGroup;
  211.   IsFounded: Boolean;
  212. Begin
  213.   Result := Nil;
  214.   IsFounded := False;
  215.   CurrentNode := GroupList.Head;
  216.   While (CurrentNode <> nil) and Not(IsFounded) do
  217.   Begin
  218.     If CurrentNode^.Info.Data.GroupNumber = GroupNumber Then
  219.     Begin
  220.       IsFounded := True;
  221.       Result := CurrentNode;
  222.     End;
  223.     CurrentNode := CurrentNode^.Next;
  224.   End;
  225. End;
  226.  
  227.  
  228. Procedure TMainForm.RemoveGroup(Code: Integer);
  229. Var
  230.   CurrentNode, PreviousNode: STGroup;
  231. begin
  232.   CurrentNode := GroupList.Head;
  233.   PreviousNode := nil;
  234.   While (CurrentNode <> nil) and (CurrentNode.Info.Data.Code <> Code) do
  235.   begin
  236.     PreviousNode := CurrentNode;
  237.     CurrentNode := CurrentNode.Next;
  238.   end;
  239.   If CurrentNode <> nil then
  240.   begin
  241.     If CurrentNode = GroupList.Head then
  242.       GroupList.Head := GroupList.Head^.Next
  243.     Else
  244.       PreviousNode.Next := CurrentNode^.Next;
  245.     If CurrentNode = GroupList.Tail then
  246.       GroupList.Tail := PreviousNode;
  247.     Dispose(CurrentNode);
  248.   end;
  249. end;
  250.  
  251. procedure TMainForm.InsertInDataList(InsertNode: TGroupNode);
  252. Var
  253.   NewNode: STGroup;
  254. begin
  255.   New(NewNode);
  256.   NewNode^.Info.Data := InsertNode.Info.Data;
  257.   NewNode^.Info.GroupStudents := InsertNode.Info.GroupStudents;
  258.   NewNode^.Next := nil;
  259.   If GroupList.Head = nil Then
  260.   Begin
  261.     GroupList.Head := NewNode;
  262.     GroupList.Tail := NewNode;
  263.   End
  264.   Else
  265.   Begin
  266.     GroupList.Tail^.Next := NewNode;
  267.     GroupList.Tail := GroupList.Tail^.Next;
  268.   End;
  269. end;
  270.  
  271. procedure TMainForm.LViewGroupDblClick(Sender: TObject);
  272. var
  273.   Item: TListItem;
  274.   CurrentNode: STGroup;
  275. begin
  276.   Item := LViewTeam.Selected;
  277.   If Assigned(Item) and Item.Selected then
  278.   begin
  279.     CurrentNode := FindGroupByCode(StrToInt(Item.Caption));
  280.     AddForm.SetTeamEdits(CurrentNode);
  281.     AddForm.AddBtn.Visible := False;
  282.     AddForm.ChangeBtn.Visible := True;
  283.     AddForm.ShowModal;
  284.     If AddForm.ModalResult = MrYes Then
  285.       ChangeRowInListView(Item, CurrentNode);
  286.   end;
  287. end;
  288.  
  289. procedure TMainForm.LViewGroupKeyDown(Sender: TObject; var Key: Word;
  290.   Shift: TShiftState);
  291. begin
  292.   // Var X := LViewTeam.Selected.Caption; //код команды
  293.   If (Key = VK_DELETE) and (LViewTeam.ItemIndex <> -1) and
  294.     (MessageBox(MainForm.Handle, 'Вы хотите удалить данную команду?',
  295.     'Удаление', MB_YESNO + MB_ICONQUESTION) = ID_YES) Then
  296.   Begin
  297.     RemoveGroup(StrToInt(LViewTeam.Selected.Caption));
  298.     LViewTeam.Delete(LViewTeam.Selected);
  299.     SaveFile.Enabled := Not(LViewTeam.GetCount = 0);
  300.   End;
  301. end;
  302.  
  303. Procedure TMainForm.ShowStudent(Temp: STGroup);
  304. Var
  305.   I: Integer;
  306. Begin
  307.   For I := Low(Temp^.Info.GroupStudents) to High(Temp^.Info.GroupStudents) do
  308.   Begin
  309.     If Temp.Info.GroupStudents[I].Code <> '' Then
  310.     Begin
  311.       AddToStudentListView(StudentListView.GetCount, Temp);
  312.     End;
  313.   End;
  314. End;
  315.  
  316. procedure TMainForm.LViewGroupSelectItem(Sender: TObject; Item: TListItem;
  317.   Selected: Boolean);
  318. begin
  319.   If Selected Then
  320.   Begin
  321.     AddStudentForm.FCurrentNode := FindGroupByCode(StrToInt(Item.Caption));
  322.     StudentListView.Clear;
  323.     ShowStudent(AddStudentForm.FCurrentNode);
  324.     AddStudentBtn.Enabled := True;
  325.   End
  326.   Else
  327.   Begin
  328.     StudentListView.Clear;
  329.     AddStudentBtn.Enabled := False;
  330.   End;
  331. end;
  332.  
  333. procedure TMainForm.FindStudentClick(Sender: TObject);
  334. begin
  335.     BuferFGroupList := GroupList;
  336.     FindStudentInGroups.Form1.ShowModal;
  337. end;
  338.  
  339. procedure TMainForm.ClearLinkedList;
  340. Var
  341.   Current, NextNode: STGroup;
  342. begin
  343.   Current := GroupList.Head;
  344.   while Current <> nil do
  345.   begin
  346.     NextNode := Current^.Next;
  347.     Dispose(Current);
  348.     Current := NextNode;
  349.   end;
  350.   GroupList.Head := nil;
  351.   GroupList.Tail := nil;
  352. end;
  353.  
  354. procedure TMainForm.OpenFileClick(Sender: TObject);
  355. Var
  356.   FileInput: File of TAllInfo;
  357.   Temp: STGroup;
  358.   Item: TListItem;
  359. begin
  360.   If OpenDialog.Execute Then
  361.   Begin
  362.     Try
  363.       Try
  364.         AssignFile(FileInput, ChangeFileExt(OpenDialog.FileName, '.txt'));
  365.         Reset(FileInput);
  366.         ClearLinkedList;
  367.         StudentListView.Clear;
  368.         LViewTeam.Clear;
  369.         While Not Eof(FileInput) do
  370.         Begin
  371.           New(Temp);
  372.           Temp^.Next := Nil;
  373.           Read(FileInput, Temp^.Info);
  374.           InsertInDataList(Temp^);
  375.           Dispose(Temp);
  376.         End;
  377.         Temp := GroupList.Head;
  378.         While Temp <> Nil do
  379.         Begin
  380.           Item := LViewTeam.Items.Add;
  381.           Item.Caption := IntToStr(Temp^.Info.Data.GroupNumber);
  382.           Item.SubItems.Add(IntToStr(GroupList.Tail^.Info.Data.YearOfStart));
  383.           Item.SubItems.Add(IntToStr(GroupList.Tail^.Info.Data.Code));
  384.           Item.SubItems.Add(IntToStr(GroupList.Tail^.Info.Data.Students));
  385.           Temp := Temp^.Next;
  386.         End;
  387.         SaveFile.Enabled := True;
  388.       Except
  389.         MessageBox(Handle, 'Файл некорректен!', 'Внимание!',
  390.           MB_OK + MB_ICONWARNING);
  391.       End;
  392.     Finally
  393.       If FileExists(ChangeFileExt(SaveDialog.FileName, '.txt')) Then
  394.       Begin
  395.         CloseFile(FileInput);
  396.       End;
  397.     End;
  398.   End;
  399. end;
  400.  
  401. procedure TMainForm.SaveFileClick(Sender: TObject);
  402. Var
  403.   FileOutput: File of TAllInfo;
  404.   Temp: STGroup;
  405. begin
  406.   If SaveDialog.Execute Then
  407.   Begin
  408.     Try
  409.       Try
  410.         AssignFile(FileOutput, ChangeFileExt(SaveDialog.FileName, '.txt'));
  411.         Rewrite(FileOutput);
  412.         Temp := GroupList.Head;
  413.         While Temp <> Nil do
  414.         Begin
  415.           Write(FileOutput, Temp^.Info);
  416.           Temp := Temp^.Next;
  417.         End;
  418.       Except
  419.         MessageBox(Handle, 'Файл некорректен!', 'Внимание!',
  420.           MB_OK + MB_ICONWARNING);
  421.       End;
  422.     Finally
  423.       CloseFile(FileOutput);
  424.     End;
  425.   End;
  426. end;
  427.  
  428. Procedure TMainForm.SetNewStudent(Item: TListItem; Temp: STGroup);
  429. Begin
  430.   Item.Caption := Temp^.Info.GroupStudents[Item.Index].Code;
  431.   Item.SubItems.Strings[0] := Temp^.Info.GroupStudents[Item.Index].FullName;
  432.   Item.SubItems.Strings[1] :=
  433.     IntToStr(Temp^.Info.GroupStudents[Item.Index].Marks);
  434.  
  435.   Item.SubItems.Strings[2] :=
  436.     (Temp^.Info.GroupStudents[Item.Index].Code);
  437.   Item.SubItems.Strings[3] :=
  438.     (Temp^.Info.GroupStudents[Item.Index].Code);
  439. End;
  440.  
  441. procedure TMainForm.StudentListViewDblClick(Sender: TObject);
  442. var
  443.   Item: TListItem;
  444.   //CurrentNode: PGroup;
  445. begin
  446.   Item := StudentListView.Selected;
  447.   If Assigned(Item) and Item.Selected then
  448.   begin
  449.     AddStudentForm.AddBtn.Visible := False;
  450.     AddStudentForm.ChangeBtn.Visible := True;
  451.     AddStudentForm.FCurrentIndex := Item.Index;
  452.     AddStudentForm.SetStudentEdits;
  453.     AddStudentForm.ShowModal;
  454.     If AddStudentForm.ModalResult = MrYes Then
  455.     Begin
  456.       SetNewStudent(Item, AddStudentForm.FCurrentNode);
  457.     End;
  458.   end;
  459.  
  460. end;
  461.  
  462. procedure TMainForm.StudentListViewKeyDown(Sender: TObject; var Key: Word;
  463.   Shift: TShiftState);
  464. Var
  465.   Item: TListItem;
  466.   Index, I: Integer;
  467.   CurrentNode: STGroup;
  468. begin
  469.   If (Key = VK_DELETE) and (StudentListView.ItemIndex <> -1) and
  470.     (MessageBox(MainForm.Handle, 'Вы хотите удалить данного студента?',
  471.     'Удаление', MB_YESNO + MB_ICONQUESTION) = ID_YES) Then
  472.   Begin
  473.     Item := StudentListView.Selected;
  474.     Index := Item.Index;
  475.     CurrentNode := AddStudentForm.FCurrentNode;
  476.     For I := Index to High(CurrentNode^.Info.GroupStudents) - 1 do
  477.     Begin
  478.       CurrentNode^.Info.GroupStudents[I] :=
  479.         CurrentNode^.Info.GroupStudents[I + 1];
  480.     End;
  481.     CurrentNode^.Info.GroupStudents[10] := AddForm.FStartArr[10];
  482.     StudentListView.Clear;
  483.     ShowStudent(CurrentNode);
  484.   End;
  485. end;
  486.  
  487. procedure TMainForm.StudentRatingsClick(Sender: TObject);
  488. begin
  489.   RatingForm.FindGoodStudents(GroupList.Head);
  490.   RatingForm.ShowModal;
  491. end;
  492.  
  493. end.
  494.  
  495.  
  496. unit GroupAddUnit;
  497.  
  498. interface
  499.  
  500. uses
  501.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  502.   System.Classes, Vcl.Graphics,
  503.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Mask, Vcl.ExtCtrls,
  504.   Vcl.Buttons, MainUnit, Vcl.CheckLst, Vcl.ComCtrls;
  505.  
  506. type
  507.   TAddForm = class(TForm)
  508.     TeamNameEdit: TLabeledEdit;
  509.     TeamCodeEdit: TLabeledEdit;
  510.     TeamCountryEdit: TLabeledEdit;
  511.     TeamRankEdit: TLabeledEdit;
  512.     AddBtn: TBitBtn;
  513.     InfoLabel: TLabel;
  514.     ChangeBtn: TBitBtn;
  515.     procedure StrKeyPress(Sender: TObject; var Key: Char);
  516.     procedure LabeledEditChange(Sender: TObject);
  517.     procedure NumberPress(Sender: TObject; var Key: Char);
  518.     procedure LabeledEditKeyDown(Sender: TObject; var Key: Word;
  519.       Shift: TShiftState);
  520.     procedure SpeedButtonClick(Sender: TObject);
  521.     procedure AddBtnClick(Sender: TObject);
  522.     Procedure ClearEdits;
  523.     Function NormalizeString(const AStr: String): String;
  524.     procedure ChangeBtnClick(Sender: TObject);
  525.     Procedure SetTeamFields(Temp: STGroup);
  526.     Procedure SetTeamEdits(Temp: STGroup);
  527.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  528.     Function SimilarGroups(Head, Temp: STGroup): Boolean;
  529.     Function WasNotChanged(Temp: STGroup): Boolean;
  530.   private
  531.     FCurrentPointer: STGroup;
  532.   public
  533.     FStartArr: TArrStudent;
  534.   end;
  535.  
  536. var
  537.   AddForm: TAddForm;
  538.  
  539. implementation
  540.  
  541. {$R *.dfm}
  542.  
  543. procedure TAddForm.NumberPress(Sender: TObject; var Key: Char);
  544. Var
  545.   CursorPosition, NewCursorPosition: Integer;
  546.   TempAll, TempSelected, TempBeforeCursor, TempAfterCursor: String;
  547. begin
  548.   If Not(Key In ['0' .. '9', #08]) Then
  549.     Key := #0;
  550.   NewCursorPosition := Length(TEdit(Sender).Text) -
  551.     Length(TEdit(Sender).SelText);
  552.   TempSelected := TEdit(Sender).SelText;
  553.   TempAll := TEdit(Sender).Text;
  554.   CursorPosition := TEdit(Sender).SelStart;
  555.   If (TEdit(Sender).SelStart = 0) and
  556.     (TEdit(Sender).SelLength < TEdit(Sender).GetTextLen) and (Key = '0') Then
  557.     Key := #0;
  558.   If (Key <> #0) and (TempSelected <> '') Then
  559.   Begin
  560.     Try
  561.       Delete(TempAll, CursorPosition + 1, Length(TempSelected));
  562.       Insert(Key, TempAll, CursorPosition + 1);
  563.       If (StrToInt(TempAll) < 1) or (StrToInt(TempAll) > 9999) Then
  564.         Key := #0
  565.       Else
  566.       Begin
  567.         TEdit(Sender).Text := TempAll;
  568.         TEdit(Sender).SelStart := NewCursorPosition + 1;
  569.         Key := #0;
  570.       End;
  571.     Except
  572.       Key := #0;
  573.     End;
  574.   End;
  575.   TempBeforeCursor := Copy(TEdit(Sender).Text, 1, TEdit(Sender).SelStart);
  576.   TempAfterCursor := Copy(TEdit(Sender).Text, TEdit(Sender).SelStart + 1,
  577.     TEdit(Sender).GetTextLen);
  578.   // SelStart идет с 0
  579.   If (Key <> #0) and (Key <> #08) and
  580.     ((StrToInt(TempBeforeCursor + Key + TempAfterCursor) < 1) or
  581.     (StrToInt(TempBeforeCursor + Key + TempAfterCursor) > 9999)) Then
  582.     Key := #0;
  583. end;
  584.  
  585. procedure TAddForm.LabeledEditKeyDown(Sender: TObject; var Key: Word;
  586.   Shift: TShiftState);
  587. begin
  588.   If (Shift = [ssCtrl]) and (Key = Ord('A')) then
  589.     TLabeledEdit(Sender).SelectAll;
  590. end;
  591.  
  592. Function TAddForm.WasNotChanged(Temp: STGroup): Boolean;
  593. Begin
  594.   WasNotChanged := (FCurrentPointer.Info.Data.GroupNumber = Temp.Info.Data.
  595.     GroupNumber) and
  596.     (FCurrentPointer.Info.Data.YearOfStart = Temp.Info.Data.YearOfStart) and
  597.     (FCurrentPointer.Info.Data.Code = Temp.Info.Data.Code) and
  598.     (FCurrentPointer.Info.Data.Students = Temp.Info.Data.Students);
  599. End;
  600.  
  601. procedure TAddForm.ChangeBtnClick(Sender: TObject);
  602. Var
  603.   Temp: STGroup;
  604. begin
  605.   New(Temp);
  606.   SetTeamFields(Temp);
  607.   Temp^.Info.GroupStudents := FStartArr;
  608.   Temp^.Next := Nil;
  609.  
  610.   If WasNotChanged(Temp) Then
  611.   Begin
  612.     SetTeamFields(FCurrentPointer);
  613.     Self.Close;
  614.     ModalResult := mrYes;
  615.     Dispose(Temp);
  616.   End
  617.   Else If SimilarGroups(FCurrentPointer, Temp) Then
  618.     Application.MessageBox
  619.       ('Некоторые из поле данной команды уже заняты другой командой в списке!',
  620.       'Ошибка', MB_ICONERROR)
  621.   Else
  622.   Begin
  623.     SetTeamFields(FCurrentPointer);
  624.     Self.Close;
  625.     ModalResult := mrYes;
  626.     Dispose(Temp);
  627.   End;
  628. end;
  629.  
  630. Procedure TAddForm.SetTeamEdits(Temp: STGroup);
  631. Begin
  632.   FCurrentPointer := Temp;
  633.   TeamNameEdit.Text := IntToStr(Temp^.Info.Data.GroupNumber);
  634.   TeamCodeEdit.Text := IntToStr(Temp^.Info.Data.YearOfStart);
  635.   TeamCountryEdit.Text := IntToStr(Temp^.Info.Data.Code);
  636.   TeamRankEdit.Text := IntToStr(Temp^.Info.Data.Students);
  637. End;
  638.  
  639. Procedure TAddForm.SetTeamFields(Temp: STGroup);
  640. Begin
  641.   Temp^.Info.Data.GroupNumber := StrToInt(TeamNameEdit.Text);
  642.   Temp^.Info.Data.YearOfStart := StrToInt(TeamCountryEdit.Text);
  643.   Temp^.Info.Data.Code := StrToInt(TeamCodeEdit.Text);
  644.   Temp^.Info.Data.Students := StrToInt(TeamRankEdit.Text);
  645. End;
  646.  
  647. procedure TAddForm.ClearEdits;
  648. Begin
  649.   TeamNameEdit.Clear;
  650.   TeamCodeEdit.Clear;
  651.   TeamCountryEdit.Clear;
  652.   TeamRankEdit.Clear;
  653. End;
  654.  
  655. procedure TAddForm.FormClose(Sender: TObject; var Action: TCloseAction);
  656. begin
  657.   ClearEdits;
  658. end;
  659.  
  660. procedure TAddForm.SpeedButtonClick(Sender: TObject);
  661. begin
  662.   ClearEdits;
  663. end;
  664.  
  665. Function TAddForm.NormalizeString(const AStr: String): String;
  666. Var
  667.   LowerStr, RestOfString: String;
  668.   FirstLetter: String[1];
  669. Begin
  670.   LowerStr := AnsiLowerCase(AStr);
  671.   FirstLetter := AnsiUpperCase(Copy(LowerStr, 1, 1));
  672.   RestOfString := Copy(LowerStr, 2, Length(LowerStr) - 1);
  673.   NormalizeString := FirstLetter + RestOfString;
  674. End;
  675.  
  676. Function TAddForm.SimilarGroups(Head, Temp: STGroup): Boolean;
  677. Var
  678.   IsCorrect: Boolean;
  679.   Current: STGroup;
  680. Begin
  681.   Current := Head;
  682.   IsCorrect := False;
  683.   While Not(IsCorrect) and (Current <> Nil) do
  684.   Begin
  685.     IsCorrect := (Current^.Info.Data.GroupNumber = Temp^.Info.Data.GroupNumber)
  686.       or (Current^.Info.Data.YearOfStart = Temp^.Info.Data.YearOfStart) or
  687.       (Current^.Info.Data.Students = Temp^.Info.Data.Students);
  688.     Current := Current^.Next;
  689.   End;
  690.   SimilarGroups := IsCorrect;
  691. End;
  692.  
  693. procedure TAddForm.AddBtnClick(Sender: TObject);
  694. Var
  695.   Temp: STGroup;
  696. begin
  697.   New(Temp);
  698.   SetTeamFields(Temp);
  699.   Temp^.Info.GroupStudents := FStartArr;
  700.   Temp^.Next := Nil;
  701.   If SimilarGroups(GroupList.Head, Temp) Then
  702.     Application.MessageBox
  703.       ('Некоторые из поле данной команды уже заняты другой командой в списке!',
  704.       'Ошибка', MB_ICONERROR)
  705.   Else
  706.   Begin
  707.     MainForm.InsertInDataList(Temp^);
  708.     Self.Close;
  709.     ModalResult := mrYes;
  710.   End;
  711.   Dispose(Temp);
  712. end;
  713.  
  714. procedure TAddForm.LabeledEditChange(Sender: TObject);
  715. Var
  716.   I: Integer;
  717. begin
  718.   AddBtn.Enabled := (TeamNameEdit.GetTextLen > 0) and
  719.     (TeamCodeEdit.GetTextLen > 0) and (TeamCountryEdit.GetTextLen > 0) and
  720.     (TeamRankEdit.GetTextLen > 0);
  721.   ChangeBtn.Enabled := (TeamNameEdit.GetTextLen > 0) and
  722.     (TeamCodeEdit.GetTextLen > 0) and (TeamCountryEdit.GetTextLen > 0) and
  723.     (TeamRankEdit.GetTextLen > 0);
  724.   If (TLabeledEdit(Sender).GetTextLen > 0) and
  725.     (TLabeledEdit(Sender).Text[1] = '0') then
  726.   begin
  727.     I := 1;
  728.     While TLabeledEdit(Sender).Text[I] = '0' do
  729.       Inc(I);
  730.     TLabeledEdit(Sender).Text := Copy(TLabeledEdit(Sender).Text, I,
  731.       TLabeledEdit(Sender).GetTextLen - I + 1);
  732.   end;
  733. end;
  734.  
  735. procedure TAddForm.StrKeyPress(Sender: TObject; var Key: Char);
  736. begin
  737.   If ((not(Key in ['0' .. '9'])) and (Key <> #08)) Then
  738.     Key := #0;
  739. end;
  740.  
  741. end.
  742.  
  743.  
  744. unit RatingsOfAllStudents;
  745.  
  746. interface
  747.  
  748. uses
  749.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  750.   System.Classes, Vcl.Graphics,
  751.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, MainUnit, Vcl.ComCtrls, Vcl.Grids,
  752.   CommCtrl;
  753.  
  754. type
  755.   TRating = Record
  756.     TeamCode, Marks: Integer;
  757.     FullName: String[50];
  758.     Code: String[6];
  759.   End;
  760.  
  761.   PRating = ^TRating;
  762.  
  763.   PAllRating = ^TAllRating;
  764.  
  765.   TAllRating = Record
  766.     Current: TRating;
  767.     Next: PAllRating;
  768.   End;
  769.  
  770.   TLinkedList = Record
  771.     Head, Tail: PAllRating;
  772.   End;
  773.  
  774.   TListView = class(Vcl.ComCtrls.TListView)
  775.  
  776.   end;
  777.  
  778.   TRatingForm = class(TForm)
  779.     ListView1: TListView;
  780.     Procedure FindGoodStudents(Temp: STGroup);
  781.     Procedure InsertElement(Var List: TLinkedList; NewRating: TRating);
  782.     Procedure OutputToTable;
  783.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  784.  
  785.   private
  786.     GoodStudentsList: TLinkedList;
  787.  
  788.   public
  789.  
  790.   end;
  791.  
  792. var
  793.   RatingForm: TRatingForm;
  794.  
  795. implementation
  796.  
  797. {$R *.dfm}
  798.  
  799. procedure ClearLinkedList(var List: TLinkedList);
  800. var
  801.   Current, nextNode: PAllRating;
  802. begin
  803.   Current := List.Head;
  804.   while Current <> nil do
  805.   begin
  806.     nextNode := Current^.Next;
  807.     Dispose(Current);
  808.     Current := nextNode;
  809.   end;
  810.   List.Head := nil;
  811.   List.Tail := nil;
  812. end;
  813.  
  814. procedure TRatingForm.InsertElement(Var List: TLinkedList; NewRating: TRating);
  815. var
  816.   NewNode: PAllRating;
  817. begin
  818.   New(NewNode);
  819.   NewNode^.Current := NewRating;
  820.   NewNode^.Next := nil;
  821.   If List.Head = nil Then
  822.   Begin
  823.     List.Head := NewNode;
  824.     List.Tail := NewNode;
  825.   End
  826.   Else
  827.   Begin
  828.     List.Tail^.Next := NewNode;
  829.     List.Tail := List.Tail^.Next;
  830.   End;
  831. end;
  832.  
  833. procedure TRatingForm.FormClose(Sender: TObject; var Action: TCloseAction);
  834. begin
  835.   ListView1.Clear;
  836.   ClearLinkedList(GoodStudentsList);
  837. end;
  838.  
  839. procedure SplitLinkedList(var Source, FrontList, BackList: PAllRating);
  840. var
  841.   FastPtr, SlowPtr: PAllRating;
  842. begin
  843.   SlowPtr := Source;
  844.   FastPtr := Source^.Next;
  845.   // Используется два указателя: slowPtr и fastPtr.
  846.   // fastPtr перемещается вдвое быстрее, чем slowPtr,
  847.   // чтобы разделить список пополам.
  848.   while (FastPtr <> nil) do
  849.   begin
  850.     FastPtr := FastPtr^.Next;
  851.     if (FastPtr <> nil) then
  852.     begin
  853.       SlowPtr := SlowPtr^.Next;
  854.       FastPtr := FastPtr^.Next;
  855.     end;
  856.   end;
  857.  
  858.   // frontList указывает на начало первой половины списка,
  859.   // а backList указывает на начало второй половины списка.
  860.   FrontList := Source;
  861.   BackList := SlowPtr^.Next;
  862.   SlowPtr^.Next := nil; // Разрываем связь между двумя половинами.
  863. end;
  864.  
  865. // Функция для объединения двух отсортированных списков
  866. function SortedMerge(listA, listB: PAllRating): PAllRating;
  867. var
  868.   MergedList: PAllRating;
  869. begin
  870.   // Если один из списков пуст, возвращаем другой список.
  871.   if (listA = nil) then
  872.     Result := listB
  873.   else if (listB = nil) then
  874.     Result := listA
  875.   else
  876.   begin
  877.     if (listA^.Current.Marks >= listB^.Current.Marks) then
  878.     begin
  879.       MergedList := listA;
  880.       MergedList^.Next := SortedMerge(listA^.Next, listB);
  881.     end
  882.     else
  883.     begin
  884.       MergedList := listB;
  885.       MergedList^.Next := SortedMerge(listA, listB^.Next);
  886.     end;
  887.  
  888.     Result := MergedList;
  889.   end;
  890. end;
  891.  
  892. procedure MergeSort(var headList: PAllRating);
  893. var
  894.   headPtr, firstHalf, secondHalf: PAllRating;
  895. begin
  896.   headPtr := headList;
  897.   // Базовый случай: если список пуст или состоит из одного элемента,
  898.   // он уже отсортирован.
  899.   if (headPtr = nil) or (headPtr^.Next = nil) then
  900.     Exit;
  901.   // Разделяем список на две половины.
  902.   SplitLinkedList(headPtr, firstHalf, secondHalf);
  903.   // Рекурсивно сортируем каждую половину списка.
  904.   MergeSort(firstHalf);
  905.   MergeSort(secondHalf);
  906.   // Объединяем отсортированные половины в один список.
  907.   headList := SortedMerge(firstHalf, secondHalf);
  908. end;
  909.  
  910. // Процедура для сортировки однонаправленного списка (TLinkedList)
  911.  
  912. procedure SortList(var LinkedList: TLinkedList);
  913. begin
  914.   // Вызываем MergeSort, передавая указатель на начало списка.
  915.   MergeSort(LinkedList.Head);
  916.   // Находим указатель на последний элемент списка (Tail).
  917.   LinkedList.Tail := LinkedList.Head;
  918.   If LinkedList.Tail <> Nil Then
  919.     while (LinkedList.Tail^.Next <> nil) do
  920.       LinkedList.Tail := LinkedList.Tail^.Next;
  921. end;
  922.  
  923. Procedure TRatingForm.FindGoodStudents(Temp: STGroup);
  924. Var
  925.   CurrentNode: STGroup;
  926.   Info: PRating;
  927.   I: Integer;
  928. Begin
  929.   CurrentNode := Temp;
  930.   While CurrentNode <> Nil do
  931.   Begin
  932.     For I := Low(CurrentNode.Info.GroupStudents)
  933.       to High(CurrentNode.Info.GroupStudents) do
  934.     Begin
  935.       If CurrentNode.Info.GroupStudents[I].FullName <> '' Then
  936.       Begin
  937.         New(Info);
  938.         Info^.TeamCode := CurrentNode.Info.Data.Code;
  939.         Info^.FullName := CurrentNode.Info.GroupStudents[I].FullName;
  940.         Info^.Code := CurrentNode.Info.GroupStudents[I].Code;
  941.         Info^.Marks := CurrentNode.Info.GroupStudents[I].Marks;
  942.         InsertElement(GoodStudentsList, Info^);
  943.       End;
  944.     End;
  945.     CurrentNode := CurrentNode^.Next;
  946.   End;
  947.   SortList(GoodStudentsList);
  948.   OutputToTable;
  949. End;
  950.  
  951. Procedure TRatingForm.OutputToTable;
  952. Var
  953.   TempOutputBest: PAllRating;
  954.   Item: TListItem;
  955. Begin
  956.   TempOutputBest := GoodStudentsList.Head;
  957.  
  958.   While (TempOutputBest <> Nil) do
  959.   Begin
  960.     Item := ListView1.Items.Add;
  961.     Item.Caption := IntToStr(TempOutputBest.Current.TeamCode);
  962.     Item.SubItems.Add(TempOutputBest.Current.Code);
  963.     Item.SubItems.Add(TempOutputBest.Current.FullName);
  964.     Item.SubItems.Add(IntToStr(TempOutputBest.Current.Marks));
  965.     TempOutputBest := TempOutputBest^.Next;
  966.   End;
  967.   While (TempOutputBest <> Nil) do
  968.   Begin
  969.     Item := ListView1.Items.Add;
  970.     Item.Caption := IntToStr(TempOutputBest.Current.TeamCode);
  971.     Item.SubItems.Add(TempOutputBest.Current.Code);
  972.     Item.SubItems.Add(TempOutputBest.Current.FullName);
  973.     Item.SubItems.Add(IntToStr(TempOutputBest.Current.Marks));
  974.     TempOutputBest := TempOutputBest^.Next;
  975.   End;
  976. End;
  977.  
  978. end.
  979.  
  980.  
  981. unit StudentAddUnit;
  982.  
  983. interface
  984.  
  985. uses
  986.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  987.   System.Classes, Vcl.Graphics,
  988.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, MainUnit, Vcl.StdCtrls, Vcl.ExtCtrls,
  989.   Vcl.Buttons, Vcl.Grids;
  990.  
  991. type
  992.   TAddStudentForm = class(TForm)
  993.     StudentNameEdit: TLabeledEdit;
  994.     StudentCodeEdit: TLabeledEdit;
  995.     AddBtn: TBitBtn;
  996.     ChangeBtn: TBitBtn;
  997.     GridOfMarks: TStringGrid;
  998.     Label2: TLabel;
  999.     Button1: TButton;
  1000.     Function NormalizeString(const AStr: String): String;
  1001.     procedure StudentStrKeyPress(Sender: TObject; var Key: Char);
  1002.     procedure StudentCodeEditKeyPress(Sender: TObject; var Key: Char);
  1003.     procedure StudentNameEditKeyDown(Sender: TObject; var Key: Word;
  1004.       Shift: TShiftState);
  1005.     procedure SBRefreshClick(Sender: TObject);
  1006.     Procedure ClearEdits;
  1007.     procedure AddBtnClick(Sender: TObject);
  1008.     Procedure SetStudentFields(Temp: PStudent);
  1009.     procedure StudentNameEditChange(Sender: TObject);
  1010.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  1011.     Procedure SetStudentEdits;
  1012.     procedure ComboBoxPositionKeyPress(Sender: TObject; var Key: Char);
  1013.     procedure ChangeBtnClick(Sender: TObject);
  1014.     procedure GridOfMarksKeyPress(Sender: TObject; var Key: Char);
  1015.     procedure Button1Click(Sender: TObject);
  1016.     procedure GetMarks;
  1017.     procedure StudentNameEditKeyPress(Sender: TObject; var Key: Char);
  1018.   private
  1019.     { Private declarations }
  1020.   public
  1021.     FCurrentNode: STGroup;
  1022.     FCurrentIndex: Integer;
  1023.     { Public declarations }
  1024.   end;
  1025.  
  1026. Const
  1027.   Digits = '0123456789';
  1028.  
  1029. var
  1030.   AddStudentForm: TAddStudentForm;
  1031.   Keys: Integer;
  1032.   IsEnabled: Boolean;
  1033.  
  1034. implementation
  1035.  
  1036. Procedure TAddStudentForm.SetStudentEdits;
  1037. Var
  1038.   Temp: String[6];
  1039. Begin
  1040.   StudentNameEdit.Text := FCurrentNode^.Info.GroupStudents
  1041.     [FCurrentIndex].FullName;
  1042.   Temp := FCurrentNode^.Info.GroupStudents[FCurrentIndex].Code;
  1043.   Delete(Temp, 1, 1);
  1044.   StudentCodeEdit.Text := Temp;
  1045.   Label2.Caption :=
  1046.     IntToStr((FCurrentNode^.Info.GroupStudents[FCurrentIndex].Marks));
  1047. End;
  1048.  
  1049. Function TAddStudentForm.NormalizeString(const AStr: String): String;
  1050. Var
  1051.   LowerStr, RestOfString: String;
  1052.   FirstLetter: String[1];
  1053. Begin
  1054.   LowerStr := AnsiLowerCase(AStr);
  1055.   FirstLetter := AnsiUpperCase(Copy(LowerStr, 1, 1));
  1056.   RestOfString := Copy(LowerStr, 2, Length(LowerStr) - 1);
  1057.   NormalizeString := FirstLetter + RestOfString;
  1058. End;
  1059.  
  1060. {$R *.dfm}
  1061.  
  1062. procedure TAddStudentForm.StudentCodeEditKeyPress(Sender: TObject;
  1063.   var Key: Char);
  1064. begin
  1065.   If Not(Key In ['A' .. 'Z', 'a' .. 'z', '0' .. '9', #08]) Then
  1066.   Begin
  1067.     Key := #0;
  1068.   End;
  1069. end;
  1070.  
  1071. procedure TAddStudentForm.StudentNameEditChange(Sender: TObject);
  1072. Var
  1073.   I: Integer;
  1074. begin
  1075.   AddBtn.Enabled := (StudentNameEdit.GetTextLen > 0) and
  1076.     (StudentCodeEdit.GetTextLen > 0) and (Button1.Enabled = True);
  1077.   ChangeBtn.Enabled := (StudentNameEdit.GetTextLen > 0) and
  1078.     (StudentCodeEdit.GetTextLen > 0) and (Button1.Enabled = True);
  1079.   If (TLabeledEdit(Sender).GetTextLen > 0) and
  1080.     (TLabeledEdit(Sender).Text[1] = '0') then
  1081.   begin
  1082.     I := 1;
  1083.     While TLabeledEdit(Sender).Text[I] = '0' do
  1084.       Inc(I);
  1085.     TLabeledEdit(Sender).Text := Copy(TLabeledEdit(Sender).Text, I,
  1086.       TLabeledEdit(Sender).GetTextLen - I + 1);
  1087.   end;
  1088. end;
  1089.  
  1090. procedure TAddStudentForm.StudentNameEditKeyDown(Sender: TObject; var Key: Word;
  1091.   Shift: TShiftState);
  1092. begin
  1093.   If (Shift = [ssCtrl]) and (Key = Ord('A')) then
  1094.   Begin
  1095.     TLabeledEdit(Sender).SelectAll;
  1096.   End;
  1097. end;
  1098.  
  1099. procedure TAddStudentForm.StudentNameEditKeyPress(Sender: TObject;
  1100.   var Key: Char);
  1101. begin
  1102.   if  (Key in ['a' .. 'z', 'A' .. 'Z','0'..'9']) then
  1103.     Key := #0;
  1104. end;
  1105.  
  1106.  
  1107. procedure TAddStudentForm.StudentStrKeyPress(Sender: TObject; var Key: Char);
  1108. begin
  1109.   If (TEdit(Sender).SelLength > 0) and Not((Key < #192) and (Key <> #08)) Then
  1110.   Begin
  1111.     TEdit(Sender).SelText := #0;
  1112.   End;
  1113.   If (Key < #192) and (Key <> #08) Then
  1114.   Begin
  1115.     Key := #0;
  1116.   End;
  1117.   If (Key = '№') Then
  1118.   Begin
  1119.     Key := #0;
  1120.   End;
  1121.   If (Length(TEdit(Sender).Text) = 50) and (Key <> #08) Then
  1122.   Begin
  1123.     Key := #0;
  1124.   End;
  1125. end;
  1126.  
  1127. Procedure TAddStudentForm.SetStudentFields(Temp: PStudent);
  1128. Begin
  1129.   Temp^.FullName := NormalizeString(StudentNameEdit.Text);
  1130.   Temp^.Code := '#' + StudentCodeEdit.Text;
  1131.   Temp^.Marks := Keys;
  1132. End;
  1133.  
  1134. procedure TAddStudentForm.AddBtnClick(Sender: TObject);
  1135. Var
  1136.   Temp: PStudent;
  1137. begin
  1138.   New(Temp);
  1139.   SetStudentFields(Temp);
  1140.   FCurrentNode^.Info.GroupStudents[FCurrentIndex] := Temp^;
  1141.   Self.Close;
  1142.   ModalResult := AddBtn.ModalResult;
  1143.   Dispose(Temp);
  1144. end;
  1145.  
  1146. procedure TAddStudentForm.ChangeBtnClick(Sender: TObject);
  1147. Var
  1148.   Temp: PStudent;
  1149. begin
  1150.   Temp := @FCurrentNode^.Info.GroupStudents[FCurrentIndex];
  1151.   SetStudentFields(Temp);
  1152.   Self.Close;
  1153.   ModalResult := AddBtn.ModalResult;
  1154. end;
  1155.  
  1156. Procedure TAddStudentForm.ClearEdits;
  1157. Var
  1158.   I: Integer;
  1159. Begin
  1160.   StudentNameEdit.Clear;
  1161.   StudentCodeEdit.Clear;
  1162.   for I := 0 to GridOfMarks.RowCount - 1 do
  1163.     GridOfMarks.Rows[I].Clear;
  1164.   Label2.Caption := '';
  1165. End;
  1166.  
  1167. procedure TAddStudentForm.ComboBoxPositionKeyPress(Sender: TObject;
  1168.   var Key: Char);
  1169. begin
  1170.   Key := #0;
  1171. end;
  1172.  
  1173. procedure TAddStudentForm.FormClose(Sender: TObject; var Action: TCloseAction);
  1174. begin
  1175.   ClearEdits;
  1176. end;
  1177.  
  1178. procedure TAddStudentForm.Button1Click(Sender: TObject);
  1179. begin
  1180.   GetMarks;
  1181. end;
  1182.  
  1183. procedure TAddStudentForm.GetMarks;
  1184. Var
  1185.   Marks: Integer;
  1186. begin
  1187.   if ((GridOfMarks.Cells[0, 0]) = '') or ((GridOfMarks.Cells[1, 0]) = '') or
  1188.     ((GridOfMarks.Cells[0, 0]) = '') or ((GridOfMarks.Cells[3, 0]) = '') or
  1189.     ((GridOfMarks.Cells[4, 0]) = '') then
  1190.     IsEnabled := False
  1191.   else
  1192.   begin
  1193.     Marks := StrToInt(GridOfMarks.Cells[0, 0]) +
  1194.       StrToInt(GridOfMarks.Cells[1, 0]) + StrToInt(GridOfMarks.Cells[2, 0]) +
  1195.       StrToInt(GridOfMarks.Cells[3, 0]) + StrToInt(GridOfMarks.Cells[4, 0]);
  1196.     Keys := Marks div 5;
  1197.     Label2.Caption := 'Средний балл:' + IntToStr(Keys);
  1198.   end;
  1199. end;
  1200.  
  1201.  
  1202. procedure TAddStudentForm.GridOfMarksKeyPress(Sender: TObject; var Key: Char);
  1203. Var
  1204.   IsEnabledButton: Boolean;
  1205.   I: Integer;
  1206. begin
  1207.   with TStringGrid(Sender) do
  1208.     if Not(Length(Cells[Col, Row]) = 0) and Not CharInSet(Key, [#08]) then
  1209.     Begin
  1210.       Key := #0;
  1211.     End;
  1212.   for I := 0 to GridOfMarks.ColCount - 1 do
  1213.     if not(Key in ['1' .. '9']) then
  1214.       Key := #0;
  1215.   for I := 0 to GridOfMarks.ColCount - 1 do
  1216.     if GridOfMarks.Cells[I, 0] = '' then
  1217.       IsEnabledButton := True;
  1218.  
  1219.   if not IsEnabledButton then
  1220.     Button1.Enabled := True
  1221.   else
  1222.     Button1.Enabled := False;
  1223. end;
  1224.  
  1225. procedure TAddStudentForm.SBRefreshClick(Sender: TObject);
  1226. begin
  1227.   ClearEdits;
  1228. end;
  1229.  
  1230. end.
  1231.  
  1232.  
  1233. unit FindStudentInGroups;
  1234.  
  1235. interface
  1236.  
  1237. uses
  1238.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  1239.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, MainUnit, Vcl.StdCtrls, Vcl.ExtCtrls,
  1240.   Vcl.ComCtrls;
  1241.  
  1242. type
  1243.     TForm1 = class(TForm)
  1244.     EEnterName: TEdit;
  1245.     Label1: TLabel;
  1246.     Button1: TButton;
  1247.     ListView: TListView;
  1248.     procedure Button1Click(Sender: TObject);
  1249.     private
  1250.         { Private declarations }
  1251.     public
  1252.         { Public declarations }
  1253.     end;
  1254.  
  1255. var
  1256.   Form1: TForm1;
  1257.  
  1258. implementation
  1259.  
  1260. {$R *.dfm}
  1261.  
  1262.  
  1263.  
  1264. procedure TForm1.Button1Click(Sender: TObject);
  1265. Var
  1266.     Name: String[50];
  1267.     I: Integer;
  1268.     NotFind: Boolean;
  1269.     Item: TListItem;
  1270. begin
  1271.     Name := EEnterName.Text;
  1272.     NotFind := True;
  1273.     while ((BuferFGroupList.Head <> Nil) and NotFind) do
  1274.     Begin
  1275.         for I := Low(BuferFGroupList.Head.Info.GroupStudents) to High(BuferFGroupList.Head.Info.GroupStudents) do
  1276.         Begin
  1277.             if (BuferFGroupList.Head.Info.GroupStudents[I].FullName = Name) then
  1278.             Begin
  1279.                 NotFind := False;
  1280.                 //как-то вывести результат по аналогии с другим модулем:
  1281.                 Item := ListView.Items.Add;
  1282.                 Item.Caption := IntToStr(BuferFGroupList.Head.Info.Data.Code);              //код специальности
  1283.                 Item.SubItems.Add(IntToStr(BuferFGroupList.Head.Info.Data.Students));       //кол-во студентов в группе
  1284.                 Item.SubItems.Add(IntToStr(BuferFGroupList.Head.Info.Data.GroupNumber));    //код группы
  1285.                 Item.SubItems.Add(IntToStr(BuferFGroupList.Head.Info.Data.YearOfStart));    //год начала
  1286.                 Item.SubItems.Add(BuferFGroupList.Head.Info.GroupStudents[I].FullName);     //фио
  1287.                 Item.SubItems.Add((BuferFGroupList.Head.Info.GroupStudents[I].Code));   //код студента
  1288.                 Item.SubItems.Add(IntToStr(BuferFGroupList.Head.Info.GroupStudents[I].Marks));  //средний балл
  1289.                 //взято из TeamForm
  1290.             End;
  1291.         End;
  1292.         BuferFGroupList.Head := BuferFGroupList.Head.Next;
  1293.     End;
  1294. end;
  1295.  
  1296. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement