Advertisement
venik2405

lab4_2_delphi_form

Feb 28th, 2021
343
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 9.16 KB | None | 0 0
  1. unit LabForm4_2;
  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,
  8.   Vcl.Samples.Spin, Vcl.Grids, Math;
  9.  
  10. Const
  11.   DEFAULT_GRID_WIDTH = 205;
  12.  
  13. type
  14.     TArr = array of Integer;
  15.   TMainForm = class(TForm)
  16.     SecondArrStringGrid: TStringGrid;
  17.     SizeLabel: TLabel;
  18.     TaskLabel: TLabel;
  19.     ColSpinEdit: TSpinEdit;
  20.     CalculateButton: TButton;
  21.     SaveDialog: TSaveDialog;
  22.     OpenDialog: TOpenDialog;
  23.     MainMenu: TMainMenu;
  24.     FileMenu: TMenuItem;
  25.     OpenFile: TMenuItem;
  26.     SaveInFile: TMenuItem;
  27.     ALabel: TLabel;
  28.     BLabel: TLabel;
  29.     OutputLabel: TLabel;
  30.     FirstArrStringGrid: TStringGrid;
  31.     procedure ColSpinEditChange(Sender: TObject);
  32.     procedure CalculateButtonClick(Sender: TObject);
  33.     procedure FileMenuClick(Sender: TObject);
  34.     function FindValid: Boolean;
  35.     procedure FirstArrStringGridSetEditText(Sender: TObject; ACol,
  36.       ARow: Integer; const Value: string);
  37.     procedure SecondArrStringGridSetEditText(Sender: TObject; ACol,
  38.       ARow: Integer; const Value: string);
  39.     procedure FirstArrStringGridKeyPress(Sender: TObject; var Key: Char);
  40.     procedure SecondArrStringGridKeyPress(Sender: TObject; var Key: Char);
  41.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  42.     procedure OpenFileClick(Sender: TObject);
  43.     procedure SaveInFileClick(Sender: TObject);
  44.   private
  45.     { Private declarations }
  46.   public
  47.     { Public declarations }
  48.   end;
  49.  
  50. var
  51.   MainForm: TMainForm;
  52.  
  53. implementation
  54.  
  55. {$R *.dfm}
  56.  
  57. function TMainForm.FindValid(): Boolean;
  58. var
  59.     ExpressionResult: Double;
  60.     I, J, N: Integer;
  61.     Answer: Boolean;
  62. begin
  63.     Answer := True;
  64.     for I := 0 to StrToInt(ColSpinEdit.Text) - 1 do
  65.         if (FirstArrStringGrid.Cells[I, 0] = '') then
  66.             Answer := False;
  67.     for I := 0 to StrToInt(ColSpinEdit.Text) - 1 do
  68.         if (SecondArrStringGrid.Cells[I, 0] = '') then
  69.             Answer := False;
  70.    FindValid := Answer;
  71. end;
  72.  
  73.  
  74. procedure TMainForm.FirstArrStringGridKeyPress(Sender: TObject; var Key: Char);
  75. begin
  76.     if not(Key in [#48 .. #57, #8, #13]) then
  77.         Key := #0;
  78. end;
  79.  
  80. procedure TMainForm.SecondArrStringGridKeyPress(Sender: TObject; var Key: Char);
  81. begin
  82.     if not(Key in [#48 .. #57, #8, #13]) then
  83.         Key := #0;
  84. end;
  85.  
  86. procedure TMainForm.FirstArrStringGridSetEditText(Sender: TObject; ACol,
  87.   ARow: Integer; const Value: string);
  88. var
  89.     Str: string;
  90.     I: Integer;
  91. begin
  92.     MainForm.Height := 340;
  93.     OutputLabel.Caption := '';
  94.     Try
  95.         if (StrToFloat(Value) > 9) or (StrToFloat(Value) < 0) then
  96.         begin
  97.             Str := Value;
  98.             FirstArrStringGrid.Cells[ACol, ARow] := Copy(Str, 1, (Length(Str) - 1));
  99.             MessageBox(0, 'Каждый разряд должен содержать одну цифру', 'Number value',
  100.               mb_IconHand);
  101.         end;
  102.     Except
  103.     End;
  104.     CalculateButton.Enabled := FindValid;
  105. end;
  106.  
  107. procedure TMainForm.SecondArrStringGridSetEditText(Sender: TObject; ACol,
  108.   ARow: Integer; const Value: string);
  109. var
  110.     Str: string;
  111.     I: Integer;
  112. begin
  113.     MainForm.Height := 340;
  114.     OutputLabel.Caption := '';
  115.     Try
  116.         if (StrToFloat(Value) > 9) or (StrToFloat(Value) < 0) then
  117.         begin
  118.             Str := Value;
  119.             SecondArrStringGrid.Cells[ACol, ARow] := Copy(Str, 1, (Length(Str) - 1));
  120.             MessageBox(0, 'Каждый разряд должен содержать одну цифру', 'Number value',
  121.               mb_IconHand);
  122.         end;
  123.     Except
  124.     End;
  125.     CalculateButton.Enabled := FindValid;
  126. end;
  127.  
  128. Procedure FindSum(FirstNum, SecondNum: TArr; Digit: Integer; var  Sum: Integer);
  129. Var
  130.     PrevDig, NextDig, I, Order: Integer;
  131. Begin
  132.     Order := 1;
  133.     for I := 0 to Digit - 1 do
  134.         Order := Order * 10;
  135.     If Digit < High(FirstNum) + 1 then
  136.     Begin
  137.         PrevDig := ((FirstNum[Digit] + SecondNum[Digit]) Mod 10) * Order;
  138.         NextDig := ((FirstNum[Digit] + SecondNum[Digit]) Div 10) * Order * 10;
  139.         Sum := Sum +  prevDig + nextDig;
  140.         FindSum(FirstNum, SecondNum, Digit + 1, Sum);
  141.     End;
  142. End;
  143.  
  144. procedure TMainForm.CalculateButtonClick(Sender: TObject);
  145. Var
  146.     FirstNumArr, SecondNumArr: TArr;
  147.     Size, I, Digit, Sum: Integer;
  148.     IsCorrect: Boolean;
  149.     J: Integer;
  150. begin
  151.     Digit := 0;
  152.     Sum := 0;
  153.     J := 0;
  154.     IsCorrect := true;
  155.     Size := ColSpinEdit.Value;
  156.     SecondArrStringGrid.ColCount := Size;
  157.     SetLength(FirstNumArr, Size);
  158.     SetLength(SecondNumArr, Size);
  159.     for I := Size - 1 downto 0 do
  160.     Begin
  161.         Try
  162.             FirstNumArr[I] := StrToInt(FirstArrStringGrid.Cells[J,0]);
  163.         Except
  164.             IsCorrect := False
  165.         End;
  166.         Inc(J);
  167.     End;
  168.     J := 0;
  169.     for I := Size - 1 downto 0 do
  170.     Begin
  171.         Try
  172.             SecondNumArr[I] := StrToInt(SecondArrStringGrid.Cells[J,0]);
  173.         Except
  174.             IsCorrect := False
  175.         End;
  176.         Inc(J);
  177.     End;
  178.     if IsCorrect then
  179.     Begin
  180.         FindSum(FirstNumArr, SecondNumArr, Digit, Sum);
  181.         OutputLabel.Caption := 'Сумма чисел: ' + IntToStr(Sum);
  182.         MainForm.Height := 390;
  183.     End
  184.     Else
  185.         ShowMessage('Данные введены некорректны. Введите числа.');
  186. end;
  187.  
  188. procedure TMainForm.ColSpinEditChange(Sender: TObject);
  189. Var
  190.     Size: Integer;
  191. begin
  192.     MainForm.Height := 350;
  193.     OutputLabel.Caption := '';
  194.     Size := ColSpinEdit.Value;
  195.     FirstArrStringGrid.ColCount := Size;
  196.     SecondArrStringGrid.ColCount := Size;
  197.     FirstArrStringGrid.Width := DEFAULT_GRID_WIDTH + (Size - 3) * 65;
  198.     SecondArrStringGrid.Width := DEFAULT_GRID_WIDTH + (Size - 3) * 65;
  199. end;
  200.  
  201. procedure TMainForm.FileMenuClick(Sender: TObject);
  202. begin
  203.     SaveInFile.Enabled := Not(OutputLabel.Caption = '');
  204. end;
  205.  
  206. procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  207. begin
  208.     CanClose := MessageDlg('Вы уверены, что хотите выйти из программы?' +
  209.     #10#13 + 'Все несохранённые данные будут утеряны.',
  210.     mtConfirmation, [mbYes, mbNo], 0) = mrYes;
  211. end;
  212.  
  213. function CheckFile(Path: String): Boolean;
  214. var
  215.     FileToCheck: TextFile;
  216.     N, I, Num: Integer;
  217. begin
  218.     AssignFile(FileToCheck, Path);
  219.     Reset(FileToCheck);
  220.     CheckFile := true;
  221.     try
  222.         Readln(FileToCheck, N);
  223.     except
  224.         CheckFile := false;
  225.     end;
  226.     if ((N < 1) or (N > 8)) then
  227.         CheckFile := False;
  228.     for I := 1 to N do
  229.     Begin
  230.         try
  231.             Readln(FileToCheck, Num);
  232.         except
  233.             CheckFile := false;
  234.         end;
  235.         if (N < 0) Or (N > 9) then
  236.             Checkfile := False;
  237.     End;
  238.     CloseFile(FileToCheck);
  239. end;
  240.  
  241. procedure TMainForm.OpenFileClick(Sender: TObject);
  242. var
  243.     InputFile: TextFile;
  244.     Num, N, I: Integer;
  245.     IsCorrect: Boolean;
  246.     FirstArr, SecondArr: TArr;
  247. begin
  248.     IsCorrect := True;
  249.     if OpenDialog.Execute then
  250.     begin
  251.         if CheckFile(OpenDialog.FileName) then
  252.         begin
  253.             AssignFile(InputFile, OpenDialog.FileName);
  254.             Reset(InputFile);
  255.             Readln(InputFile, N);
  256.             ColSpinEdit.Value := N;
  257.             SetLength(FirstArr, N);
  258.             SetLength(SecondArr, N);
  259.             for I := 0 to N - 1 do
  260.                 Readln(InputFile, FirstArr[I]);
  261.             for I := 0 to N - 1 do
  262.                 Readln(InputFile, SecondArr[I]);
  263.             CloseFile(InputFile);
  264.             for I := 0 to N - 1 do
  265.                 FirstArrStringGrid.Cells[I,0] := IntToStr(FirstArr[I]);
  266.             for I := 0 to N - 1 do
  267.                 SecondArrStringGrid.Cells[I,0] := IntToStr(SecondArr[I]);
  268.             ShowMessage('Данные из файла успешно загружены');
  269.         end
  270.         else
  271.         Begin
  272.             ShowMessage('Данные в файле некорректны. Каждый разряд массива должен содержать по одной цифре.');
  273.             IsCorrect := False
  274.         End;
  275.         if IsCorrect = True then
  276.         Begin
  277.             CalculateButton.Enabled;
  278.             CalculateButton.Click;
  279.         End;
  280.     end;
  281. end;
  282.  
  283. procedure TMainForm.SaveInFileClick(Sender: TObject);
  284. var
  285.     OutputFile: TextFile;
  286.     I, J: Integer;
  287. begin
  288.     if SaveDialog.Execute then
  289.     begin
  290.         AssignFile(OutputFile, SaveDialog.FileName);
  291.         Rewrite(OutputFile);
  292.         Writeln(OutputFile, 'Разрядность числа: ' + IntToStr(ColSpinEdit.Value));
  293.         Writeln(OutputFile, 'Первое число:');
  294.         for I := 0 to ColSpinEdit.Value do
  295.             Write(OutputFile, FirstArrStringGrid.Cells[I, 0] + ' ');
  296.         Writeln(OutputFile);
  297.         Writeln(OutputFile, 'Второе число:');
  298.         for I := 0 to ColSpinEdit.Value do
  299.             Write(OutputFile, SecondArrStringGrid.Cells[I, 0] + ' ');
  300.         Writeln(OutputFile);
  301.         Write(OutputFile, OutputLabel.Caption);
  302.         CloseFile(OutputFile);
  303.         ShowMessage('Успешно сохранено');
  304.     end;
  305. end;
  306.  
  307. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement