Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit Lab2_1;
- interface
- uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Menus, Vcl.Grids;
- type
- TLabWork = class(TForm)
- btFindMaxArea: TButton;
- edCountTriangles: TEdit;
- ArrLength: TLabel;
- MainMenu: TMainMenu;
- Save: TMenuItem;
- Author: TMenuItem;
- OpenFile: TOpenDialog;
- Help: TMenuItem;
- SaveFile: TSaveDialog;
- PopupMenu: TPopupMenu;
- sgTriangles: TStringGrid;
- FileMenu: TMenuItem;
- SaveIntoFile: TMenuItem;
- InputfromFile: TMenuItem;
- edResult: TEdit;
- lbMaxArea: TLabel;
- procedure edCountTrianglesKeyPress(Sender: TObject; var Key: Char);
- procedure FormClose(Sender: TObject; var Action: TCloseAction);
- procedure AuthorClick(Sender: TObject);
- procedure InputfromFileClick(Sender: TObject);
- procedure HelpClick(Sender: TObject);
- procedure SaveIntoFileClick(Sender: TObject);
- procedure edCountTrianglesKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
- procedure OnChange(Sender: TObject);
- procedure sgTrianglesKeyPress(Sender: TObject; var Key: Char);
- procedure btFindMaxAreaClick(Sender: TObject);
- procedure FillHeadlines(Table: TStringGrid);
- procedure sgTrianglesKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- procedure CleanAllTriangles(Table: TStringGrid; edCountTriangles: TEdit);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- LabWork: TLabWork;
- implementation
- {$R *.dfm}
- procedure TLabWork.FillHeadlines(Table: TStringGrid);
- var
- i, Len: Integer;
- begin
- Len := Table.RowCount - 1;
- with Table do
- for i := 0 to Len do
- Cells[0, i] := Format('[%d]', [i + 1]);
- end;
- function IsInValidInput(UserString: string; Key: char): Boolean;
- const
- Digits = ['0'..'9', #8];
- var
- i, Iteration: Integer;
- IsInvalidSymbol: boolean;
- begin
- IsInvalidSymbol := False;
- if Key = '0' then
- begin
- Iteration := length(UserString);
- if Iteration <> 0 then
- begin
- IsInvalidSymbol := True;
- for i := 1 to Iteration do
- if UserString[i] <> '0' then
- IsInvalidSymbol := False;
- end
- end
- else
- if (Key = ',') and (length(UserString) <> 0) then
- begin
- Iteration := length(UserString);
- for i := 1 to Iteration do
- if UserString[i] = Key then
- IsInvalidSymbol := True
- end
- else
- IsInvalidSymbol := (not (Key in Digits));
- Result := IsInvalidSymbol;
- end;
- procedure TLabWork.AuthorClick(Sender: TObject);
- begin
- MessageBox(Handle, PChar('Author of this program is Vladislav Mironuk (851001)'), PChar('Author'), MB_ICONINFORMATION + MB_OK);
- end;
- procedure TLabWork.btFindMaxAreaClick(Sender: TObject);
- const
- MaxSideIndex = 2;
- var
- SideIndex, TriangleIndex, CountOfTheTriangle: Integer;
- CurrentArea, p, MaxArea: Real;
- FSide, SSide, TSide: Real;
- begin
- MaxArea := 0;
- CountOfTheTriangle := StrToInt(edCountTriangles.Text) - 1;
- with sgTriangles do
- begin
- for TriangleIndex := 0 to CountOfTheTriangle do
- for SideIndex := 1 to MaxSideIndex do
- if (Cells[SideIndex, TriangleIndex] = '') then
- begin
- btFindMaxArea.Enabled := False;
- if MessageBox(Handle, PChar('The triangle number ' + IntToStr(TriangleIndex + 1) +
- ' contains incorrect ' + IntToStr(SideIndex) +
- ' side ' + #13 + 'Do you want to open Help?'),
- PChar('Error'), MB_ICONSTOP + MB_YESNO) = mrYES then
- HelpClick(Sender);
- Exit;
- end;
- for TriangleIndex := 0 to CountOfTheTriangle do
- begin
- FSide := StrToFloat(Cells[1, TriangleIndex]);
- SSide := StrToFloat(Cells[2, TriangleIndex]);
- TSide := StrToFloat(Cells[3, TriangleIndex]);
- if (FSide >= SSide + TSide) or
- (SSide >= TSide + FSide) or
- (TSide >= FSide + SSide) then
- begin
- MessageBox(Handle, PChar('The triangle number ' + IntToStr(TriangleIndex + 1) + ' does not exist ' + #13 +
- 'Condition of existense triangle is '+ #13 + ' MaxSide < OtherSide + OtherSide'),
- PChar('Error'), MB_ICONSTOP + MB_OK);
- Exit
- end
- else
- begin
- try
- p := (FSide + SSide + TSide) / 2;
- CurrentArea := Sqrt(p*((p-FSide)*(p-SSide)*(p-TSide)));
- except
- MessageBox(Handle, PChar('The triangle number '+ IntToStr(TriangleIndex + 1) +
- ' contains too large sides'), PChar('Error'), MB_ICONSTOP + MB_YESNO);
- Exit
- end;
- if CurrentArea > MaxArea then
- MaxArea := CurrentArea;
- end;
- end;
- end;
- edResult.Visible := True;
- lbMaxArea.Visible := True;
- SaveIntoFile.Enabled := True;
- edResult.Text := Format('%.3f', [MaxArea]);
- end;
- procedure TLabWork.edCountTrianglesKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- begin
- if Key = VK_Insert then
- Key := 0;
- end;
- procedure TLabWork.edCountTrianglesKeyPress(Sender: TObject; var Key: Char);
- const
- Digits = ['0'..'9', #8];
- var
- IsInvalidSymbol: Boolean;
- begin
- if (length(edCountTriangles.Text) > 1) and (Key <> #8) and (Key <> #13) then
- begin
- MessageBox(Handle, PChar('Max count of the triangles is 99'),
- PChar('Error'), MB_ICONSTOP + MB_OK);
- IsInvalidSymbol := True;
- end
- else
- if (Key = '0') and (length(edCountTriangles.Text) = 0) then
- IsInvalidSymbol := True
- else
- IsInvalidSymbol := not (Key in Digits);
- if IsInvalidSymbol then
- Key := #0;
- end;
- procedure TLabWork.FormClose(Sender: TObject; var Action: TCloseAction);
- begin
- if MessageBox(Handle, PChar('Are you sure?'), PChar('Exit?'), MB_ICONSTOP + MB_YESNO + MB_DEFBUTTON2) = mrNo then
- Action := TCloseAction.caNone;
- end;
- procedure TLabWork.OnChange(Sender: TObject);
- const
- OneColHeigth = 27;
- MaxHeigth = 80;
- WidthWithScrolls = 190;
- WidthWithOutScrolls = 169;
- MaxRowsInOnePage = 3;
- begin
- edResult.Visible := False;
- lbMaxArea.Visible := False;
- edResult.Clear;
- SaveIntoFile.Enabled := False;
- if (edCountTriangles.Text = '') or (edCountTriangles.Text = '1') then
- begin
- btFindMaxArea.Enabled := False;
- sgTriangles.Visible := False
- end
- else
- begin
- sgTriangles.RowCount := StrToInt(edCountTriangles.Text);
- if sgTriangles.RowCount > MaxRowsInOnePage then
- begin
- sgTriangles.Height := MaxHeigth;
- sgTriangles.ScrollBars := ssVertical;
- sgTriangles.Width := WidthWithScrolls
- end
- else
- begin
- sgTriangles.Height := ((StrToInt(edCountTriangles.Text)) * OneColHeigth);
- sgTriangles.ScrollBars := ssNone;
- sgTriangles.Width := WidthWithOutScrolls
- end;
- FillHeadlines(sgTriangles);
- sgTriangles.Visible := True;
- end;
- end;
- procedure TLabWork.HelpClick(Sender: TObject);
- const
- RangeOfTheArray = '1 < Length < 100';
- begin
- MessageBox(Handle, PChar('This program find max the area of the specified triangles' + #13 +
- 'Sides of the triangles must be in range Side < 99999 '),
- PChar('Help'), MB_ICONINFORMATION + MB_OK)
- end;
- procedure TLabWork.CleanAllTriangles(Table: TStringGrid; edCountTriangles: TEdit);
- const
- MaxSideIndex = 3;
- var
- TriangleIndex, CountOfTheTriangle, SideIndex: Integer;
- begin
- CountOfTheTriangle := StrToInt(edCountTriangles.Text);
- edCountTriangles.Clear;
- with sgTriangles do
- for TriangleIndex := 0 to CountOfTheTriangle do
- for SideIndex := 1 to MaxSideIndex do
- Cells[SideIndex, TriangleIndex] := ''
- end;
- procedure TLabWork.InputfromFileClick(Sender: TObject);
- const
- MaxSideIndex = 3;
- var
- Input: TextFile;
- Element: Real;
- TriangleIndex, SideIndex, CountOfTheTriangles: Integer;
- begin
- if OpenFile.Execute() then
- begin
- edResult.Clear;
- if edCountTriangles.Text <> '' then
- CleanAllTriangles(sgTriangles, edCountTriangles);
- try
- AssignFile(Input, OpenFile.FileName);
- Reset(Input);
- except
- MessageBox(Handle, PChar('Error open the file'), PChar('Error!'), MB_ICONERROR + MB_OK);
- Exit
- end;
- if EOF(Input) then
- MessageBox(Handle, PChar('Your file is empty'), PChar('Error!'), MB_ICONERROR + MB_OK)
- else
- begin
- CountOfTheTriangles := 0;
- while not EOF(Input) do
- begin
- inc(CountOfTheTriangles);
- Readln(Input);
- end;
- if (CountOfTheTriangles > 99) and (CountOfTheTriangles < 2) then
- begin
- if MessageBox(Handle, PChar('length of the array must be must be integers and belong to the set' + #13 +
- 'Do you want to read help?'), PChar('Error!'), MB_ICONERROR + MB_YESNO) = mrYES then
- HelpClick(Sender)
- end
- else
- begin
- edCountTriangles.Text := IntToStr(CountOfTheTriangles);
- Reset(Input);
- for TriangleIndex := 0 to CountOfTheTriangles do
- begin
- for SideIndex := 1 to MaxSideIndex do
- try
- Read(Input, Element);
- sgTriangles.Cells[SideIndex, TriangleIndex] := FloatToStr(Element);
- except
- if MessageBox(Handle, PChar('The file does not contain suitable numbers' + #13 +
- 'Do you want to read help?'), PChar('Error!'), MB_ICONERROR + MB_YESNO) = mrYES then
- HelpClick(Sender);
- CloseFile(Input);
- CleanAllTriangles(sgTriangles, edCountTriangles);
- Exit;
- end;
- Readln(Input);
- end;
- btFindMaxArea.Enabled := True;
- end;
- end;
- CloseFile(Input);
- end;
- end;
- procedure TLabWork.SaveIntoFileClick(Sender: TObject);
- var
- Output: TextFile;
- begin
- if SaveFile.Execute then
- begin
- AssignFile(Output, SaveFile.FileName);
- try
- Rewrite(Output);
- Write(Output, 'Max area is ', edResult.Text)
- except
- MessageBox(Handle, PChar('Critical error writing to file'), PChar('Error!'), MB_ICONERROR + MB_OK)
- end;
- CloseFile(Output);
- end;
- end;
- procedure TLabWork.sgTrianglesKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- begin
- if Key = VK_Insert then
- Key := 0;
- end;
- procedure TLabWork.sgTrianglesKeyPress(Sender: TObject; var Key: Char);
- const
- Row = 0;
- MaxElementLength = 5;
- begin
- SaveIntoFile.Enabled := False;
- edResult.Visible := False;
- lbMaxArea.Visible := False;
- edResult.Clear;
- with sgTriangles do
- begin
- if (Length(Cells[Col, Row]) = MaxElementLength) and (Key <> #8) and (Key <> #9) then
- begin
- Key := #0;
- MessageBox(Handle, PChar('Max length of the side is 5'),
- PChar('Error'), MB_ICONSTOP + MB_OK)
- end
- else
- if IsInValidInput(sgTriangles.Cells[sgTriangles.Col, Row], Key) then
- Key := #0;
- btFindMaxArea.Enabled := True;
- end;
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement