Advertisement
Vladislav8653

4.1 delphi

Mar 26th, 2023
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 37.34 KB | None | 0 0
  1. unit MainForm;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.StdCtrls, Vcl.Menus;
  8.  
  9. type
  10.   THeadForm = class(TForm)
  11.     StringGrid1: TStringGrid;
  12.     Button1: TButton;
  13.     Button2: TButton;
  14.     Label1: TLabel;
  15.     MainMenu1: TMainMenu;
  16.     PopupMenu1: TPopupMenu;
  17.     SaveDialog1: TSaveDialog;
  18.     OpenDialog1: TOpenDialog;
  19.     N1: TMenuItem;
  20.     N2: TMenuItem;
  21.     N3: TMenuItem;
  22.     N4: TMenuItem;
  23.     N5: TMenuItem;
  24.     procedure FormCreate(Sender: TObject);
  25.     procedure Button1Click(Sender: TObject);
  26.     procedure Button2Click(Sender: TObject);
  27.     procedure StringGrid1DblClick(Sender: TObject);
  28.     procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
  29.       var CanSelect: Boolean);
  30.     procedure N5Click(Sender: TObject);
  31.     procedure N4Click(Sender: TObject);
  32.     procedure N2Click(Sender: TObject);
  33.     procedure N3Click(Sender: TObject);
  34.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  35.   private
  36.     { Private declarations }
  37.   public
  38.     { Public declarations }
  39.   end;
  40.  
  41. type
  42.     TStudent = packed record
  43.         Name : String[18];
  44.         Group : Integer;
  45.         Number : Byte;
  46.         Day : Integer;
  47.         Month : Integer;
  48.         Year : Integer;
  49.         Sex : Boolean;
  50.         Speciality : String[16];  // спецуха
  51.     end;
  52.  
  53. var
  54.   HeadForm: THeadForm;
  55.   I, N, Row, RowForDelete: Integer;
  56.   Path : String;
  57.   IsFileOpen : Boolean;
  58.  
  59. implementation
  60.  
  61. {$R *.dfm}
  62. uses Add, List, Edit;
  63.  
  64. procedure THeadForm.Button1Click(Sender: TObject);
  65. begin
  66.     Form1.ShowModal;
  67. end;
  68.  
  69. procedure THeadForm.Button2Click(Sender: TObject);
  70. begin
  71.     Form2.ShowModal;
  72. end;
  73.  
  74. procedure THeadForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  75. begin
  76.     CanClose := MessageBox(Form1.Handle, 'Вы уверены, что хотите выйти?', 'Выход', MB_YESNO + MB_ICONQUESTION)=ID_YES;
  77. end;
  78.  
  79. procedure THeadForm.FormCreate(Sender: TObject);
  80. begin
  81.     StringGrid1.Cells[0,0] := 'Код группы';
  82.     StringGrid1.Cells[1,0] := 'Отделение';
  83.     StringGrid1.ColWidths[1] := 150;
  84.     StringGrid1.Cells[2,0] := 'ФИО';
  85.     StringGrid1.Cells[3,0] := 'Номер';
  86.     StringGrid1.Cells[4,0] := 'Дата рождения';
  87.     StringGrid1.Cells[5,0] := 'Пол';
  88.     I := 1;
  89. end;
  90.  
  91. Function Open (): String;
  92. Begin
  93.     With HeadForm Do
  94.     Begin
  95.         If OpenDialog1.Execute Then
  96.         Begin
  97.             Path := OpenDialog1.Filename;
  98.             IsFileOpen := True;
  99.         End
  100.         Else
  101.             IsFileOpen := False;
  102.     End;
  103.     Open := Path;
  104. End;
  105.  
  106. procedure THeadForm.N3Click(Sender: TObject); // save
  107. Var
  108.     FileWithStudents : File of TStudent;
  109.     Str, Birthday : String;
  110.     I, Depth : Integer;
  111.     StudentsForFile : TStudent;
  112. begin
  113.     If (SaveDialog1.Execute) then
  114.     Begin
  115.         Try
  116.             Path := SaveDialog1.FileName;
  117.             Str := ExtractFileExt(Path);
  118.             If(Str = '') Then
  119.                 Path := Path + '.nik';
  120.             Rewrite(FileWithStudents, Path);
  121.             Seek(FileWithStudents, 0);
  122.             Truncate(FileWithStudents);
  123.             Depth := HeadForm.StringGrid1.RowCount;
  124.             If Depth > 1 then
  125.             For I := 0 To Depth - 2 Do
  126.             Begin
  127.                 StudentsForFile.Group := StrToInt(HeadForm.StringGrid1.Cells[0, I + 1]);
  128.                 StudentsForFile.Speciality := HeadForm.StringGrid1.Cells[1, I + 1];
  129.                 StudentsForFile.Name := HeadForm.StringGrid1.Cells[2, I + 1];
  130.                 StudentsForFile.Number := StrToInt(HeadForm.StringGrid1.Cells[3, I + 1]);
  131.                 Birthday := HeadForm.StringGrid1.Cells[4, I + 1];
  132.                 StudentsForFile.Day := StrToInt (Birthday[1] + Birthday[2]);
  133.                 StudentsForFile.Month := StrToInt (Birthday[4] + Birthday[5]);
  134.                 StudentsForFile.Year := StrToInt (Birthday[7] + Birthday[8] + Birthday[9]+ Birthday[10]);
  135.                 If (HeadForm.StringGrid1.Cells[5, I + 1] = 'Мужской') then
  136.                     StudentsForFile.Sex := True
  137.                 else
  138.                     StudentsForFile.Sex := False;
  139.                 Write(FileWithStudents, StudentsForFile);
  140.             End;
  141.             CloseFile(FileWithStudents);
  142.         Except
  143.             Application.MessageBox('Что-то пошло не так :\', 'Ошибка', MB_ICONSTOP);
  144.         End;
  145.     End;
  146. end;
  147.  
  148. procedure THeadForm.N2Click(Sender: TObject);   // open
  149. Var
  150.     FileWithStudents : File of TStudent;
  151.     Day, Year, Month, Birthday, Sex : String;
  152.     I, MsgResult, K, Counter, N: Integer;
  153.     StudentsForFile : TStudent;
  154.     IsFirstTime, CanClose : Boolean;
  155. begin
  156.     I := 1;
  157.     IsFirstTime := True;
  158.     AssignFile(FileWithStudents, Path);
  159.     If(OpenDialog1.Execute) Then
  160.     Begin
  161.         Try
  162.             Path := OpenDialog1.FileName;
  163.             Reset(FileWithStudents, Path);
  164.             While(Not(Eof(FileWithStudents))) Do
  165.             Begin
  166.                 If (I = 1) Then
  167.                     Finalize(FileWithStudents);
  168.                 Read(FileWithStudents, StudentsForFile);
  169.                 If IsFirstTime then
  170.                 Begin
  171.                     MsgResult := MessageDlg ('Дополнить существующие записи?', mtConfirmation, [mbYes, mbNo], 0);
  172.                     If MsgResult = mrYes then
  173.                     begin
  174.                         I := HeadForm.StringGrid1.RowCount;
  175.                     end
  176.                     else
  177.                     begin
  178.                         HeadForm.StringGrid1.RowCount := 1;
  179.                     end;
  180.                     IsFirstTime := False;
  181.                 End;
  182.  
  183.                 N := HeadForm.StringGrid1.RowCount;
  184.                 K := 1;
  185.                 While K <> N Do
  186.                 begin
  187.                     Counter := 0;
  188.                     If HeadForm.StringGrid1.Cells[0,K] = IntToStr(StudentsForFile.Group) then
  189.                         Inc(Counter);
  190.                     If HeadForm.StringGrid1.Cells[1,K] = StudentsForFile.Speciality then
  191.                         Inc(Counter);
  192.                     If HeadForm.StringGrid1.Cells[2,K] = StudentsForFile.Name then
  193.                             Inc(Counter);
  194.                     If HeadForm.StringGrid1.Cells[3,K] = IntToStr(StudentsForFile.Number) then
  195.                             Inc(Counter);
  196.  
  197.                     Day := IntToStr(StudentsForFile.Day);
  198.                     If (Length(Day) = 1) then
  199.                         Day := '0' + Day;
  200.                     Month := IntToStr(StudentsForFile.Month);
  201.                     If (Length(Month) = 1) then
  202.                         Month := '0' + Month;
  203.                     Year := IntToStr(StudentsForFile.Year);
  204.                     Birthday := Day + '.' + Month + '.' + Year;
  205.                     If HeadForm.StringGrid1.Cells[4,K] = Birthday then
  206.                         Inc(Counter);
  207.                     If StudentsForFile.Sex then
  208.                         Sex := 'Мужской'
  209.                     else
  210.                         Sex := 'Женский';
  211.                     If HeadForm.StringGrid1.Cells[5,K] = Sex then
  212.                         Inc(Counter);
  213.                     Inc(K);
  214.                     If Counter = 6 then
  215.                     begin
  216.                         MessageBox(Form1.Handle, Pchar('Информация о студенте из файла уже есть в базе данных.'), 'Ошибка', MB_ICONSTOP);
  217.                         Counter := 0;
  218.                         Exit
  219.                     end;
  220.                 end;
  221.  
  222.                 HeadForm.StringGrid1.RowCount := HeadForm.StringGrid1.RowCount + 1;
  223.                 HeadForm.StringGrid1.Cells[0, I] := IntToStr(StudentsForFile.Group);
  224.                 HeadForm.StringGrid1.Cells[1, I] := StudentsForFile.Speciality;
  225.                 HeadForm.StringGrid1.Cells[2, I] := StudentsForFile.Name;
  226.                 HeadForm.StringGrid1.Cells[3, I] := IntToStr(StudentsForFile.Number);
  227.                 Day := IntToStr(StudentsForFile.Day);
  228.                 If Length(Day) = 1 then
  229.                     Day := '0' + Day;
  230.                 Month := IntToStr(StudentsForFile.Month);
  231.                 If Length(Month) = 1 then
  232.                     Month := '0' + Month;
  233.                 Year := IntToStr(StudentsForFile.Year);
  234.                 HeadForm.StringGrid1.Cells[4, I] := Day + '.' + Month + '.' + Year;
  235.                 If StudentsForFile.Sex = True then
  236.                     HeadForm.StringGrid1.Cells[5, I] := 'Мужской'
  237.                 else
  238.                     HeadForm.StringGrid1.Cells[5, I] := 'Женский';
  239.                 N3.Enabled := True;
  240.                 Inc(I);
  241.             End;
  242.             CloseFile(FileWithStudents);
  243.         Except
  244.             Application.MessageBox('Что-то пошло не так :\', 'Ошибка', MB_ICONSTOP);
  245.         End;
  246.     End;
  247. end;
  248.  
  249. procedure THeadForm.N4Click(Sender: TObject);
  250. Const
  251.     STR1 = '1)Добавьте студентов в "базу данных" через окно "Добавить студента".';
  252.     STR2 = '2)Ранее добавленные студенты будут отображены в главном окне.';
  253.     STR3 = '3)Отсортированный список студентов можно узнать, нажав кнопку "Отсортированный список". Там же отображены фильтры сортировки.';
  254.     STR4 = '4)Чтобы редактировать строку с данными о студенте, дважды кликните на нее. В окне редактирования также будет возможность удалить строку.';
  255. begin
  256.     Application.MessageBox(STR1 + #13#10 + STR2 + #13#10 + STR3 + #13#10 + STR4, 'Инструкция', 0);
  257. end;
  258.  
  259. procedure THeadForm.N5Click(Sender: TObject);
  260. begin
  261.     Application.MessageBox('Арефин Владислав гр.251004', 'Разрабочик', 0);
  262. end;
  263.  
  264. procedure THeadForm.StringGrid1DblClick(Sender: TObject);
  265. Var
  266.     Birthday, Str : String;
  267.     Speciality : Integer;
  268. begin
  269.     If Row <> 0 then
  270.     Begin
  271.         Form3.Surname.Text := HeadForm.StringGrid1.Cells[2, Row];
  272.         Form3.Group.Text := HeadForm.StringGrid1.Cells[0, Row];
  273.         Form3.Number.Text := HeadForm.StringGrid1.Cells[3, Row];
  274.         Birthday := HeadForm.StringGrid1.Cells[4, Row];
  275.         Form3.Edit1.Text := Birthday[1] + Birthday[2];
  276.         Form3.Edit2.Text := Birthday[4] + Birthday[5];
  277.         Form3.Edit3.Text := Birthday[7] + Birthday[8] + Birthday[9] + Birthday[10];
  278.         Form3.RadioButton5.Checked := False;
  279.         Form3.RadioButton6.Checked := False;
  280.         If HeadForm.StringGrid1.Cells[5, Row] = 'Мужской' then
  281.             Form3.RadioButton5.Checked := True
  282.         else
  283.             Form3.RadioButton6.Checked := True;
  284.         Str := HeadForm.StringGrid1.Cells[1, Row];
  285.  
  286.         //Я понимаю, что 4 if'a - это некрасиво, тут case of - идеальный вариант.
  287.         //Но delphi ругается на case of почему-то
  288.         Speciality := -1;
  289.         If Str = 'Ассенизация' then
  290.             Speciality := 0;
  291.         If Str = 'Тракторостроение' then
  292.             Speciality := 1;
  293.         If Str = 'Программирование' then
  294.             Speciality := 2;
  295.         If Str = 'Швейное дело' then
  296.             Speciality := 3;
  297.  
  298.  
  299.         Form3.RadioGroup1.ItemIndex := Speciality;
  300.         RowForDelete := Row;
  301.         Form3.ShowModal;
  302.         Row := 0;
  303.     End;
  304. end;
  305.  
  306. procedure THeadForm.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
  307.   var CanSelect: Boolean);
  308. begin
  309.     Row := Arow;
  310. end;
  311.  
  312. end.
  313.  
  314. -----------------------------------------------------------------------------------------------------------------------------------
  315.  
  316.  
  317. unit Add;
  318.  
  319. interface
  320.  
  321. uses
  322.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  323.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Menus;
  324.  
  325. type
  326.   TForm1 = class(TForm)
  327.     Label1: TLabel;
  328.     Group: TEdit;
  329.     Label2: TLabel;
  330.     Label3: TLabel;
  331.     Label4: TLabel;
  332.     Label5: TLabel;
  333.     Label6: TLabel;
  334.     Surname: TEdit;
  335.     Number: TEdit;
  336.     RadioButton5: TRadioButton;
  337.     RadioButton6: TRadioButton;
  338.     RadioGroup1: TRadioGroup;
  339.     MainMenu1: TMainMenu;
  340.     N1: TMenuItem;
  341.     Edit1: TEdit;
  342.     Edit2: TEdit;
  343.     Edit3: TEdit;
  344.     Button1: TButton;
  345.     procedure N1Click(Sender: TObject);
  346.     procedure Button1Click(Sender: TObject);
  347.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  348.     procedure SurnameKeyPress(Sender: TObject; var Key: Char);
  349.   private
  350.     { Private declarations }
  351.   public
  352.     { Public declarations }
  353.   end;
  354.  
  355. var
  356.   Form1: TForm1;
  357.  
  358. implementation
  359.  
  360. uses MainForm;
  361.  
  362. {$R *.dfm}
  363. type
  364.     TStudent = record
  365.         Name : String[18];
  366.         Group : Integer;
  367.         Number : Byte;
  368.         Day : Integer;
  369.         Month : Integer;
  370.         Year : Integer;
  371.         Sex : Boolean;
  372.     end;
  373.  
  374. Var
  375.     Student : TStudent;
  376.     IsChosen, CanClose : Boolean;
  377.  
  378. procedure TForm1.Button1Click(Sender: TObject);
  379. Var
  380.     N, I, Counter, K: Integer;
  381.     Str, Birthday, Sex : String[20];
  382.     Day, Month : String[2];
  383.     Year : String[4];
  384. begin
  385.     IsChosen := True;
  386.     CanClose := False;
  387.     If (Length(Surname.Text) = 0) or (Length(Group.Text) = 0) or (Length(Number.Text) = 0) or (Length(Edit1.Text) = 0) or (Length(Edit2.Text) = 0) or (Length(Edit3.Text) = 0) then
  388.     Begin
  389.         IsChosen := False;
  390.         MessageBox(Form1.Handle, Pchar('Не оставляйте поля пустыми.'), 'Ошибка', MB_ICONSTOP);
  391.     End;
  392.  
  393.     If IsChosen then
  394.         If (RadioGroup1.ItemIndex = -1) or ((RadioButton5.Checked = False) and (RadioButton6.Checked = False)) then
  395.         begin
  396.             IsChosen := False;
  397.             MessageBox(Form1.Handle, Pchar('Не оставляйте пункты неотмеченными.'), 'Ошибка', MB_ICONSTOP);
  398.         end;
  399.  
  400.     If IsChosen then
  401.     Begin
  402.         Str := Surname.Text;
  403.         For I := 1 To Length(Str) Do
  404.             If (Ord(Str[I]) < 192) or ((Ord(Str[I])) > 255) then // это от А до я
  405.                 If Not(Str[I] in ['.', #08, #09, #32, #16]) then
  406.                 begin
  407.                     IsChosen := False;
  408.                     MessageBox(Form1.Handle, Pchar('Фамилия и инициалы должны состоять из кириллицы. Также допустимы точки и пробелы.'), 'Ошибка', MB_ICONSTOP);
  409.                     Surname.Text := '';
  410.                     Break
  411.                 end;
  412.     End;
  413.  
  414.     If IsChosen then
  415.     begin
  416.         If (StrToInt(Edit1.Text) < 1) or (StrToInt(Edit1.Text) > 31) then
  417.         begin
  418.             IsChosen := False;
  419.              MessageBox(Form1.Handle, Pchar('Число должно быть в диапазоне от 1 до 31.'), 'Ошибка', MB_ICONSTOP);
  420.              Edit1.Text := '';
  421.         end;
  422.     end;
  423.  
  424.     If IsChosen then
  425.     begin
  426.         If (StrToInt(Edit2.Text) < 1) or (StrToInt(Edit2.Text) > 12) then
  427.         begin
  428.             IsChosen := False;
  429.             MessageBox(Form1.Handle, Pchar('Месяц должен быть в диапазоне от 1 до 12.'), 'Ошибка', MB_ICONSTOP);
  430.             Edit2.Text := '';
  431.         end;
  432.     end;
  433.  
  434.     If IsChosen then
  435.     begin
  436.         If (StrToInt(Edit3.Text) < 1900) or (StrToInt(Edit3.Text) > 2023) then
  437.         begin
  438.             IsChosen := False;
  439.             MessageBox(Form1.Handle, Pchar('Год должен быть в диапазоне от 1900 до 2023.'), 'Ошибка', MB_ICONSTOP);
  440.             Edit3.Text := '';
  441.         end;
  442.     end;
  443.  
  444.  
  445.     If IsChosen then
  446.     Begin
  447.         try
  448.             Student.Name := Surname.Text;
  449.             Student.Group := StrToInt(Group.Text);
  450.             Student.Number := StrToInt(Number.Text);
  451.             Student.Day := StrToInt(Edit1.Text);
  452.             Student.Month := StrToInt(Edit2.Text);
  453.             Student.Year := StrToInt(Edit3.Text);
  454.             If RadioButton6.Checked then
  455.                 Student.Sex := False;    // если female ))
  456.             If RadioButton5.Checked then
  457.                 Student.Sex := True;     // если male
  458.             CanClose := True;
  459.             HeadForm.N3.Enabled := True;
  460.         except
  461.             IsChosen := False;
  462.             MessageBox(Form1.Handle, Pchar('Проверьте исходные данные.'), 'Ошибка', MB_ICONSTOP);
  463.             Student.Name := '';
  464.             Student.Group := -1;
  465.             Student.Number := 255;
  466.             Student.Day := -1;
  467.             Student.Month := -1;
  468.             Student.Year := -1;
  469.         end;
  470.     End;
  471.  
  472.     If CanClose then
  473.     begin
  474.         N := HeadForm.StringGrid1.RowCount - 1;
  475.         Counter := 0;
  476.         For I := 1 To N Do
  477.         begin
  478.             If HeadForm.StringGrid1.Cells[0,I] = IntToStr(Student.Group) then
  479.                 Inc(Counter);
  480.  
  481.             K := RadioGroup1.ItemIndex;
  482.             Case K of
  483.                 0: Str := 'Ассенизация';
  484.                 1: Str := 'Тракторостроение';
  485.                 2: Str := 'Программирование';
  486.                 3: Str := 'Швейное дело';
  487.             End;
  488.  
  489.             If HeadForm.StringGrid1.Cells[1,I] = Str then
  490.                 Inc(Counter);
  491.             If HeadForm.StringGrid1.Cells[2,I] = Student.Name then
  492.                 Inc(Counter);
  493.             If HeadForm.StringGrid1.Cells[3,I] = IntToStr(Student.Number) then
  494.                 Inc(Counter);
  495.  
  496.             Day := IntToStr(Student.Day);
  497.             If (Length(Day) = 1) then
  498.                 Day := '0' + Day;
  499.             Month := IntToStr(Student.Month);
  500.             If (Length(Month) = 1) then
  501.                 Month := '0' + Month;
  502.             Year := IntToStr(Student.Year);
  503.             Birthday := Day + '.' + Month + '.' + Year;
  504.  
  505.             If HeadForm.StringGrid1.Cells[4,I] = Birthday then
  506.                 Inc(Counter);
  507.  
  508.             If Student.Sex then
  509.                 Sex := 'Мужской'
  510.             else
  511.                 Sex := 'Женский';
  512.  
  513.             If HeadForm.StringGrid1.Cells[5,I] = Sex then
  514.                 Inc(Counter);
  515.  
  516.             If Counter = 6 then
  517.             begin
  518.                 CanClose := False;
  519.                 MessageBox(Form1.Handle, Pchar('Такой студент уже есть в базе данных.'), 'Ошибка', MB_ICONSTOP);
  520.                 Counter := 0;
  521.                 Break
  522.             end;
  523.         end;
  524.         If CanClose then
  525.             Form1.Close;
  526.     end;
  527.  
  528. end;
  529.  
  530. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  531. Var
  532.     N, I, Counter, K: Integer;
  533.     Str, Birthday, Sex : String[20];
  534.     Day, Month : String[2];
  535.     Year : String[4];
  536. begin
  537.     If CanClose then
  538.     Begin
  539.         I := HeadForm.StringGrid1.RowCount;
  540.         HeadForm.StringGrid1.RowCount := HeadForm.StringGrid1.RowCount + 1;
  541.         HeadForm.StringGrid1.Cells[0, I] := IntToStr(Student.Group);
  542.         If RadioGroup1.ItemIndex <> -1 then
  543.         Begin
  544.             N := RadioGroup1.ItemIndex;
  545.             Case N of
  546.                 0: Str := 'Ассенизация';
  547.                 1: Str := 'Тракторостроение';
  548.                 2: Str := 'Программирование';
  549.                 3: Str := 'Швейное дело';
  550.             End;
  551.             HeadForm.StringGrid1.Cells[1, I] :=  Str;
  552.         End;
  553.         HeadForm.StringGrid1.Cells[2, I] := Student.Name;
  554.         HeadForm.StringGrid1.Cells[3, I] := IntToStr(Student.Number);
  555.  
  556.         If Length(Edit1.Text) = 1 then
  557.             Edit1.Text := '0' + Edit1.Text;
  558.         If Length(Edit2.Text) = 1 then
  559.             Edit2.Text := '0' + Edit2.Text;
  560.  
  561.  
  562.         HeadForm.StringGrid1.Cells[4, I] := Edit1.Text + '.' +  Edit2.Text + '.' +  Edit3.Text;
  563.         If Student.Sex then
  564.             HeadForm.StringGrid1.Cells[5, I] := 'Мужской'
  565.         else
  566.             HeadForm.StringGrid1.Cells[5, I] := 'Женский';
  567.         Surname.Text := '';
  568.         Group.Text := '';
  569.         Number.Text := '';
  570.         Edit1.Text := '';
  571.         Edit2.Text := '';
  572.         Edit3.Text := '';
  573.         RadioButton5.Checked := False;
  574.         RadioButton6.Checked := False;
  575.         RadioGroup1.ItemIndex := -1;
  576.         CanClose := False;
  577.         Inc(I);
  578.     End;
  579. end;
  580.  
  581. procedure TForm1.N1Click(Sender: TObject);
  582. Const
  583.     STR1 = 'Пример даты рождения: 14.05.2005';
  584.     STR2 = 'Пример фамилии и инициалов: Арефин В.А.';
  585.     STR3 = 'Фамилия и инициалы должны состоять из кириллицы.';
  586. begin
  587.     Application.MessageBox(STR1 + #10#13 + STR2 + #10#13 + STR3, 'Примеры заполнения полей и правила', 0);
  588. end;
  589.  
  590.  
  591.  
  592.  
  593. procedure TForm1.SurnameKeyPress(Sender: TObject; var Key: Char);
  594. begin
  595.     If (Ord(Key) < 1040) or ((Ord(Key) > 1103)) then // это от А до я
  596.         If Not(Key in ['.', #08, #09, #32, #16]) then  // тут точка, пробел, шифт, таб, бэкспэйс
  597.             Key := #0;
  598. end;
  599.  
  600. end.
  601.  
  602. -----------------------------------------------------------------------------------------------------------------------------------
  603.  
  604. unit Edit;
  605.  
  606. interface
  607.  
  608. uses
  609.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  610.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, Vcl.StdCtrls, Vcl.ExtCtrls;
  611.  
  612. type
  613.   TForm3 = class(TForm)
  614.     Label1: TLabel;
  615.     Label2: TLabel;
  616.     Label3: TLabel;
  617.     Label4: TLabel;
  618.     Label5: TLabel;
  619.     Label6: TLabel;
  620.     Group: TEdit;
  621.     Surname: TEdit;
  622.     Number: TEdit;
  623.     RadioButton5: TRadioButton;
  624.     RadioButton6: TRadioButton;
  625.     RadioGroup1: TRadioGroup;
  626.     Edit1: TEdit;
  627.     Edit2: TEdit;
  628.     Edit3: TEdit;
  629.     Button1: TButton;
  630.     MainMenu1: TMainMenu;
  631.     N1: TMenuItem;
  632.     Button2: TButton;
  633.     procedure Button1Click(Sender: TObject);
  634.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  635.     procedure N1Click(Sender: TObject);
  636.     procedure FormCreate(Sender: TObject);
  637.     procedure Button2Click(Sender: TObject);
  638.   private
  639.     { Private declarations }
  640.   public
  641.     { Public declarations }
  642.   end;
  643.  
  644. var
  645.   Form3: TForm3;
  646.  
  647. implementation
  648.  
  649. {$R *.dfm}
  650.  
  651. uses MainForm;
  652.  
  653. {$R *.dfm}
  654. type
  655.     TStudent = record
  656.         Name : String[18];
  657.         Group : Integer;
  658.         Number : Byte;
  659.         Day : Integer;
  660.         Month : Integer;
  661.         Year : Integer;
  662.         Sex : Boolean;
  663.     end;
  664.  
  665. Var
  666.     Student : TStudent;
  667.     IsChosen, CanClose : Boolean;
  668.  
  669.  
  670. procedure TForm3.Button1Click(Sender: TObject);
  671. Var
  672.     N, I, Counter, K: Integer;
  673.     Str, Birthday, Sex : String[20];
  674.     Day, Month : String[2];
  675.     Year : String[4];
  676. begin
  677.     IsChosen := True;
  678.     CanClose := False;
  679.     If (Length(Surname.Text) = 0) or (Length(Group.Text) = 0) or (Length(Number.Text) = 0) or (Length(Edit1.Text) = 0) or (Length(Edit2.Text) = 0) or (Length(Edit3.Text) = 0) then
  680.     Begin
  681.         IsChosen := False;
  682.         MessageBox(Form3.Handle, Pchar('Не оставляйте поля пустыми.'), 'Ошибка', MB_ICONSTOP);
  683.     End;
  684.  
  685.     If IsChosen then
  686.         If (RadioGroup1.ItemIndex = -1) or ((RadioButton5.Checked = False) and (RadioButton6.Checked = False)) then
  687.         begin
  688.             IsChosen := False;
  689.             MessageBox(Form3.Handle, Pchar('Не оставляйте пункты неотмеченными.'), 'Ошибка', MB_ICONSTOP);
  690.         end;
  691.  
  692.     If IsChosen then
  693.     Begin
  694.         Str := Surname.Text;
  695.         For I := 1 To Length(Str) Do
  696.             If (Ord(Str[I]) < 192) or ((Ord(Str[I])) > 255) then // это от А до я
  697.                 If Not(Str[I] in ['.', #08, #09, #32, #16]) then
  698.                 begin
  699.                     IsChosen := False;
  700.                     MessageBox(Form3.Handle, Pchar('Фамилия и инициалы должны состоять из кириллицы. Также допустимы точки и пробелы.'), 'Ошибка', MB_ICONSTOP);
  701.                     Surname.Text := '';
  702.                     Break
  703.                 end;
  704.     End;
  705.  
  706.     If IsChosen then
  707.     begin
  708.         If (StrToInt(Edit1.Text) < 1) or (StrToInt(Edit1.Text) > 31) then
  709.         begin
  710.             IsChosen := False;
  711.              MessageBox(Form3.Handle, Pchar('Число должно быть в диапазоне от 1 до 31.'), 'Ошибка', MB_ICONSTOP);
  712.              Edit1.Text := '';
  713.         end;
  714.     end;
  715.  
  716.     If IsChosen then
  717.     begin
  718.         If (StrToInt(Edit2.Text) < 1) or (StrToInt(Edit2.Text) > 12) then
  719.         begin
  720.             IsChosen := False;
  721.             MessageBox(Form3.Handle, Pchar('Месяц должен быть в диапазоне от 1 до 12.'), 'Ошибка', MB_ICONSTOP);
  722.             Edit2.Text := '';
  723.         end;
  724.     end;
  725.  
  726.     If IsChosen then
  727.     begin
  728.         If (StrToInt(Edit3.Text) < 1900) or (StrToInt(Edit3.Text) > 2023) then
  729.         begin
  730.             IsChosen := False;
  731.             MessageBox(Form3.Handle, Pchar('Год должен быть в диапазоне от 1900 до 2023.'), 'Ошибка', MB_ICONSTOP);
  732.             Edit3.Text := '';
  733.         end;
  734.     end;
  735.  
  736.     If IsChosen then
  737.     Begin
  738.         try
  739.             Student.Name := Surname.Text;
  740.             Student.Group := StrToInt(Group.Text);
  741.             Student.Number := StrToInt(Number.Text);
  742.             Student.Day := StrToInt(Edit1.Text);
  743.             Student.Month := StrToInt(Edit2.Text);
  744.             Student.Year := StrToInt(Edit3.Text);
  745.             If RadioButton6.Checked then
  746.                 Student.Sex := False;    // если female ))
  747.             If RadioButton5.Checked then
  748.                 Student.Sex := True;     // если male
  749.             CanClose := True;
  750.         except
  751.             IsChosen := False;
  752.             MessageBox(Form3.Handle, Pchar('Проверьте исходные данные.'), 'Ошибка', MB_ICONSTOP);
  753.             Student.Name := '';
  754.             Student.Group := -1;
  755.             Student.Number := 255;
  756.             Student.Day := -1;
  757.             Student.Month := -1;
  758.             Student.Year := -1;
  759.         end;
  760.     End;
  761.  
  762.  
  763.     If IsChosen then
  764.     begin
  765.         N := HeadForm.StringGrid1.RowCount - 1;
  766.         For I := 1 To N Do
  767.         begin
  768.             Counter := 0;
  769.             If HeadForm.StringGrid1.Cells[0,I] = IntToStr(Student.Group) then
  770.                 Inc(Counter);
  771.  
  772.             K := RadioGroup1.ItemIndex;
  773.             Case K of
  774.                 0: Str := 'Ассенизация';
  775.                 1: Str := 'Тракторостроение';
  776.                 2: Str := 'Программирование';
  777.                 3: Str := 'Швейное дело';
  778.             End;
  779.  
  780.             If HeadForm.StringGrid1.Cells[1,I] = Str then
  781.                 Inc(Counter);
  782.             If HeadForm.StringGrid1.Cells[2,I] = Student.Name then
  783.                 Inc(Counter);
  784.             If HeadForm.StringGrid1.Cells[3,I] = IntToStr(Student.Number) then
  785.                 Inc(Counter);
  786.  
  787.             Day := IntToStr(Student.Day);
  788.             If (Length(Day) = 1) then
  789.                 Day := '0' + Day;
  790.             Month := IntToStr(Student.Month);
  791.             If (Length(Month) = 1) then
  792.                 Month := '0' + Month;
  793.             Year := IntToStr(Student.Year);
  794.             Birthday := Day + '.' + Month + '.' + Year;
  795.  
  796.             If HeadForm.StringGrid1.Cells[4,I] = Birthday then
  797.                 Inc(Counter);
  798.  
  799.             If Student.Sex then
  800.                 Sex := 'Мужской'
  801.             else
  802.                 Sex := 'Женский';
  803.  
  804.             If HeadForm.StringGrid1.Cells[5,I] = Sex then
  805.                 Inc(Counter);
  806.  
  807.             If Counter = 6 then
  808.             begin
  809.                 CanClose := False;
  810.                 MessageBox(Form3.Handle, Pchar('Такой студент уже есть в базе данных.'), 'Ошибка', MB_ICONSTOP);
  811.                 Counter := 0;
  812.                 Break
  813.             end;
  814.         end;
  815.         If CanClose then
  816.             Form3.Close;
  817.     end;
  818. end;
  819.  
  820. procedure TForm3.Button2Click(Sender: TObject);
  821. Var
  822.     IsSure : Boolean;
  823.     I, N: Integer;
  824. begin
  825.     IsSure := False;
  826.     If (RowForDelete <> 0) then
  827.         IsSure := MessageBox(Form3.Handle, 'Вы уверены, что хотите удалить информацию об данном студенте?', 'Удаление', MB_YESNO + MB_ICONQUESTION)=ID_YES;
  828.     If IsSure then
  829.     begin
  830.         N := HeadForm.StringGrid1.RowCount - 1;
  831.         For I := RowForDelete To N Do
  832.         begin
  833.             HeadForm.StringGrid1.Rows[I] := HeadForm.StringGrid1.Rows[I + 1];
  834.         end;
  835.         HeadForm.StringGrid1.RowCount := HeadForm.StringGrid1.RowCount - 1;
  836.         RowForDelete := 0;
  837.         Form3.Close;
  838.     end;
  839. end;
  840.  
  841.  
  842. procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
  843. Var
  844.     N, I, Counter, K: Integer;
  845.     Str, Birthday, Sex : String[20];
  846.     Day, Month : String[2];
  847.     Year : String[4];
  848. begin
  849.     If CanClose then
  850.     Begin
  851.         I := Row;
  852.         HeadForm.StringGrid1.Cells[0, I] := IntToStr(Student.Group);
  853.         If RadioGroup1.ItemIndex <> -1 then
  854.         Begin
  855.             N := RadioGroup1.ItemIndex;
  856.             Case N of
  857.                 0: Str := 'Ассенизация';
  858.                 1: Str := 'Тракторостроение';
  859.                 2: Str := 'Программирование';
  860.                 3: Str := 'Швейное дело';
  861.             End;
  862.             HeadForm.StringGrid1.Cells[1, I] :=  Str;
  863.         End;
  864.         HeadForm.StringGrid1.Cells[2, I] := Student.Name;
  865.         HeadForm.StringGrid1.Cells[3, I] := IntToStr(Student.Number);
  866.  
  867.         If Length(Edit1.Text) = 1 then
  868.             Edit1.Text := '0' + Edit1.Text;
  869.         If Length(Edit2.Text) = 1 then
  870.             Edit2.Text := '0' + Edit2.Text;
  871.  
  872.  
  873.         HeadForm.StringGrid1.Cells[4, I] := Edit1.Text + '.' +  Edit2.Text + '.' +  Edit3.Text;
  874.         If Student.Sex then
  875.             HeadForm.StringGrid1.Cells[5, I] := 'Мужской'
  876.         else
  877.             HeadForm.StringGrid1.Cells[5, I] := 'Женский';
  878.         Surname.Text := '';
  879.         Group.Text := '';
  880.         Number.Text := '';
  881.         Edit1.Text := '';
  882.         Edit2.Text := '';
  883.         Edit3.Text := '';
  884.         RadioButton5.Checked := False;
  885.         RadioButton6.Checked := False;
  886.         RadioGroup1.ItemIndex := -1;
  887.         CanClose := False;
  888.         Inc(I);
  889.     End;
  890. end;
  891.  
  892. procedure TForm3.FormCreate(Sender: TObject);
  893. begin
  894.     //Surname.Text := HeadForm.StringGrid1.Cells[N, 0];
  895.     //HeadForm.StringGrid1.Se
  896. end;
  897.  
  898. procedure TForm3.N1Click(Sender: TObject);
  899. Const
  900.     STR1 = 'Пример даты рождения: 14.05.2005';
  901.     STR2 = 'Пример фамилии и инициалов: Арефин В.А.';
  902.     STR3 = 'Фамилия и инициалы должны состоять из кириллицы.';
  903. begin
  904.     Application.MessageBox(STR1 + #10#13 + STR2 + #10#13 + STR3, 'Примеры заполнения полей и правила', 0);
  905. end;
  906.  
  907. end.
  908.  
  909. -----------------------------------------------------------------------------------------------------------------------------------
  910.  
  911. unit List;
  912.  
  913. interface
  914.  
  915. uses
  916.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  917.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.StdCtrls;
  918.  
  919. type
  920.   TForm2 = class(TForm)
  921.     StringGrid1: TStringGrid;
  922.     Label1: TLabel;
  923.     Label2: TLabel;
  924.     Label3: TLabel;
  925.     Label4: TLabel;
  926.     procedure FormActivate(Sender: TObject);
  927.   private
  928.     { Private declarations }
  929.   public
  930.     { Public declarations }
  931.   end;
  932.  
  933. var
  934.   Form2: TForm2;
  935.  
  936. implementation
  937.  
  938. {$R *.dfm}
  939.  
  940. uses MainForm;
  941.  
  942. type
  943.     TStudent = packed record
  944.         Name : String[18];
  945.         Group : Integer;
  946.         Number : Byte;
  947.         Day : Integer;
  948.         Month : Integer;
  949.         Year : Integer;
  950.         Sex : Boolean;
  951.         Speciality : String[16];  // спецуха
  952.     end;
  953.  
  954. Var
  955.     Students : Array of TStudent;
  956.  
  957. function IsAdult (I : Integer) : Boolean;
  958. Var
  959.     Adult : Boolean;
  960.     CurrentData : String[10];
  961.     Year, Month, Day : Integer;
  962. Begin
  963.     Adult := False;
  964.     CurrentData := DateToStr(Date);
  965.     Day := StrToInt(CurrentData[1] + CurrentData[2]);
  966.     Month := StrToInt(CurrentData[4] + CurrentData[5]);
  967.     Year := StrToInt(CurrentData[7] + CurrentData[8] + CurrentData[9] + CurrentData[10]);
  968.     If Students[I].Year < (Year - 18) then
  969.         Adult := True; // точно совершеннолетний
  970.  
  971.     If (Students[I].Year = (Year - 18)) and (Students[I].Month < Month) then
  972.         Adult := True; // точно совершеннолетний
  973.     If (Students[I].Year = (Year - 18)) and (Students[I].Month = Month) and (Students[I].Day <= Day) then
  974.         Adult := True; // точно совершеннолетний
  975.     IsAdult := Adult;
  976. End;
  977.  
  978. procedure TForm2.FormActivate(Sender: TObject);
  979. Var
  980.     Depth, I, J, Counter: Integer;
  981.     Birthday : String[10];
  982.     Min : TStudent;
  983. begin
  984.     StringGrid1.Cells[0,0] := 'Код группы';
  985.     StringGrid1.Cells[1,0] := 'Отделение';
  986.     StringGrid1.ColWidths[1] := 150;
  987.     StringGrid1.Cells[2,0] := 'ФИО';
  988.     StringGrid1.Cells[3,0] := 'Номер';
  989.     StringGrid1.Cells[4,0] := 'Дата рождения';
  990.     StringGrid1.Cells[5,0] := 'Пол';
  991.     StringGrid1.RowCount := 1;
  992.     Depth := HeadForm.StringGrid1.RowCount;
  993.     SetLength(Students, Depth - 1);
  994.     If Depth > 1 then
  995.         For I := 0 To Depth - 2 Do
  996.         Begin
  997.             Students[I].Group := StrToInt(HeadForm.StringGrid1.Cells[0, I + 1]);
  998.             Students[I].Speciality := HeadForm.StringGrid1.Cells[1, I + 1];
  999.             Students[I].Name := HeadForm.StringGrid1.Cells[2, I + 1];
  1000.             Students[I].Number := StrToInt(HeadForm.StringGrid1.Cells[3, I + 1]);
  1001.             Birthday := HeadForm.StringGrid1.Cells[4, I + 1];
  1002.             Students[I].Day := StrToInt (Birthday[1] + Birthday[2]);
  1003.             Students[I].Month := StrToInt (Birthday[4] + Birthday[5]);
  1004.             Students[I].Year := StrToInt (Birthday[7] + Birthday[8] + Birthday[9]+ Birthday[10]);
  1005.  
  1006.             If (HeadForm.StringGrid1.Cells[5, I + 1] = 'Мужской') then
  1007.                 Students[I].Sex := True
  1008.             else
  1009.                 Students[I].Sex := False;
  1010.  
  1011.         End;
  1012.     If Depth > 2 then // для сортировки нужно хотя бы 2 элемента массива  (глубина = инфа + заголовок, поэтому - 1)
  1013.     Begin
  1014.         For I := 0 To (Depth - 1) Do        //сортиро4ка по номерам группы (по возрастанию)
  1015.         begin
  1016.             If (Students[I].Speciality = 'Программирование') and Not(IsAdult(I)) then
  1017.             Begin
  1018.                  For J := I + 1 To (Depth - 2) do
  1019.                  If (Students[J].Group < Students[I].Group) then
  1020.                  Begin
  1021.                     Min := Students[J];
  1022.                     Students[J] := Students[I];
  1023.                     Students[I] := Min;
  1024.                  End;
  1025.             End;
  1026.         end;
  1027.  
  1028.  
  1029.         For I := 0 To (Depth - 1) Do        //сортиро4ка по номерам в журнале (по возрастанию)
  1030.         begin
  1031.             If (Students[I].Speciality = 'Программирование') and Not(IsAdult(I)) then
  1032.             Begin
  1033.                  For J := I + 1 To (Depth - 2) do
  1034.                  If (Students[J].Number < Students[I].Number) and (Students[J].Group = Students[I].Group) then
  1035.                  Begin
  1036.                     Min := Students[J];
  1037.                     Students[J] := Students[I];
  1038.                     Students[I] := Min;
  1039.                  End;
  1040.             End;
  1041.         end;
  1042.     End;
  1043.     If (Depth > 1) then
  1044.     Begin
  1045.         Counter := 0;
  1046.         For I := 0 To (Depth - 2) Do // вывод инфы
  1047.             If (Students[I].Speciality = 'Программирование') and Not(IsAdult(I)) then
  1048.             begin
  1049.                 Form2.StringGrid1.RowCount := Form2.StringGrid1.RowCount + 1 ;
  1050.                 Form2.StringGrid1.Cells[0, I + 1] := IntToStr(Students[I].Group);
  1051.                 Form2.StringGrid1.Cells[1, I + 1] := Students[I].Speciality;
  1052.                 Form2.StringGrid1.Cells[2, I + 1] := Students[I].Name;
  1053.                 Form2.StringGrid1.Cells[3, I + 1] := IntToStr(Students[I].Number);
  1054.                 Form2.StringGrid1.Cells[4, I + 1] := IntToStr(Students[I].Day) + '.' + IntToStr(Students[I].Month) + '.' + IntToStr(Students[I].Year);
  1055.                 If Students[I].Sex then
  1056.                     Form2.StringGrid1.Cells[5, I + 1] := 'Мужской'
  1057.                 else
  1058.                     Form2.StringGrid1.Cells[5, I + 1] := 'Женский';
  1059.                 Inc(Counter);
  1060.             End;
  1061.         If Counter = 0 then
  1062.         begin
  1063.             Form2.StringGrid1.Visible := False;
  1064.         end;
  1065.     End;
  1066.     If Depth = 1 then
  1067.          Form2.StringGrid1.Visible := False;
  1068.     For I := 0 To Form2.StringGrid1.RowCount - 1 Do
  1069.         If Form2.StringGrid1.Cells[0, I] = '' then
  1070.             Form2.StringGrid1.RowCount := Form2.StringGrid1.RowCount - 1;
  1071. end;
  1072.  
  1073.  
  1074. end.
  1075.  
  1076.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement