Advertisement
anticlown

Lab.6.2.Full(Delphi)

Apr 14th, 2023
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 13.97 KB | None | 0 0
  1. Unit MagicSquareMain;
  2.  
  3. Interface
  4.  
  5. Uses
  6.     Winapi.Windows,
  7.     Winapi.Messages,
  8.     System.SysUtils,
  9.     System.Variants,
  10.     System.Classes,
  11.     Vcl.Graphics,
  12.     Vcl.Controls,
  13.     Vcl.Forms,
  14.     Vcl.Dialogs,
  15.     Vcl.StdCtrls,
  16.     Vcl.ExtCtrls,
  17.     Vcl.Buttons,
  18.     System.ImageList,
  19.     Vcl.ImgList,
  20.     Vcl.VirtualImageList,
  21.     Vcl.Menus,
  22.     Vcl.Grids,
  23.     Vcl.ComCtrls,
  24.     ClipBrd;
  25.  
  26. Type
  27.  
  28.     TMatrix = Array Of Array Of Integer;
  29.  
  30.     TMagicSquareControl = Class
  31.         Size, MagicSum: Integer;
  32.         MagicSquare: TMatrix;
  33.         Procedure FindMagicSquare();
  34.     End;
  35.  
  36.     TLabeledEdit = Class(Vcl.ExtCtrls.TLabeledEdit)
  37.     Protected
  38.         Procedure WMPaste(Var Msg: TMessage); Message WM_PASTE;
  39.     End;
  40.  
  41.     TfrmMain = Class(TForm)
  42.         BalloonHint: TBalloonHint;
  43.         VilImages_48: TVirtualImageList;
  44.         SvdSaveToFileDialog: TSaveDialog;
  45.         MmMainMenu: TMainMenu;
  46.         MiFileMenu: TMenuItem;
  47.         MiOpenFromFile: TMenuItem;
  48.         MiSaveToFile: TMenuItem;
  49.         MiHelp: TMenuItem;
  50.         MiInfoAboutDeveloper: TMenuItem;
  51.         OpdOpenFromFileDialog: TOpenDialog;
  52.         PgcPages: TPageControl;
  53.         TbstWelcome: TTabSheet;
  54.         TbstMagicSquare: TTabSheet;
  55.         PButtons: TPanel;
  56.         SdbtOpenFromFile: TSpeedButton;
  57.         SdbtStart: TSpeedButton;
  58.         SdbtSaveToFile: TSpeedButton;
  59.         SdbtHelp: TSpeedButton;
  60.         PBack: TPanel;
  61.         LbWelcome: TLabel;
  62.         LbTaskInfo: TLabel;
  63.         LbIncorrectPatricipants: TLabel;
  64.         LbFinalResult: TLabel;
  65.         LbeSize: TLabeledEdit;
  66.         BtConfirmSize: TButton;
  67.         BtFind: TButton;
  68.         StrgrMagicSquare: TStringGrid;
  69.         LbResult: TLabel;
  70.         BtPreviousPage: TButton;
  71.         LbAnswer: TLabel;
  72.         LbMagicSum: TLabel;
  73.         Procedure FormCreate(Sender: TObject);
  74.         Procedure MiOpenFromFileClick(Sender: TObject);
  75.         Procedure BtConfirmSizeClick(Sender: TObject);
  76.         Procedure SdbtOpenFromFileClick(Sender: TObject);
  77.         Procedure LbeSizeChange(Sender: TObject);
  78.         Procedure LbeSizeKeyPress(Sender: TObject; Var Key: Char);
  79.         Procedure FormCloseQuery(Sender: TObject; Var CanClose: Boolean);
  80.         Procedure MiHelpClick(Sender: TObject);
  81.         Procedure MiInfoAboutDeveloperClick(Sender: TObject);
  82.         Procedure SdbtHelpClick(Sender: TObject);
  83.         Procedure BtPreviousPageClick(Sender: TObject);
  84.         Procedure BtFindClick(Sender: TObject);
  85.         Procedure SdbtStartClick(Sender: TObject);
  86.         Procedure MiSaveToFileClick(Sender: TObject);
  87.     End;
  88.  
  89. Var
  90.     FrmMain: TfrmMain;
  91.     SquareControl: TMagicSquareControl;
  92.  
  93. Implementation
  94.  
  95. {$R *.dfm}
  96.  
  97. Uses MagicSquareData;
  98.  
  99. Function IsFileOfNumberCorrect(Path: String): Boolean; Stdcall; External 'anticlown.dll';
  100.  
  101. Procedure GetNumberFromFile(Path: String; Var Size: Integer; Var IsCorrect: Boolean); Stdcall;
  102.     External 'anticlown.dll';
  103.  
  104. Procedure TMagicSquareControl.FindMagicSquare();
  105. Var
  106.     I, J: Integer;
  107. Begin
  108.     MagicSum := (Size * (Size * Size + 1)) Div 2;
  109.  
  110.     For I := Low(MagicSquare) To High(MagicSquare) Do
  111.         For J := Low(MagicSquare) To High(MagicSquare) Do
  112.             MagicSquare[I, J] := Size * I + J + 1;
  113.  
  114.     For I := Low(MagicSquare) To Size Div 4 - 1 Do
  115.         For J := Low(MagicSquare) To Size Div 4 - 1 Do
  116.             MagicSquare[I, J] := Size * Size + 1 - MagicSquare[I, J];
  117.  
  118.     For I := Low(MagicSquare) To Size Div 4 - 1 Do
  119.         For J := 3 * Size Div 4 To High(MagicSquare) Do
  120.             MagicSquare[I, J] := Size * Size + 1 - MagicSquare[I, J];
  121.  
  122.     For I := 3 * Size Div 4 To High(MagicSquare) Do
  123.         For J := Low(MagicSquare) To Size Div 4 - 1 Do
  124.             MagicSquare[I, J] := Size * Size + 1 - MagicSquare[I, J];
  125.  
  126.     For I := 3 * Size Div 4 To High(MagicSquare) Do
  127.         For J := 3 * Size Div 4 To High(MagicSquare) Do
  128.             MagicSquare[I, J] := Size * Size + 1 - MagicSquare[I, J];
  129.  
  130.     For I := Size Div 4 To 3 * Size Div 4 - 1 Do
  131.         For J := Size Div 4 To 3 * Size Div 4 - 1 Do
  132.             MagicSquare[I, J] := Size * Size + 1 - MagicSquare[I, J];
  133. End;
  134.  
  135. Procedure TfrmMain.FormCreate(Sender: TObject);
  136. Begin
  137.     PgcPages.ActivePageIndex := 0;
  138.     SquareControl := TMagicSquareControl.Create;
  139. End;
  140.  
  141. Procedure TfrmMain.FormCloseQuery(Sender: TObject; Var CanClose: Boolean);
  142. Begin
  143.     If Application.MessageBox(PChar('Вы уверены, что хотите выйти?'), PChar('Выход'),
  144.         MB_ICONQUESTION + MB_YESNO + MB_DEFBUTTON1 + MB_TASKMODAL) = IDYES Then
  145.         CanClose := True
  146.     Else
  147.         CanClose := False;
  148. End;
  149.  
  150. Procedure TfrmMain.MiHelpClick(Sender: TObject);
  151. Const
  152.     FIRST_MESSAGE = '- Вводимыми значениями могут являться только целые числа!' + #13#10;
  153.     SECOND_MESSAGE = '- Диапазон ввода размера квадрата: 4...32' + #13#10;
  154.     THIRD_MESSAGE = '- Для ввода из файла используйте вкладку ''Файл'' - ''Открыть''.' + #13#10;
  155.     FOURTH_MESSAGE =
  156.         '- Для сохранения в файл используйте вкладку ''Файл'' - ''Сохранить''.' + #13#10;
  157.     FIFTH_MESSAGE =
  158.         '- Для удобного использования программы представлен набор кнопок на левой панели.';
  159. Begin
  160.     Application.MessageBox(FIRST_MESSAGE + SECOND_MESSAGE + THIRD_MESSAGE + FOURTH_MESSAGE +
  161.         FIFTH_MESSAGE, 'Справка');
  162. End;
  163.  
  164. Procedure TfrmMain.MiInfoAboutDeveloperClick(Sender: TObject);
  165. Const
  166.     FIRST_MESSAGE = 'Ф.И.О.: Карась А.С. a.k.a Clownfish' + #13#10;
  167.     SECOND_MESSAGE = 'Группа: 251004' + #13#10;
  168.     THIRD_MESSAGE = 'Контакты: предварительная запись вживую по адресу' + #13#10;
  169.     FOURTH_MESSAGE = 'г.Гродно, ул.Мостовая, д.31';
  170. Begin
  171.     Application.MessageBox(FIRST_MESSAGE + SECOND_MESSAGE + THIRD_MESSAGE + FOURTH_MESSAGE,
  172.         'О разработчике');
  173. End;
  174.  
  175. Procedure TfrmMain.MiOpenFromFileClick(Sender: TObject);
  176. Var
  177.     IsCorrect: Boolean;
  178.     Size: Integer;
  179. Begin
  180.     If OpdOpenFromFileDialog.Execute() Then
  181.         If IsFileOfNumberCorrect(OpdOpenFromFileDialog.FileName) Then
  182.         Begin
  183.             GetNumberFromFile(OpdOpenFromFileDialog.FileName, Size, IsCorrect);
  184.  
  185.             If (IsCorrect) Then
  186.             Begin
  187.                 LbeSize.Text := IntToStr(Size);
  188.                 BtConfirmSizeClick(Sender);
  189.             End;
  190.         End
  191.         Else
  192.             Application.MessageBox('Данные в файле некорректны, попробуйте ещё раз.', 'Ошибка!',
  193.                 MB_ICONERROR);
  194. End;
  195.  
  196. Procedure TfrmMain.SdbtHelpClick(Sender: TObject);
  197. Begin
  198.     MiHelpClick(Sender);
  199. End;
  200.  
  201. Procedure TfrmMain.SdbtOpenFromFileClick(Sender: TObject);
  202. Begin
  203.     MiOpenFromFileClick(Sender);
  204. End;
  205.  
  206. Procedure TLabeledEdit.WMPaste(Var Msg: TMessage);
  207. Const
  208.     MIN_VALUE = 4;
  209.     MAX_VALUE = 32;
  210. Begin
  211.     If Clipboard.HasFormat(CF_TEXT) Then
  212.     Begin
  213.         Try
  214.             If (StrToInt(Clipboard.AsText) < MIN_VALUE) Or
  215.                 (StrToInt(Clipboard.AsText) > MAX_VALUE) Then
  216.             Begin
  217.                 Application.MessageBox(Pchar('В буфере обмена содержится неподходящее значение!'),
  218.                     'Ошибка', MB_ICONWARNING);
  219.                 Exit;
  220.             End;
  221.         Except
  222.             Application.MessageBox(Pchar('При чтении из буфера произошла ошибка!'), 'Ошибка',
  223.                 MB_ICONWARNING);
  224.             Exit;
  225.         End;
  226.     End
  227.     Else
  228.     Begin
  229.         Application.MessageBox(Pchar('В буфере обмена содержатся некорректные данные!'), 'Ошибка',
  230.             MB_ICONWARNING);
  231.         Exit;
  232.     End;
  233.     Inherited;
  234. End;
  235.  
  236. Procedure TfrmMain.LbeSizeChange(Sender: TObject);
  237. Const
  238.     MIN_VALUE = 4;
  239.     MAX_VALUE = 32;
  240. Var
  241.     Temp: Integer;
  242. Begin
  243.     BtFind.Enabled := False;
  244.     If (LbeSize.Text <> '') Then
  245.     Begin
  246.         Temp := StrToInt(LbeSize.Text);
  247.         If ((Temp < MIN_VALUE) Or (Temp > MAX_VALUE) Or (Temp And (Temp - 1) <> 0)) Then
  248.         Begin
  249.             LbIncorrectPatricipants.Visible := True;
  250.             BtConfirmSize.Enabled := False;
  251.         End
  252.         Else
  253.         Begin
  254.             LbIncorrectPatricipants.Visible := False;
  255.             BtConfirmSize.Enabled := True;
  256.         End;
  257.     End
  258.     Else
  259.     Begin
  260.         BtConfirmSize.Enabled := False;
  261.         SdbtStart.Enabled := False;
  262.     End;
  263. End;
  264.  
  265. Procedure TfrmMain.LbeSizeKeyPress(Sender: TObject; Var Key: Char);
  266. Begin
  267.     If (Not(Key In ['0' .. '9', #08, #127])) Then
  268.         Key := #0;
  269.     If (LbeSize.Text = '0') And (Key = '0') Then
  270.         Key := #0;
  271. End;
  272.  
  273. Procedure TfrmMain.BtConfirmSizeClick(Sender: TObject);
  274. Begin
  275.     SquareControl.Size := StrToInt(LbeSize.Text);
  276.     SetLength(SquareControl.MagicSquare, SquareControl.Size, SquareControl.Size);
  277.  
  278.     Case SquareControl.Size Of
  279.         4:
  280.             With StrgrMagicSquare Do
  281.             Begin
  282.                 Left := 280;
  283.                 DefaultColWidth := 40;
  284.                 DefaultRowHeight := 40;
  285.                 StrgrMagicSquare.Width := StrgrMagicSquare.DefaultRowHeight * SquareControl.Size +
  286.                     (SquareControl.Size + 3);
  287.                 StrgrMagicSquare.Height := StrgrMagicSquare.Width;
  288.             End;
  289.         8:
  290.             With StrgrMagicSquare Do
  291.             Begin
  292.                 Left := 230;
  293.                 DefaultColWidth := 30;
  294.                 DefaultRowHeight := 30;
  295.                 StrgrMagicSquare.Width := StrgrMagicSquare.DefaultColWidth * SquareControl.Size +
  296.                     (SquareControl.Size + 3);
  297.                 StrgrMagicSquare.Height := StrgrMagicSquare.Width;
  298.             End;
  299.         Else
  300.             With StrgrMagicSquare Do
  301.             Begin
  302.                 Left := 30;
  303.                 DefaultColWidth := 40;
  304.                 DefaultRowHeight := 30;
  305.                 StrgrMagicSquare.Width := StrgrMagicSquare.DefaultColWidth * SquareControl.Size +
  306.                     (SquareControl.Size + 3);
  307.                 StrgrMagicSquare.Height := 400;
  308.             End;
  309.     End;
  310.  
  311.     StrgrMagicSquare.RowCount := SquareControl.Size;
  312.     StrgrMagicSquare.ColCount := SquareControl.Size;
  313.  
  314.     BtFind.Enabled := True;
  315.     BtFind.Visible := True;
  316.     SdbtStart.Enabled := True;
  317. End;
  318.  
  319. Procedure TfrmMain.SdbtStartClick(Sender: TObject);
  320. Begin
  321.     BtFindClick(Sender);
  322. End;
  323.  
  324. Procedure TfrmMain.BtFindClick(Sender: TObject);
  325. Var
  326.     I, J: Integer;
  327. Begin
  328.     PgcPages.ActivePageIndex := 1;
  329.     TbstMagicSquare.Enabled := True;
  330.     TbstWelcome.Enabled := False;
  331.     BtPreviousPage.Enabled := True;
  332.     BtFind.Default := False;
  333.     BtPreviousPage.Default := True;
  334.     MiSaveToFile.Enabled := True;
  335.     SdbtSaveToFile.Enabled := True;
  336.  
  337.     Case SquareControl.Size Of
  338.         4:
  339.             PgcPages.Height := 400;
  340.         8:
  341.             PgcPages.Height := 500;
  342.         Else
  343.             PgcPages.Height := 600;
  344.     End;
  345.  
  346.     SquareControl.FindMagicSquare;
  347.     LbMagicSum.Caption := IntToStr(SquareControl.MagicSum);
  348.     For I := Low(SquareControl.MagicSquare) To High(SquareControl.MagicSquare) Do
  349.         For J := Low(SquareControl.MagicSquare) To High(SquareControl.MagicSquare) Do
  350.             StrgrMagicSquare.Cells[J, I] := IntToStr(SquareControl.MagicSquare[I, J]);
  351.  
  352.     BtPreviousPage.SetFocus;
  353. End;
  354.  
  355. Procedure TfrmMain.MiSaveToFileClick(Sender: TObject);
  356. Var
  357.     OutputFile: TextFile;
  358.     I, J: Integer;
  359. Begin
  360.     If SvdSaveToFileDialog.Execute() And FileExists(SvdSaveToFileDialog.FileName) Then
  361.     Begin
  362.         AssignFile(OutputFile, SvdSaveToFileDialog.FileName);
  363.  
  364.         Try
  365.             Try
  366.                 Rewrite(OutputFile);
  367.  
  368.                 Writeln(OutputFile, 'Входные данные: ');
  369.                 Writeln(OutputFile, 'Размер квадрата - ', SquareControl.Size);
  370.  
  371.                 Write(OutputFile, 'Ответ: ' + #13#10);
  372.                 Writeln(OutputFile, 'Магическая сумма - ', SquareControl.MagicSum);
  373.                 Writeln(OutputFile, 'Магический квадрат:');
  374.                 For I := Low(SquareControl.MagicSquare) To High(SquareControl.MagicSquare) Do
  375.                 Begin
  376.                     For J := Low(SquareControl.MagicSquare) To High(SquareControl.MagicSquare) Do
  377.                         Write(OutputFile, SquareControl.MagicSquare[I, J], ' ');
  378.                     Write(OutputFile, #13#10);
  379.                 End;
  380.  
  381.                 Application.MessageBox('Данные успешно записаны в файл!', 'Сохранение',
  382.                     MB_ICONINFORMATION);
  383.             Finally
  384.                 CloseFile(OutputFile);
  385.             End;
  386.         Except
  387.             Application.MessageBox('Отказано в доступе! Измените параметры файла! ', 'Ошибка!',
  388.                 MB_ICONERROR);
  389.         End;
  390.     End
  391.     Else
  392.         Application.MessageBox('Введено некорректное имя файла или закрыто окно сохранения!',
  393.             'Ошибка!', MB_ICONERROR);
  394. End;
  395.  
  396. Procedure TfrmMain.BtPreviousPageClick(Sender: TObject);
  397. Begin
  398.     PgcPages.ActivePageIndex := 0;
  399.     TbstWelcome.Enabled := True;
  400.     TbstMagicSquare.Enabled := False;
  401.     BtPreviousPage.Enabled := False;
  402.     BtFind.Default := True;
  403.     PgcPages.Height := 372;
  404. End;
  405.  
  406. End.
  407.  
  408. Unit MagicSquareData;
  409.  
  410. Interface
  411.  
  412. Uses
  413.     System.SysUtils,
  414.     System.Classes, Vcl.BaseImageCollection, Vcl.ImageCollection,
  415.   System.ImageList, Vcl.ImgList, Vcl.Controls;
  416.  
  417. Type
  418.     TdtmdPictures = Class(TDataModule)
  419.     imcImages: TImageCollection;
  420.     imlIcons: TImageList;
  421.     End;
  422. Var
  423.     DtmdPictures: TdtmdPictures;
  424.  
  425. Implementation
  426.  
  427. {%CLASSGROUP 'Vcl.Controls.TControl'}
  428. {$R *.dfm}
  429.  
  430. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement