Advertisement
gguuppyy

форма14

Feb 29th, 2024 (edited)
25
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.38 KB | None | 0 0
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  7. System.Classes, Vcl.Graphics,
  8. Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.Menus,
  9. Vcl.ExtDlgs, Vcl.Imaging.pngimage, RegularExpressions, Vcl.Grids;
  10.  
  11. type
  12. TMainForm = class(TForm)
  13. MainMenu: TMainMenu;
  14. FileTab: TMenuItem;
  15. InfoTab: TMenuItem;
  16. AboutTab: TMenuItem;
  17. OpenOption: TMenuItem;
  18. SaveOption: TMenuItem;
  19. TaskLabel: TLabel;
  20. InputNLabel: TLabel;
  21. InputNEdit: TEdit;
  22. ResultButton: TButton;
  23. OpenTextFileDialog: TOpenTextFileDialog;
  24. SaveTextFileDialog: TSaveTextFileDialog;
  25. Label1: TLabel;
  26. Label2: TLabel;
  27. StringGridResultElements: TStringGrid;
  28. ButtonUserElements: TButton;
  29. PopupMenu1: TPopupMenu;
  30. StringGridA: TStringGrid;
  31. procedure ResultButtonOnClick(Sender: TObject);
  32. procedure AboutDeveloperButton(Sender: TObject);
  33. // procedure InputNEditChange(Sender: TObject);
  34. // procedure InputYEditChange(Sender: TObject);
  35. procedure OpenOptionClick(Sender: TObject);
  36. // procedure InfoAboutProgramButton(Sender: TObject);
  37. // procedure InputXEditKeyDown(Sender: TObject; var Key: Char);
  38. // procedure InputYEditKeyDown(Sender: TObject; var Key: Char);
  39. procedure CloseButtonClick(Sender: TObject);
  40. procedure InfoAboutProgramButton(Sender: TObject);
  41. procedure SureCloseProgramButton(Sender: TObject;
  42. var CanClose: Boolean);
  43. procedure CheckCanSave;
  44. procedure SaveOptionClick(Sender: TObject);
  45. procedure FormKeyDown(Sender: TObject; var Key: Word;
  46. Shift: TShiftState);
  47. procedure InputNEditOnKeyDown(Sender: TObject; var Key: Word;
  48. Shift: TShiftState);
  49. procedure ButtonUserElementsOnClick(Sender: TObject);
  50. procedure InputNEditChange(Sender: TObject);
  51. procedure StringGridUserElementsKeyPress(Sender: TObject;
  52. var Key: Char);
  53. procedure StringGridAOnKeyPress(Sender: TObject; var Key: Char);
  54. procedure StringGridAOnSetEditText(Sender: TObject; ACol, ARow: Integer;
  55. const Value: string);
  56.  
  57. // Добавьте эту строку
  58. private
  59. { Private declarations }
  60. ResultObtained: Boolean;
  61.  
  62. public
  63. { Public declarations }
  64. published
  65. end;
  66.  
  67. type
  68. matriza = array [0 .. 100, 0 .. 100] of Double;
  69.  
  70. var
  71. MainForm: TMainForm;
  72. a: matriza;
  73.  
  74. implementation
  75.  
  76. {$R *.dfm}
  77.  
  78. procedure TMainForm.CloseButtonClick(Sender: TObject);
  79. begin
  80. if Sender is TForm then
  81. begin
  82. (Sender as TForm).Close;
  83. end;
  84.  
  85. end;
  86.  
  87. procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
  88. Shift: TShiftState);
  89. begin
  90. if (Key = VK_RETURN) and ResultButton.Enabled then
  91. begin
  92. ResultButton.Click; // Вызываем событие "нажатия" кнопки
  93. Key := 0;
  94. end;
  95. end;
  96.  
  97. procedure TMainForm.CheckCanSave;
  98. begin
  99. // Проверяем, что поля не пусты и результат получен
  100. if (InputNEdit.Text <> '') and ResultButton.Enabled then
  101. SaveOption.Enabled := True
  102. else
  103. SaveOption.Enabled := False;
  104. end;
  105.  
  106. procedure TMainForm.InfoAboutProgramButton(Sender: TObject);
  107. begin
  108. Application.MessageBox
  109. ('1. Введите количество элементов (больше 2) массива А соответсвующие поле.' + #13#10
  110. + '2. Заполните соответсвующие ячейки элементами массива А.' + #13#10 +
  111. '3. Нажмите кнопку Результат, и вы получите новый массив соответсвующий условию задания.'
  112. + #13#10 + 'Файл ввода данных должен выглядеть так:' + #13#10 + '3' +
  113. #13#10 + '3 4 5' + #13#10, 'Инструкция', MB_ICONINFORMATION or MB_OK);
  114. end;
  115.  
  116. procedure TMainForm.InputNEditOnKeyDown(Sender: TObject; var Key: Word;
  117. Shift: TShiftState);
  118. var
  119. N: Integer;
  120. begin
  121. if Key = VK_RETURN then
  122. begin
  123. Key := 0; // Это предотвращает звуковой сигнал
  124. ButtonUserElements.Enabled := True; // Открываем ButtonUserElements
  125. ButtonUserElements.SetFocus;
  126. ButtonUserElements.Click;
  127. // Перенаправляем фокус на StringGridUserElements
  128. end;
  129. end;
  130.  
  131. procedure TMainForm.InputNEditChange(Sender: TObject);
  132. var
  133. N, i: Integer;
  134. begin
  135. if InputNEdit.Text <> '' then // Проверяем, не пустая ли строка
  136. begin
  137. N := StrToInt(InputNEdit.Text); // Получаем количество элементов
  138. StringGridA.ColCount := N; // Устанавливаем количество столбцов в StringGridUserElements
  139.  
  140. end;
  141.  
  142.  
  143. ButtonUserElements.Enabled := (InputNEdit.Text <> '');
  144. end;
  145.  
  146.  
  147.  
  148. procedure TMainForm.StringGridAOnKeyPress(Sender: TObject; var Key: Char);
  149. begin
  150. if not(Key in ['0' .. '9', ',', '.', '-', #8, #13]) then
  151. Key := #0;
  152. end;
  153.  
  154. procedure TMainForm.StringGridAOnSetEditText(Sender: TObject; ACol, ARow: Integer; const Value: string);
  155. var
  156. i, N: Integer;
  157. flag: Boolean;
  158. MaxLength: Integer;
  159. begin
  160. ACol := StringGridA.Col; // Get the current column
  161. ARow := StringGridA.Row;
  162.  
  163. if (Value <> '') and (Value[1] = '0') then
  164. Begin
  165. StringGridA.Cells[ACol, ARow] := Copy(Value, 2, Length(Value) - 1);
  166. End;
  167.  
  168. MaxLength := 10; // Установите максимальную длину ввода
  169. if Length(Value) > MaxLength then
  170. StringGridA.Cells[ACol, ARow] := Copy(Value, 1, MaxLength);
  171. N := StrToInt(InputNEdit.Text); // Получаем количество элементов
  172. // Проверка на заполненность таблицы
  173. flag := True; // Инициализируем флаг как True
  174. for i := 0 to N - 1 do
  175. begin
  176. if StringGridA.Cells[i, 0] = '' then // Если ячейка пустая
  177. begin
  178. flag := False; // Устанавливаем флаг как False
  179. Break; // Выходим из цикла
  180. end;
  181. end;
  182. // Установка свойства Enabled кнопки ResultButton
  183. if flag then // Если флаг истинный
  184. begin
  185. ResultButton.Enabled := True; // Делаем кнопку доступной
  186. // StringGridB.SetFocus;
  187. end
  188. else // Если флаг ложный
  189. ResultButton.Enabled := False; // Делаем кнопку недоступной
  190. end;
  191.  
  192. procedure TMainForm.StringGridUserElementsKeyPress(Sender: TObject;
  193. var Key: Char);
  194. begin
  195. if not(Key in ['0' .. '9', ',', '.', '-', #8, #13]) then
  196. Key := #0;
  197. end;
  198.  
  199. procedure TMainForm.ButtonUserElementsOnClick(Sender: TObject);
  200. var
  201. N: Integer;
  202. i: Integer;
  203. flag: Boolean;
  204. begin
  205. if InputNEdit.Text <> '' then // Если InputNEdit не пустое
  206. begin
  207. N := StrToInt(InputNEdit.Text); // Преобразуем текст в число
  208.  
  209. if N > 2 then // Проверяем условие N > 2
  210. begin
  211. StringGridA.ColCount := N;
  212. // Устанавливаем количество столбцов в StringGridUserElements
  213. StringGridA.Enabled := True;
  214. // Открываем StringGridUserElements
  215. end
  216. else
  217. begin
  218. ShowMessage('Значение N должно быть больше 2.'); // Выводим сообщение об ошибке
  219. Exit;
  220. end;
  221. end;
  222.  
  223. StringGridA.SetFocus;
  224. end;
  225.  
  226. procedure TMainForm.ResultButtonOnClick(Sender: TObject);
  227. var
  228. i, N: Integer;
  229. sum: Double;
  230. begin
  231.  
  232. N := StrToInt(InputNEdit.Text);
  233. sum := 0;
  234. StringGridResultElements.ColCount := N - 2; // Уменьшаем количество столбцов на 2
  235. for i := 0 to N - 3 do // Изменяем диапазон цикла
  236. begin
  237. try
  238. sum := (StrToFloat(StringGridA.Cells[i, 0]) + StrToFloat(StringGridA.Cells[i + 1, 0]) +
  239. StrToFloat(StringGridA.Cells[i + 2, 0])) / 3;
  240. StringGridResultElements.Cells[i, 0] := FormatFloat('0.00', sum);
  241. SaveOption.Enabled := True;
  242. except
  243. on E: Exception do
  244. begin
  245. Application.MessageBox(PChar('Неверный ввод в ' + IntToStr(i + 1) + ' ячейке.'), 'Ошибка',
  246. MB_ICONERROR or MB_OK);
  247. Exit;
  248. end;
  249. end;
  250. end;
  251.  
  252. if StringGridResultElements.ColCount > 0 then
  253. begin
  254. if MessageDlg('Вы хотите сохранить текущие результаты?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  255. begin
  256. SaveOptionClick(Sender);
  257. end;
  258. end;
  259. end;
  260.  
  261. procedure TMainForm.SaveOptionClick(Sender: TObject);
  262. var
  263. FileLines: TStringList;
  264. N: Integer;
  265. i: Integer;
  266. Value: Double;
  267. begin
  268. // Устанавливаем имя файла и расширение по умолчанию
  269. SaveTextFileDialog.FileName := 'output.txt';
  270. SaveTextFileDialog.Filter := 'Текстовые файлы|*.txt|Все файлы|*.*';
  271.  
  272. if SaveTextFileDialog.Execute(Self.Handle) then
  273. begin
  274. // Создаем TStringList для хранения строк
  275. FileLines := TStringList.Create;
  276. try
  277. N := StrToInt(InputNEdit.Text);
  278. FileLines.Add('Длина массива: ' + IntToStr(N));
  279.  
  280. FileLines.Add('Массив:');
  281. for i := 0 to N - 1 do
  282. begin
  283. Value := StrToFloat(StringGridA.Cells[i, 0]);
  284. FileLines.Add('Элемент ' + IntToStr(i + 1) + ': ' + FloatToStr(Value));
  285. end;
  286.  
  287. FileLines.Add('Итоговый массив:');
  288. for i := 0 to N - 3 do
  289. begin
  290. Value := StrToFloat(StringGridResultElements.Cells[i, 0]);
  291. FileLines.Add('Элемент ' + IntToStr(i + 1) + ': ' + FloatToStr(Value));
  292. end;
  293.  
  294. // Сохраняем строки в файл
  295. FileLines.SaveToFile(SaveTextFileDialog.FileName);
  296. finally
  297. FileLines.Free;
  298. end;
  299. end;
  300. end;
  301.  
  302. procedure TMainForm.OpenOptionClick(Sender: TObject);
  303. var
  304. Encoding: TEncoding;
  305. FileName: String;
  306. FileLines: TStringList;
  307. N: Integer;
  308. P: String;
  309. Data1: TArray<String>;
  310. begin
  311. OpenTextFileDialog.Filter := 'Текстовые файлы|*.txt|Все файлы|*.*';
  312. if OpenTextFileDialog.Execute(Self.Handle) then
  313. begin
  314. FileName := OpenTextFileDialog.FileName;
  315. Encoding := OpenTextFileDialog.Encodings.Objects
  316. [OpenTextFileDialog.EncodingIndex] as TEncoding;
  317. try
  318. FileLines := TStringList.Create;
  319. FileLines.LoadFromFile(FileName, Encoding);
  320. if FileLines.Count <> 2 then
  321. raise Exception.Create('Файл должен содержать ровно 2 строки');
  322. if not TryStrToInt(FileLines[0], N) then
  323. raise Exception.Create('Первая строка должна быть числом');
  324. Data1 := FileLines[1].Split([' ']);
  325. if Length(Data1) <> N then
  326. raise Exception.Create
  327. ('Вторая строка должна содержать N элементов, разделенных пробелами');
  328.  
  329. StringGridA.ColCount := N;
  330.  
  331. for var i := 0 to N - 1 do
  332. begin
  333. StringGridA.Cells[i, 0] := Data1[i];
  334. end;
  335.  
  336. InputNEdit.Text := IntToStr(N);
  337. ResultButton.Click;
  338. // SaveOptionClick(Sender);
  339. finally
  340. FileLines.Free;
  341. end;
  342. end;
  343. end;
  344.  
  345. procedure TMainForm.SureCloseProgramButton(Sender: TObject;
  346. var CanClose: Boolean);
  347. begin
  348. CanClose := MessageBox(0, 'Вы действительно хотите выйти?', 'Выход',
  349. MB_ICONQUESTION + MB_YESNO) = IDYES;
  350. end;
  351.  
  352. procedure TMainForm.AboutDeveloperButton(Sender: TObject);
  353. begin
  354. Application.MessageBox
  355. ('Выполнила студентка группы 351003 Пулиш Виктория Александровна',
  356. 'О разработчике', MB_ICONINFORMATION or MB_OK);
  357. end;
  358.  
  359. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement