Advertisement
SmnVadik

Lab5.1 (Delphi)

Aug 19th, 2023
405
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 24.64 KB | None | 0 0
  1. -----------------------------------FormMain-------------------------------------
  2.  
  3. unit Unit2;
  4.  
  5. interface
  6.  
  7. uses
  8.     Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  9.     System.Classes, Vcl.Graphics,
  10.     Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.StdCtrls, Vcl.Menus;
  11.  
  12. type
  13.     TFormMain = class(TForm)
  14.         StringGridMain: TStringGrid;
  15.         ButtonInfo: TButton;
  16.         ButtonAdd: TButton;
  17.         MainMenu1: TMainMenu;
  18.         Task: TMenuItem;
  19.         Develop: TMenuItem;
  20.         FOpen: TMenuItem;
  21.         FSave: TMenuItem;
  22.         N7: TMenuItem;
  23.         FOut: TMenuItem;
  24.         F: TMenuItem;
  25.         SaveDialog1: TSaveDialog;
  26.         OpenDialog1: TOpenDialog;
  27.         procedure FormCreate(Sender: TObject);
  28.         procedure ButtonAddClick(Sender: TObject);
  29.         procedure ButtonInfoClick(Sender: TObject);
  30.         procedure StringGridMainKeyDown(Sender: TObject; var Key: Word;
  31.           Shift: TShiftState);
  32.         procedure DevelopClick(Sender: TObject);
  33.         procedure FSaveClick(Sender: TObject);
  34.         procedure TaskClick(Sender: TObject);
  35.         procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  36.         procedure FOutClick(Sender: TObject);
  37.         procedure FOpenClick(Sender: TObject);
  38.     private
  39.         { Private declarations }
  40.     public
  41.         { Public declarations }
  42.     end;
  43.  
  44.  
  45. var
  46.     FormMain: TFormMain;
  47.     Path: String;
  48.  
  49. implementation
  50.  
  51. {$R *.dfm}
  52.  
  53. uses Unit1, Unit4;
  54.  
  55. procedure TFormMain.ButtonAddClick(Sender: TObject);
  56. var
  57.     Size, I: Integer;
  58. begin
  59.     Size := StringGridMain.RowCount;
  60.     For I := 1 to Size - 1 do
  61.         StringGridMain.Rows[I].Clear;
  62.     StringGridMain.RowCount := 1;
  63.     FormAdd.ShowModal
  64. end;
  65.  
  66. procedure PrintStudentsWithLowGrades(GroupList: PStudent);
  67. var
  68.     CurrentStudent: PStudent;
  69.     CurrentGrade: PMarks;
  70.     HasLowGrade: Boolean;
  71.     I: Integer;
  72. begin
  73.     I := FormInfo.StringGridInfo.RowCount;
  74.     CurrentStudent := GroupList;
  75.  
  76.     while Assigned(CurrentStudent) do
  77.     begin
  78.         HasLowGrade := False;
  79.         CurrentGrade := CurrentStudent.marks;
  80.  
  81.         // Проверяем оценки студента
  82.         while Assigned(CurrentGrade) do
  83.         begin
  84.             if CurrentGrade.mark < 4 then
  85.             begin
  86.                 HasLowGrade := True;
  87.                 Break; // Если есть оценка ниже 4, то выходим из цикла
  88.             end;
  89.             CurrentGrade := CurrentGrade^.Next;
  90.         end;
  91.  
  92.         // Выводим информацию о студенте, у которого есть оценка ниже 4
  93.         if HasLowGrade then
  94.         Begin
  95.             FormInfo.StringGridInfo.Cells[0, I] :=
  96.               IntToStr(CurrentStudent.code);
  97.             FormInfo.StringGridInfo.Cells[1, I] := CurrentStudent.name;
  98.             Inc(I);
  99.             FormInfo.StringGridInfo.RowCount := I;
  100.         End;
  101.         CurrentStudent := CurrentStudent^.Next;
  102.         // Переходим к следующему студенту
  103.     end;
  104. end;
  105.  
  106. procedure TFormMain.ButtonInfoClick(Sender: TObject);
  107.  
  108. var
  109.     cur: PStudent;
  110.     I, J: Integer;
  111.     Bol: Boolean;
  112.  
  113. begin
  114.     PrintStudentsWithLowGrades(GroupList);
  115.     If FormInfo.StringGridInfo.RowCount = 1 Then
  116.         Application.MessageBox('Нет студентов с оценками ниже 4',
  117.           'Предупреждение', 0)
  118.     Else
  119.         FormInfo.ShowModal;
  120.  
  121. end;
  122.  
  123. procedure TFormMain.DevelopClick(Sender: TObject);
  124. begin
  125.     Application.MessageBox('Выполнил студент группы 251004, Сымоник Вадим',
  126.       'О разработчике', 0);
  127. end;
  128.  
  129. function AddGrade(var head: PMarks; subCode, Grade: Integer): PMarks;
  130. var
  131.     NewGradeNode, LastGradeNode: PMarks;
  132. begin
  133.     New(NewGradeNode);
  134.     NewGradeNode.subCode := subCode;
  135.     NewGradeNode.mark := Grade;
  136.     NewGradeNode^.Next := nil;
  137.  
  138.     if head = nil then
  139.         head := NewGradeNode
  140.     else
  141.     begin
  142.         LastGradeNode := head;
  143.         while LastGradeNode^.Next <> nil do
  144.             LastGradeNode := LastGradeNode^.Next;
  145.         LastGradeNode^.Next := NewGradeNode;
  146.     end;
  147.     Result := NewGradeNode;
  148. end;
  149.  
  150. function AddStudent(var head: PStudent; code: Integer; name: String;
  151.   Grades: PMarks): PStudent;
  152. var
  153.     NewStudentNode, LastStudentNode: PStudent;
  154. begin
  155.     New(NewStudentNode);
  156.     NewStudentNode.code := code;
  157.     NewStudentNode.name := Name;
  158.     NewStudentNode.marks := Grades;
  159.     NewStudentNode^.Next := nil;
  160.  
  161.     if head = nil then
  162.         head := NewStudentNode
  163.     else
  164.     begin
  165.         LastStudentNode := head;
  166.         while LastStudentNode^.Next <> nil do
  167.             LastStudentNode := LastStudentNode^.Next;
  168.         LastStudentNode^.Next := NewStudentNode;
  169.     end;
  170.     Result := NewStudentNode;
  171. end;
  172.  
  173. procedure AddGradeToStudent(var head: PStudent; GroupCode: Integer;
  174.   const name: string; subCode, Grade: Integer);
  175. var
  176.     CurrentStudent: PStudent;
  177.     NewGrade: PMarks;
  178. begin
  179.     CurrentStudent := head;
  180.  
  181.     // Проверяем, существует ли студент с указанными данными
  182.     while Assigned(CurrentStudent) do
  183.     begin
  184.         if (CurrentStudent.code = GroupCode) and (CurrentStudent.name = Name)
  185.         then
  186.         begin
  187.             // Студент найден, добавляем оценку
  188.             NewGrade := AddGrade(CurrentStudent.marks, subCode, Grade);
  189.             Exit; // Завершаем процедуру, так как студент найден и оценка добавлена
  190.         end;
  191.         CurrentStudent := CurrentStudent^.Next;
  192.     end;
  193.  
  194.     // Если студент не найден, создаем новый элемент списка студентов и добавляем оценку
  195.     CurrentStudent := AddStudent(head, GroupCode, Name, nil);
  196.     AddGrade(CurrentStudent.marks, subCode, Grade);
  197. end;
  198.  
  199.  
  200. Procedure GetLineFromF(var FileInput: TextFile);
  201. Var
  202.     I, J, num, code, mark: Integer;
  203.     name, Grade: String;
  204.     IsCorrect, cor: Boolean;
  205. Begin
  206.     IsCorrect := True;
  207.     Try
  208.         Readln(FileInput, code);
  209.     Except
  210.         Application.MessageBox('Ошибка чтения кода', 'Ошибка', MB_ICONSTOP);
  211.         IsCorrect := False;
  212.     End;
  213.     If not IsCorrect Or ((code <= 0) Or (code >= 1000)) Then
  214.     Begin
  215.         IsCorrect := False;
  216.     End;
  217.  
  218.     Readln(FileInput, Name);
  219.  
  220.     J := 0;
  221.     While not SeekEoln(FileInput) do
  222.     Begin
  223.         cor := True;
  224.         try
  225.             Read(FileInput, num);
  226.         Except
  227.             cor := False;
  228.         end;
  229.         If cor And ((num > 0) And (num <= 10)) Then
  230.         Begin
  231.             SetLength(arrOfGrade, J + 1);
  232.             arrOfGrade[J] := num;
  233.             Inc(J);
  234.         End;
  235.     End;
  236.  
  237.     If IsCorrect Then
  238.     Begin
  239.         for I := 0 to Length(arrOfGrade) - 1 do
  240.         Begin
  241.             mark := arrOfGrade[I];
  242.             AddGradeToStudent(GroupList, code, Name, code, mark);
  243.         End;
  244.     End;
  245.  
  246. End;
  247.  
  248. procedure TFormMain.FOpenClick(Sender: TObject);
  249. var
  250.     F: TextFile;
  251.     Correct: Boolean;
  252.     I, J, mark, Size, code: Integer;
  253.     name, Path: String;
  254.     NewStudentNode, LastStudentNode, head, CurrentStudent: PStudent;
  255.     NewGrade: PMarks;
  256.  
  257. begin
  258.  
  259.     If OpenDialog1.Execute Then
  260.     Begin
  261.  
  262.         Size := StringGridMain.RowCount;
  263.         For I := 1 to Size - 1 do
  264.             StringGridMain.Rows[I].Clear;
  265.         StringGridMain.RowCount := 1;
  266.  
  267.         AssignFile(F, OpenDialog1.FileName);
  268.  
  269.         Try
  270.             Try
  271.                 Reset(F);
  272.                 While not eof(F) do
  273.                 Begin
  274.                     GetLineFromF(F);
  275.                     Readln(F);
  276.                 End;
  277.  
  278.             Finally
  279.                 CloseFile(F);
  280.             End;
  281.         Except
  282.  
  283.         End;
  284.  
  285.         FormAdd.ButtonList.Click;
  286.  
  287.     end;
  288. end;
  289.  
  290. procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  291. begin
  292.     CanClose := Application.MessageBox('Вы действительно хотите выйти?',
  293.       'Выход', MB_YESNO) = ID_YES;
  294. end;
  295.  
  296. procedure TFormMain.FormCreate(Sender: TObject);
  297. begin
  298.     StringGridMain.RowCount := 1;
  299.     StringGridMain.Cells[0, 0] := 'Код';
  300.     StringGridMain.Cells[1, 0] := 'Фамилия и инициалы';
  301.     StringGridMain.Cells[2, 0] := 'Оценки';
  302. end;
  303.  
  304. procedure TFormMain.FOutClick(Sender: TObject);
  305. begin
  306.     FormMain.Close
  307. end;
  308.  
  309. procedure TFormMain.FSaveClick(Sender: TObject);
  310. var
  311.     F: TextFile;
  312.     I: Integer;
  313.     Str, marks, mark: String;
  314.     CurrentStudent: PStudent;
  315.     CurrMarks: PMarks;
  316. begin
  317.     If (SaveDialog1.Execute) Then
  318.     Begin
  319.         Try
  320.             Path := SaveDialog1.FileName;
  321.             Str := ExtractFileExt(Path);
  322.             If (Str = '') Then
  323.                 Path := Path + '.txt';
  324.             CurrentStudent := GroupList;
  325.             AssignFile(F, Path);
  326.             Rewrite(F);
  327.             While CurrentStudent <> nil do
  328.             Begin
  329.                 marks := '';
  330.                 CurrMarks := CurrentStudent.marks;
  331.                 While CurrMarks <> nil do
  332.                 Begin
  333.                     mark := IntToStr(CurrMarks.mark);
  334.                     marks := marks + mark + ' ';
  335.                     CurrMarks := CurrMarks.next;
  336.                 End;
  337.                 Writeln(F, IntToStr(CurrentStudent.code));
  338.                 Writeln(F, CurrentStudent.name);
  339.                 Writeln(F, marks);
  340.                 CurrentStudent := CurrentStudent.Next;
  341.             End;
  342.             CloseFile(F);
  343.         Except
  344.             Application.MessageBox('Некорректный файл!', 'Ошибка', MB_ICONSTOP);
  345.         End;
  346.     End;
  347. end;
  348.  
  349. procedure deleteNode(Value: Integer);
  350. var
  351.     currNode: PStudent;
  352.     prevNode: PStudent;
  353.     temp: Integer;
  354. Begin
  355.     currNode := head;
  356.     prevNode := nil;
  357.     temp := 1;
  358.  
  359.     while (currNode <> nil) And (temp <> Value) do
  360.     Begin
  361.         prevNode := currNode;
  362.         currNode := currNode.Next;
  363.         Inc(temp);
  364.     End;
  365.  
  366.     If currNode <> nil Then
  367.     Begin
  368.         If prevNode <> nil Then
  369.             prevNode.Next := currNode.Next
  370.         else
  371.             head := currNode.Next;
  372.  
  373.         Dispose(currNode);
  374.     End;
  375.  
  376. End;
  377.  
  378. procedure editData(val, code, name: Integer);
  379. var
  380.     curr: PStudent;
  381.     temp: Integer;
  382. Begin
  383.     curr := head;
  384.     temp := 1;
  385.  
  386.     while (curr <> nil) and (temp <> val) do
  387.         curr := curr.Next;
  388.  
  389.     If curr <> nil Then
  390.     Begin
  391.  
  392.     End;
  393.  
  394. End;
  395.  
  396.  
  397. procedure FreeGrades(var head: PMarks);
  398. var
  399.     CurrentGrade, NextGrade: PMarks;
  400. begin
  401.     CurrentGrade := head;
  402.     while Assigned(CurrentGrade) do
  403.     begin
  404.         NextGrade := CurrentGrade^.Next;
  405.         Dispose(CurrentGrade);
  406.         CurrentGrade := NextGrade;
  407.     end;
  408.     head := nil; // Обнуляем указатель на голову списка
  409. end;
  410.  
  411. procedure DeleteStudent(var head: PStudent; GroupCode: Integer;
  412.   const name: string);
  413. var
  414.     CurrentStudent, PrevStudent: PStudent;
  415. begin
  416.     CurrentStudent := head;
  417.     PrevStudent := nil;
  418.  
  419.     // Поиск студента по указанным данным
  420.     while Assigned(CurrentStudent) do
  421.     begin
  422.         if (CurrentStudent.code = GroupCode) and (CurrentStudent.name = Name)
  423.         then
  424.         begin
  425.             // Найден студент, удаляем его из списка
  426.             if Assigned(PrevStudent) then
  427.                 PrevStudent^.Next := CurrentStudent^.Next
  428.             else
  429.                 head := CurrentStudent^.Next;
  430.  
  431.             // Освобождаем память, занятую узлом студента и его оценками
  432.             FreeGrades(CurrentStudent.marks);
  433.             Dispose(CurrentStudent);
  434.             Exit; // Завершаем процедуру, так как студент найден и удален
  435.         end;
  436.  
  437.         PrevStudent := CurrentStudent;
  438.         CurrentStudent := CurrentStudent^.Next;
  439.     end;
  440. end;
  441.  
  442. procedure TFormMain.StringGridMainKeyDown(Sender: TObject; var Key: Word;
  443.   Shift: TShiftState);
  444. var
  445.     SelectedRow, Size, I, code: Integer;
  446.     name: String;
  447.     cur: PStudent;
  448. begin
  449.     If Key = VK_DELETE Then
  450.     Begin
  451.         SelectedRow := StringGridMain.Row;
  452.         code := StrToInt(StringGridMain.Cells[0, SelectedRow]);
  453.         Name := StringGridMain.Cells[1, SelectedRow];
  454.         If SelectedRow > 0 Then
  455.         Begin
  456.             If Application.MessageBox('Вы действительно хотите удалить строку?',
  457.               'Удалить строку', MB_YESNO + MB_ICONQUESTION) = ID_YES Then
  458.             Begin
  459.  
  460.                 For I := SelectedRow to StringGridMain.RowCount - 2 do
  461.                 Begin
  462.                     StringGridMain.Cells[0, I] := StringGridMain.Cells
  463.                       [0, I + 1];
  464.                     StringGridMain.Cells[1, I] := StringGridMain.Cells
  465.                       [1, I + 1];
  466.                     StringGridMain.Cells[2, I] := StringGridMain.Cells
  467.                       [2, I + 1];
  468.                 End;
  469.                 StringGridMain.RowCount := StringGridMain.RowCount - 1;
  470.  
  471.                 DeleteStudent(GroupList, code, Name);
  472.  
  473.             End;
  474.         End;
  475.  
  476.     End;
  477.  
  478.     If StringGridMain.RowCount = 1 Then
  479.         FSave.Enabled := False
  480.     Else
  481.         FSave.Enabled := True;
  482.  
  483. end;
  484.  
  485. procedure TFormMain.TaskClick(Sender: TObject);
  486. const
  487.     str1 = 'Имеется упорядоченный по коду группы линейный односвязный список,';
  488.     str2 = #10#13'содержащий сведения о студентах колледжа: код группы, фамилия и ';
  489.     str3 = #10#13'инициалы студента, оценки. Требуется вывести код группы, фамилии и ';
  490.     str4 = #10#13'инициалы всех студентов данной группы, у которых есть ';
  491.     str5 = #10#13'оценки ниже четверки.';
  492. begin
  493.     Application.MessageBox(str1 + str2 + str3 + str4 + str5, 'Задание', 0)
  494. end;
  495.  
  496. end.
  497.  
  498.  
  499. ----------------------------FormAdd----------------------------------------
  500.  
  501. unit Unit1;
  502.  
  503. interface
  504.  
  505. uses
  506.     Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  507.     System.Classes, Vcl.Graphics,
  508.     Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Menus;
  509.  
  510. type
  511.     TFormAdd = class(TForm)
  512.         ButtonAdd: TButton;
  513.         ButtonList: TButton;
  514.         EditCode: TEdit;
  515.         EditName: TEdit;
  516.         EditMark: TEdit;
  517.         Label1: TLabel;
  518.         Label2: TLabel;
  519.         Label3: TLabel;
  520.     MainMenu1: TMainMenu;
  521.     N1: TMenuItem;
  522.         procedure ButtonAddClick(Sender: TObject);
  523.         procedure ButtonListClick(Sender: TObject);
  524.         procedure EditCodeChange(Sender: TObject);
  525.         procedure EditCodeKeyPress(Sender: TObject; var Key: Char);
  526.         procedure EditMarkChange(Sender: TObject);
  527.         procedure EditMarkKeyPress(Sender: TObject; var Key: Char);
  528.         procedure EditNameChange(Sender: TObject);
  529.         procedure EditNameKeyPress(Sender: TObject; var Key: Char);
  530.         procedure FormCreate(Sender: TObject);
  531.     procedure N1Click(Sender: TObject);
  532.     private
  533.         { Private declarations }
  534.     public
  535.         { Public declarations }
  536.     end;
  537.  
  538. type
  539.  
  540.     PMarks = ^TMarks;
  541.  
  542.     TMarks = record
  543.         subCode: Integer;
  544.         mark: Integer;
  545.         next: PMarks;
  546.     end;
  547.  
  548.     PStudent = ^TStudent;
  549.  
  550.     TStudent = record
  551.         code: Integer;
  552.         name: String[20];
  553.         marks: PMarks;
  554.         next: PStudent;
  555.     end;
  556.  
  557. var
  558.     FormAdd: TFormAdd;
  559.     head: PStudent;
  560.     hd: PMarks;
  561.     bol1, bol2, bol3: Boolean;
  562.     GroupList: PStudent;
  563.     arrOfGrade: array of Integer;
  564.  
  565. implementation
  566.  
  567. {$R *.dfm}
  568.  
  569. uses Unit2, Unit4;
  570.  
  571. function AddGrade(var head: PMarks; subCode, Grade: Integer): PMarks;
  572. var
  573.     NewGradeNode, LastGradeNode: PMarks;
  574. begin
  575.     New(NewGradeNode);
  576.     NewGradeNode.subCode := subCode;
  577.     NewGradeNode.mark := Grade;
  578.     NewGradeNode^.next := nil;
  579.  
  580.     if head = nil then
  581.         head := NewGradeNode
  582.     else
  583.     begin
  584.         LastGradeNode := head;
  585.         while LastGradeNode^.next <> nil do
  586.             LastGradeNode := LastGradeNode^.next;
  587.         LastGradeNode^.next := NewGradeNode;
  588.     end;
  589.  
  590.     // сделали из процедуры функцию
  591.  
  592.     Result := NewGradeNode;
  593. end;
  594.  
  595. function AddStudent(var head: PStudent; code: Integer; name: String;
  596.   Grades: PMarks): PStudent;
  597. var
  598.     NewStudentNode, LastStudentNode: PStudent;
  599. begin
  600.     New(NewStudentNode);
  601.     NewStudentNode.code := code;
  602.     NewStudentNode.name := Name;
  603.     NewStudentNode.marks := Grades;
  604.     NewStudentNode^.next := nil;
  605.  
  606.     if head = nil then
  607.         head := NewStudentNode
  608.     else
  609.     begin
  610.         LastStudentNode := head;
  611.         while LastStudentNode^.next <> nil do
  612.             LastStudentNode := LastStudentNode^.next;
  613.         LastStudentNode^.next := NewStudentNode;
  614.     end;
  615.  
  616.     // сделали из процедуры функцию
  617.     Result := NewStudentNode;
  618. end;
  619.  
  620. procedure AddGradeToStudent(var head: PStudent; GroupCode: Integer;
  621.   const name: string; subCode, Grade: Integer);
  622. var
  623.     CurrentStudent: PStudent;
  624.     NewGrade: PMarks;
  625. begin
  626.     CurrentStudent := head;
  627.  
  628.     // Проверяем, существует ли студент с указанными данными
  629.     while Assigned(CurrentStudent) do
  630.     begin
  631.         if (CurrentStudent.code = GroupCode) and (CurrentStudent.name = Name)
  632.         then
  633.         begin
  634.             // Студент найден, добавляем оценку
  635.             NewGrade := AddGrade(CurrentStudent.marks, subCode, Grade);
  636.             Exit; // Завершаем процедуру, так как студент найден и оценка добавлена
  637.         end;
  638.         CurrentStudent := CurrentStudent^.next;
  639.     end;
  640.  
  641.     // Если студент не найден, создаем новый элемент списка студентов и добавляем оценку
  642.     CurrentStudent := AddStudent(head, GroupCode, Name, nil);
  643.     AddGrade(CurrentStudent.marks, subCode, Grade);
  644. end;
  645.  
  646.  
  647. procedure TFormAdd.ButtonAddClick(Sender: TObject);
  648. var
  649.     J, I: Integer;
  650.     Correct: Boolean;
  651.     Size, code, mark: Integer;
  652.     name, str, strOfGrade: String;
  653.  
  654. begin
  655.  
  656.     strOfGrade := EditMark.Text;
  657.  
  658.     str := '';
  659.     I := 1;
  660.     J := 0;
  661.     Correct := True;
  662.  
  663.     while I <= Length(strOfGrade) + 1 do
  664.     Begin
  665.         If (strOfGrade[I] <> ' ') And (I <= Length(strOfGrade)) Then
  666.             str := str + strOfGrade[I]
  667.         Else
  668.         Begin
  669.             if ((str <> '') And (StrToInt(str) > 0) And (StrToInt(str) <= 10))
  670.             then
  671.             Begin
  672.                 SetLength(arrOfGrade, J + 1);
  673.                 arrOfGrade[J] := StrToInt(str);
  674.                 Inc(J);
  675.                 str := '';
  676.             End;
  677.         End;
  678.         Inc(I);
  679.     End;
  680.  
  681.     code := StrToInt(EditCode.Text);
  682.     Name := EditName.Text;
  683.  
  684.     for I := 0 to Length(arrOfGrade) - 1 do
  685.     Begin
  686.         mark := arrOfGrade[I];
  687.         AddGradeToStudent(GroupList, code, Name, code, mark);
  688.     End;
  689.  
  690.     EditMark.Text := '';
  691.  
  692.     FormMain.FSave.Enabled := True;
  693.  
  694. end;
  695.  
  696. procedure TFormAdd.ButtonListClick(Sender: TObject);
  697. var
  698.  
  699.     Size, I: Integer;
  700.  
  701.     CurrStudent: PStudent;
  702.     CurrGrade: PMarks;
  703. begin
  704.  
  705.     EditCode.Text := '';
  706.     EditName.Text := '';
  707.     EditMark.Text := '';
  708.  
  709.     I := FormMain.StringGridMain.RowCount;
  710.     CurrStudent := GroupList;
  711.  
  712.     while Assigned(CurrStudent) do
  713.     begin
  714.         CurrGrade := CurrStudent.marks;
  715.  
  716.         FormMain.StringGridMain.Cells[0, I] := IntToStr(CurrStudent.code);
  717.         FormMain.StringGridMain.Cells[1, I] := CurrStudent.name;
  718.  
  719.         while Assigned(CurrGrade) do
  720.         begin
  721.             FormMain.StringGridMain.Cells[2, I] := FormMain.StringGridMain.Cells[2, I] + IntToStr(CurrGrade.mark) + ' ';
  722.             CurrGrade := CurrGrade^.next;
  723.         end;
  724.  
  725.         Inc(I);
  726.         FormMain.StringGridMain.RowCount := I;
  727.  
  728.         CurrStudent := CurrStudent^.next;
  729.         // Переходим к следующему студенту
  730.     end;
  731.  
  732.     If FormMain.StringGridMain.RowCount = 1 Then
  733.         FormMain.FSave.Enabled := False
  734.     Else
  735.         FormMain.FSave.Enabled := True;
  736.  
  737.     ModalResult := MrOk;
  738.  
  739. end;
  740.  
  741. procedure TFormAdd.EditCodeChange(Sender: TObject);
  742. var
  743.     num: Integer;
  744. begin
  745.     bol1 := True;
  746.     try
  747.         num := StrToInt(EditCode.Text);
  748.     except
  749.         bol1 := False;
  750.         EditCode.Text := '';
  751.     end;
  752.     if Length(EditCode.Text) <> 3 Then
  753.         bol1 := False;
  754.  
  755.     If (bol1 = True) And (bol2 = True) and (bol3 = True) Then
  756.         ButtonAdd.Enabled := True
  757.     Else
  758.         ButtonAdd.Enabled := False;
  759.  
  760. end;
  761.  
  762. procedure TFormAdd.EditCodeKeyPress(Sender: TObject; var Key: Char);
  763. begin
  764.     If not(Key in ['0' .. '9', #8, #13]) Then
  765.         Key := #0;
  766.     If (Key = #13) And (ButtonAdd.Enabled = True) Then
  767.         ButtonAdd.Click;
  768. end;
  769.  
  770. procedure TFormAdd.EditMarkChange(Sender: TObject);
  771. var
  772.     str, strOfGrade: String;
  773.     Correct: Boolean;
  774.     I, J: Integer;
  775. begin
  776.  
  777.     bol3 := True;
  778.  
  779.     if (Length(EditMark.Text) = 0) or (EditMark.Text = '') then
  780.         bol3 := False;
  781.  
  782.     If (bol1 = True) And (bol2 = True) and (bol3 = True) Then
  783.         ButtonAdd.Enabled := True
  784.     Else
  785.         ButtonAdd.Enabled := False;
  786.  
  787. end;
  788.  
  789. procedure TFormAdd.EditMarkKeyPress(Sender: TObject; var Key: Char);
  790. begin
  791.     If not(Key in ['0' .. '9', ' ', #13, #8]) Then
  792.         Key := #0;
  793.     If (Key = #13) And (ButtonAdd.Enabled = True) Then
  794.         ButtonAdd.Click;
  795. end;
  796.  
  797. procedure TFormAdd.EditNameChange(Sender: TObject);
  798. begin
  799.     bol2 := True;
  800.     If Length(EditName.Text) > 20 Then
  801.     Begin
  802.         EditName.Text := '';
  803.         bol2 := False;
  804.         Application.MessageBox('Максимальная длина строки', 'Ошибка', 0);
  805.     End;
  806.  
  807.     If Length(EditName.Text) = 0 Then
  808.         bol2 := False;
  809.  
  810.     If (bol1 = True) And (bol2 = True) and (bol3 = True) Then
  811.         ButtonAdd.Enabled := True
  812.     Else
  813.         ButtonAdd.Enabled := False;
  814. end;
  815.  
  816. procedure TFormAdd.EditNameKeyPress(Sender: TObject; var Key: Char);
  817. begin
  818.     If (Key = #13) And (ButtonAdd.Enabled = True) Then
  819.         ButtonAdd.Click;
  820. end;
  821.  
  822. procedure TFormAdd.FormCreate(Sender: TObject);
  823. begin
  824.     GroupList := nil;
  825. end;
  826.  
  827. procedure TFormAdd.N1Click(Sender: TObject);
  828. const
  829.     str1 = '1. Код группы - трехзначное число'#13#10;
  830.     str2 = '2. Максимальная длина строки имени - 20 символов'#13#10;
  831.     str3 = '3. Оценки вводятся через пробел. При вводе чисел больше 10,'#13#10;
  832.     str4 = 'они будут удалены при добавлении.'#13#10;
  833.     str5 = '4. Если среди чисел нет которые находятся в диапазон от 1 до 10,'#13#10;
  834.     str6 = 'то запись не будет добавлена в список.';
  835. begin
  836.     Application.MessageBox(str1 + str2 + str3 + str4 + str5 + str6, 'Инструкция', 0)
  837. end;
  838.  
  839. end.
  840.  
  841.  
  842. -----------------------------FormInfo------------------------------------------
  843.  
  844. unit Unit4;
  845.  
  846. interface
  847.  
  848. uses
  849.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  850.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.StdCtrls;
  851.  
  852. type
  853.   TFormInfo = class(TForm)
  854.     StringGridInfo: TStringGrid;
  855.     procedure FormCreate(Sender: TObject);
  856.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  857.   private
  858.     { Private declarations }
  859.   public
  860.     { Public declarations }
  861.   end;
  862.  
  863. type
  864. TArrRec = record
  865.     code: Integer;
  866.     name: String[20];
  867.     mark: Real;
  868. end;
  869. TArray = array of TArrRec;
  870.  
  871. var
  872.   FormInfo: TFormInfo;
  873.  
  874. implementation
  875.  
  876. {$R *.dfm}
  877.  
  878. uses unit1;
  879.  
  880. procedure SortList();
  881. var
  882.     I, J, Max: Integer;
  883.     arr: TArray;
  884. Begin
  885.     For I := 1 to FormInfo.StringGridInfo.RowCount - 2 do
  886.     Begin
  887.         Max := I;
  888.         For J := 1 to FormInfo.StringGridInfo.RowCount - 2 do
  889.         Begin
  890.  
  891.         End;
  892.     End;
  893. End;
  894.  
  895. procedure TFormInfo.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  896. begin
  897.     StringGridInfo.RowCount := 1;
  898. end;
  899.  
  900. procedure TFormInfo.FormCreate(Sender: TObject);
  901. begin
  902.     StringGridInfo.RowCount := 1;
  903.     StringGridInfo.Cells[0, 0] := 'Код';
  904.     StringGridInfo.Cells[1, 0] := 'фамилия и инициалы';
  905. end;
  906.  
  907. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement