Advertisement
Guest User

OnlyForYou

a guest
Dec 14th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 14.44 KB | None | 0 0
  1. unit F_1_1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Math, Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Menus, Vcl.Grids;
  8.  
  9. type
  10.   TMyForm = class(TForm)
  11.     btShowResult: TButton;
  12.     MainMenu: TMainMenu;
  13.     FileMenu: TMenuItem;
  14.     OpenMenu: TMenuItem;
  15.     SaveMenu: TMenuItem;
  16.     N1: TMenuItem;
  17.     AboutMenu: TMenuItem;
  18.     OpenFile: TOpenDialog;
  19.     SaveFile: TSaveDialog;
  20.     PopupMenu: TPopupMenu;
  21.     TaskMenu: TMenuItem;
  22.     edArrSize: TEdit;
  23.     lbArrSize: TLabel;
  24.     sgArrayA: TStringGrid;
  25.     lbArrayA: TLabel;
  26.     sgArrayB: TStringGrid;
  27.     lbArrayB: TLabel;
  28.     sgNewArrayA: TStringGrid;
  29.     lbNewArrayA: TLabel;
  30.     sgNewArrayB: TStringGrid;
  31.     lbNewArrayB: TLabel;
  32.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  33.     procedure OpenMenuClick(Sender: TObject);
  34.     procedure SaveMenuClick(Sender: TObject);
  35.     procedure AboutMenuClick(Sender: TObject);
  36.     procedure FormCreate(Sender: TObject);
  37.     procedure TaskMenuClick(Sender: TObject);
  38.     function IsValidInput(Acontrol: TEdit; Key: Char): Boolean;
  39.     procedure OnEdit(Sender: TObject);
  40.     procedure edArrSizeKeyPress(Sender: TObject; var Key: Char);
  41.     procedure edArrSizeChange(Sender: TObject);
  42.     procedure FillHeadlines(Table: TStringGrid);
  43.     procedure SetSize(Table: TStringGrid);
  44.     procedure sgArrayAKeyPress(Sender: TObject; var Key: Char);
  45.     function IsValidInputSG(Acontrol: TStringGrid; Key: Char): Boolean;
  46.     function NotEmptyTable(Table: TStringGrid): Boolean;
  47.     procedure sgArrayBKeyPress(Sender: TObject; var Key: Char);
  48.     procedure sgArrayAKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
  49.     procedure sgArrayBKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
  50.     procedure btShowResultClick(Sender: TObject);
  51.   private
  52.     { Private declarations }
  53.   public
  54.     { Public declarations }
  55.     var
  56.       IsFilledArrA, IsFilledArrB: Boolean;
  57.   end;
  58.  
  59. var
  60.   MyForm: TMyForm;
  61.  
  62. implementation
  63.  
  64. {$R *.dfm}
  65.  
  66. procedure TMyForm.FormCreate(Sender: TObject);
  67. begin
  68.    IsFilledArrA := False;
  69.    IsFilledArrB := False;
  70.    btShowResult.Caption := 'Показать' + #10#13 + 'результат';
  71.    sgArrayA.Cells[0, 0] := '[1]';
  72.    sgArrayB.Cells[0, 0] := '[1]';
  73. end;
  74.  
  75. procedure TMyForm.SetSize(Table: TStringGrid);
  76. var
  77.    Column: Integer;
  78. begin
  79.    Column := Table.ColCount;
  80.    if Column < 5 then
  81.    begin
  82.       Table.Width := 65 * Column + 3;
  83.       Table.ScrollBars := ssNone;
  84.       Table.Height := 52;
  85.    end
  86.    else
  87.    begin
  88.       Table.Width := 264;
  89.       Table.ScrollBars := ssHorizontal;
  90.       Table.Height := 70;
  91.    end;
  92. end;
  93.  
  94. procedure TMyForm.FillHeadlines(Table: TStringGrid);
  95. var
  96.    i, Len: Integer;
  97. begin
  98.    Len := Table.ColCount - 1;
  99.    with Table do
  100.       for i := 0 to Len do
  101.          Cells[i, 0] := Format('[%d]', [i + 1]);
  102. end;
  103.  
  104. function TMyForm.NotEmptyTable(Table: TStringGrid): Boolean;
  105. var
  106.    i, Len: Integer;
  107.    IsValidInput: Boolean;
  108. begin
  109.    Len := Table.ColCount - 1;
  110.    IsValidInput := True;
  111.    with Table do
  112.       for i := 0 to Len do
  113.          if Cells[i, 1] = '' then
  114.             IsValidInput := False;
  115.    NotEmptyTable := IsValidInput;
  116. end;
  117.  
  118. function CheckSize(Text: string; Symbol: Char): Boolean;
  119. const
  120.    Digits = ['0'..'9'];
  121.    MinSize = 1;
  122.    MaxSize = 30;
  123. var
  124.    IsValidInput: Boolean;
  125.    InputText: Integer;
  126. begin
  127.    IsValidInput := True;
  128.    if Symbol in Digits then
  129.    begin
  130.       InputText := StrToInt(Text + Symbol);
  131.       if (InputText > MaxSize) or (InputText <= MinSize)  then
  132.             IsValidInput := False;
  133.    end
  134.    else
  135.       IsValidInput := True;
  136.    CheckSize := IsValidInput;
  137. end;
  138.  
  139. function CheckSGSize(Text: string; Symbol: Char): Boolean;
  140. const
  141.    Digits = ['0'..'9'];
  142.    MinSize = -100000;
  143.    MaxSize = 100000;
  144. var
  145.    IsValidInput: Boolean;
  146.    InputText, Len: Integer;
  147. begin
  148.    IsValidInput := True;
  149.    if Symbol in Digits then
  150.    begin
  151.       Len := Length(Text + Symbol);
  152.       InputText := StrToInt(Text + Symbol);
  153.       if (InputText > MaxSize) or (InputText < MinSize) or (Len > 6) then
  154.             IsValidInput := False;
  155.    end;
  156.    CheckSGSize := IsValidInput;
  157. end;
  158.  
  159. function TMyForm.IsValidInput(Acontrol: TEdit; Key: Char): Boolean;
  160. const
  161.    ValidInput = ['0'..'9', #8];
  162. var
  163.    IsValidKey: Boolean;
  164. begin
  165.    IsValidKey := False;
  166.    if Key in ValidInput then
  167.       if not CheckSize(Acontrol.Text, Key) then
  168.          begin
  169.             IsValidKey := False;
  170.             MessageBox(Handle, PChar('Допустимы значения от 2 до 30'),
  171.                   PChar('Ошибка!'), MB_ICONINFORMATION + MB_OK)
  172.          end
  173.       else
  174.          IsValidKey := True;
  175.    IsValidInput := IsValidKey;
  176. end;
  177.  
  178. function TMyForm.IsValidInputSG(Acontrol: TStringGrid; Key: Char): Boolean;
  179. const
  180.    ValidInput = ['0'..'9', #8];
  181. var
  182.    IsValidKey: Boolean;
  183. begin
  184.    IsValidKey := False;
  185.    if Key = '-' then
  186.    begin
  187.       if Length(Acontrol.Cells[Acontrol.Col, Acontrol.Row]) = 0 then
  188.          IsValidKey := True
  189.    end
  190.    else
  191.       if Key in ValidInput then
  192.          if not CheckSGSize(Acontrol.Cells[Acontrol.Col, Acontrol.Row], Key) then
  193.             begin
  194.                IsValidKey := False;
  195.                MessageBox(Handle, PChar('Допустимы значения от -100000 до 100000'),
  196.                      PChar('Ошибка!'), MB_ICONINFORMATION + MB_OK)
  197.             end
  198.          else
  199.             IsValidKey := True;
  200.    IsValidInputSG := IsValidKey;
  201. end;
  202.  
  203. procedure TMyForm.OnEdit(Sender: TObject);
  204. begin
  205.    btShowResult.Enabled := False;
  206.    SaveMenu.Enabled := False;
  207.    lbNewArrayA.Visible := False;
  208.    sgNewArrayA.Visible := False;
  209.    lbNewArrayB.Visible := False;
  210.    sgNewArrayB.Visible := False;
  211. end;
  212.  
  213. procedure TMyForm.btShowResultClick(Sender: TObject);
  214. var
  215.    i, Len: Integer;
  216.    A, B: array of Integer;
  217. begin
  218.    Len := sgArrayA.ColCount;
  219.    SetLength(A, Len);
  220.    SetLength(B, Len);
  221.    sgNewArrayA.ColCount := Len;
  222.    sgNewArrayB.ColCount := Len;
  223.    Dec(Len);
  224.    with sgArrayA do
  225.       for i := 0 to Len do
  226.          A[i] := StrToInt(Cells[i, 1]);
  227.    with sgArrayB do
  228.       for i := 0 to Len do
  229.          B[i] := StrToInt(Cells[i, 1]);
  230.    SetSize(sgNewArrayA);
  231.    SetSize(sgNewArrayB);
  232.    FillHeadlines(sgNewArrayA);
  233.    FillHeadlines(sgNewArrayB);
  234.    lbNewArrayA.Visible := True;
  235.    sgNewArrayA.Visible := True;
  236.    lbNewArrayB.Visible := True;
  237.    sgNewArrayB.Visible := True;
  238.    with sgNewArrayA do
  239.       for i := 0 to Len do
  240.          Cells[i, 1] := IntToStr(A[i] + B[i]);
  241.    with sgNewArrayB do
  242.       for i := 0 to Len do
  243.          Cells[i, 1] := IntToStr(A[i] - B[i]);
  244.    SaveMenu.Enabled := True;
  245. end;
  246.  
  247. procedure TMyForm.edArrSizeChange(Sender: TObject);
  248. begin
  249.    OnEdit(Sender);
  250.    if edArrSize.Text <> '' then
  251.    begin
  252.       sgArrayA.ColCount := StrToInt(edArrSize.Text);
  253.       sgArrayB.ColCount := StrToInt(edArrSize.Text);
  254.       sgArrayA.Enabled := True;
  255.       sgArrayB.Enabled := True;
  256.       SetSize(sgArrayA);
  257.       SetSize(sgArrayB);
  258.       FillHeadlines(sgArrayA);
  259.       FillHeadlines(sgArrayB);
  260.    end
  261.    else
  262.    begin
  263.       sgArrayA.Enabled := False;
  264.       sgArrayB.Enabled := False;
  265.       sgArrayA.Rows[1].Clear;
  266.       sgArrayB.Rows[1].Clear;
  267.    end;
  268. end;
  269.  
  270. procedure TMyForm.edArrSizeKeyPress(Sender: TObject; var Key: Char);
  271. begin
  272.    if not IsValidInput(edArrSize, Key) then
  273.       Key := #0;
  274. end;
  275.  
  276. procedure TMyForm.sgArrayAKeyPress(Sender: TObject; var Key: Char);
  277. begin
  278.    if not IsValidInputSG(sgArrayA, Key) then
  279.       Key := #0;
  280. end;
  281.  
  282.  
  283. procedure TMyForm.sgArrayAKeyUp(Sender: TObject; var Key: Word;
  284.   Shift: TShiftState);
  285. begin
  286.    OnEdit(Sender);
  287.    IsFilledArrA := NotEmptyTable(sgArrayA);
  288.    if IsFilledArrA and IsFilledArrB then
  289.       btShowResult.Enabled := True;
  290. end;
  291.  
  292. procedure TMyForm.sgArrayBKeyUp(Sender: TObject; var Key: Word;
  293.   Shift: TShiftState);
  294. begin
  295.    OnEdit(Sender);
  296.    IsFilledArrB := NotEmptyTable(sgArrayB);
  297.    if IsFilledArrA and IsFilledArrB then
  298.       btShowResult.Enabled := True;
  299. end;
  300.  
  301. procedure TMyForm.sgArrayBKeyPress(Sender: TObject; var Key: Char);
  302. begin
  303.    if not IsValidInputSG(sgArrayA, Key) then
  304.       Key := #0;
  305. end;
  306.  
  307. procedure TMyForm.FormClose(Sender: TObject; var Action: TCloseAction);
  308. begin
  309.    if MessageBox(Handle, PChar('Вы уверены?'), PChar('Выйти?'), MB_ICONSTOP +
  310.        MB_YESNO + MB_DEFBUTTON2) = mrNo then
  311.       Action := TCloseAction.caNone;
  312. end;
  313.  
  314. procedure TMyForm.AboutMenuClick(Sender: TObject);
  315. begin
  316.    MessageBox(Handle, PChar('Автор этой программы Трапашко Илья (851001)'),
  317.       PChar('Автор'), MB_ICONINFORMATION + MB_OK);
  318. end;
  319.  
  320. procedure TMyForm.TaskMenuClick(Sender: TObject);
  321. begin
  322.    MessageBox(Handle, PChar('Данная программа получает новые массивы, элементы которых вычисляются по правилу: a(i)=a(i)+b(i), b(i)=a(i)-b(i)'),
  323.       PChar('О программе'), MB_ICONINFORMATION + MB_OK);
  324. end;
  325.  
  326. function SafeRead(var MyFile: TextFile; var Number: Integer): Boolean;
  327. const
  328.    MaxSize = 100000;
  329.    MinSize = -100000;
  330. begin
  331.    try
  332.       Read(MyFile, Number);
  333.       if (Number <= MaxSize) and (Number >= MinSize) then
  334.          SafeRead := True
  335.       else
  336.          SafeRead := False;
  337.    except
  338.       SafeRead := False;
  339.    end;
  340. end;
  341.  
  342. function CountNumbers(Line: string): Integer;
  343. var
  344.    k, Counter: Integer;
  345. begin
  346.    Line := Line + ' ';
  347.    Counter := 0;
  348.    for k := 2 to length(Line) do
  349.       if (Line[k] = ' ') and (Line[k - 1] <> ' ') then
  350.             Inc(Counter);
  351.    if Counter > 1 then
  352.       CountNumbers := Counter
  353.    else
  354.       CountNumbers := -1;
  355. end;
  356.  
  357. procedure TMyForm.OpenMenuClick(Sender: TObject);
  358. var
  359.    InputFile: TextFile;
  360.    Temp, FirstLen, Secondlen, i: Integer;
  361.    IsValidInput: Boolean;
  362.    Line: string;
  363. begin
  364.    if OpenFile.Execute then
  365.    begin
  366.       OnEdit(Sender);
  367.       try
  368.          AssignFile(InputFile, OpenFile.FileName);
  369.          Reset(InputFile);
  370.          if SeekEof(inputFile) then
  371.             MessageDlg('Похоже, файл пустой. Повторите попытку', mtError, [mbOk], 0)
  372.          else
  373.          begin
  374.             IsValidInput := True;
  375.             Readln(InputFile, Line);
  376.             FirstLen := CountNumbers(Line);
  377.             Read(InputFile, Line);
  378.             SecondLen := CountNumbers(Line);
  379.             if FirstLen = SecondLen then
  380.             begin
  381.                Reset(InputFile);
  382.                while not Eoln(InputFile) and IsValidInput do
  383.                   IsValidInput := SafeRead(InputFile, Temp);
  384.                if IsValidInput then
  385.                begin
  386.                   Readln(InputFile);
  387.                   while not Eoln(InputFile) and IsValidInput do
  388.                      IsValidInput := SafeRead(InputFile, Temp);
  389.                   if IsValidInput then
  390.                   begin
  391.                      sgArrayA.Enabled := True;
  392.                      sgArrayB.Enabled := True;
  393.                      Reset(InputFile);
  394.                      edArrSize.Text := IntToStr(FirstLen);
  395.                      Dec(FirstLen);
  396.                      with sgArrayA do
  397.                         for i := 0 to FirstLen do
  398.                         begin
  399.                            Read(InputFile, Temp);
  400.                            Cells[i, 1] := IntToStr(Temp);
  401.                         end;
  402.                      Readln(InputFile);
  403.                      with sgArrayB do
  404.                         for i := 0 to FirstLen do
  405.                         begin
  406.                            Read(InputFile, Temp);
  407.                            Cells[i, 1] := IntToStr(Temp);
  408.                         end;
  409.                      btShowResult.Enabled := True;
  410.                      SaveMenu.Enabled := True;
  411.                   end
  412.                   else
  413.                      MessageDlg('Ошибка ввода данных. Для числителя и знаменателя'
  414.                         + #10#13 + 'допустимы значения, в промежутке от -100000 до 10000', mtError, [mbOk], 0);
  415.                end
  416.                else
  417.                   MessageDlg('Ошибка ввода данных. Для числителя и знаменателя'
  418.                         + #10#13 + 'допустимы значения, в промежутке от -100000 до 10000', mtError, [mbOk], 0);
  419.             end
  420.             else
  421.                MessageDlg('Ошибка ввода данных. Массивы должны иметь одинаковое количество элементов', mtError, [mbOk], 0);
  422.             CloseFile(InputFile);
  423.          end;
  424.       except
  425.          MessageDlg('Ошибка ввода данных. Повторите попытку', mtError, [mbOk], 0);
  426.          CloseFile(InputFile);
  427.       end;
  428.    end;
  429. end;
  430.  
  431. function CheckFileName(MyFile: string): string;
  432. var
  433.    IsValidInput: boolean;
  434. begin
  435.    IsValidInput := False;
  436.    if AnsiCompareStr(Copy(MyFile, Length(MyFile) - 3, 4), '.txt') <> 0 then
  437.       MyFile := MyFile + '.txt';
  438.    CheckFileName := MyFile;
  439. end;
  440.  
  441. procedure TMyForm.SaveMenuClick(Sender: TObject);
  442. var
  443.    OutputFile: TextFile;
  444.    i, Len: Integer;
  445.    MyFile: string;
  446. begin
  447.    if SaveFile.Execute then
  448.    begin
  449.       MyFile := SaveFile.FileName;
  450.       MyFile := CheckFileName(MyFile);
  451.       if FileExists(MyFile) then
  452.       begin
  453.          if MessageDlg('Перезаписать файл?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  454.          begin
  455.             AssignFile(outputFile, MyFile);
  456.             Rewrite(OutputFile);
  457.             Len := sgNewArrayA.ColCount;
  458.             with sgNewArrayA do
  459.                for i := 0 to Len do
  460.                   Write(OutputFile, Cells[i, 1], ' ');
  461.             Writeln(OutputFile);
  462.             with sgNewArrayB do
  463.             for i := 0 to Len do
  464.                Write(OutputFile, Cells[i, 1], ' ');
  465.             CloseFile(outputFile);
  466.          end
  467.          else
  468.             SaveMenuClick(Sender);
  469.       end
  470.       else
  471.       begin
  472.          AssignFile(outputFile, MyFile);
  473.          Rewrite(OutputFile);
  474.          Len := sgNewArrayA.ColCount;
  475.          with sgNewArrayA do
  476.             for i := 0 to Len do
  477.                Write(OutputFile, Cells[i, 1], ' ');
  478.          Writeln(OutputFile);
  479.          with sgNewArrayB do
  480.          for i := 0 to Len do
  481.             Write(OutputFile, Cells[i, 1], ' ');
  482.          CloseFile(outputFile);
  483.       end;
  484.    end;
  485. end;
  486.  
  487. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement