Advertisement
Guest User

Untitled

a guest
Dec 14th, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 11.62 KB | None | 0 0
  1. unit Lab2_1;
  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.StdCtrls, Vcl.Menus, Vcl.Grids;
  8.  
  9. type
  10.   TLabWork = class(TForm)
  11.     btFindMaxArea: TButton;
  12.     edCountTriangles: TEdit;
  13.     ArrLength: TLabel;
  14.     MainMenu: TMainMenu;
  15.     Save: TMenuItem;
  16.     Author: TMenuItem;
  17.     OpenFile: TOpenDialog;
  18.     Help: TMenuItem;
  19.     SaveFile: TSaveDialog;
  20.     PopupMenu: TPopupMenu;
  21.     sgTriangles: TStringGrid;
  22.     FileMenu: TMenuItem;
  23.     SaveIntoFile: TMenuItem;
  24.     InputfromFile: TMenuItem;
  25.     edResult: TEdit;
  26.     lbMaxArea: TLabel;
  27.     procedure edCountTrianglesKeyPress(Sender: TObject; var Key: Char);
  28.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  29.     procedure AuthorClick(Sender: TObject);
  30.     procedure InputfromFileClick(Sender: TObject);
  31.     procedure HelpClick(Sender: TObject);
  32.     procedure SaveIntoFileClick(Sender: TObject);
  33.     procedure edCountTrianglesKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  34.     procedure OnChange(Sender: TObject);
  35.     procedure sgTrianglesKeyPress(Sender: TObject; var Key: Char);
  36.     procedure btFindMaxAreaClick(Sender: TObject);
  37.     procedure FillHeadlines(Table: TStringGrid);
  38.     procedure sgTrianglesKeyDown(Sender: TObject; var Key: Word;
  39.       Shift: TShiftState);
  40.     procedure CleanAllTriangles(Table: TStringGrid; edCountTriangles: TEdit);
  41.   private
  42.     { Private declarations }
  43.   public
  44.     { Public declarations }
  45.   end;
  46.  
  47. var
  48.   LabWork: TLabWork;
  49.  
  50. implementation
  51.  
  52. {$R *.dfm}
  53.  
  54.  
  55. procedure TLabWork.FillHeadlines(Table: TStringGrid);
  56. var
  57.    i, Len: Integer;
  58. begin
  59.    Len := Table.RowCount - 1;
  60.    with Table do
  61.       for i := 0 to Len do
  62.          Cells[0, i] := Format('[%d]', [i + 1]);
  63. end;
  64.  
  65.  
  66.  
  67. function IsInValidInput(UserString: string; Key: char): Boolean;
  68. const
  69.    Digits = ['0'..'9', #8];
  70. var
  71.    i, Iteration: Integer;
  72.    IsInvalidSymbol: boolean;
  73. begin
  74.    IsInvalidSymbol := False;
  75.    if Key = '0' then
  76.    begin
  77.       Iteration := length(UserString);
  78.       if Iteration <> 0 then
  79.       begin
  80.          IsInvalidSymbol := True;
  81.          for i := 1 to Iteration do
  82.             if UserString[i] <> '0' then
  83.                IsInvalidSymbol := False;
  84.       end
  85.    end
  86.    else
  87.       if (Key = ',') and (length(UserString) <> 0) then
  88.       begin
  89.             Iteration := length(UserString);
  90.             for i := 1 to Iteration do
  91.                if UserString[i] = Key then
  92.                   IsInvalidSymbol := True
  93.       end
  94.       else
  95.          IsInvalidSymbol := (not (Key in Digits));
  96.    Result := IsInvalidSymbol;
  97. end;
  98.  
  99.  
  100.  
  101.  
  102. procedure TLabWork.AuthorClick(Sender: TObject);
  103. begin
  104.    MessageBox(Handle, PChar('Author of this program is Vladislav Mironuk (851001)'), PChar('Author'), MB_ICONINFORMATION + MB_OK);
  105. end;
  106.  
  107. procedure TLabWork.btFindMaxAreaClick(Sender: TObject);
  108. const
  109.    MaxSideIndex = 2;
  110. var
  111.    SideIndex, TriangleIndex,  CountOfTheTriangle: Integer;
  112.    CurrentArea, p, MaxArea: Real;
  113.    FSide, SSide, TSide: Real;
  114. begin
  115.    MaxArea := 0;
  116.    CountOfTheTriangle := StrToInt(edCountTriangles.Text) - 1;
  117.    with sgTriangles do
  118.    begin
  119.       for TriangleIndex := 0 to CountOfTheTriangle do
  120.          for SideIndex := 1 to MaxSideIndex do
  121.             if (Cells[SideIndex, TriangleIndex] = '') then
  122.             begin
  123.                btFindMaxArea.Enabled := False;
  124.                if MessageBox(Handle, PChar('The triangle number ' + IntToStr(TriangleIndex + 1) +
  125.                               ' contains incorrect ' + IntToStr(SideIndex) +
  126.                               ' side ' + #13 + 'Do you want to open Help?'),
  127.                             PChar('Error'), MB_ICONSTOP + MB_YESNO) = mrYES then
  128.                   HelpClick(Sender);
  129.                Exit;
  130.             end;
  131.       for TriangleIndex := 0 to CountOfTheTriangle do
  132.       begin
  133.          FSide := StrToFloat(Cells[1, TriangleIndex]);
  134.          SSide := StrToFloat(Cells[2, TriangleIndex]);
  135.          TSide := StrToFloat(Cells[3, TriangleIndex]);
  136.          if (FSide >= SSide + TSide) or
  137.             (SSide >= TSide + FSide) or
  138.             (TSide >= FSide + SSide) then
  139.          begin
  140.             MessageBox(Handle, PChar('The triangle number ' + IntToStr(TriangleIndex + 1) + ' does not exist ' + #13 +
  141.                        'Condition of existense triangle is '+ #13 + ' MaxSide < OtherSide + OtherSide'),
  142.                         PChar('Error'), MB_ICONSTOP + MB_OK);
  143.             Exit
  144.          end
  145.          else
  146.          begin
  147.             try
  148.                p := (FSide + SSide + TSide) / 2;
  149.                CurrentArea := Sqrt(p*((p-FSide)*(p-SSide)*(p-TSide)));
  150.             except
  151.                MessageBox(Handle, PChar('The triangle number '+ IntToStr(TriangleIndex + 1) +
  152.                         ' contains too large sides'), PChar('Error'), MB_ICONSTOP + MB_YESNO);
  153.                Exit
  154.             end;
  155.             if CurrentArea > MaxArea then
  156.                MaxArea := CurrentArea;
  157.          end;
  158.       end;
  159.    end;
  160.    edResult.Visible := True;
  161.    lbMaxArea.Visible := True;
  162.    SaveIntoFile.Enabled := True;
  163.    edResult.Text := Format('%.3f', [MaxArea]);
  164. end;
  165.  
  166.  
  167. procedure TLabWork.edCountTrianglesKeyDown(Sender: TObject; var Key: Word;
  168.                                               Shift: TShiftState);
  169. begin
  170.    if Key = VK_Insert then
  171.       Key := 0;
  172. end;
  173.  
  174.  
  175. procedure TLabWork.edCountTrianglesKeyPress(Sender: TObject; var Key: Char);
  176. const
  177.    Digits = ['0'..'9', #8];
  178. var
  179.    IsInvalidSymbol: Boolean;
  180. begin
  181.    if (length(edCountTriangles.Text) > 1) and (Key <> #8) and (Key <> #13) then
  182.    begin
  183.       MessageBox(Handle, PChar('Max count of the triangles is 99'),
  184.                PChar('Error'), MB_ICONSTOP + MB_OK);
  185.        IsInvalidSymbol := True;
  186.    end
  187.    else
  188.       if (Key = '0') and (length(edCountTriangles.Text) = 0) then
  189.          IsInvalidSymbol := True
  190.       else
  191.          IsInvalidSymbol := not (Key in Digits);
  192.    if IsInvalidSymbol then
  193.       Key := #0;
  194. end;
  195.  
  196.  
  197. procedure TLabWork.FormClose(Sender: TObject; var Action: TCloseAction);
  198. begin
  199.    if MessageBox(Handle, PChar('Are you sure?'), PChar('Exit?'), MB_ICONSTOP + MB_YESNO + MB_DEFBUTTON2) = mrNo then
  200.       Action := TCloseAction.caNone;
  201. end;
  202.  
  203.  
  204. procedure TLabWork.OnChange(Sender: TObject);
  205. const
  206.    OneColHeigth = 27;
  207.    MaxHeigth = 80;
  208.    WidthWithScrolls = 190;
  209.    WidthWithOutScrolls = 169;
  210.    MaxRowsInOnePage = 3;
  211. begin
  212.    edResult.Visible := False;
  213.    lbMaxArea.Visible := False;
  214.    edResult.Clear;
  215.    SaveIntoFile.Enabled := False;
  216.    if (edCountTriangles.Text = '') or (edCountTriangles.Text = '1') then
  217.    begin
  218.       btFindMaxArea.Enabled := False;
  219.       sgTriangles.Visible := False
  220.    end
  221.    else
  222.    begin
  223.       sgTriangles.RowCount := StrToInt(edCountTriangles.Text);
  224.       if sgTriangles.RowCount > MaxRowsInOnePage then
  225.       begin
  226.          sgTriangles.Height := MaxHeigth;
  227.          sgTriangles.ScrollBars := ssVertical;
  228.          sgTriangles.Width := WidthWithScrolls
  229.       end
  230.       else
  231.       begin
  232.          sgTriangles.Height := ((StrToInt(edCountTriangles.Text)) * OneColHeigth);
  233.          sgTriangles.ScrollBars := ssNone;
  234.          sgTriangles.Width := WidthWithOutScrolls
  235.       end;
  236.       FillHeadlines(sgTriangles);
  237.       sgTriangles.Visible := True;
  238.    end;
  239. end;
  240.  
  241. procedure TLabWork.HelpClick(Sender: TObject);
  242. const
  243.    RangeOfTheArray = '1 < Length < 100';
  244. begin
  245.     MessageBox(Handle, PChar('This program find max the area of the specified triangles' + #13 +
  246.                'Sides of the triangles must be in range   Side < 99999 '),
  247.                PChar('Help'), MB_ICONINFORMATION + MB_OK)
  248. end;
  249.  
  250. procedure TLabWork.CleanAllTriangles(Table: TStringGrid; edCountTriangles: TEdit);
  251. const
  252.    MaxSideIndex = 3;
  253. var
  254.    TriangleIndex, CountOfTheTriangle, SideIndex: Integer;
  255. begin
  256.    CountOfTheTriangle := StrToInt(edCountTriangles.Text);
  257.    edCountTriangles.Clear;
  258.    with sgTriangles do
  259.       for TriangleIndex := 0 to CountOfTheTriangle do
  260.          for SideIndex := 1 to MaxSideIndex do
  261.             Cells[SideIndex, TriangleIndex] := ''
  262.  
  263. end;
  264.  
  265. procedure TLabWork.InputfromFileClick(Sender: TObject);
  266. const
  267.    MaxSideIndex = 3;
  268. var
  269.    Input: TextFile;
  270.    Element: Real;
  271.    TriangleIndex, SideIndex, CountOfTheTriangles: Integer;
  272. begin
  273.    if OpenFile.Execute() then
  274.    begin
  275.       edResult.Clear;
  276.       if edCountTriangles.Text <> '' then
  277.          CleanAllTriangles(sgTriangles, edCountTriangles);
  278.       try
  279.          AssignFile(Input, OpenFile.FileName);
  280.          Reset(Input);
  281.       except
  282.          MessageBox(Handle, PChar('Error open the file'), PChar('Error!'), MB_ICONERROR + MB_OK);
  283.          Exit
  284.       end;
  285.       if EOF(Input) then
  286.          MessageBox(Handle, PChar('Your file is empty'), PChar('Error!'), MB_ICONERROR + MB_OK)
  287.       else
  288.       begin
  289.          CountOfTheTriangles := 0;
  290.          while not EOF(Input) do
  291.          begin
  292.             inc(CountOfTheTriangles);
  293.             Readln(Input);
  294.          end;
  295.          if (CountOfTheTriangles > 99) and (CountOfTheTriangles < 2) then
  296.          begin
  297.             if MessageBox(Handle, PChar('length of the array must be must be integers and belong to the set' + #13 +
  298.                            'Do you want to read help?'), PChar('Error!'), MB_ICONERROR + MB_YESNO) = mrYES then
  299.                HelpClick(Sender)
  300.          end
  301.          else
  302.          begin
  303.             edCountTriangles.Text := IntToStr(CountOfTheTriangles);
  304.             Reset(Input);
  305.             for TriangleIndex := 0 to CountOfTheTriangles do
  306.             begin
  307.                for SideIndex := 1 to MaxSideIndex do
  308.                   try
  309.                      Read(Input, Element);
  310.                      sgTriangles.Cells[SideIndex, TriangleIndex] := FloatToStr(Element);
  311.                   except
  312.                      if MessageBox(Handle, PChar('The file does not contain suitable numbers' + #13 +
  313.                              'Do you want to read help?'), PChar('Error!'), MB_ICONERROR + MB_YESNO) = mrYES then
  314.                         HelpClick(Sender);
  315.                      CloseFile(Input);
  316.                      CleanAllTriangles(sgTriangles, edCountTriangles);
  317.                      Exit;
  318.                   end;
  319.                Readln(Input);
  320.             end;
  321.             btFindMaxArea.Enabled := True;
  322.          end;
  323.       end;
  324.       CloseFile(Input);
  325.    end;
  326. end;
  327.  
  328.  
  329.  
  330. procedure TLabWork.SaveIntoFileClick(Sender: TObject);
  331. var
  332.    Output: TextFile;
  333. begin
  334.    if SaveFile.Execute then
  335.    begin
  336.       AssignFile(Output, SaveFile.FileName);
  337.       try
  338.          Rewrite(Output);
  339.          Write(Output, 'Max area is ', edResult.Text)
  340.       except
  341.          MessageBox(Handle, PChar('Critical error writing to file'), PChar('Error!'), MB_ICONERROR + MB_OK)
  342.       end;
  343.       CloseFile(Output);
  344.    end;
  345. end;
  346.  
  347.  
  348. procedure TLabWork.sgTrianglesKeyDown(Sender: TObject; var Key: Word;
  349.   Shift: TShiftState);
  350. begin
  351.     if Key = VK_Insert then
  352.       Key := 0;
  353. end;
  354.  
  355. procedure TLabWork.sgTrianglesKeyPress(Sender: TObject; var Key: Char);
  356. const
  357.    Row = 0;
  358.    MaxElementLength = 5;
  359. begin
  360.    SaveIntoFile.Enabled := False;
  361.    edResult.Visible := False;
  362.    lbMaxArea.Visible := False;
  363.    edResult.Clear;
  364.    with sgTriangles do
  365.    begin
  366.       if (Length(Cells[Col, Row]) = MaxElementLength) and (Key <> #8) and (Key <> #9) then
  367.       begin
  368.          Key := #0;
  369.          MessageBox(Handle, PChar('Max length of the side is 5'),
  370.                   PChar('Error'), MB_ICONSTOP + MB_OK)
  371.       end
  372.       else
  373.          if IsInValidInput(sgTriangles.Cells[sgTriangles.Col, Row], Key) then
  374.             Key := #0;
  375.       btFindMaxArea.Enabled := True;
  376.    end;
  377. end;
  378. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement