Advertisement
gguuppyy

форма23

Mar 4th, 2024 (edited)
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.64 KB | None | 0 0
  1. Unit Unit1;
  2.  
  3. Interface
  4.  
  5. Uses
  6. Winapi.Windows,
  7. Winapi.Messages,
  8. System.SysUtils,
  9. System.Variants,
  10. System.Classes,
  11. Vcl.Graphics,
  12. Clipbrd,
  13. Vcl.Controls,
  14. Vcl.Forms,
  15. Vcl.Dialogs,
  16. Vcl.StdCtrls,
  17. Vcl.NumberBox,
  18. Vcl.ComCtrls,
  19. Vcl.Grids,
  20. Vcl.Imaging.Pngimage,
  21. Vcl.ExtCtrls,
  22. Vcl.Menus;
  23.  
  24. Type
  25. TMain = Class(TForm)
  26. UpDown1: TUpDown;
  27. Edit1: TEdit;
  28. StringGrid1: TStringGrid;
  29. Memo1: TMemo;
  30. Button1: TButton;
  31. BalloonHint1: TBalloonHint;
  32. MainMenu1: TMainMenu;
  33. N1: TMenuItem;
  34. N2: TMenuItem;
  35. N3: TMenuItem;
  36. N4: TMenuItem;
  37. N5: TMenuItem;
  38. OpenDialog1: TOpenDialog;
  39. SaveDialog1: TSaveDialog;
  40. Label1: TLabel;
  41. Label2: TLabel;
  42. Edit2: TEdit;
  43. UpDown2: TUpDown;
  44. Procedure FormActivate(Sender: TObject);
  45.  
  46. Procedure StringGrid1KeyPress(Sender: TObject; Var Key: Char);
  47. Procedure Edit1Change(Sender: TObject);
  48. Procedure Checker(Var IsCorrect: Boolean);
  49. Procedure GetPath(Var Path: String);
  50. Procedure N4Click(Sender: TObject);
  51. Procedure N5Click(Sender: TObject);
  52. Procedure N1Click(Sender: TObject);
  53. Procedure N2Click(Sender: TObject);
  54. Procedure N3Click(Sender: TObject);
  55. Procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  56. Procedure FormCloseQuery(Sender: TObject; Var CanClose: Boolean);
  57. Procedure StringGrid1Resize();
  58. Procedure StringGrid1MouseActivate(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y, HitTest: Integer;
  59. Var MouseActivate: TMouseActivate);
  60. Procedure StringGrid1KeyDown(Sender: TObject; Var Key: Word; Shift: TShiftState);
  61. Procedure Edit1KeyPress(Sender: TObject; Var Key: Char);
  62. Procedure Edit1ContextPopup(Sender: TObject; MousePos: TPoint; Var Handled: Boolean);
  63. Procedure Edit1MouseActivate(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y, HitTest: Integer;
  64. Var MouseActivate: TMouseActivate);
  65. Procedure Edit1KeyDown(Sender: TObject; Var Key: Word; Shift: TShiftState);
  66. Procedure Button1Click(Sender: TObject);
  67. procedure Edit2KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  68. procedure Edit2KeyPress(Sender: TObject; var Key: Char);
  69. procedure Edit2MouseActivate(Sender: TObject; Button: TMouseButton;
  70. Shift: TShiftState; X, Y, HitTest: Integer;
  71. var MouseActivate: TMouseActivate);
  72. procedure Edit2Change(Sender: TObject);
  73. Private
  74. iscorrect: boolean;
  75. { Private declarations }
  76. Public
  77. { Public declarations }
  78. End;
  79.  
  80. Const
  81. E: Double = 1.0E-3;
  82. NumSet = ['1', '2', '3', '4', '5', '6', '7', '8', '9', #8, #44, #45, #46];
  83.  
  84. Var
  85. Main: TMain;
  86.  
  87. Implementation
  88.  
  89. {$R *.dfm}
  90.  
  91. Uses
  92. Instruction,
  93. Information;
  94.  
  95.  
  96. type
  97. TArray = array of array of Integer;
  98.  
  99. function SearchForGoodStudents(Arr: TArray): Integer;
  100. var
  101. Rows, EightGradeCounter, SixGradeCounter, CheckGradeCounter, Sum, I, J: Integer;
  102. begin
  103. Sum := 0;
  104.  
  105. for I := 0 to High(Arr) do
  106. begin
  107. EightGradeCounter := 0;
  108. SixGradeCounter := 0;
  109. CheckGradeCounter := 0;
  110.  
  111. for J := 0 to High(Arr[I]) do
  112. begin
  113. if (Arr[I][J] > 5) then
  114. Inc(SixGradeCounter);
  115.  
  116. if (Arr[I][J] <= 8) then
  117. Inc(EightGradeCounter);
  118.  
  119. if (Arr[I][J] <= 5) then
  120. Inc(CheckGradeCounter);
  121. end;
  122.  
  123. if (SixGradeCounter > 0) and (EightGradeCounter > 0) and (CheckGradeCounter = 0) then
  124. Inc(Sum);
  125. end;
  126.  
  127. Result := Sum;
  128. end;
  129.  
  130. procedure TMain.Button1Click(Sender: TObject);
  131. var
  132. Cols, I, J: Integer;
  133. Matrix: TArray;
  134. GoodStudentsCount: Integer;
  135. begin
  136. Checker(IsCorrect);
  137.  
  138. try
  139. Cols := StrToInt(Edit1.Text);
  140. except
  141. Cols := 1;
  142. end;
  143.  
  144. SetLength(Matrix, Cols);
  145.  
  146. for I := 0 to Cols - 1 do
  147. begin
  148. SetLength(Matrix[I], StringGrid1.ColCount);
  149.  
  150. for J := 0 to StringGrid1.ColCount - 1 do
  151. begin
  152. Matrix[I][J] := StrToInt(StringGrid1.Cells[J, I]);
  153.  
  154. if Matrix[I][J] = 0 then
  155. begin
  156. ShowMessage('Найдена пустая ячейка');
  157. Abort;
  158. end;
  159.  
  160. if (Matrix[I][J] < 0) or (Matrix[I][J] > 10) then
  161. begin
  162. ShowMessage('Ошибка!');
  163. Abort;
  164. end;
  165. end;
  166. end;
  167.  
  168. if IsCorrect then
  169. begin
  170. GoodStudentsCount := SearchForGoodStudents(Matrix);
  171.  
  172. Memo1.Lines.Clear;
  173. Memo1.Lines.Add(Format('Количество хорошистов: %d', [GoodStudentsCount]));
  174. end
  175. else
  176. ShowMessage('Заполните все поля');
  177. end;
  178.  
  179. Procedure TMain.Checker(Var IsCorrect: Boolean);
  180. Var
  181. Length, I: Integer;
  182. Begin
  183. Try
  184. Length := StrToInt(Edit1.Text);
  185. IsCorrect := True;
  186. Except
  187. Length := 0;
  188. IsCorrect := False;
  189. End;
  190.  
  191. Dec(Length);
  192.  
  193. For I := 0 To Length Do
  194. Begin
  195. If (StringGrid1.Cells[I, 0] = '') Or (StringGrid1.Cells[I, 0] = '-') Then
  196. Begin
  197. IsCorrect := False;
  198. End;
  199. End;
  200. End;
  201.  
  202. Procedure TMain.GetPath(Var Path: String);
  203. Begin
  204. If OpenDialog1.Execute Then
  205. Begin
  206. Path := OpenDialog1.FileName;
  207. End
  208. Else
  209. Begin
  210. ShowMessage('Открытие файла отменено.');
  211. End;
  212. End;
  213.  
  214. Procedure TMain.N1Click(Sender: TObject);
  215. Begin
  216. If Memo1.Lines.Count = 0 Then
  217. Begin
  218. N5.Enabled := False;
  219. End
  220. Else
  221. Begin
  222. N5.Enabled := True;
  223. End;
  224. End;
  225.  
  226. Procedure TMain.N2Click(Sender: TObject);
  227. Begin
  228. Instruction.InstructionForm.ShowModal;
  229. End;
  230.  
  231. Procedure TMain.N3Click(Sender: TObject);
  232. Begin
  233. Information.InformationForm.ShowModal;
  234. End;
  235.  
  236. procedure TMain.N4Click(Sender: TObject);
  237. var
  238. IsCorrect, Fail: Boolean;
  239. Path: String;
  240. FileElem: TextFile;
  241. I, Count: Integer;
  242. Str: String;
  243. Values: TStringList;
  244. begin
  245. GetPath(Path);
  246. AssignFile(FileElem, Path);
  247. IsCorrect := True;
  248. Fail := False;
  249.  
  250. if Path = '' then
  251. IsCorrect := False;
  252.  
  253. if IsCorrect then
  254. begin
  255. try
  256. Reset(FileElem);
  257. ShowMessage('Файл успешно открыт.');
  258. except
  259. on E: EInOutError do
  260. begin
  261. if E.ErrorCode = 103 then
  262. begin
  263. IsCorrect := False;
  264. ShowMessage('Ошибка I/O (код 103): Файл занят или недоступен.' + #13#10 + 'Проверьте файл и повторите попытку');
  265. end
  266. else
  267. begin
  268. IsCorrect := False;
  269. ShowMessage('Ошибка I/O: ' + E.Message);
  270. if E.Message = 'I/O error 32' then
  271. ShowMessage('Файл используется в нескольких процессах' + #13#10 + 'Проверьте файл и повторите попытку');
  272. end;
  273. end;
  274. on E: Exception do
  275. begin
  276. ShowMessage('Ошибка: ' + E.Message + #13#10 + 'Проверьте файл и повторите попытку');
  277. IsCorrect := False;
  278. end;
  279. end;
  280.  
  281. if IsCorrect then
  282. begin
  283. try
  284. Count := 0;
  285. while not Eof(FileElem) do
  286. begin
  287. ReadLn(FileElem, Str);
  288. Inc(Count);
  289. end;
  290. CloseFile(FileElem);
  291.  
  292. if not Fail then
  293. begin
  294. Reset(FileElem);
  295. StringGrid1.RowCount := Count;
  296. Values := TStringList.Create;
  297. try
  298. for I := 0 to Count - 1 do
  299. begin
  300. ReadLn(FileElem, Str);
  301. Values.DelimitedText := Str;
  302. if Values.Count > StringGrid1.ColCount then
  303. StringGrid1.ColCount := Values.Count; // Увеличиваем количество столбцов, если необходимо
  304. for var J := 0 to Values.Count - 1 do
  305. StringGrid1.Cells[J, I] := Values[J]; // Записываем значение в соответствующую ячейку
  306. end;
  307. finally
  308. Values.Free;
  309. end;
  310. CloseFile(FileElem);
  311. end;
  312.  
  313. if not Fail then
  314. ShowMessage('Открытие завершено.')
  315. else
  316. ShowMessage('Некорректные данные файла! Проверьте данные и повторите попытку.');
  317.  
  318. except
  319. CloseFile(FileElem);
  320. IsCorrect := False;
  321. ShowMessage('Ошибка открытия файла.');
  322. end;
  323. end;
  324. end;
  325. end;
  326. Procedure TMain.StringGrid1Resize();
  327. Var
  328. NewRowCount, NewColCount, I, J: Integer;
  329. Begin
  330. Try
  331. NewRowCount := StrToInt(Edit1.Text);
  332. Except
  333. NewRowCount := 1;
  334. End;
  335. For I := 0 To 10 Do
  336. If I >= NewRowCount Then
  337. Begin
  338. StringGrid1.Cells[I, 0] := '';
  339. End;
  340. End;
  341.  
  342. Procedure TMain.N5Click(Sender: TObject);
  343. Begin
  344. If SaveDialog1.Execute Then
  345. Begin
  346.  
  347. Memo1.Lines.SaveToFile(SaveDialog1.FileName);
  348. End
  349. Else
  350.  
  351. Begin
  352. ShowMessage('Сохранение в файл отменено.');
  353. End;
  354. End;
  355.  
  356. Procedure TMain.Edit1Change(Sender: TObject);
  357. Begin
  358. If Edit1.Text = '' Then
  359. Begin
  360. StringGrid1.ColCount := 1;
  361. End
  362. Else
  363. Begin
  364. StringGrid1.ColCount := StrToInt(Edit1.Text);
  365. End;
  366. StringGrid1Resize
  367. End;
  368.  
  369. Procedure TMain.Edit1ContextPopup(Sender: TObject; MousePos: TPoint; Var Handled: Boolean);
  370. Begin
  371. Handled := True;
  372. End;
  373.  
  374. Procedure TMain.Edit1KeyDown(Sender: TObject; Var Key: Word; Shift: TShiftState);
  375. Begin
  376. Clipboard.Clear;
  377. End;
  378.  
  379. Procedure TMain.Edit1KeyPress(Sender: TObject; Var Key: Char);
  380. Begin
  381. //Проверяем, является ли введенный символ цифрой
  382. If Not(Key In ['1' .. '9', #8]) Then
  383. Begin
  384. BalloonHint1.Title := 'Недопустимый символ.';
  385. BalloonHint1.Description := 'Введите число от 1 до 9.';
  386. BalloonHint1.ImageIndex := 1;
  387. BalloonHint1.ShowHint(Edit1);
  388. Key := #0;
  389. End;
  390. End;
  391.  
  392. Procedure TMain.Edit1MouseActivate(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y, HitTest: Integer;
  393. Var MouseActivate: TMouseActivate);
  394. Begin
  395. Clipboard.Clear;
  396. End;
  397.  
  398. Procedure TMain.Edit2Change(Sender: TObject);
  399. Begin
  400. If Edit2.Text = '' Then
  401. Begin
  402. StringGrid1.RowCount := 1;
  403. End
  404. Else
  405. Begin
  406. StringGrid1.RowCount := StrToInt(Edit2.Text);
  407. End;
  408. StringGrid1Resize
  409. End;
  410.  
  411.  
  412. procedure TMain.Edit2KeyDown(Sender: TObject; var Key: Word;
  413. Shift: TShiftState);
  414. begin
  415. Clipboard.Clear;
  416. end;
  417.  
  418. procedure TMain.Edit2KeyPress(Sender: TObject; var Key: Char);
  419. begin
  420. //Проверяем, является ли введенный символ цифрой
  421. If Not(Key In ['1' .. '9', #8]) Then
  422. Begin
  423. BalloonHint1.Title := 'Недопустимый символ.';
  424. BalloonHint1.Description := 'Введите число от 1 до 9.';
  425. BalloonHint1.ImageIndex := 1;
  426. BalloonHint1.ShowHint(Edit1);
  427. Key := #0;
  428. End;
  429. end;
  430.  
  431. procedure TMain.Edit2MouseActivate(Sender: TObject; Button: TMouseButton;
  432. Shift: TShiftState; X, Y, HitTest: Integer;
  433. var MouseActivate: TMouseActivate);
  434. begin
  435. Clipboard.Clear;
  436. end;
  437.  
  438. Procedure TMain.FormActivate(Sender: TObject);
  439. Begin
  440. UpDown1.Associate := Edit1;
  441. UpDown1.Max := 10;
  442. UpDown1.Min := 1;
  443.  
  444. UpDown2.Associate := Edit2;
  445. UpDown2.Max := 10;
  446. UpDown2.Min := 1;
  447. End;
  448.  
  449.  
  450.  
  451. Procedure TMain.FormCloseQuery(Sender: TObject; Var CanClose: Boolean);
  452. Var
  453. Confirmation: Integer;
  454. Begin
  455. Confirmation := Application.MessageBox('Вы уверены, что хотите выйти?', 'Выход', MB_YESNO);
  456. CanClose := Confirmation = IDYES;
  457. End;
  458.  
  459. Procedure TMain.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  460. Var
  461. Rows, Cols, I, J: Integer;
  462. Begin
  463. Try
  464. Cols := StrToInt(Edit1.Text);
  465. Except
  466. Cols := 1;
  467. End;
  468. Rows := 1;
  469. For I := 0 To Rows - 1 Do
  470. Begin
  471. For J := 0 To Cols - 1 Do
  472. If (StringGrid1.Cells[J, I] <> '') Then
  473. Button1.Enabled := True
  474. Else
  475. Button1.Enabled := False;
  476. End;
  477. End;
  478.  
  479. Procedure TMain.StringGrid1KeyDown(Sender: TObject; Var Key: Word; Shift: TShiftState);
  480. Begin
  481. Clipboard.Clear;
  482. End;
  483.  
  484. Procedure TMain.StringGrid1KeyPress(Sender: TObject; Var Key: Char);
  485. Var
  486. C, R: Integer;
  487. CellValue: String;
  488. Num: Integer;
  489. Begin
  490. C := (Sender As TStringGrid).Col;
  491. R := (Sender As TStringGrid).Row;
  492. CellValue := StringGrid1.Cells[C, R];
  493.  
  494. If Not(Key In ['0' .. '9', '-', #8]) Then
  495. Begin
  496. BalloonHint1.Title := 'Недопустимый символ.';
  497. BalloonHint1.Description := 'Здесь можно ввести только целое число.';
  498. BalloonHint1.ImageIndex := 1;
  499. BalloonHint1.ShowHint(StringGrid1);
  500. Key := #0;
  501. End
  502. Else
  503. If (Key = '-') And (CellValue.IndexOf('-') >= 0) Then
  504. Begin
  505. BalloonHint1.Title := 'Недопустимый символ.';
  506. BalloonHint1.Description := 'Минус уже присутствует в числе.';
  507. BalloonHint1.ImageIndex := 1;
  508. BalloonHint1.ShowHint(StringGrid1);
  509. Key := #0;
  510. End
  511. Else
  512. If TryStrToInt(CellValue + Key, Num) Then
  513. Begin
  514. If (Num < 1) Or (Num > 10) Then
  515. Begin
  516. BalloonHint1.Title := 'Ограничение диапазона.';
  517. BalloonHint1.Description := 'Допустимые значения от 1 до 10.';
  518. BalloonHint1.ImageIndex := 1;
  519. BalloonHint1.ShowHint(StringGrid1);
  520. Key := #0;
  521. End;
  522. End
  523. Else
  524. If Key = '.' Then
  525. Begin
  526. BalloonHint1.Title := 'Недопустимый символ.';
  527. BalloonHint1.Description := 'Дробные числа не разрешены.';
  528. BalloonHint1.ImageIndex := 1;
  529. BalloonHint1.ShowHint(StringGrid1);
  530. Key := #0;
  531. End;
  532. End;
  533.  
  534. Procedure TMain.StringGrid1MouseActivate(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y, HitTest: Integer;
  535. Var MouseActivate: TMouseActivate);
  536. Begin
  537. Clipboard.Clear;
  538. End;
  539.  
  540. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement