Advertisement
THOMAS_SHELBY_18

3.3 form

Feb 7th, 2024
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 14.46 KB | Source Code | 0 0
  1. unit Unit1;
  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.ExtDlgs, Clipbrd,
  8.   Vcl.Grids;
  9.  
  10. type
  11.     TArr = Array of Integer;
  12.   TMainForm = class(TForm)
  13.     ConditionLabel: TLabel;
  14.     MainMenu: TMainMenu;
  15.     FileMenuItem: TMenuItem;
  16.     OpenMenuItem: TMenuItem;
  17.     SaveMenuItem: TMenuItem;
  18.     SaveAsMenuItem: TMenuItem;
  19.     ManualMenuItem: TMenuItem;
  20.     AboutDeveloperMenuItem: TMenuItem;
  21.     Label1: TLabel;
  22.     Label4: TLabel;
  23.     Edit1: TEdit;
  24.     SaveDialog: TSaveDialog;
  25.     OpenDialog: TOpenDialog;
  26.     CopyPastePopupMenu: TPopupMenu;
  27.     PasteButton: TMenuItem;
  28.     StringGrid: TStringGrid;
  29.     CalculateButton: TButton;
  30.     AnswerStringGrid: TStringGrid;
  31.     Memo: TMemo;
  32.     Label2: TLabel;
  33.     Label3: TLabel;
  34.     procedure OpenMenuItemClick(Sender: TObject);
  35.     procedure ManualMenuItemClick(Sender: TObject);
  36.     procedure AboutDeveloperMenuItemClick(Sender: TObject);
  37.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  38.     procedure CalculateButtonClick(Sender: TObject);
  39.     procedure EditDblClick(Sender: TObject);
  40.     procedure EditChange(Sender: TObject);
  41.     procedure EditKeyPress(Sender: TObject; var Key: Char);
  42.     procedure EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  43.     procedure CopyButtonClick(Sender: TObject);
  44.     procedure PasteButtonClick(Sender: TObject);
  45.     procedure CutButtonClick(Sender: TObject);
  46.     procedure CopyPastePopupMenuPopup(Sender: TObject);
  47.     procedure SaveAsMenuItemClick(Sender: TObject);
  48.     procedure SaveMenuItemClick(Sender: TObject);
  49.     procedure FormCreate(Sender: TObject);
  50.     procedure StringGridGetEditMask(Sender: TObject; ACol, ARow: Integer;
  51.       var Value: string);
  52.     procedure StringGridKeyPress(Sender: TObject; var Key: Char);
  53.     procedure StringGridSetEditText(Sender: TObject; ACol, ARow: Integer;
  54.       const Value: string);
  55.     procedure StringGridExit(Sender: TObject);
  56.  
  57.   private
  58.     { Private declarations }
  59.   public
  60.     { Public declarations }
  61.   end;
  62.  
  63. var
  64.   MainForm: TMainForm;
  65.   ItemCount: Integer;
  66.   DefaultFormWidth, BigFormWidth: Integer;
  67.  
  68. const
  69.     MAX = 15;
  70.     MIN = 1;
  71.     kNULL = #0;
  72.     kBACKSPACE = #8;
  73.     kMINUS = #45;
  74.     kDOWN = 40;
  75.     kUP = 38;
  76.     kENTER = 13;
  77.     kINSERT = 45;
  78.  
  79. implementation
  80.  
  81. {$R *.dfm}
  82.  
  83. procedure TMainForm.AboutDeveloperMenuItemClick(Sender: TObject);
  84. begin
  85.    MessageBox(Handle, 'Разработчик: Наривончик Александр Михайлович, гр. 351004', 'О разработчике', MB_OK Or MB_ICONINFORMATION);
  86. end;
  87.  
  88. Procedure ClearStringGrid();
  89. Var
  90.     I: Integer;
  91. Begin
  92.     for I := 0 to ItemCount-1 do
  93.         MainForm.StringGrid.Cells[I, 1] := '';
  94.     for I := 0 to ItemCount-1 do
  95.         MainForm.AnswerStringGrid.Cells[I, 1] := '';
  96. End;
  97.  
  98. Procedure EditButtonEnabled(Button: TButton);
  99. var
  100.     I:Integer;
  101. Begin
  102.     With MainForm Do
  103.     Begin
  104.         Button.Enabled := True;
  105.         for I := 0 to ItemCount-1 do
  106.             if (Trim(StringGrid.Cells[I, 1]) = '-') Or (Trim(StringGrid.Cells[I, 1])= '') then
  107.                 Button.Enabled := False;
  108.  
  109.         if  Button.Enabled = True then
  110.             Button.Enabled := (Edit1.Text <> '');
  111.     End;
  112. End;
  113.  
  114. Function SortArr(Arr: TArr): TArr;
  115. Var
  116.     I, J, K, Buf: Integer;
  117. Begin
  118.     MainForm.Memo.Text := '';
  119.  
  120.     For K := Low(Arr) to High(Arr) do
  121.         MainForm.Memo.Text := MainForm.Memo.Text + IntToStr(Arr[K]) + '  ';
  122.     MainForm.Memo.Text := MainForm.Memo.Text + #13#10 + '---------------------------------------------------' + #13#10;
  123.  
  124.     For I := 1 to High(Arr)  do
  125.     Begin
  126.         Buf := Arr[I];
  127.         J := I;
  128.         While ((J > 0) And (Arr[J-1] > Buf)) Do
  129.         Begin
  130.             Arr[J] := Arr[J-1];
  131.             Dec(J);
  132.         End;
  133.         Arr[J] := Buf;
  134.  
  135.         For K := Low(Arr) to High(Arr) do
  136.             MainForm.Memo.Text := MainForm.Memo.Text + IntToStr(Arr[K]) + '  ';
  137.         MainForm.Memo.Text := MainForm.Memo.Text + #13#10;
  138.  
  139.     End;
  140.     SortArr := Arr;
  141. End;
  142.  
  143.  
  144. procedure TMainForm.CalculateButtonClick(Sender: TObject);
  145. var
  146.     NumArr: TArr;
  147.     I: Integer;
  148. begin
  149.     SetLength(NumArr, ItemCount);
  150.     for I := Low(NumArr) To High(NumArr) do
  151.         NumArr[I] := StrToInt(StringGrid.Cells[I,1]);
  152.  
  153.     NumArr := SortArr(NumArr);
  154.  
  155.     for I := Low(NumArr) To High(NumArr) do
  156.         AnswerStringGrid.Cells[I,1] := IntToStr(NumArr[I]) ;
  157.  
  158.     MainForm.Width := BigFormWidth;
  159.  
  160.     SaveAsMenuItem.Enabled := True;
  161.     SaveMenuItem.Enabled := True;
  162. end;
  163.  
  164. ////////////////////////////POPUP MENU /////////////////////////////////////
  165. procedure TMainForm.CopyPastePopupMenuPopup(Sender: TObject);
  166. var
  167.     Num, Code: Integer;
  168. begin
  169.     Val(Clipboard.AsText, Num, Code);
  170.     If Clipboard.HasFormat(CF_TEXT) And ((Code = 0) And (Num < MAX+1) And (Num > -1)) Then
  171.         PasteButton.Enabled := True
  172.     Else
  173.         PasteButton.Enabled := False;
  174. end;
  175.  
  176. procedure TMainForm.PasteButtonClick(Sender: TObject);
  177. var
  178.     Num, Code, CursPos: Integer;
  179.     S: String;
  180. begin
  181.     with TEdit(ActiveControl)do
  182.     Begin
  183.         CursPos := SelStart;
  184.         S := Text;
  185.  
  186.         PasteFromClipboard;
  187.         Val(Text, Num, Code);
  188.         If (Code <> 0) Or (Num < MIN) Or (Num > MAX) Then
  189.         Begin
  190.             Text := S;
  191.             SelStart := CursPos;
  192.             Beep;
  193.         End;
  194.     End;
  195. end;
  196.  
  197. procedure TMainForm.CutButtonClick(Sender: TObject);
  198. begin
  199.     TEdit(ActiveControl).CutToClipboard;
  200. end;
  201.  
  202. procedure TMainForm.CopyButtonClick(Sender: TObject);
  203. begin
  204.     TEdit(ActiveControl).CopyToClipboard;
  205. end;
  206. /////////////////////////////////////////// SAVE  ///////////////////////////
  207. Procedure SaveAnswer ();
  208. var
  209.     IsFileCorrect: Boolean;
  210.     FileOut: TextFile;
  211.     Path: String;
  212.     I: Integer;
  213. Begin
  214.     With MainForm Do
  215.     Begin
  216.         IsFileCorrect := True;
  217.         Path := SaveDialog.FileName;
  218.         AssignFile(FileOut, Path);
  219.         Try
  220.             Rewrite(FileOut);
  221.         Except
  222.             IsFileCorrect := False;
  223.             MessageBox(Handle, 'Не удалось сохранить ответ в файл!', 'Ошибка', MB_OK Or MB_ICONERROR);
  224.         End;
  225.  
  226.         If IsFileCorrect then
  227.         Begin
  228.             Writeln(FileOut, 'Введенный массив:');
  229.             for I := 0 to ItemCount-1 do
  230.                 Write(FileOut, StringGrid.Cells [I, 1]: 4);
  231.  
  232.             Writeln(FileOut);
  233.             Writeln(FileOut, 'Отсортированный массив:');
  234.             for I := 0 to ItemCount-1 do
  235.                 Write(FileOut, AnswerStringGrid.Cells [I, 1]: 4);
  236.  
  237.             CloseFile(FileOut);
  238.             MessageBox(Handle, 'Сохранено успешно!', 'Сохранение', MB_OK Or MB_ICONINFORMATION);
  239.         End;
  240.     End;
  241. End;
  242. procedure TMainForm.SaveAsMenuItemClick(Sender: TObject);
  243. begin
  244.     If SaveDialog.Execute Then
  245.         SaveAnswer();
  246. end;
  247.  
  248. procedure TMainForm.SaveMenuItemClick(Sender: TObject);
  249. begin
  250.     If(SaveDialog.FileName = 'Answer') Then
  251.     Begin
  252.         If SaveDialog.Execute Then
  253.             SaveAnswer();
  254.     End
  255.     Else
  256.         SaveAnswer();
  257. end;
  258.  
  259. procedure TMainForm.StringGridExit(Sender: TObject);
  260. var
  261.     I,J: Integer;
  262.     str: String;
  263. begin
  264.     for I := 0 to ItemCount do
  265.     begin
  266.        str := StringGrid.Cells[I, 1];
  267.         j := 1;
  268.         while J <= High(str) do
  269.         begin
  270.             if str[J] = ' ' then
  271.             begin
  272.                 delete(str, j, 1);
  273.                 dec(J);
  274.             end;
  275.             inc(j);
  276.         end;
  277.         StringGrid.Cells[I, 1] := str;
  278.     end;
  279. end;
  280.  
  281. procedure TMainForm.StringGridGetEditMask(Sender: TObject; ACol, ARow: Integer;
  282.   var Value: string);
  283. begin
  284.     Value := '#99';
  285. end;
  286.  
  287. procedure TMainForm.StringGridKeyPress(Sender: TObject; var Key: Char);
  288. begin
  289.     if Not(Key in ['0'..'9', #8, kMINUS]) then Key := #0;
  290. end;
  291.  
  292. procedure TMainForm.StringGridSetEditText(Sender: TObject; ACol, ARow: Integer;
  293.   const Value: string);
  294. Var
  295.     NumStr, Num:String;
  296.     IValue, I: Integer;
  297. begin
  298.     EditButtonEnabled(CalculateButton);
  299.     MainForm.Width := DefaultFormWidth;
  300.  
  301.     SaveAsMenuItem.Enabled := False;
  302.     SaveMenuItem.Enabled := False;
  303. end;
  304.  
  305. Procedure EditStringGrids;
  306. var
  307.     I:Integer;
  308. Begin
  309.     ClearStringGrid;
  310.     With MainForm do
  311.     Begin
  312.         if Edit1.Text = '' then
  313.         Begin
  314.             ItemCount := 7;
  315.             StringGrid.Options := StringGrid.Options - [goEditing];
  316.         End
  317.         Else
  318.         Begin
  319.             ItemCount := StrToInt(Edit1.Text);
  320.             StringGrid.Options := StringGrid.Options + [goEditing];
  321.         End;
  322.         StringGrid.ColCount := ItemCount;
  323.         AnswerStringGrid.ColCount := ItemCount;
  324.         for I := 0 to ItemCount-1 do
  325.         Begin
  326.             StringGrid.Cells[I, 0] := IntToStr(I+1);
  327.             AnswerStringGrid.Cells[I, 0] := IntToStr(I+1);
  328.         End;
  329.     End;
  330. End;
  331.  
  332. //////////////////////////////// EDIT /////////////////////////////////////////
  333. procedure TMainForm.EditChange(Sender: TObject);
  334. var
  335.     S:String;
  336.     Num, Code, CursPos: Integer;
  337. begin
  338.     with Sender As TEdit do
  339.     Begin
  340.         S := Text;
  341.         CursPos := SelStart;
  342.  
  343.         Val(S, Num, Code);
  344.         If (Code = 0) And (Num > MIN-1) And (Num < MAX+1) Then
  345.         Begin
  346.             Text := IntToStr(Num);
  347.             SelStart := CursPos;
  348.         End
  349.         Else
  350.         Begin
  351.             Delete (S, SelStart, 1);
  352.             Text := S;
  353.             SelStart := CursPos-1;
  354.         End;
  355.  
  356.         if Text = '0' then
  357.             Text := '';
  358.  
  359.         MainForm.Width := DefaultFormWidth;
  360.         EditButtonEnabled(CalculateButton);
  361.         EditStringGrids;
  362.         ClearStringGrid;
  363.     End;
  364.  
  365.     if SaveAsMenuItem.Enabled = True then
  366.     Begin
  367.         SaveAsMenuItem.Enabled := False;
  368.         SaveMenuItem.Enabled := False;
  369.     End;
  370. end;
  371.  
  372. procedure TMainForm.EditDblClick(Sender: TObject);
  373. begin
  374.     with Sender As TEdit do
  375.         Text := '';
  376. end;
  377.  
  378. procedure TMainForm.EditKeyDown(Sender: TObject; var Key: Word;
  379.   Shift: TShiftState);
  380. Begin
  381.     with MainForm, Sender As TEdit do
  382.     case key of
  383.     kINSERT:
  384.         Key := 0;
  385.     end;
  386. End;
  387.  
  388. procedure TMainForm.EditKeyPress(Sender: TObject; var Key: Char);
  389. begin
  390.     with Sender As TEdit Do
  391.         case key of
  392.             '0'..'9':;
  393.             kBACKSPACE:;
  394.             kMINUS:;
  395.         Else
  396.             Key := kNULL;
  397.         end;
  398. end;
  399. ////////////////////////////////////////////////////////////////////////////////
  400.  
  401. procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  402. begin
  403.     CanClose := MessageBox(Handle, 'Вы действительно хотите выйти?', 'Вы уверены?', MB_YESNO Or MB_ICONQUESTION) = IDYES;
  404. end;
  405.  
  406. procedure TMainForm.FormCreate(Sender: TObject);
  407. var
  408.     I:Integer;
  409. begin
  410.     DefaultFormWidth := MainForm.Width;
  411.     BigFormWidth := 900;
  412.     ItemCount := 7;
  413.     for I := 0 to ItemCount-1 do
  414.     Begin
  415.         StringGrid.Cells[I, 0] := IntToStr(I+1);
  416.         AnswerStringGrid.Cells[I, 0] := IntToStr(I+1);
  417.     End;
  418. end;
  419.  
  420. procedure TMainForm.ManualMenuItemClick(Sender: TObject);
  421. begin
  422.     MessageBox(Handle, '1. Введите в соответствующее поле количество элементов массива(от 1 до 15).' + #13#10 + '2. Введите элементы массива (от -99 до 999)' + #13#10 + '3. Нажмите кнопку "Отсортировать".' + #13#10 + '4. Получите результат!'+ #13#10 + '5. В случае ввода из файла убедитесь, что файл содержит количество элементов и сами элементы массива, записанные в отдельных строках.', 'Инструкция', MB_OK Or MB_ICONINFORMATION);
  423. end;
  424.  
  425. //////////////////////////////////// OPEN ////////////////////////////////////////
  426. Function ReadNumFromFile(Var FileIn: TextFile; Var Num: Integer; Const MINNUM: Integer; Const MAXNUM: Integer): Boolean;
  427. Var
  428.     IsFileCorrect: Boolean;
  429.     NumStr: String;
  430.     Code: Integer;
  431.  
  432. Begin
  433.     Readln(FileIn, NumStr);
  434.     Val(NumStr, Num, Code);
  435.  
  436.     If Code = 0 then
  437.         IsFileCorrect := True
  438.     Else
  439.     Begin
  440.         MessageBox(MainForm.Handle, 'Неверный формат данных в файле!', 'Ошибка', MB_OK Or MB_ICONERROR);
  441.         IsFileCorrect := False;
  442.     End;
  443.  
  444.     If (IsFileCorrect) And ((Num < MINNUM) Or (Num > MAXNUM)) then
  445.     Begin
  446.         MessageBox(MainForm.Handle, 'Неверный формат данных в файле!', 'Ошибка', MB_OK Or MB_ICONERROR);
  447.         IsFileCorrect := False;
  448.     End;
  449.  
  450.     ReadNumFromFile := IsFileCorrect;
  451. End;
  452.  
  453. procedure TMainForm.OpenMenuItemClick(Sender: TObject);
  454. var
  455.     FileIn: TextFile;
  456.     Path: String;
  457.     IsFileCorrect: Boolean;
  458.     I, N: Integer;
  459. begin
  460.     If OpenDialog.Execute Then
  461.     Begin
  462.         IsFileCorrect := True;
  463.         Path := OpenDialog.FileName;
  464.         AssignFile(FileIn, Path);
  465.  
  466.         Try
  467.             Reset(FileIn);
  468.         Except
  469.             IsFileCorrect := False;
  470.             MessageBox(Handle, 'Не удалось открыть файл!', 'Ошибка', MB_OK Or MB_ICONERROR);
  471.         End;
  472.  
  473.         If (IsFileCorrect) Then
  474.         Begin
  475.             IsFileCorrect := ReadNumFromFile(FileIn, ItemCount, MIN, MAX);
  476.             If (IsFileCorrect) then
  477.             Begin
  478.                 Edit1.Text := IntToStr(ItemCount);
  479.                 I := 0;
  480.                 Repeat
  481.                     IsFileCorrect := ReadNumFromFile(FileIn, N, -99, 999);
  482.                     if IsFileCorrect then
  483.                         StringGrid.Cells[I,1] := IntToStr(N);
  484.                         Inc(I);
  485.                 Until Not IsFileCorrect Or (I = ItemCount);
  486.             End;
  487.  
  488.             If (IsFileCorrect) And Not EoF(FileIn) then
  489.             Begin
  490.                 IsFileCorrect := False;
  491.                 MessageBox(MainForm.Handle, 'Неверный формат данных в файле!', 'Ошибка', MB_OK Or MB_ICONERROR);
  492.             End;
  493.  
  494.             CloseFile(FileIn);
  495.             if Not IsFileCorrect then
  496.             Begin
  497.                 ClearStringGrid;
  498.                 EditStringGrids;
  499.                 Edit1.Text := '';
  500.             End;
  501.  
  502.             EditButtonEnabled(CalculateButton);
  503.         End;
  504.     End;
  505. end;
  506. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement