Advertisement
THOMAS_SHELBY_18

6.2 DELPHI

Mar 22nd, 2024
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 10.88 KB | Source Code | 0 0
  1. unit MainUnit;
  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, Clipbrd;
  8.  
  9. type
  10.   TMainForm = class(TForm)
  11.     ConditionLabel: TLabel;
  12.     MainMenu: TMainMenu;
  13.     FileMenuItem: TMenuItem;
  14.     OpenMenuItem: TMenuItem;
  15.     SaveMenuItem: TMenuItem;
  16.     ManualMenuItem: TMenuItem;
  17.     AboutDeveloperMenuItem: TMenuItem;
  18.     OpenDialog: TOpenDialog;
  19.     SaveDialog: TSaveDialog;
  20.     CopyPastePopupMenu: TPopupMenu;
  21.     CopyButton: TMenuItem;
  22.     PasteButton: TMenuItem;
  23.     CutButton: TMenuItem;
  24.     BuildButton: TButton;
  25.     ValueEdit: TEdit;
  26.     StringGrid: TStringGrid;
  27.     ResetButton: TButton;
  28.     procedure OpenMenuItemClick(Sender: TObject);
  29.     procedure SaveMenuItemClick(Sender: TObject);
  30.     procedure ManualMenuItemClick(Sender: TObject);
  31.     procedure AboutDeveloperMenuItemClick(Sender: TObject);
  32.     procedure CopyPastePopupMenuPopup(Sender: TObject);
  33.     procedure PasteButtonClick(Sender: TObject);
  34.     procedure CutButtonClick(Sender: TObject);
  35.     procedure CopyButtonClick(Sender: TObject);
  36.     procedure ValueEditChange(Sender: TObject);
  37.     procedure ResetButtonClick(Sender: TObject);
  38.     procedure ValueEditKeyPress(Sender: TObject; var Key: Char);
  39.     procedure ValueEditKeyDown(Sender: TObject; var Key: Word;
  40.       Shift: TShiftState);
  41.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  42.     procedure BuildButtonClick(Sender: TObject);
  43.   private
  44.     { Private declarations }
  45.   public
  46.     { Public declarations }
  47.   end;
  48.  
  49. var
  50.   MainForm: TMainForm;
  51.  
  52. implementation
  53.  
  54. type
  55.   TMagicSquare = array of array of Integer;
  56.  
  57. const
  58.     kMINUS = #45;
  59.     kBACKSPACE = #8;
  60.     kINSERT = 45;
  61.     MAX = 19;
  62.     Min = 3;
  63.  
  64. var
  65.     MagicSquare: TMagicSquare;
  66.  
  67. {$R *.dfm}
  68.  
  69. procedure TMainForm.AboutDeveloperMenuItemClick(Sender: TObject);
  70. begin
  71.     MessageBox(Handle, 'Разработчик: Наривончик Александр Михайлович, гр. 351004', 'О разработчике', MB_OK Or MB_ICONINFORMATION);
  72. end;
  73.  
  74. procedure ClearStringGrid (Grid: TStringGrid);
  75. var
  76.     I, J: Integer;
  77. begin
  78.     with Grid do
  79.     begin
  80.         for I := ColCount-1 downto 0 do
  81.             for J := RowCount-1 DownTo 0 do
  82.                 Cells[J, I] := '';
  83.         RowCount := 10;
  84.         ColCount := 10;
  85.     end;
  86. end;
  87.  
  88. procedure BuildMagicSquare(var MagicSquare: TMagicSquare);
  89. var
  90.     I, J, N, K, M, Counter, Delta: Integer;
  91.     TempMatrix: Array Of Array Of Integer;
  92. begin
  93.     N := Length(MagicSquare);
  94.     SetLength(TempMatrix, 2*N-1, 2*N-1);
  95.  
  96.     I := Length(TempMatrix) div 2;
  97.     J := 0;
  98.  
  99.     for Counter := 1 to Sqr(N) do
  100.     begin
  101.         TempMatrix[I, J] := Counter;
  102.  
  103.         if(Counter mod N = 0) then
  104.         begin
  105.             J := 0 + Counter div N;
  106.             I := Length(TempMatrix) div 2 + Counter div N;
  107.         end
  108.         else
  109.         begin
  110.             Dec(I);
  111.             Inc(J);
  112.         end;
  113.     end;
  114.  
  115.     Delta := N div 2;
  116.     for K := Delta downto 1 do
  117.     begin
  118.         M := K;
  119.         J :=  N div 2 - (Delta - K)-1;
  120.         I := High(TempMatrix) div 2 - K + 1;
  121.  
  122.         while M > 0 do
  123.         begin
  124.             TempMatrix[I, High(TempMatrix)- Delta - (Delta-K)] := TempMatrix[I, J];
  125.             TempMatrix[I, Delta + Delta-K] := TempMatrix[I, High(TempMatrix) - Delta + (Delta-K)+1];
  126.  
  127.             TempMatrix[High(TempMatrix)- Delta - (Delta-K), I] := TempMatrix[J, I];
  128.             TempMatrix[Delta + Delta-K, I] := TempMatrix[High(TempMatrix)- Delta + (Delta-K)+1, I];
  129.  
  130.             Inc(I, 2);
  131.             Dec(M);
  132.         end;
  133.     end;
  134.  
  135.     Delta := N div 2;
  136.     for I := 0 to High(MagicSquare) do
  137.         for J := 0 to High(MagicSquare) do
  138.             MagicSquare[I, J] := TempMatrix[I + Delta, J + Delta];
  139. end;
  140.  
  141. procedure OutputMagicSquare(MagicSquare: TMagicSquare);
  142. var
  143.     I, J: Integer;
  144. begin
  145.     with MainForm.StringGrid do
  146.     begin
  147.         RowCount := Length(MagicSquare);
  148.         ColCount := Length(MagicSquare);
  149.  
  150.         for I := 0 to High(MagicSquare) do
  151.         begin
  152.             for J := 0 to High(MagicSquare) do
  153.                Cells[J, I] := IntToStr(MagicSquare[I, J]);
  154.         end;
  155.     end;
  156. end;
  157.  
  158. procedure TMainForm.BuildButtonClick(Sender: TObject);
  159. var
  160.     N: Integer;
  161. begin
  162.     ClearStringGrid(StringGrid);
  163.     N := StrToInt(ValueEdit.Text);
  164.     SetLength(MagicSquare, N, N);
  165.     BuildMagicSquare(MagicSquare);
  166.     OutputMagicSquare(MagicSquare);
  167.     SaveMenuItem.Enabled := True;
  168. end;
  169.  
  170. procedure TMainForm.CopyButtonClick(Sender: TObject);
  171. begin
  172.     TEdit(ActiveControl).CopyToClipboard;
  173. end;
  174.  
  175. procedure TMainForm.CopyPastePopupMenuPopup(Sender: TObject);
  176. var
  177.     IValue: Integer;
  178.     Buffer: String;
  179. begin
  180.     Buffer := Clipboard.AsText;
  181.     PasteButton.Enabled := True;
  182.     PasteButton.Enabled := TryStrToInt(Buffer, IValue)
  183. end;
  184.  
  185. procedure TMainForm.CutButtonClick(Sender: TObject);
  186. begin
  187.     TEdit(ActiveControl).CutToClipboard;
  188. end;
  189.  
  190. procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  191. begin
  192.     CanClose := MessageBox(Handle, 'Вы действительно хотите выйти?', 'Вы уверены?', MB_YESNO Or MB_ICONQUESTION) = IDYES;
  193. end;
  194.  
  195. procedure TMainForm.ManualMenuItemClick(Sender: TObject);
  196. begin
  197.     MessageBox(Handle, '1. Введите в поле порядок магического квадрата (нечётное число от 3 до 19' + #13#10 + '2. Нажмите кнопку "Построить".' + #13#10 + '3. Получите результат!'+ #13#10 + '4. В случае ввода из файла убедитесь, что файл содержит нечётное число от 3 до 19.', 'Инструкция', MB_OK Or MB_ICONINFORMATION);
  198. end;
  199.  
  200. procedure ResetProgram();
  201. begin
  202.     with MainForm do
  203.     begin
  204.         ClearStringGrid(StringGrid);
  205.         ValueEdit.Text := '';
  206.         SaveMenuItem.Enabled := False;
  207.     end;
  208. end;
  209.  
  210. function ReadNumFromFile(var FileIn: TextFile; var Num: Integer): Boolean;
  211. var
  212.     IsFileCorrect: Boolean;
  213.     NumStr: String;
  214.     Code: Integer;
  215. begin
  216.     try
  217.         Reset(FileIn);
  218.     except
  219.         IsFileCorrect := False;
  220.         MessageBox(MainForm.Handle, 'Не удалось открыть файл!', 'Ошибка', MB_OK Or MB_ICONERROR);
  221.     end;
  222.     if IsFileCorrect then
  223.     begin
  224.         Readln(FileIn, NumStr);
  225.         Val(NumStr, Num, Code);
  226.  
  227.         if Code = 0 then
  228.             IsFileCorrect := True
  229.         else
  230.         begin
  231.             MessageBox(MainForm.Handle, 'Неверный формат данных в файле!', 'Ошибка', MB_OK or MB_ICONERROR);
  232.             IsFileCorrect := False;
  233.         end;
  234.  
  235.         if (IsFileCorrect) and ((Num < MIN) or (Num > MAX)) then
  236.         begin
  237.             MessageBox(MainForm.Handle, 'Неверный формат данных в файле!', 'Ошибка', MB_OK or MB_ICONERROR);
  238.             IsFileCorrect := False;
  239.         end;
  240.  
  241.         if (IsFileCorrect) and not Odd(Num) then
  242.         begin
  243.             MessageBox(MainForm.Handle, 'Число в файле должно быть нечётным!', 'Ошибка', MB_OK or MB_ICONERROR);
  244.             IsFileCorrect := False;
  245.         end;
  246.         CloseFile(FileIn);
  247.     end;
  248.     ReadNumFromFile := IsFileCorrect;
  249. End;
  250.  
  251. procedure TMainForm.OpenMenuItemClick(Sender: TObject);
  252. var
  253.     FileIn: TextFile;
  254.     Path: String;
  255.     TempNum: Integer;
  256. begin
  257.     if OpenDialog.Execute Then
  258.     begin
  259.         Path := OpenDialog.FileName;
  260.         AssignFile(FileIn, Path);
  261.  
  262.         if ReadNumFromFile(FileIn, TempNum) then
  263.         begin
  264.             ResetProgram;
  265.             ValueEdit.Text := IntToStr(TempNum);
  266.             SetLength(MagicSquare, TempNum, TempNum);
  267.             BuildMagicSquare(MagicSquare);
  268.             OutputMagicSquare(MagicSquare);
  269.             SaveMenuItem.Enabled := True;
  270.         end;
  271.     end;
  272. end;
  273.  
  274. procedure TMainForm.PasteButtonClick(Sender: TObject);
  275. begin
  276.      TEdit(ActiveControl).PasteFromClipboard;
  277. end;
  278.  
  279. procedure TMainForm.ResetButtonClick(Sender: TObject);
  280. begin
  281.     ResetProgram;
  282. end;
  283.  
  284. procedure OutputSquareToTextFile(MagicSquare: TMagicSquare; var FileOut: TextFile);
  285. var
  286.     I, J: Integer;
  287. begin
  288.     for I := 0 to High(MagicSquare) do
  289.     begin
  290.         for J := 0 to High(MagicSquare) do
  291.            Write(FileOut, IntToStr(MagicSquare[I, J]) + ' ');
  292.         Writeln(FileOut);
  293.     end;
  294. end;
  295. Procedure SaveAnswer ();
  296. var
  297.     IsFileCorrect: Boolean;
  298.     FileOut: TextFile;
  299.     Path: String;
  300. Begin
  301.     With MainForm Do
  302.     Begin
  303.         IsFileCorrect := True;
  304.         Path := SaveDialog.FileName;
  305.         AssignFile(FileOut, Path);
  306.         Try
  307.             Rewrite(FileOut);
  308.         Except
  309.             IsFileCorrect := False;
  310.             MessageBox(Handle, 'Не удалось сохранить ответ в файл!', 'Ошибка', MB_OK Or MB_ICONERROR);
  311.         End;
  312.  
  313.         If IsFileCorrect then
  314.         Begin
  315.             OutputSquareToTextFile(MagicSquare, FileOut);
  316.             CloseFile(FileOut);
  317.             MessageBox(Handle, 'Сохранено успешно!', 'Сохранение', MB_OK Or MB_ICONINFORMATION);
  318.         End;
  319.     End;
  320. End;
  321.  
  322. procedure TMainForm.SaveMenuItemClick(Sender: TObject);
  323. begin
  324.     If SaveDialog.Execute Then
  325.         SaveAnswer();
  326. end;
  327.  
  328. procedure EditAddButtonEnabled(ActiveEdit: TEdit);
  329. begin
  330.     with ActiveEdit do
  331.     begin
  332.         MainForm.BuildButton.Enabled := not ((Text = '') or (Text = '1')) and Odd(StrToInt(Text));
  333.     end;
  334. end;
  335.  
  336. procedure TMainForm.ValueEditChange(Sender: TObject);
  337. var
  338.     CursPos: Byte;
  339.     TempStr: String;
  340.     IValue: Integer;
  341. begin
  342.     with TEdit(Sender) do
  343.     begin
  344.         if Text = '0' then
  345.             Text := ''
  346.         else
  347.         if (Length(Text) > 0) and (Text <> '1') then
  348.         begin
  349.             CursPos := SelStart;
  350.             TempStr := Text;
  351.  
  352.             if not TryStrToInt(TempStr, IValue) then
  353.             begin
  354.                 Delete (TempStr, SelStart, 1);
  355.                 Text := TempStr;
  356.                 SelStart := CursPos-1;
  357.             end
  358.             else
  359.             begin
  360.                 Text := IntToStr(IValue);
  361.                 SelStart := CursPos;
  362.             end;
  363.  
  364.             if (IValue > Max) or (IValue < MIN) then
  365.             begin
  366.                 Delete (TempStr, SelStart, 1);
  367.                 Text := TempStr;
  368.                 SelStart := CursPos-1;
  369.             end
  370.         end;
  371.     end;
  372.  
  373.     EditAddButtonEnabled(TEdit(Sender));
  374. end;
  375.  
  376. procedure TMainForm.ValueEditKeyDown(Sender: TObject; var Key: Word;
  377.   Shift: TShiftState);
  378.  begin
  379.     if Key = kINSERT then
  380.         Key := 0;
  381. end;
  382.  
  383. procedure TMainForm.ValueEditKeyPress(Sender: TObject; var Key: Char);
  384. begin
  385.     if Not (Key in ['0'..'9', kBACKSPACE, kMINUS]) then
  386.         Key := #0;
  387. end;
  388. end.
  389.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement