redmanexe

Lab1Challenge1Forms2

Dec 21st, 2024
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 14.17 KB | None | 0 0
  1. Unit Unit1;
  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.Tabs, Vcl.StdCtrls, Vcl.Menus,
  8.     System.Actions, Vcl.ActnList, System.UITypes, Vcl.ExtDlgs;
  9.  
  10. Const
  11.     AllowedKeys = ['0'..'9', '-', #8];
  12.     ROOMS_MIN = 1;
  13.     ROOMS_MAX = 99999;
  14.     MANS_AND_WOMANS_MIN = 0;
  15.     MANS_AND_WOMANS_MAX = 99999;
  16.  
  17. Type
  18.     TMainForm = Class(TForm)
  19.         Menu: TMainMenu;
  20.         FileTab: TMenuItem;
  21.         InfoTab: TMenuItem;
  22.         AboutTab: TMenuItem;
  23.         OpenFileOption: TMenuItem;
  24.         SaveFileOption: TMenuItem;
  25.         ExitFileOption: TMenuItem;
  26.         FileOptionsSeparator: TMenuItem;
  27.         InfoAboutFilesOption: TMenuItem;
  28.         InfoAboutKeyboardOptions: TMenuItem;
  29.         TaskLabel: TLabel;
  30.         RoomsEdit: TEdit;
  31.         WomansEdit: TEdit;
  32.         MansEdit: TEdit;
  33.         DescriptionLabel1: TLabel;
  34.         DescriptionLabel3: TLabel;
  35.         DescriptionLabel2: TLabel;
  36.         CalculationButton: TButton;
  37.         ResultLabel: TLabel;
  38.         Actions: TActionList;
  39.         OnKeyPressed: TAction;
  40.         OnEditChanged: TAction;
  41.         OnFormClose: TAction;
  42.         OpenFileDialog: TOpenTextFileDialog;
  43.         SaveFileDialog: TSaveTextFileDialog;
  44.         Procedure CalculationButtonClick(Sender: TObject);
  45.         Procedure OnKeyPressedExecute(Sender: TObject; Var Key: Char);
  46.         Procedure OnEditChangedExecute(Sender: TObject);
  47.         Procedure OnFormCloseExecute(Sender: TObject);
  48.         Procedure FormClose(Sender: TObject; Var Action: TCloseAction);
  49.         Procedure OpenFileOptionClick(Sender: TObject);
  50.         Procedure SaveFileOptionClick(Sender: TObject);
  51.         Procedure AboutTabClick(Sender: TObject);
  52.         Procedure InfoAboutFilesOptionClick(Sender: TObject);
  53.         Procedure InfoAboutKeyboardOptionsClick(Sender: TObject);
  54.     procedure FormResize(Sender: TObject);
  55.     Private
  56.         LatestResult: Boolean;
  57.         Procedure CheckDataInEdits();
  58.         Function Calculate(Const Rooms: Integer; Const Womans: Integer; Const Mans: Integer): Boolean;
  59.         Procedure SetResultIntoLabel(Const Result: Boolean);
  60.         Procedure ProcessFile(Const FileName: TFileName);
  61.         Function Substring(Const Orig: String; Const Beg: Integer; Const Len: Integer): String;
  62.         Function IsTextFile(Const FilePath: String): Boolean;
  63.         Function CheckFileAvailability(Const FilePath: String; Const Read: Boolean): Boolean;
  64.         Procedure SaveIntoFile(Const FileName: TFileName);
  65.     Public
  66.  
  67. End;
  68.  
  69. Var
  70.     MainForm: TMainForm;
  71.  
  72. implementation
  73.  
  74. {$R *.dfm}
  75.  
  76. Procedure TMainForm.AboutTabClick(Sender: TObject);
  77. Var
  78.     Dlg: TForm;
  79. Begin
  80.     Dlg := CreateMessageDialog(
  81.             'Программа для решения задания 1.1!' + #10 + 'Разработана Даниилом Струцом, группа 451004',
  82.             mtInformation, [mbOk], mbOk);
  83.     Dlg.Caption := 'О разработчике...';
  84.     Dlg.ShowModal();
  85.     Dlg.Free();
  86. End;
  87.  
  88. Function TMainForm.Calculate(Const Rooms: Integer; Const Womans: Integer; Const Mans: Integer): Boolean;
  89. Var
  90.     MansRooms, WomansRooms: Integer;
  91. Begin
  92.     MansRooms := Mans Div 4;
  93.     WomansRooms := Womans Div 4;
  94.  
  95.     If Not(MansRooms * 4 = Mans) Then
  96.         Inc(MansRooms);
  97.     If Not(WomansRooms * 4 = Womans) Then
  98.         Inc(WomansRooms);
  99.  
  100.     Calculate := (MansRooms + WomansRooms < Rooms + 1);
  101. End;
  102.  
  103. Procedure TMainForm.SaveFileOptionClick(Sender: TObject);
  104. Begin
  105.     If SaveFileDialog.Execute(Self.Handle) Then
  106.         SaveIntoFile(SaveFileDialog.FileName);
  107. End;
  108.  
  109. Procedure TMainForm.SaveIntoFile(Const FileName: TFileName);
  110. Var
  111.     F: TextFile;
  112.     FN: String;
  113.     Dlg: TForm;
  114. Begin
  115.     If Not (IsTextFile(FileName)) Then
  116.         FN := FileName + '.txt'
  117.     Else
  118.         FN := FileName;
  119.  
  120.     If CheckFileAvailability(FN, False) Then
  121.     Begin
  122.         Try
  123.             AssignFile(F, FN);
  124.             Rewrite(F);
  125.             If (LatestResult) Then
  126.                 Write(F, 'Достаточно')
  127.             Else
  128.                 Write(F, 'Недостаточно');
  129.  
  130.             CloseFile(F);
  131.         Except
  132.             Dlg := CreateMessageDialog(
  133.                 'Выбранный файл недоступен или не является текстовым файлом!',
  134.                 mtError, [mbOk], mbOk);
  135.             Dlg.Caption := 'Сохранение в файл';
  136.             Dlg.ShowModal();
  137.             Dlg.Free();
  138.         End;
  139.     End
  140.     Else
  141.     Begin
  142.         Dlg := CreateMessageDialog(
  143.             'Выбранный файл недоступен или не является текстовым файлом!',
  144.             mtError, [mbOk], mbOk);
  145.         Dlg.Caption := 'Сохранение в файл';
  146.         Dlg.ShowModal();
  147.         Dlg.Free();
  148.     End;
  149. End;
  150.  
  151. Procedure TMainForm.SetResultIntoLabel(Const Result: Boolean);
  152. Begin
  153.     If (Result) Then
  154.         ResultLabel.Caption := 'Достаточно'
  155.     Else
  156.         ResultLabel.Caption := 'Недостаточно';
  157. End;
  158.  
  159. Procedure TMainForm.CalculationButtonClick(Sender: TObject);
  160. Var
  161.     Rooms, Womans, Mans: Integer;
  162.     IsCorrect: Boolean;
  163.     Reasons: String;
  164.     Dlg: TForm;
  165. Begin
  166.     IsCorrect := True;
  167.     Rooms := -1;
  168.     Womans := -1;
  169.     Mans := -1;
  170.     Try
  171.         Rooms := StrToInt(RoomsEdit.Text);
  172.         Womans := StrToInt(WomansEdit.Text);
  173.         Mans := StrToInt(MansEdit.Text);
  174.     Except
  175.         IsCorrect := False;
  176.     End;
  177.  
  178.     If (Rooms < ROOMS_MIN) Or (Rooms > ROOMS_MAX) Then
  179.     Begin
  180.         IsCorrect := False;
  181.         Reasons := Reasons + ' количество комнат';
  182.     End;
  183.     If (Womans < MANS_AND_WOMANS_MIN) Or (Womans > MANS_AND_WOMANS_MAX) Then
  184.     Begin
  185.         IsCorrect := False;
  186.         If Not (Reasons = '') Then
  187.             Reasons := Reasons + ',';
  188.         Reasons := Reasons + ' количество женщин';
  189.     End;
  190.     If (Mans < MANS_AND_WOMANS_MIN) Or (Mans > MANS_AND_WOMANS_MAX) Then
  191.     Begin
  192.         IsCorrect := False;
  193.         If Not (Reasons = '') Then
  194.             Reasons := Reasons + ',';
  195.         Reasons := Reasons + ' количество мужчин';
  196.     End;
  197.  
  198.     If (IsCorrect) Then
  199.     Begin
  200.         LatestResult := Calculate(Rooms, Womans, Mans);
  201.         SetResultIntoLabel(LatestResult);
  202.         SaveFileOption.Enabled := True;
  203.     End
  204.     Else
  205.     Begin
  206.         Dlg := CreateMessageDialog(
  207.             'Значения в следующих полях неверны:' + Reasons + '. Прочитайте инструкцию!',
  208.             mtError, [mbOk], mbOk);
  209.         Dlg.Caption := 'Вычисление';
  210.         Dlg.ShowModal();
  211.         Dlg.Free();
  212.     End;
  213. End;
  214.  
  215. Procedure TMainForm.CheckDataInEdits();
  216. Begin
  217.     If Not (RoomsEdit.Text = '') And Not (MansEdit.Text = '') And Not (WomansEdit.Text = '') Then
  218.         CalculationButton.Enabled := True
  219.     Else
  220.         CalculationButton.Enabled := False;
  221. End;
  222.  
  223. Procedure TMainForm.FormClose(Sender: TObject; Var Action: TCloseAction);
  224. Begin
  225.     Action := TCloseAction.caNone;
  226.     OnFormCloseExecute(Sender);
  227. End;
  228.  
  229. procedure TMainForm.FormResize(Sender: TObject);
  230. begin
  231.     If (Self.WindowState = WSMaximized) Then
  232.         Self.WindowState := WSNormal;
  233. end;
  234.  
  235. Procedure TMainForm.OnEditChangedExecute(Sender: TObject);
  236. Var
  237.     I: Integer;
  238. Begin
  239.     CheckDataInEdits();
  240.     SaveFileOption.Enabled := False;
  241. End;
  242.  
  243. Procedure TMainForm.OnFormCloseExecute(Sender: TObject);
  244. Var
  245.     CloseDialog: TForm;
  246. Begin
  247.     CloseDialog := CreateMessageDialog(
  248.         'Вы точно хотите выйти из программы?',
  249.         mtConfirmation, [mbYes, mbNo], mbNo, ['Да', 'Нет']);
  250.     CloseDialog.Caption := 'Выход из программы';
  251.     If (CloseDialog.ShowModal() = 6) Then
  252.         Application.Terminate();
  253.     CloseDialog.Free();
  254. End;
  255.  
  256. Procedure TMainForm.OnKeyPressedExecute(Sender: TObject; Var Key: Char);
  257. Begin
  258.     If Not CharInSet(Key, AllowedKeys) Then
  259.         Key := #0
  260. End;
  261.  
  262. Procedure TMainForm.OpenFileOptionClick(Sender: TObject);
  263. Begin
  264.     If OpenFileDialog.Execute(Self.Handle) Then
  265.         ProcessFile(OpenFileDialog.FileName);
  266. End;
  267.  
  268. Procedure TMainForm.ProcessFile(Const FileName: TFileName);
  269. Var
  270.     F: TextFile;
  271.     Rooms, Womans, Mans: Integer;
  272.     IsCorrect: Boolean;
  273.     Dlg: TForm;
  274. Begin
  275.     IsCorrect := True;
  276.     Rooms := -1;
  277.     Mans := -1;
  278.     Womans := -1;
  279.     If CheckFileAvailability(FileName, True) Then
  280.     Begin
  281.         Try
  282.             AssignFile(F, FileName);
  283.             Reset(F);
  284.             If Not Eof(F) Then
  285.                 Read(F, Rooms);
  286.             If Not Eof(F) Then
  287.                 Read(F, Womans);
  288.             If Not Eof(F) Then
  289.                 Read(F, Mans);
  290.             CloseFile(F);
  291.         Except
  292.             Dlg := CreateMessageDialog(
  293.                 'Файл содержит неверные значения!',
  294.                 mtError, [mbOk], mbOk);
  295.             Dlg.Caption := 'Открытие файла';
  296.             Dlg.ShowModal();
  297.             Dlg.Free();
  298.             IsCorrect := False;
  299.         End;
  300.  
  301.         If (IsCorrect) Then
  302.         Begin
  303.             If (Rooms < ROOMS_MIN) Or (Rooms > ROOMS_MAX)
  304.                 Or (Womans < MANS_AND_WOMANS_MIN) Or (Womans > MANS_AND_WOMANS_MAX)
  305.                 Or (Mans < MANS_AND_WOMANS_MIN) Or (Mans > MANS_AND_WOMANS_MAX) Then
  306.             Begin
  307.                 Dlg := CreateMessageDialog(
  308.                     'Файл содержит значения, находящиеся вне границ, или же в файле недостаточно нужных значений!',
  309.                     mtError, [mbOk], mbOk);
  310.                 Dlg.Caption := 'Открытие файла';
  311.                 Dlg.ShowModal();
  312.                 Dlg.Free();
  313.             End
  314.             Else
  315.             Begin
  316.                 RoomsEdit.Text := IntToStr(Rooms);
  317.                 WomansEdit.Text := IntToStr(Womans);
  318.                 MansEdit.Text := IntToStr(Mans);
  319.             End;
  320.         End;
  321.     End
  322.     Else
  323.     Begin
  324.         Dlg := CreateMessageDialog(
  325.             'Выбранный файл недоступен или не является текстовым файлом!',
  326.             mtError, [mbOk], mbOk);
  327.         Dlg.Caption := 'Открытие файла';
  328.         Dlg.ShowModal();
  329.         Dlg.Free();
  330.     End;
  331. End;
  332.  
  333. Function TMainForm.Substring(Const Orig: String; Const Beg: Integer; Const Len: Integer): String;
  334. Var
  335.     Res: String;
  336.     I, En: Integer;
  337. Begin
  338.     En := Beg + Len - 1;
  339.     If ((Beg > 0) And (En < (Length(Orig) + 1))) Then
  340.     Begin
  341.         For I := Beg To En Do
  342.             Res := Res + Orig[I];
  343.     End;
  344.  
  345.     Substring := Res;
  346. End;
  347. Procedure TMainForm.InfoAboutFilesOptionClick(Sender: TObject);
  348. Var
  349.     Dlg: TForm;
  350. Begin
  351.     Dlg := CreateMessageDialog(
  352.                 'Для открытия файла с нужными данными:' + #10
  353.                 + '1. Нажмите на пункт "Файл" в меню сверху и выберите опцию "Открыть..."' + #10
  354.                 + '2. Выберите нужный текстовый файл' + #10
  355.                 + '3. Откройте его при помощи кнопки "Открыть"' + #10
  356.                 + 'Если информация в файле верная - данные появятся в полях для ввода!' + #10
  357.                 + '' + #10
  358.                 + 'Для сохранения результатов в файл:' + #10
  359.                 + '1. Нажмите на пункт "Файл" в меню сверху и выберите опцию "Сохранить..."' + #10
  360.                 + '2. Выберите файл или же укажите название нового файла для сохранения' + #10
  361.                 + '3. Нажмите на кнопку "Сохранить"' + #10
  362.                 + 'Если файл будет доступен - результат будет сохранен!',
  363.                 mtInformation, [mbOk], mbOk);
  364.     Dlg.Caption := 'Инструкция: выбор файлов';
  365.     Dlg.ShowModal();
  366.     Dlg.Free();
  367. End;
  368.  
  369. Procedure TMainForm.InfoAboutKeyboardOptionsClick(Sender: TObject);
  370. Var
  371.     Dlg: TForm;
  372. Begin
  373.     Dlg := CreateMessageDialog(
  374.                 'Работа с программой:' + #10
  375.                 + '1. Введите данные в поля для ввода' + #10
  376.                 + '2. Нажмите на кнопку "Вычислить"' + #10
  377.                 + 'Если данные верны - в строке под кнопкой будет выведен результат!' + #10
  378.                 + '' + #10
  379.                 + 'Однако для входных данных есть некоторые требования:' + #10
  380.                 + '- Количество комнат должно быть от 1 до 99999 (включительно)' + #10
  381.                 + '- Количество мужчин и женщин должно быть от 0 до 99999 (включительно)',
  382.                 mtInformation, [mbOk], mbOk);
  383.     Dlg.Caption := 'Инструкция: работа с программой';
  384.     Dlg.ShowModal();
  385.     Dlg.Free();
  386. End;
  387.  
  388. Function TMainForm.IsTextFile(Const FilePath: String): Boolean;
  389. Var
  390.     Path: String;
  391. Begin
  392.     Path := LowerCase(Substring(FilePath, Length(FilePath) - 3, 4));
  393.     IsTextFile := (Path = '.txt');
  394. End;
  395.  
  396. Function TMainForm.CheckFileAvailability(Const FilePath: String; Const Read: Boolean): Boolean;
  397. Var
  398.     IsAvailable: Boolean;
  399.     Checkable: TextFile;
  400. Begin
  401.     IsAvailable := True;
  402.     AssignFile(Checkable, FilePath);
  403.     Try
  404.         If (Read) Then
  405.             Reset(Checkable)
  406.         Else
  407.         Begin
  408.             If (FileExists(FilePath)) Then
  409.                 Append(Checkable)
  410.             Else
  411.                 Rewrite(Checkable);
  412.         End;
  413.         CloseFile(Checkable);
  414.     Except
  415.         IsAvailable := False;
  416.     End;
  417.  
  418.     If (IsAvailable And Not IsTextFile(FilePath)) Then
  419.         IsAvailable := False;
  420.  
  421.     CheckFileAvailability := IsAvailable;
  422. End;
  423.  
  424. End.
Tags: delphi
Advertisement
Add Comment
Please, Sign In to add comment