Matixs

Untitled

May 5th, 2023
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 14.90 KB | None | 0 0
  1. unit AdministratorPageMain;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  7.   Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls,
  8.   Vcl.ComCtrls, BidirectionalUserList, Vcl.Grids, StrUtils;
  9.  
  10. const
  11.     HEADER_IDUSER = '№';
  12.     HEADER_FIRSTNAME = 'Фамилия';
  13.     HEADER_LASTNAME = 'Имя';
  14.     HEADER_PATRONYMIC = 'Отчество';
  15.     HEADER_LOGIN = 'Логин';
  16.     HEADER_PASSWORD = 'Пароль';
  17.     HEADER_ROLEID =  'Роль';
  18.     HEADER_PHONE = 'Телефон';
  19.     HEADER_SEX = 'Пол';
  20.  
  21. type
  22.   TAdminFrameMain = class(TFrame)
  23.     PageControl1: TPageControl;
  24.     TabSheet1: TTabSheet;
  25.     TabSheet2: TTabSheet;
  26.     Label1: TLabel;
  27.     UsersAmountLabel: TLabel;
  28.     SGUsers: TStringGrid;
  29.     BtnAdd: TButton;
  30.     SGArchive: TStringGrid;
  31.     DeletedUsersAmount: TLabel;
  32.     Label4: TLabel;
  33.     ButtonRecover: TButton;
  34.     BtnDelete: TButton;
  35.     BtnEdit: TButton;
  36.     procedure FrameEnter(Sender: TObject);
  37.     procedure BtnAddClick(Sender: TObject);
  38.     procedure BtnEditClick(Sender: TObject);
  39.     procedure BtnDeleteClick(Sender: TObject);
  40.     procedure ButtonRecoverClick(Sender: TObject);
  41.     procedure SGUsersSelectCell(Sender: TObject; ACol, ARow: Integer;
  42.       var CanSelect: Boolean);
  43.     procedure FillSGByFirstName(SG : TStringGrid; Text : String);
  44.   private
  45.     { Private declarations }
  46.   public
  47.     { Public declarations }
  48.   end;
  49.  
  50.  
  51. implementation
  52.  
  53. {$R *.dfm}
  54.  
  55. uses ConstantsFile, AdministatorPageAddEdit, Main, ConstantsRole, EntityUser,
  56.   ConstantsTitleMainFrame;
  57.  
  58. procedure TAdminFrameMain.BtnAddClick(Sender: TObject);
  59. begin
  60.     try
  61.         with MainForm do
  62.         begin
  63.             Main.MainForm.LBCurrentPage.Caption := ConstantsTitleMainFrame.TITLE_ADD_USER_PAGE;
  64.             AdminFrameMain.Visible := False;
  65.             AdminFrameAdd.Visible := True;
  66.             AdminFrameAdd.UpdateFrame;
  67.         end;
  68.     Except
  69.         On E : EInOutError do
  70.         begin
  71.             Application.MessageBox('В доступе к файлу с пользователями отказано. Обратитесь к системному администратору.','Ошибка сохранения', MB_OK + MB_ICONERROR);
  72.             Application.Terminate;
  73.             Abort;
  74.         end;
  75.         On E : Exception do
  76.         begin
  77.             Application.MessageBox('Неизвестная ошибка. Обратитесь к системному администратору.','Ошибка сохранения', MB_OK + MB_ICONERROR);
  78.             Application.Terminate;
  79.             Abort;
  80.         end;
  81.     end;
  82. end;
  83.  
  84. procedure FillHeadersSG(SGUsers : TStringGrid);
  85. begin
  86.  
  87.     SGUsers.Cells[0,0] := HEADER_IDUSER;
  88.     SGUsers.Cells[1,0] := HEADER_FIRSTNAME;
  89.     SGUsers.Cells[2,0] := HEADER_LASTNAME;
  90.     SGUsers.Cells[3,0] := HEADER_PATRONYMIC;
  91.     SGUsers.Cells[4,0] := HEADER_LOGIN;
  92.     SGUsers.Cells[5,0] := HEADER_PASSWORD;
  93.     SGUsers.Cells[6,0] := HEADER_ROLEID;
  94.     SGUsers.Cells[7,0] := HEADER_PHONE;
  95.     SGUsers.Cells[8,0] := HEADER_SEX;
  96. end;
  97.  
  98. procedure ClearStringGrid(SG : TStringGrid);
  99. var
  100.     I, J : Integer;
  101. begin
  102.     for I := 0 to SG.RowCount - 1 do
  103.     begin
  104.         SG.Rows[I].Clear;
  105.     end;
  106. end;
  107.  
  108. procedure FillSpecificRole(SG : TStringGrid; Role : String);
  109. var
  110.     TempList : TUserList;
  111.     I, J : Integer;
  112.     AmountDeletedUsers : Integer;
  113. begin
  114.     ClearStringGrid(SG); // Очистка StringGrid
  115.     FillHeadersSG(SG); // Заполнение заголовков StringGrid
  116.  
  117.     I := 1;
  118.     J := 0;
  119.  
  120.     TempList := TUserList.GetUserListFromFile(ConstantsFile.FILE_NAME_USER);  // Получение списка пользователей из типизированного файла
  121.  
  122.     AmountDeletedUsers := TUserList.GetAmountSpecificUsers(ConstantsFile.FILE_NAME_USER, ConstantsRole.ROLE_DELETED); // Количество удаленных пользователей
  123.  
  124.     MainForm.AdminFrameMain.DeletedUsersAmount.Caption := AmountDeletedUsers.ToString; // Вывод количества удаленных пользователей в компонент TLabel
  125.     SG.RowCount := AmountDeletedUsers + 1;
  126.  
  127.     // Цикл для прохода по списку
  128.     while TempList.Head <> NIL do
  129.     begin
  130.         // Заполнение полей StringGrid данными пользователя
  131.         if TempList.Head^.User.Role = Role then // Если роль пользователя совпадает с ролью, переданной в эту процедуру
  132.         begin
  133.             SG.Cells[J, I] := TempList.Head.User.IdUser.ToString;
  134.             SG.Cells[J + 1, I] := TempList.Head.User.FirstName;
  135.             SG.Cells[J + 2, I] := TempList.Head.User.LastName;
  136.             SG.Cells[J + 3, I] := TempList.Head.User.Patronymic;
  137.             SG.Cells[J + 4, I] := TempList.Head.User.Login;
  138.             SG.Cells[J + 5, I] := TempList.Head.User.Password;
  139.             SG.Cells[J + 6, I] := TempList.Head.User.Role;
  140.             SG.Cells[J + 7, I] := TempList.Head.User.Phone;
  141.             SG.Cells[J + 8, I] := TempList.Head.User.Sex;
  142.             Inc(I);
  143.         end;
  144.  
  145.         TempList.Head := TempList.Head^.Next; // Переход к следующей записи
  146.     end;
  147. end;
  148.  
  149. procedure FillAllUsers(SG : TStringGrid);
  150. var
  151.     AmountAllUsers : Integer;
  152.     AmountDeletedUsers : Integer;
  153.     AmountResult : Integer;
  154.     TempList : TUserList;
  155.     I, J : Integer;
  156. begin
  157.     ClearStringGrid(SG); // Очистка SrtingGrid
  158.     FillHeadersSG(SG); // Заполнение заголовков StringGrid
  159.  
  160.     I := 1;
  161.     J := 0;
  162.  
  163.     TempList := TUserList.GetUserListFromFile(ConstantsFile.FILE_NAME_USER); // Получение списка пользователей из типизированного файла
  164.  
  165.     AmountAllUsers := TUserList.GetAmountAllUsers(ConstantsFile.FILE_NAME_USER); // Получение количества пользователей
  166.     AmountDeletedUsers := TUserList.GetAmountSpecificUsers(ConstantsFile.FILE_NAME_USER, ConstantsRole.ROLE_DELETED); // Получение количества удаленных пользователей
  167.     AmountResult := AmountAllUsers - AmountDeletedUsers; // Количество пользователей, кроме удаленных
  168.  
  169.     Main.MainForm.AdminFrameMain.UsersAmountLabel.Caption := AmountResult.ToString; // Вывод в компонент TLabel количества неудаленных пользователей
  170.     SG.RowCount := AmountResult + 1;
  171.  
  172.     // Цикл для прохода по списку
  173.     while TempList.Head <> NIL do
  174.     begin
  175.         if TempList.Head^.User.Role <> ConstantsRole.ROLE_DELETED then // Если пользователь не удален
  176.         begin
  177.             // Заполнение полей StringGrid данными пользователя
  178.             SG.Cells[J, I] := TempList.Head.User.IdUser.ToString;
  179.             SG.Cells[J + 1, I] := TempList.Head.User.FirstName;
  180.             SG.Cells[J + 2, I] := TempList.Head.User.LastName;
  181.             SG.Cells[J + 3, I] := TempList.Head.User.Patronymic;
  182.             SG.Cells[J + 4, I] := TempList.Head.User.Login;
  183.             SG.Cells[J + 5, I] := TempList.Head.User.Password;
  184.             SG.Cells[J + 6, I] := TempList.Head.User.Role;
  185.             SG.Cells[J + 7, I] := TempList.Head.User.Phone;
  186.             SG.Cells[J + 8, I] := TempList.Head.User.Sex;
  187.             Inc(I);
  188.         end;
  189.  
  190.         TempList.Head := TempList.Head^.Next; // Переход к следующей записи
  191.     end;
  192.     TempList.Destroy; // Очистка памяти
  193. end;
  194.  
  195. procedure TAdminFrameMain.BtnDeleteClick(Sender: TObject);
  196. Var
  197.     C, R : Word;
  198.     UserForDelete : TUser;
  199.     TempList : TUserList;
  200. begin
  201.     try
  202.         C := SGUsers.Col; // Получить выбранный столбец в StringGrid
  203.         R := SGUsers.Row; // Получить выбранную строку в StringGrid
  204.  
  205.         UserForDelete := TUserList.GetUserByPrimaryKey(SGUsers.Cells[0,R].ToInteger, ConstantsFile.FILE_NAME_USER); // Получить записи пользователя к удалению
  206.  
  207.         // Если ID выбранного пользователя совпадает с пользователем к удалению
  208.         if UserForDelete.IdUser = Main.CurrentUser.IdUser then
  209.         begin
  210.             Application.MessageBox('Нельзя удалить свою учетную запись.','Отказ в удалении', MB_OK+MB_ICONERROR);
  211.             exit;
  212.         end;
  213.  
  214.         TempList := TUserList.GetUserListFromFile(ConstantsFile.FILE_NAME_USER); // Получить список пользователей из файла
  215.         TempList.EditUserRoleById(SGUsers.Cells[0, R].ToInteger, ConstantsRole.ROLE_DELETED); // Присвоить выбранному пользователю роль "Удален"
  216.         TempList.SaveUserList(ConstantsFile.FILE_NAME_USER); // Сохранение обновленного списка в файл
  217.  
  218.         Self.FrameEnter(Sender); // Обновление копонента TStringGrid после внесения правок
  219.         TempList.Destroy; // Очистка памяти занятой динамической структурой
  220.     Except
  221.         On E : EInOutError do
  222.         begin
  223.             Application.MessageBox('В доступе к файлу с пользователями отказано. Обратитесь к системному администратору.','Ошибка сохранения', MB_OK + MB_ICONERROR);
  224.             Application.Terminate;
  225.             Abort;
  226.         end;
  227.         On E : Exception do
  228.         begin
  229.             Application.MessageBox('Неизвестная ошибка. Обратитесь к системному администратору.','Ошибка сохранения', MB_OK + MB_ICONERROR);
  230.             Application.Terminate;
  231.             Abort;
  232.         end;
  233.     end;
  234. end;
  235.  
  236. Procedure SendDataForActions(SG : TStringGrid; TitleMainFrame : String);
  237. Var
  238.     C, R : Word;
  239.     UserForEdit : TUser;
  240.     TempList : TUserList;
  241. begin
  242.     C := SG.Col;
  243.     R := SG.Row;
  244.  
  245.     UserForEdit := TUserList.GetUserByLogin(SG.Cells[4,R], ConstantsFile.FILE_NAME_USER);
  246.     TempList := TUserList.GetUserListFromFile(ConstantsFile.FILE_NAME_USER);
  247.  
  248.     if UserForEdit <> NIL then
  249.         TempList.DeleteUserByID(UserForEdit.IdUser);
  250.  
  251.     with MainForm do
  252.     begin
  253.         AdminFrameMain.Visible := False;
  254.         AdminFrameAdd.Visible := True;
  255.         AdminFrameAdd.UpdateFrameForEdit(UserForEdit);
  256.         Main.MainForm.LBCurrentPage.Caption := TitleMainFrame;
  257.     end;
  258.  
  259.     TempList.Destroy;
  260. end;
  261.  
  262. procedure TAdminFrameMain.BtnEditClick(Sender: TObject);
  263. Var
  264.     C, R : Word;
  265.     UserForEdit : TUser;
  266.     TempList : TUserList;
  267. begin
  268.     try
  269.         C := SGUsers.Col;
  270.         R := SGUsers.Row;
  271.  
  272.         UserForEdit := TUserList.GetUserByPrimaryKey(SGUsers.Cells[0,R].ToInteger, ConstantsFile.FILE_NAME_USER);
  273.  
  274.         if UserForEdit.IdUser = Main.CurrentUser.IdUser then
  275.         begin
  276.             Application.MessageBox('Нельзя редактировать свою учетную запись.','Отказ в редактировании', MB_OK+MB_ICONERROR);
  277.             exit;
  278.         end;
  279.  
  280.         SendDataForActions(SGUsers, ConstantsTitleMainFrame.TITLE_EDIT_USER_PAGE);
  281.     Except
  282.         On E : EInOutError do
  283.         begin
  284.             Application.MessageBox('В доступе к файлу с пользователями отказано. Обратитесь к системному администратору.','Ошибка сохранения', MB_OK + MB_ICONERROR);
  285.             Application.Terminate;
  286.             Abort;
  287.         end;
  288.         On E : Exception do
  289.         begin
  290.             Application.MessageBox('Неизвестная ошибка. Обратитесь к системному администратору.','Ошибка сохранения', MB_OK + MB_ICONERROR);
  291.             Application.Terminate;
  292.             Abort;
  293.         end;
  294.     end;
  295. end;
  296.  
  297. procedure TAdminFrameMain.ButtonRecoverClick(Sender: TObject);
  298. begin
  299.     if SGArchive.RowCount - 1 = 0 then
  300.     begin
  301.         Application.MessageBox('Список удаленных пользователей пуст! Восстановление невозможно.','Ошибка восстановления',MB_OK+MB_ICONERROR)
  302.     end
  303.     else
  304.     begin
  305.         SendDataForActions(SGArchive, ConstantsTitleMainFrame.TITLE_RECOVER_USER_PAGE);
  306.     end;
  307. end;
  308.  
  309. function CheckSubStr(SubStr, MainStr: string): Boolean;
  310. begin
  311.   Result := False;
  312.   if (Pos(SubStr, MainStr) = 0) = False then Result := True;
  313. end;
  314.  
  315. procedure TAdminFrameMain.FillSGByFirstName(SG : TStringGrid; Text : String);
  316. var
  317.     I, J, Count : Integer;
  318.     UserArray : array of array of String;
  319.     Temp: String;
  320. begin
  321.     if (SG.RowCount - 1 > 1) AND (Text <> '') then
  322.     begin
  323.         Text := Text.ToLower;
  324.         Self.FrameEnter(NIL);
  325.         Count := 0;
  326.         SetLength(UserArray, SG.RowCount - 1, SG.ColCount);
  327.         for I := 1 to SG.RowCount -1 do
  328.         begin
  329.             temp := SG.Cells[1,I].ToLower;
  330.             if NOT(pos(text, temp)=0) then
  331.             begin
  332.                 for J := 0 to SG.ColCount - 1 do
  333.                 begin
  334.                     UserArray[Count,J] := SG.Cells[J,I];
  335.                 end;
  336.                 Inc(Count);
  337.             end;
  338.         end;
  339.  
  340.         SetLength(UserArray,Count);
  341.         SG.RowCount := Count + 1;
  342.  
  343.         for I := 0 to High(UserArray) do
  344.         begin
  345.             for J := 0 to High(UserArray[0]) do
  346.             begin
  347.                 SG.Cells[J,I+1] := UserArray[I,J];
  348.             end;
  349.         end;
  350.     end
  351.     else if Text = '' then
  352.     begin
  353.         FrameEnter(NIL);
  354.     end;
  355. end;
  356.  
  357.  
  358. procedure TAdminFrameMain.FrameEnter(Sender: TObject);
  359. begin
  360.     try
  361.         FillAllUsers(SGUsers);
  362.         FillSpecificRole(SGArchive, ConstantsRole.ROLE_DELETED);
  363.     Except
  364.         On E : EInOutError do
  365.         begin
  366.             Application.MessageBox('В доступе к файлу с пользователями отказано. Обратитесь к системному администратору.','Ошибка сохранения', MB_OK + MB_ICONERROR);
  367.             Application.Terminate;
  368.             Abort;
  369.         end;
  370.         On E : Exception do
  371.         begin
  372.             Application.MessageBox('Неизвестная ошибка. Обратитесь к системному администратору.','Ошибка сохранения', MB_OK + MB_ICONERROR);
  373.             Application.Terminate;
  374.             Abort;
  375.         end;
  376.     end;
  377. end;
  378.  
  379. procedure TAdminFrameMain.SGUsersSelectCell(Sender: TObject; ACol,
  380.   ARow: Integer; var CanSelect: Boolean);
  381. begin
  382.     CanSelect := True;
  383.  
  384.     if ARow = 0 then
  385.         CanSelect := False;
  386. end;
  387.  
  388. end.
Add Comment
Please, Sign In to add comment