Advertisement
MadCortez

Untitled

Apr 7th, 2021
475
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 8.10 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.Menus, Vcl.StdCtrls, Vcl.Grids,
  8.   Vcl.Samples.Spin;
  9.  
  10. type
  11.   TForm1 = class(TForm)
  12.     MainMenu1: TMainMenu;
  13.     FileButton: TMenuItem;
  14.     AboutButton: TMenuItem;
  15.     ReadButton: TMenuItem;
  16.     SaveButton: TMenuItem;
  17.     LSize: TLabel;
  18.     OpenDialog1: TOpenDialog;
  19.     SaveDialog1: TSaveDialog;
  20.     SGMatrix: TStringGrid;
  21.     Start: TButton;
  22.     ESize: TSpinEdit;
  23.     procedure AboutButtonClick(Sender: TObject);
  24.     procedure OpenDialog1CanClose(Sender: TObject; var CanClose: Boolean);
  25.     procedure SaveDialog1CanClose(Sender: TObject; var CanClose: Boolean);
  26.     procedure SetSize;
  27.     procedure ReadButtonClick(Sender: TObject);
  28.     procedure SaveButtonClick(Sender: TObject);
  29.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  30.     procedure StartClick(Sender: TObject);
  31.     procedure ESizeChange(Sender: TObject);
  32.   private
  33.     { Private declarations }
  34.   public
  35.     { Public declarations }
  36.   end;
  37.   TMatrix = array of array of Integer;
  38.  
  39. var
  40.   Form1: TForm1;
  41.   Size: Integer;
  42.   Ans: Real;
  43.   Matrix, TempMatrix: TMatrix;
  44. const
  45.    MIN_SIZE = 2;
  46.    MAX_SIZE = 32;
  47.  
  48. implementation
  49.  
  50. {$R *.dfm}
  51.  
  52. procedure TForm1.SetSize;
  53. var
  54.    ErrMsg: String;
  55.    Err: Integer;
  56. begin
  57.    val(ESize.Text, Size, Err);
  58.    Size := StrToInt(ESize.Text);
  59.    SGMatrix.ColCount := Size;
  60.    if Size = 2 then
  61.    begin
  62.       SGMatrix.DefaultColWidth := 50;
  63.       SGMatrix.Width := (SGMatrix.DefaultColWidth + 6) * Size;
  64.       SGMatrix.RowCount := Size;
  65.       SGMatrix.DefaultRowHeight := 20;
  66.       SGMatrix.Height := (SGMatrix.DefaultRowHeight + 6) * Size;
  67.    end
  68.    else
  69.    begin
  70.       SGMatrix.DefaultColWidth := 50;
  71.       SGMatrix.Width := (SGMatrix.DefaultColWidth + 2) * Size;
  72.       SGMatrix.RowCount := Size;
  73.       SGMatrix.DefaultRowHeight := 20;
  74.       SGMatrix.Height := (SGMatrix.DefaultRowHeight + 2) * Size;
  75.    end;
  76.    SGMatrix.Visible := True;
  77. end;
  78.  
  79. procedure FillMatrix;
  80. var
  81.    i, j, Count: Integer;
  82. begin
  83.    Count := 0;
  84.    for i := 0 to High(Matrix) do
  85.       for j := 0 to High(Matrix) do
  86.       begin
  87.          Inc(Count);
  88.          Matrix[i, j] := Count;
  89.       end;
  90. end;
  91.  
  92. procedure FillMatrixTemp;
  93. var
  94.    i, j, Count: Integer;
  95. begin
  96.    Count := sqr(Size);
  97.    for i := 0 to Size - 1 do
  98.       for j := 0 to Size - 1 do
  99.       begin
  100.          TempMatrix[i, j] := Count;
  101.          Dec(Count);
  102.       end;
  103. end;
  104.  
  105. procedure TForm1.StartClick(Sender: TObject);
  106. var
  107.    Count, i, j, Temp, a, b: Integer;
  108. begin
  109.    Form1.SetSize;
  110.    SetLength(Matrix, Size, Size);
  111.    SetLength(TempMatrix, Size, Size);
  112.    FillMatrix;
  113.    FillMatrixTemp;
  114.    for i := 0 to Size - 1 do
  115.       for j := 0 to Size - 1 do
  116.       begin
  117.          a := (i + 1) mod 4;
  118.          b := (j + 1) mod 4;
  119.          if ((a = 1) and (b = 0)) or ((a = 0) and (b = 1)) or ((a = 2) and (b = 3))
  120.          or ((a = 3) and (b = 2)) or (a = b) then
  121.          else
  122.             Matrix[i, j] := TempMatrix[i, j];
  123.       end;
  124.    for i := 0 to Size - 1 do
  125.       for j := 0 to Size - 1 do
  126.          SGMatrix.Cells[j, i] := IntToStr(Matrix[i, j]);
  127.    SaveButton.Enabled := True;
  128. end;
  129.  
  130. procedure TForm1.ESizeChange(Sender: TObject);
  131. begin
  132.    SGMatrix.Visible := False;
  133.    SaveButton.Enabled := False;
  134. end;
  135.  
  136. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  137. begin
  138.    CanClose := MessageDlg('Вы уверены, что хотите выйти из программы?' +
  139.       #10#13 + 'Все несохраненные данные будут утеряны.',
  140.       mtConfirmation, [mbYes, mbNo], 0) = mrYes;
  141. end;
  142.  
  143. procedure TForm1.AboutButtonClick(Sender: TObject);
  144. var
  145.    Task: String;
  146. begin
  147.    Task := 'Данная программа генерирует магический квадрат' + #10#13 + '(Размер кратен 4)' + #10#13;
  148.    Task := Task + 'Автор - Пестунов Илья, гр. 051007';
  149.    MessageDlg(Task, mtInformation, [mbOK], 0);
  150. end;
  151.  
  152. procedure TForm1.ReadButtonClick(Sender: TObject);
  153. var
  154.    MyFile: TextFile;
  155.    i, Value, j: Integer;
  156. begin
  157.    ESize.Text := '';
  158.    SGMatrix.Visible := False;
  159.    Start.Enabled := True;
  160.    with SGMatrix do
  161.       for i := 0 to Size do
  162.          Cols[i].Clear;
  163.    if OpenDialog1.Execute then
  164.    begin
  165.       AssignFile(MyFile, OpenDialog1.FileName);
  166.       Reset(MyFile);
  167.       Read(MyFile, Size);
  168.       ESize.Text := IntToStr(Size);
  169.       SGMatrix.ColCount := Size;
  170.       if Size = 2 then
  171.       begin
  172.          SGMatrix.Width := (SGMatrix.DefaultColWidth + 6) * (Size);
  173.          SGMatrix.RowCount := Size;
  174.          SGMatrix.DefaultRowHeight := 20;
  175.          SGMatrix.Height := (SGMatrix.DefaultRowHeight + 6) * Size;
  176.       end
  177.       else
  178.       begin
  179.          SGMatrix.DefaultColWidth := 50;
  180.          SGMatrix.Width := (SGMatrix.DefaultColWidth + 2) * (Size);
  181.          SGMatrix.RowCount := Size;
  182.          SGMatrix.DefaultRowHeight := 20;
  183.          SGMatrix.Height := (SGMatrix.DefaultRowHeight + 2) * Size;
  184.       end;
  185.       CloseFile(MyFile);
  186.       SGMatrix.Visible := True;
  187.    end;
  188. end;
  189.  
  190. procedure TForm1.SaveButtonClick(Sender: TObject);
  191. var
  192.    MyFile: TextFile;
  193.    i, j: Integer;
  194. begin
  195.    if SaveDialog1.Execute then
  196.    begin
  197.       AssignFile(MyFile, SaveDialog1.FileName);
  198.       Rewrite(MyFile);
  199.       Writeln(MyFile, 'Размер магического квадрата: ', Size);
  200.       Writeln(MyFile, 'Магический квадрат: ');
  201.       for i := 0 to SGMatrix.RowCount do
  202.       begin
  203.          for j := 0 to SGMatrix.ColCount do
  204.          begin
  205.             Write(MyFile, SGMatrix.Cells[j, i]:4, ' ');
  206.          end;
  207.          Writeln(MyFile);
  208.       end;
  209.       CloseFile(MyFile);
  210.       MessageDlg('Результат успешно сохранён', mtCustom, [mbOK], 0);
  211.    end;
  212. end;
  213.  
  214. procedure TForm1.OpenDialog1CanClose(Sender: TObject; var CanClose: Boolean);
  215. var
  216.    IsValid: Boolean;
  217.    N, i, Value, Err, j: Integer;
  218.    MyFile: TextFile;
  219.    Check: String;
  220. const
  221.    Digit: set of Char = ['1'..'9', '0', ' ', '-'];
  222. begin
  223.    IsValid := True;
  224.    N := Length(OpenDialog1.FileName);
  225.    if (OpenDialog1.FileName[N] = 't') and (OpenDialog1.FileName[N - 1] = 'x') and (OpenDialog1.FileName[N - 2] = 't') then
  226.    begin
  227.       AssignFile(MyFile, OpenDialog1.FileName);
  228.       Reset(MyFile);
  229.       Read(MyFile, Check);
  230.       CloseFile(MyFile);
  231.       if Length(Check) = 0 then
  232.       begin
  233.          MessageDlg('Файл пуст', mtWarning, [mbOK], 0);
  234.          IsValid := False;
  235.       end
  236.       else
  237.       begin
  238.          AssignFile(MyFile, OpenDialog1.FileName);
  239.          Reset(MyFile);
  240.          try
  241.             Readln(MyFile, Size);
  242.          except
  243.             IsValid := False;
  244.             MessageDlg('Размера магического квадрата должен быть натуральным числом до 32, кратным 4', mtWarning, [mbOK], 0);
  245.          end;
  246.          if ((IsValid) and (Size < MIN_SIZE)) or ((IsValid) and (Size > MAX_SIZE)) or (Size mod 4 <> 0) then
  247.          begin
  248.             IsValid := False;
  249.             MessageDlg('Размера магического квадрата должен быть натуральным числом до 32, кратным 4', mtError, [mbOK], 0);
  250.          end;
  251.       end;
  252.       CloseFile(MyFile);
  253.    end
  254.    else
  255.    begin
  256.       MessageDlg('Файл должен иметь расширение .txt', mtError, [mbOK], 0);
  257.       IsValid := False;
  258.    end;
  259.    if not(IsValid) then
  260.       CanClose := False
  261.    else
  262.    begin
  263.       ESize.Text := IntToStr(Size);
  264.       Form1.Start.Click;
  265.    end;
  266. end;
  267.  
  268. procedure TForm1.SaveDialog1CanClose(Sender: TObject; var CanClose: Boolean);
  269. var
  270.    N: Integer;
  271. begin
  272.    N := Length(SaveDialog1.FileName);
  273.    if (SaveDialog1.FileName[N] = 't') and (SaveDialog1.FileName[N - 1] = 'x') and (SaveDialog1.FileName[N - 2] = 't') then
  274.       CanClose := True
  275.    else
  276.    begin
  277.       CanClose := False;
  278.       MessageDlg('Файл должен иметь расширение .txt', mtError, [mbOK], 0);
  279.    end;
  280. end;
  281.  
  282. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement