Vanilla_Fury

laba_5_3_del

Apr 11th, 2021
321
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 9.56 KB | None | 0 0
  1. unit laba_5_3_f1_v2;
  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.Menus, Vcl.StdCtrls, System.RegularExpressions,
  8.   Vcl.ExtCtrls, Vcl.ComCtrls, System.UITypes, Math;
  9.  
  10. type
  11.     TArrStr = Array of String;
  12.     TArrInt = Array of Integer;
  13.  
  14.     TFormMain = class(TForm)
  15.     MainMenu1: TMainMenu;
  16.     NHelp: TMenuItem;
  17.     NAuthor: TMenuItem;
  18.     OpenDialog1: TOpenDialog;
  19.     NFile: TMenuItem;
  20.     NOpen: TMenuItem;
  21.     NSaveAs: TMenuItem;
  22.     SaveDialog1: TSaveDialog;
  23.     NSave: TMenuItem;
  24.     NTask: TMenuItem;
  25.     MemoOutput: TMemo;
  26.     ButtonAccept: TButton;
  27.     LabelAnswer: TLabel;
  28.     BalloonHint1: TBalloonHint;
  29.     TrackBar1: TTrackBar;
  30.     Label3: TLabel;
  31.     Label5: TLabel;
  32.     Label7: TLabel;
  33.     procedure NAuthorClick(Sender: TObject);
  34.     procedure NOpenClick(Sender: TObject);
  35.     procedure NSaveAsClick(Sender: TObject);
  36.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  37.     procedure FormCreate(Sender: TObject);
  38.     procedure NSaveClick(Sender: TObject);
  39.     procedure NTaskClick(Sender: TObject);
  40.     procedure ButtonAcceptClick(Sender: TObject);
  41.     procedure OutputAnswer(SizeOfArr: Byte);
  42.     procedure TrackBar1Change(Sender: TObject);
  43.  
  44.     private
  45.         StrFile: String;
  46.         IsSaved: Boolean;
  47.     public
  48.  
  49.     end;
  50.  
  51. const
  52.     RegExForNumber = '[1-9]\d{0,2}';
  53.     CaptionHereWillBeAnswer = 'Здесь будет ответ';
  54.  
  55. var
  56.     FormMain: TFormMain;
  57.  
  58. implementation
  59. {$R *.dfm}
  60.  
  61. function FindRegEx(SInput, StrRegEx: String; StrIfNothingFound: String = '') : TArrStr; forward;
  62.  
  63. //******************************************************************************
  64. // Ввод данных
  65.  
  66. procedure TFormMain.ButtonAcceptClick(Sender: TObject);
  67. var
  68.     SizeOfArr: Byte;
  69.  
  70. begin
  71.     SizeOfArr := 3 + TrackBar1.Position * 2;
  72.  
  73.     OutputAnswer(SizeOfArr);
  74.     NSave.Enabled := StrFile <> '';
  75. end;
  76.  
  77. procedure TFormMain.OutputAnswer(SizeOfArr: Byte);
  78. var
  79.     Arr: Array Of TArrInt;
  80.     i, j, NCount, Num, WhenToStop: Integer;
  81.     Nums: TArrInt;
  82.     Str1: String;
  83.  
  84. begin
  85.     MemoOutput.Clear();
  86.  
  87.     SetLength(Arr, SizeOfArr, SizeOfArr);
  88.     for i := 0 to SizeOfArr - 1 do
  89.         for j := 0 to SizeOfArr - 1 do
  90.             Arr[i][j] := 0;
  91.  
  92.     NCount := 1;
  93.     i := 0;
  94.     j := SizeOfArr div 2;
  95.     WhenToStop := SizeOfArr * SizeOfArr;
  96.  
  97.     repeat
  98.         Arr[i][j] := NCount;
  99.  
  100.         Dec(i);
  101.         Inc(j);
  102.  
  103.         if (i < 0) then i := SizeOfArr - 1;
  104.         if (j > SizeOfArr - 1) then j := 0;
  105.  
  106.         if (Arr[i][j] <> 0) then
  107.         begin
  108.             i := i + 2;
  109.             Dec(j);;
  110.         end;
  111.  
  112.         if (i > SizeOfArr - 1) then i := i - SizeOfArr;
  113.         if (j < 0) then j := SizeOfArr - 1;
  114.  
  115.         MemoOutput.Lines.Add('Шаг ' + IntToStr(NCount) + ':');
  116.         for Nums in Arr do
  117.         begin
  118.             Str1 := '';
  119.             for Num in Nums do
  120.                 Str1 := Str1 + format('%-3d', [Num]);
  121.  
  122.             MemoOutput.Lines.Add(Str1);
  123.         end;
  124.         MemoOutput.Lines.Add('');
  125.  
  126.         Inc(NCount);
  127.     until (NCount > WhenToStop);
  128.  
  129.     NSaveAs.Enabled := True;
  130.     if StrFile <> '' then
  131.         NSave.Enabled := True;
  132. end;
  133.  
  134.  
  135. procedure TFormMain.TrackBar1Change(Sender: TObject);
  136. begin
  137.     MemoOutput.Clear();
  138.     NSaveAs.Enabled := False;
  139.     NSave.Enabled := False;
  140. end;
  141.  
  142. //******************************************************************************
  143. // Работа с файлами
  144.  
  145. procedure TFormMain.NOpenClick(Sender: TObject);
  146. const
  147.     ErrorDuringInputOccured = 'Возникла ошибка при открытии файла.' + #10#13 +
  148.                 'Пожалуйста, выберите файл нужного формата(.datgrad) с ' +
  149.                 'корректными данными.';
  150.  
  151. var
  152.     FileInput : TextFile;
  153.     PathToFile, String1, Input: String;
  154.  
  155. begin
  156.     if not IsSaved and (MessageDlg('Вы хотите сохранить текущие данные?' +
  157.         #10#13 + 'Иначе после открытия файла текущие записи будут удалены.',
  158.         mtConfirmation, [mbYes, mbNo], 0) = mrYes) then
  159.         NSaveClick(Self);
  160.  
  161.     if (IsSaved or (MessageDlg('Вы уверены, что хотите открыть другой файл?' + #10#13 +
  162.         'Все текущие записи будут удалены.', mtConfirmation, [mbYes, mbCancel], 0) = mrYes))
  163.         and OpenDialog1.Execute then
  164.     begin
  165.         PathToFile := OpenDialog1.FileName;
  166.         try
  167.             AssignFile(FileInput, PathToFile);
  168.             Reset(FileInput);
  169.  
  170.             Readln(FileInput, String1);
  171.  
  172.             Input := FindRegEx(String1, '^\s*[357]\s*$')[0];
  173.             if Input <> '' then
  174.                 OutputAnswer(StrToInt(Input))
  175.             else
  176.                 ShowMessage('Ошибка. В первой строке файла должно быть нечётное число от 3 до 7.');
  177.  
  178.             CloseFile(FileInput);
  179.         except
  180.             ShowMessage(ErrorDuringInputOccured);
  181.         end;
  182.     end;
  183. end;
  184.  
  185. procedure TFormMain.NSaveAsClick(Sender: TObject);
  186. var
  187.     FileOutput : TextFile;
  188.     StrFilePath: String;
  189.     ShouldNotRepeat: Boolean;
  190.     Point: TPoint;
  191.  
  192. begin
  193.     try
  194.         repeat
  195.             ShouldNotRepeat := True;
  196.             if SaveDialog1.Execute then
  197.             begin
  198.                 StrFilePath := SaveDialog1.FileName;
  199.                 StrFilePath := FindRegEx(StrFilePath, '.+\.txt', StrFilePath + '.txt')[0];
  200.  
  201.                 if FileExists(StrFilePath) then
  202.                     if MessageDlg('Такой файл уже существует.' +
  203.                         #10#13 + 'Вы хотите перезаписать файл? Это действие невозможно отменить.',
  204.                         mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  205.                         ShouldNotRepeat := True
  206.                     else
  207.                         ShouldNotRepeat := False
  208.                 else
  209.                     ShouldNotRepeat := True;
  210.  
  211.                 if ShouldNotRepeat then
  212.                 begin
  213.                     AssignFile(FileOutput, StrFilePath);
  214.                     Rewrite(FileOutput);
  215.  
  216.                     Write(FileOutput, MemoOutput.Text + #10#13);
  217.  
  218.                     CloseFile(FileOutput);
  219.                     IsSaved := True;
  220.                     BalloonHint1.Title := 'Готово';
  221.                     BalloonHint1.Description := 'Ответ успешно записан в файл.';
  222.                     Point.X := Round(MemoOutput.Left + MemoOutput.Width * 2 / 3);
  223.                     Point.Y := MemoOutput.Top + MemoOutput.Height;
  224.                     Balloonhint1.ShowHint(ClientToScreen(Point));
  225.  
  226.                     NSave.Enabled := True;
  227.                     StrFile := StrFilePath;
  228.                 end;
  229.             end;
  230.         until ShouldNotRepeat;
  231.     except
  232.        ShowMessage('Не удается открыть файл для вывода данных или записать в него данные.');
  233.     end;
  234. end;
  235.  
  236. procedure TFormMain.NSaveClick(Sender: TObject);
  237. var
  238.     FileOutput : TextFile;
  239.  
  240. begin
  241.     if MessageDlg('Вы хотите перезаписать файл "' + StrFile + '"?' + #10#13 +
  242.         'Это действие невозможно отменить.', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  243.         if FileExists(StrFile) then
  244.         begin
  245.             AssignFile(FileOutput, StrFile);
  246.             Rewrite(FileOutput);
  247.  
  248.             Write(FileOutput, MemoOutput.Text + #10#13);
  249.  
  250.             CloseFile(FileOutput);
  251.             IsSaved := True;
  252.         end
  253.         else
  254.         begin
  255.             ShowMessage('Этого файла уже не существует.');
  256.             StrFile := '';
  257.             NSave.Enabled := False;
  258.             NSaveAsClick(Self);
  259.         end;
  260. end;
  261.  
  262.  
  263. //******************************************************************************
  264. // Form Create
  265.  
  266. procedure TFormMain.FormCreate(Sender: TObject);
  267. begin
  268.     StrFile := '';
  269.     IsSaved := True;
  270.     MemoOutput.Text := CaptionHereWillBeAnswer;
  271. end;
  272.  
  273. //******************************************************************************
  274. // Прочее
  275.  
  276. procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  277. begin
  278.     CanClose := IsSaved or (MessageDlg('Вы уверены, что хотите выйти из программы?' +
  279.         #10#13 + 'Все несохранённые данные будут утеряны.',
  280.         mtConfirmation, [mbYes, mbNo], 0) = mrYes);
  281. end;
  282.  
  283. procedure TFormMain.NAuthorClick(Sender: TObject);
  284. begin
  285.     ShowMessage('Панев Александр, гр. 051007' + #10#13 + 'Минск, 2021');
  286. end;
  287.  
  288. procedure TFormMain.NTaskClick(Sender: TObject);
  289. begin
  290.     ShowMessage('Построить квадрат нечётного порядка и визувлизировать построение.');
  291. end;
  292.  
  293. function FindRegEx(SInput, StrRegEx: String; StrIfNothingFound: String = '') : TArrStr;
  294. var
  295.     ArrStr: TArrStr;
  296.     RegEx: TRegEx;
  297.     MatchCollection: TMatchCollection;
  298.     i: Integer;
  299. begin
  300.     RegEx := TRegEx.Create(StrRegEx);
  301.     MatchCollection := RegEx.Matches(SInput);
  302.     SetLength(ArrStr, MatchCollection.Count);
  303.     for i := 0 to MatchCollection.Count - 1 do
  304.         ArrStr[i] := MatchCollection.Item[i].Value;
  305.  
  306.     if (Length(ArrStr) < 1) then
  307.         ArrStr := [StrIfNothingFound];
  308.     Result := ArrStr;
  309. end;
  310.  
  311. end.
  312.  
Advertisement
Add Comment
Please, Sign In to add comment