Advertisement
ksyshshot

Lab.4.1

Mar 3rd, 2023
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 50.70 KB | Source Code | 0 0
  1. unit Lab_4_1_Form;
  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;
  8.  
  9. type
  10.   TFormMenu = class(TForm)
  11.     ButtonCreateNewRecord: TButton;
  12.     ButtonChangeRecord: TButton;
  13.     ButtonDeleteRecord: TButton;
  14.     ButtonSeeRecord: TButton;
  15.     LabelWelcome: TLabel;
  16.     LabelProgramFunction: TLabel;
  17.     LabelChooseFunction: TLabel;
  18.     ButtonFindSpecialPrinters: TButton;
  19.     LabelTask: TLabel;
  20.     LabelAbout: TLabel;
  21.     ButtonAbout: TButton;
  22.     ButtonHelp: TButton;
  23.     LabelHelp: TLabel;
  24.     procedure ButtonAboutClick(Sender: TObject);
  25.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  26.     procedure ButtonCreateNewRecordClick(Sender: TObject);
  27.     procedure ButtonChangeRecordClick(Sender: TObject);
  28.     procedure ButtonDeleteRecordClick(Sender: TObject);
  29.     procedure ButtonSeeRecordClick(Sender: TObject);
  30.     procedure FormCreate(Sender: TObject);
  31.     procedure ButtonHelpClick(Sender: TObject);
  32.     procedure ButtonFindSpecialPrintersClick(Sender: TObject);
  33.   private
  34.     { Private declarations }
  35.   public
  36.     { Public declarations }
  37.   end;
  38.  
  39. var
  40.   FormMenu: TFormMenu;
  41.  
  42. implementation
  43.  
  44. {$R *.dfm}
  45.  
  46. uses UnitAbout, UnitError, UnitExit, UnitCreateNewRecord, UnitChangeRecord,
  47.   UnitDeleteRecord, UnitSeeRecord, UnitInstructionMenu, UnitTaskSearch;
  48.  
  49. {Type
  50.     TPrinter = record
  51.         Brand: String[15];
  52.         Kind: Char;
  53.         Format: Integer;
  54.         Cost: Integer;
  55.     end;
  56.  
  57. var
  58.     F: File of TPrinter;
  59.     Printer: TPrinter; }
  60.  
  61. procedure TFormMenu.ButtonAboutClick(Sender: TObject);
  62. begin
  63.     UnitAbout.FormAbout.ShowModal();
  64. end;
  65.  
  66. procedure TFormMenu.ButtonChangeRecordClick(Sender: TObject);
  67. begin
  68.     FormMenu.Visible := false;
  69.     UnitChangeRecord.FormChangeRecord.ShowModal();
  70.     FormMenu.Visible := true;
  71. end;
  72.  
  73. procedure TFormMenu.ButtonCreateNewRecordClick(Sender: TObject);
  74. begin
  75.     FormMenu.Visible := false;
  76.     UnitCreateNewRecord.FormCreateNewRecord.ShowModal();
  77.     FormMenu.Visible := true;
  78. end;
  79.  
  80. procedure TFormMenu.ButtonDeleteRecordClick(Sender: TObject);
  81. begin
  82.     FormMenu.Visible := false;
  83.     UnitDeleteRecord.FormDeleteRecord.ShowModal();
  84.     FormMenu.Visible := true;
  85. end;
  86.  
  87. procedure TFormMenu.ButtonFindSpecialPrintersClick(Sender: TObject);
  88. begin
  89.     UnitTaskSearch.FormTaskSearch.ShowModal();
  90. end;
  91.  
  92. procedure TFormMenu.ButtonHelpClick(Sender: TObject);
  93. begin
  94.     UnitInstructionMenu.FormInstructionMenu.ShowModal();
  95. end;
  96.  
  97. procedure TFormMenu.ButtonSeeRecordClick(Sender: TObject);
  98. begin
  99.     FormMenu.Visible := false;
  100.     UnitSeeRecord.FormSeeRecord.ShowModal();
  101.     FormMenu.Visible := true;
  102. end;
  103.  
  104. procedure TFormMenu.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  105. var
  106.     Res: Integer;
  107. begin
  108.     Res := UnitExit.FormExit.ShowModal();
  109.     If Res = mrOk Then
  110.         CanClose := True
  111.     Else
  112.         CanClose := False;
  113. end;
  114.  
  115. procedure TFormMenu.FormCreate(Sender: TObject);
  116. begin
  117.     {Reset(F); }
  118. end;
  119.  
  120. end.
  121.  
  122. unit UnitTaskSearch;
  123.  
  124. interface
  125.  
  126. uses
  127.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  128.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Menus;
  129.  
  130. type
  131.   TFormTaskSearch = class(TForm)
  132.     RadioGroupChooseFormat: TRadioGroup;
  133.     ButtonChoosePrinters: TButton;
  134.     EditPrinterCount: TEdit;
  135.     LabelPrinterCount: TLabel;
  136.     LabelAveragePrice: TLabel;
  137.     EditAveragePrice: TEdit;
  138.     ButtonExit: TButton;
  139.     MainMenuTask: TMainMenu;
  140.     ButtonSaveToFile: TMenuItem;
  141.     SaveDialogTask: TSaveDialog;
  142.     procedure RadioGroupChooseFormatClick(Sender: TObject);
  143.     procedure ButtonChoosePrintersClick(Sender: TObject);
  144.     procedure ButtonExitClick(Sender: TObject);
  145.     procedure ButtonSaveToFileClick(Sender: TObject);
  146.   private
  147.     { Private declarations }
  148.   public
  149.     { Public declarations }
  150.   end;
  151.  
  152. var
  153.   FormTaskSearch: TFormTaskSearch;
  154.  
  155. implementation
  156.  
  157. {$R *.dfm}
  158.  
  159. uses UnitError;
  160.  
  161. const
  162.     PATH = 'Records.rcd';
  163.  
  164. Type
  165.     TPrinter = record
  166.         Brand: String[15];
  167.         Kind: Char;
  168.         Format: Integer;
  169.         CostRub, CostCop: Integer;
  170.     end;
  171.  
  172. var
  173.     F: File of TPrinter;
  174.     Printer: TPrinter;
  175.     ChosenFormat: Integer;
  176.  
  177. function GetAveragePrice(Rub, Cop, Count: Integer): Double;
  178. var
  179.     AllRub: Integer;
  180.     AllPrice: Double;
  181. begin
  182.     AllRub := Rub + (Cop div 100);
  183.     AllPrice := AllRub + ((Cop mod 100) / 100);
  184.     GetAveragePrice := AllPrice / Count;
  185. end;
  186.  
  187. procedure TFormTaskSearch.ButtonChoosePrintersClick(Sender: TObject);
  188. var
  189.     IsCorrect: Boolean;
  190.     Size, I, Count, CostRub, CostCop: Integer;
  191.     AveragePrice: Double;
  192. begin
  193.     Count := 0;
  194.     CostRub := 0;
  195.     CostCop := 0;
  196.     IsCorrect := true;
  197.     try
  198.         AssignFile(F, PATH);
  199.         Reset(F);
  200.         Seek(F, 0);
  201.         Size := FileSize(F);
  202.         for I := 0 to (Size - 1) do
  203.         begin
  204.             Read(F, Printer);
  205.             if (Printer.Kind = 'M') and (Printer.Format = ChosenFormat) then
  206.             begin
  207.                 Inc(Count);
  208.                 CostRub := CostRub + Printer.CostRub;
  209.                 CostCop := CostCop + Printer.CostCop;
  210.             end;
  211.         end;
  212.         if Count <> 0 then
  213.         begin
  214.             AveragePrice := GetAveragePrice(CostRub, CostCop, Count);
  215.             try
  216.                 EditAveragePrice.Text := FloatToStr(AveragePrice);
  217.                 EditPrinterCount.Text := IntToStr(Count);
  218.             finally
  219.                 CloseFile(F);
  220.             end;
  221.             ButtonSaveToFile.Enabled := true;
  222.         end
  223.         else
  224.         begin
  225.             UnitError.FormError.LabelError.Caption := 'Не найдено записей, ' +
  226.             'подходящих условию отборки. ';
  227.             UnitError.FormError.ShowModal();
  228.             UnitError.FormError.LabelError.Caption := '';
  229.         end;
  230.     except
  231.         IsCorrect := false;
  232.         UnitError.FormError.LabelError.Caption := 'Ошибка. Нет доступа к фай' +
  233.         'лу. Проверьте наличие файла Records.rdc в папке с приложением, а также' +
  234.         ' доступ к нему. ';
  235.         UnitError.FormError.ShowModal();
  236.         UnitError.FormError.LabelError.Caption := '';
  237.     end;
  238. end;
  239.  
  240. procedure TFormTaskSearch.ButtonExitClick(Sender: TObject);
  241. begin
  242.     EditAveragePrice.Text := '';
  243.     EditPrinterCount.Text := '';
  244.     RadioGroupChooseFormat.ItemIndex := -1;
  245.     ModalResult := mrOk;
  246. end;
  247.  
  248. procedure TFormTaskSearch.ButtonSaveToFileClick(Sender: TObject);
  249. var
  250.     SaveFile: TextFile;
  251.     SavePath, Error: String;
  252.     IsCorrect: Boolean;
  253. begin
  254.     IsCorrect := True;;
  255.     Error := '';
  256.     if SaveDialogTask.Execute() then
  257.     begin
  258.         SavePath := SaveDialogTask.FileName;
  259.         AssignFile(SaveFile, SavePath);
  260.         Try
  261.             Rewrite(SaveFile);
  262.             Try
  263.                 Writeln(SaveFile, 'Количество матричных принтеров с заданным' +
  264.                 ' форматом: ', EditPrinterCount.Text);
  265.                 Writeln(SaveFile, 'Их средняя цена: ', EditAveragePrice.Text)
  266.             Finally
  267.                 CloseFile(SaveFile);
  268.             End;
  269.         Except
  270.             IsCorrect := False;
  271.             Error := 'Нет доступа к файлу';
  272.         End;
  273.         if not(IsCorrect) then
  274.         begin
  275.             UnitError.FormError.LabelError.Caption := 'Ошибка считывания с файла. ' + Error;
  276.             UnitError.FormError.ShowModal();
  277.             UnitError.FormError.LabelError.Caption := '';
  278.         end
  279.         else
  280.             ButtonSaveToFile.Enabled := false;
  281.     end;
  282. end;
  283.  
  284. procedure TFormTaskSearch.RadioGroupChooseFormatClick(Sender: TObject);
  285. begin
  286.     EditAveragePrice.Text := '';
  287.     EditPrinterCount.Text := '';
  288.     ButtonSaveToFile.Enabled := false;
  289.     case RadioGroupChooseFormat.ItemIndex of
  290.         0: ChosenFormat := 1;
  291.         1: ChosenFormat := 2;
  292.         2: ChosenFormat := 3;
  293.         3: ChosenFormat := 4;
  294.         4: ChosenFormat := 5;
  295.         5: ChosenFormat := 6;
  296.     end;
  297. end;
  298.  
  299. end.
  300.  
  301. unit UnitTaskSearch;
  302.  
  303. interface
  304.  
  305. uses
  306.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  307.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Menus;
  308.  
  309. type
  310.   TFormTaskSearch = class(TForm)
  311.     RadioGroupChooseFormat: TRadioGroup;
  312.     ButtonChoosePrinters: TButton;
  313.     EditPrinterCount: TEdit;
  314.     LabelPrinterCount: TLabel;
  315.     LabelAveragePrice: TLabel;
  316.     EditAveragePrice: TEdit;
  317.     ButtonExit: TButton;
  318.     MainMenuTask: TMainMenu;
  319.     ButtonSaveToFile: TMenuItem;
  320.     SaveDialogTask: TSaveDialog;
  321.     procedure RadioGroupChooseFormatClick(Sender: TObject);
  322.     procedure ButtonChoosePrintersClick(Sender: TObject);
  323.     procedure ButtonExitClick(Sender: TObject);
  324.     procedure ButtonSaveToFileClick(Sender: TObject);
  325.   private
  326.     { Private declarations }
  327.   public
  328.     { Public declarations }
  329.   end;
  330.  
  331. var
  332.   FormTaskSearch: TFormTaskSearch;
  333.  
  334. implementation
  335.  
  336. {$R *.dfm}
  337.  
  338. uses UnitError;
  339.  
  340. const
  341.     PATH = 'Records.rcd';
  342.  
  343. Type
  344.     TPrinter = record
  345.         Brand: String[15];
  346.         Kind: Char;
  347.         Format: Integer;
  348.         CostRub, CostCop: Integer;
  349.     end;
  350.  
  351. var
  352.     F: File of TPrinter;
  353.     Printer: TPrinter;
  354.     ChosenFormat: Integer;
  355.  
  356. function GetAveragePrice(Rub, Cop, Count: Integer): Double;
  357. var
  358.     AllRub: Integer;
  359.     AllPrice: Double;
  360. begin
  361.     AllRub := Rub + (Cop div 100);
  362.     AllPrice := AllRub + ((Cop mod 100) / 100);
  363.     GetAveragePrice := AllPrice / Count;
  364. end;
  365.  
  366. procedure TFormTaskSearch.ButtonChoosePrintersClick(Sender: TObject);
  367. var
  368.     IsCorrect: Boolean;
  369.     Size, I, Count, CostRub, CostCop: Integer;
  370.     AveragePrice: Double;
  371. begin
  372.     Count := 0;
  373.     CostRub := 0;
  374.     CostCop := 0;
  375.     IsCorrect := true;
  376.     try
  377.         AssignFile(F, PATH);
  378.         Reset(F);
  379.         Seek(F, 0);
  380.         Size := FileSize(F);
  381.         for I := 0 to (Size - 1) do
  382.         begin
  383.             Read(F, Printer);
  384.             if (Printer.Kind = 'M') and (Printer.Format = ChosenFormat) then
  385.             begin
  386.                 Inc(Count);
  387.                 CostRub := CostRub + Printer.CostRub;
  388.                 CostCop := CostCop + Printer.CostCop;
  389.             end;
  390.         end;
  391.         if Count <> 0 then
  392.         begin
  393.             AveragePrice := GetAveragePrice(CostRub, CostCop, Count);
  394.             try
  395.                 EditAveragePrice.Text := FloatToStr(AveragePrice);
  396.                 EditPrinterCount.Text := IntToStr(Count);
  397.             finally
  398.                 CloseFile(F);
  399.             end;
  400.             ButtonSaveToFile.Enabled := true;
  401.         end
  402.         else
  403.         begin
  404.             UnitError.FormError.LabelError.Caption := 'Не найдено записей, ' +
  405.             'подходящих условию отборки. ';
  406.             UnitError.FormError.ShowModal();
  407.             UnitError.FormError.LabelError.Caption := '';
  408.         end;
  409.     except
  410.         IsCorrect := false;
  411.         UnitError.FormError.LabelError.Caption := 'Ошибка. Нет доступа к фай' +
  412.         'лу. Проверьте наличие файла Records.rdc в папке с приложением, а также' +
  413.         ' доступ к нему. ';
  414.         UnitError.FormError.ShowModal();
  415.         UnitError.FormError.LabelError.Caption := '';
  416.     end;
  417. end;
  418.  
  419. procedure TFormTaskSearch.ButtonExitClick(Sender: TObject);
  420. begin
  421.     EditAveragePrice.Text := '';
  422.     EditPrinterCount.Text := '';
  423.     RadioGroupChooseFormat.ItemIndex := -1;
  424.     ModalResult := mrOk;
  425. end;
  426.  
  427. procedure TFormTaskSearch.ButtonSaveToFileClick(Sender: TObject);
  428. var
  429.     SaveFile: TextFile;
  430.     SavePath, Error: String;
  431.     IsCorrect: Boolean;
  432. begin
  433.     IsCorrect := True;;
  434.     Error := '';
  435.     if SaveDialogTask.Execute() then
  436.     begin
  437.         SavePath := SaveDialogTask.FileName;
  438.         AssignFile(SaveFile, SavePath);
  439.         Try
  440.             Rewrite(SaveFile);
  441.             Try
  442.                 Writeln(SaveFile, 'Количество матричных принтеров с заданным' +
  443.                 ' форматом: ', EditPrinterCount.Text);
  444.                 Writeln(SaveFile, 'Их средняя цена: ', EditAveragePrice.Text)
  445.             Finally
  446.                 CloseFile(SaveFile);
  447.             End;
  448.         Except
  449.             IsCorrect := False;
  450.             Error := 'Нет доступа к файлу';
  451.         End;
  452.         if not(IsCorrect) then
  453.         begin
  454.             UnitError.FormError.LabelError.Caption := 'Ошибка считывания с файла. ' + Error;
  455.             UnitError.FormError.ShowModal();
  456.             UnitError.FormError.LabelError.Caption := '';
  457.         end
  458.         else
  459.             ButtonSaveToFile.Enabled := false;
  460.     end;
  461. end;
  462.  
  463. procedure TFormTaskSearch.RadioGroupChooseFormatClick(Sender: TObject);
  464. begin
  465.     EditAveragePrice.Text := '';
  466.     EditPrinterCount.Text := '';
  467.     ButtonSaveToFile.Enabled := false;
  468.     case RadioGroupChooseFormat.ItemIndex of
  469.         0: ChosenFormat := 1;
  470.         1: ChosenFormat := 2;
  471.         2: ChosenFormat := 3;
  472.         3: ChosenFormat := 4;
  473.         4: ChosenFormat := 5;
  474.         5: ChosenFormat := 6;
  475.     end;
  476. end;
  477.  
  478. end.
  479.  
  480. unit UnitDeleteRecord;
  481.  
  482. interface
  483.  
  484. uses
  485.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  486.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids, Vcl.Menus;
  487.  
  488. type
  489.   TFormDeleteRecord = class(TForm)
  490.     LabelCondition: TLabel;
  491.     ButtonDeleteRecord: TButton;
  492.     Records: TStringGrid;
  493.     LabelDeleteRecord: TLabel;
  494.     EditDeleteRecord: TEdit;
  495.     MainMenuDeleteRecord: TMainMenu;
  496.     OpenDialogDeleteRecord: TOpenDialog;
  497.     ButtonDeleteRecordFromFile: TMenuItem;
  498.     ButtonInstruction: TMenuItem;
  499.     procedure FormShow(Sender: TObject);
  500.     procedure ButtonExitClick(Sender: TObject);
  501.     procedure ComboBoxDeleteRecordKeyPress(Sender: TObject; var Key: Char);
  502.     procedure EditDeleteRecordKeyPress(Sender: TObject; var Key: Char);
  503.     procedure ButtonDeleteRecordClick(Sender: TObject);
  504.     procedure ButtonDeleteRecordFromFileClick(Sender: TObject);
  505.     procedure ButtonInstructionClick(Sender: TObject);
  506.   private
  507.     { Private declarations }
  508.   public
  509.     { Public declarations }
  510.   end;
  511.  
  512. var
  513.   FormDeleteRecord: TFormDeleteRecord;
  514.  
  515. implementation
  516.  
  517. {$R *.dfm}
  518.  
  519. uses UnitError, UnitInstructionDeleteRecord;
  520.  
  521. const
  522.     PATH = 'Records.rcd';
  523.     PATH_DELETE = 'NewRecords.rcd';
  524.     MAX_RUB = 9999;
  525.     MIN_RUB = 1;
  526.     MAX_COP = 99;
  527.     MIN_COP = 0;
  528.     MAX_LENGTH = 15;
  529.     MIN_LENGTH = 1;
  530.     MAX_FORMAT = 6;
  531.     MIN_FORMAT = 1;
  532.     MIN_RECORDS_SIZE = 1;
  533.  
  534. type
  535.     TPrinter = record
  536.         Brand: String[15];
  537.         Kind: Char;
  538.         Format: Integer;
  539.         CostRub: Integer;
  540.         CostCop: Integer;
  541.     end;
  542.  
  543. var
  544.     F: File of TPrinter;
  545.     Printer: TPrinter;
  546.     SizeOfFile: Integer;
  547.  
  548. procedure TFormDeleteRecord.ButtonDeleteRecordClick(Sender: TObject);
  549. var
  550.     TempF: File of TPrinter;
  551.     Number, I: Integer;
  552.     Error: String;
  553.     IsCorrect: Boolean;
  554. begin
  555.     Error := 'Ошибка доступа к файлу' +
  556.     '. Проверьте, находится ли файл Records.rcd в папке с приложением' +
  557.     ', а также доступ к нему. ';
  558.     IsCorrect := true;
  559.     AssignFile(F, PATH);
  560.     AssignFile(TempF, PATH_DELETE);
  561.     try
  562.         Reset(F);
  563.         try
  564.             Number := StrToInt(EditDeleteRecord.Text);
  565.             if not(Number in [1..FileSize(F)]) then
  566.             begin
  567.                 IsCorrect := false;
  568.                 Error := 'Нет записи с таким номером. ';
  569.             end;
  570.         except
  571.             IsCorrect := false;
  572.             Error := 'Некорректно введён номер записи. ';
  573.         end;
  574.         if (IsCorrect) then
  575.         begin
  576.             Rewrite(TempF);
  577.             I := 1;
  578.             while I <= FileSize(F) do
  579.             begin
  580.                 Read(F, Printer);
  581.                 if not(I = Number) then
  582.                     Write(TempF, Printer);
  583.                 Inc(I);
  584.             end;
  585.             CloseFile(TempF);
  586.         end;
  587.         CloseFile(F);
  588.     except
  589.         IsCorrect := False;
  590.         Error := 'Ошибка доступа к файлу' +
  591.         '. Проверьте, находится ли файл Records.rcd в папке с приложением' +
  592.         ', а также доступ к нему. ';
  593.     end;
  594.     if (IsCorrect) then
  595.     begin
  596.         DeleteFile(PATH);
  597.         RenameFile(PATH_DELETE, PATH);
  598.         EditDeleteRecord.Text := '';
  599.         ModalResult := mrOk;
  600.     end
  601.     else
  602.     begin
  603.         UnitError.FormError.LabelError.Caption := Error;
  604.         UnitError.FormError.ShowModal();
  605.         UnitError.FormError.LabelError.Caption := '';
  606.     end;
  607. end;
  608.  
  609. procedure CheckCost(Str: String; var Err: String; var IsCorrect: Boolean; var Rub: Integer; var Cop: Integer);
  610. var
  611.     I: Integer;
  612.     IsFirst: Boolean;
  613. begin
  614.     if (Str = '') then
  615.     begin
  616.         Err := 'В файле не найдено элементов. ';
  617.         IsCorrect := False;
  618.     end
  619.     else
  620.     try
  621.         IsFirst := true;
  622.         I := 1;
  623.         while (I <= Length(Str)) do
  624.         begin
  625.             if (Str[I] = ' ') then
  626.             begin
  627.                 if I = 1 then
  628.                 begin
  629.                     Delete(Str, 1, 1);
  630.                     if (IsFirst) then
  631.                         Dec(I)
  632.                     else
  633.                         Inc(I);
  634.                 end;
  635.                 if (I > 1) and (IsFirst) then
  636.                 begin
  637.                     Rub := StrToInt(Copy(Str, 1, (I - 1)));
  638.                     IsFirst := false;
  639.                     Delete(Str, 1, (I - 1));
  640.                     I := 0;
  641.                 end;
  642.                 if (I > 1) and not(isFirst) then
  643.                 begin
  644.                     Cop := StrToInt(Copy(Str, 1, Length(Str)));
  645.                     I := Length(Str);
  646.                 end;
  647.             end;
  648.             Inc(I);
  649.         end;
  650.         if (Rub > MAX_RUB) or (Rub < MIN_RUB) or
  651.         (Cop > MAX_COP) or (Cop < MIN_COP) then
  652.         begin
  653.             Err := 'Значение цены не входит в допустимый диапазон. ';
  654.             IsCorrect := false;
  655.         end;
  656.     except
  657.         IsCorrect := False;
  658.         Err := 'Обнаружена некорректно записанная цена. ';
  659.     end;
  660. end;
  661.  
  662. procedure TFormDeleteRecord.ButtonDeleteRecordFromFileClick(Sender: TObject);
  663. var
  664.     FileForDelete: TextFile;
  665.     DeletePath, Error, Brand, Cost: String;
  666.     Format, CostRub, CostCop, Number: Integer;
  667.     Kind: Char;
  668.     IsCorrect: Boolean;
  669. begin
  670.     IsCorrect := True;
  671.     If OpenDialogDeleteRecord.Execute() Then
  672.     Begin
  673.         DeletePath := OpenDialogDeleteRecord.FileName;
  674.         AssignFile(FileForDelete, DeletePath);
  675.         Try
  676.             Error := 'Нет доступа к файлу. ';
  677.             Reset(FileForDelete);
  678.             Try
  679.                 Readln(FileForDelete, Number);
  680.                 if (Number < MIN_RECORDS_SIZE) or (Number > SizeOfFile) then
  681.                 begin
  682.                     IsCorrect := false;
  683.                     Error := 'Неверный номер записи. ';
  684.                 end;
  685.             Finally
  686.                 CloseFile(FileForDelete);
  687.             End;
  688.         Except
  689.             IsCorrect := False;
  690.             Error := 'Ошибка считывания с файла. ' + Error;
  691.         End;
  692.         if (IsCorrect) then
  693.         begin
  694.             EditDeleteRecord.Text := IntToStr(Number);
  695.             ButtonDeleteRecordClick(Sender);
  696.         end
  697.         else
  698.         begin
  699.             UnitError.FormError.LabelError.Caption := 'Ошибка. ' + Error;
  700.             UnitError.FormError.ShowModal();
  701.             UnitError.FormError.LabelError.Caption := '';
  702.         end;
  703.     End;
  704. end;
  705.  
  706. procedure TFormDeleteRecord.ButtonExitClick(Sender: TObject);
  707. begin
  708.     ModalResult := mrOk;
  709. end;
  710.  
  711. procedure TFormDeleteRecord.ButtonInstructionClick(Sender: TObject);
  712. begin
  713.     UnitInstructionDeleteRecord.FormInstructionDeleteRecord.ShowModal();
  714. end;
  715.  
  716. procedure TFormDeleteRecord.ComboBoxDeleteRecordKeyPress(Sender: TObject;
  717.   var Key: Char);
  718. begin
  719.     Key := #0;
  720. end;
  721.  
  722. procedure TFormDeleteRecord.EditDeleteRecordKeyPress(Sender: TObject;
  723.   var Key: Char);
  724. begin
  725.     if not(Key in ['0'..'9', #8, #13]) then
  726.         Key := #0;
  727.     if (length(EditDeleteRecord.Text) = 0) and (Key = '0') then
  728.         Key := #0;
  729.     if (Length(EditDeleteRecord.Text) > 0) and (Key = #13) then
  730.         ButtonDeleteRecordClick(Sender);
  731. end;
  732.  
  733. procedure TFormDeleteRecord.FormShow(Sender: TObject);
  734. var
  735.     I: Integer;
  736. begin
  737.     AssignFile(F, PATH);
  738.     try
  739.         Reset(F);
  740.         Seek(F, 0);
  741.         SizeOfFile := FileSize(F);
  742.         Records.RowCount := SizeOfFile + 1;
  743.         I := 1;
  744.         while I <= SizeOfFile do
  745.         begin
  746.             Read(F, Printer);
  747.             Records.Cells[0, I] := IntToStr(I);
  748.             with Printer do
  749.             begin
  750.                 Records.Cells[1, I] := Brand;
  751.                 case Kind of
  752.                     'M': Records.Cells[2, I] := 'Матричный';
  753.                     'J': Records.Cells[2, I] := 'Струйный';
  754.                     'L': Records.Cells[2, I] := 'Лазерный';
  755.                 end;
  756.                 Records.Cells[3, I] := IntToStr(CostRub);
  757.                 Records.Cells[4, I] := IntToStr(CostCop);
  758.                 Records.Cells[5, I] := 'A' + IntToStr(Format);
  759.             end;
  760.             Inc(I);
  761.         end;
  762.         CloseFile(F);
  763.     except
  764.         UnitError.FormError.LabelError.Caption := 'Ошибка доступа к файлу' +
  765.         '. Проверьте, находится ли файл Records.rcd в папке с приложением' +
  766.         ', а также доступ к нему. ';
  767.         UnitError.FormError.ShowModal();
  768.         UnitError.FormError.LabelError.Caption := '';
  769.     end;
  770.     //layot table
  771.     Records.Cells[0, 0] := '№';
  772.     Records.ColWidths[0] := 35;
  773.     Records.Cells[1, 0] := 'Марка';
  774.     Records.ColWidths[1] := 120;
  775.     Records.Cells[2, 0] := 'Тип';
  776.     Records.ColWidths[2] := 120;
  777.     Records.Cells[3, 0] := 'Цена(руб)';
  778.     Records.Cells[4, 0] := 'Цена(коп)';
  779.     Records.Cells[5, 0] := 'Формат печати';
  780.     Records.ColWidths[5] := 135;
  781. end;
  782.  
  783. end.
  784.  
  785. unit UnitCreateNewRecord;
  786.  
  787. interface
  788.  
  789. uses
  790.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  791.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Menus, Vcl.ExtCtrls;
  792.  
  793. type
  794.   TFormCreateNewRecord = class(TForm)
  795.     LabelAddRecord: TLabel;
  796.     MainMenuCreateNewRecord: TMainMenu;
  797.     LabelBrand: TLabel;
  798.     EditPrinterBrand: TEdit;
  799.     EditCostRub: TEdit;
  800.     LabelPrintFormat: TLabel;
  801.     LabelCost: TLabel;
  802.     ButtonAddRecordFromFile: TMenuItem;
  803.     ButtonAdd: TButton;
  804.     ButtonExit: TButton;
  805.     EditCostCop: TEdit;
  806.     RadioButtonA1: TRadioButton;
  807.     RadioButtonA2: TRadioButton;
  808.     RadioButtonA3: TRadioButton;
  809.     RadioButtonA6: TRadioButton;
  810.     RadioButtonA5: TRadioButton;
  811.     RadioButtonA4: TRadioButton;
  812.     RadioGroupType: TRadioGroup;
  813.     ButtonInstructionForCreate: TMenuItem;
  814.     OpenDialogForCreateRecord: TOpenDialog;
  815.     procedure ButtonExitClick(Sender: TObject);
  816.     procedure EditCostRubKeyPress(Sender: TObject; var Key: Char);
  817.     procedure EditCostCopKeyPress(Sender: TObject; var Key: Char);
  818.     procedure ButtonAddClick(Sender: TObject);
  819.     procedure RadioButtonA1Click(Sender: TObject);
  820.     procedure RadioButtonA2Click(Sender: TObject);
  821.     procedure RadioButtonA3Click(Sender: TObject);
  822.     procedure RadioButtonA4Click(Sender: TObject);
  823.     procedure RadioButtonA5Click(Sender: TObject);
  824.     procedure RadioButtonA6Click(Sender: TObject);
  825.     procedure RadioGroupTypeClick(Sender: TObject);
  826.     procedure ButtonAddRecordFromFileClick(Sender: TObject);
  827.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  828.     procedure ButtonInstructionForCreateClick(Sender: TObject);
  829.   private
  830.     { Private declarations }
  831.   public
  832.     { Public declarations }
  833.   end;
  834.  
  835. var
  836.   FormCreateNewRecord: TFormCreateNewRecord;
  837.  
  838. implementation
  839.  
  840. {$R *.dfm}
  841.  
  842. uses Lab_4_1_Form, UnitError, UnitInstructionCreateRecord;
  843.  
  844. const
  845.     MAX_RUB = 9999;
  846.     MIN_RUB = 1;
  847.     MAX_COP = 99;
  848.     MIN_COP = 0;
  849.     PATH = 'Records.rcd';
  850.     MAX_LENGTH = 15;
  851.     MIN_LENGTH = 1;
  852.     MAX_FORMAT = 6;
  853.     MIN_FORMAT = 1;
  854.  
  855. type
  856.     TPrinter = record
  857.         Brand: String[15];
  858.         Kind: Char;
  859.         Format: Integer;
  860.         CostRub: Integer;
  861.         CostCop: Integer;
  862.     end;
  863.  
  864. var
  865.     F: file of TPrinter;
  866.     Printer: TPrinter;
  867.     Size: Integer;
  868.  
  869. procedure TFormCreateNewRecord.ButtonAddClick(Sender: TObject);
  870. var
  871.     IsCorrect: Boolean;
  872.     Error: String;
  873. begin
  874.     IsCorrect := true;
  875.     Error := '';
  876.     try
  877.         if (Length(EditPrinterBrand.Text) = 0) then
  878.         begin
  879.             Error := Error + 'Не введено название марки. ';
  880.             IsCorrect := false;
  881.         end;
  882.         if (RadioGroupType.ItemIndex = -1) then
  883.         begin
  884.             Error := Error + 'Не выбран тип принтера. ';
  885.             IsCorrect := false;
  886.         end;
  887.         Printer.CostRub := StrToInt(EditCostRub.Text);
  888.         if (Printer.CostRub < MIN_RUB) or (Printer.CostRub > MAX_RUB) then
  889.         begin
  890.             Error := Error + 'Значение стоимости(рубли) неверного диаипазона. ';
  891.             IsCorrect := false;
  892.         end;
  893.         if not(Length(EditCostCop.Text) = 0) then
  894.         begin
  895.             Printer.CostCop := StrToInt(EditCostCop.Text);
  896.             if ((Printer.CostCop < MIN_COP) or (Printer.CostCop > MAX_COP)) then
  897.             begin
  898.                 Error := Error + 'Значение стоимости(копейки) неверного диаипазона. ';
  899.                 IsCorrect := false;
  900.             end;
  901.         end
  902.         else
  903.             Printer.CostCop := 0;
  904.         if not(RadioButtonA1.Checked) and not(RadioButtonA2.Checked) and
  905.         not(RadioButtonA3.Checked) and not(RadioButtonA4.Checked) and
  906.         not(RadioButtonA5.Checked) and not(RadioButtonA6.Checked) then
  907.         begin
  908.             Error := Error + 'Не выбран формат(ы) печати принтера. ';
  909.             IsCorrect := false;
  910.         end;
  911.     except
  912.         IsCorrect := false;
  913.         Error := Error + 'Некорректно введено значение цены';
  914.     end;
  915.     if (IsCorrect) then
  916.     begin
  917.         Printer.Brand := EditPrinterBrand.Text;
  918.         try
  919.             AssignFile(F, PATH);
  920.             Reset(F);
  921.             Seek(F, FileSize(F));
  922.             try
  923.                 Write(F, Printer);
  924.             finally
  925.                 CloseFile(F);
  926.             end;
  927.         except
  928.             UnitError.FormError.LabelError.Caption := 'Ошибка доступа к файлу' +
  929.             '. Проверьте, находится ли файл Records.rcd в папке с приложением' +
  930.             ', а также доступ к нему. ';
  931.             UnitError.FormError.ShowModal();
  932.             UnitError.FormError.LabelError.Caption := '';
  933.         end;
  934.     end
  935.     else
  936.     begin
  937.         UnitError.FormError.LabelError.Caption := 'Ошибка. ' + Error;
  938.         UnitError.FormError.ShowModal();
  939.         UnitError.FormError.LabelError.Caption := '';
  940.     end;
  941.     //clear record
  942.     EditPrinterBrand.Text := '';
  943.     RadioGroupType.ItemIndex := -1;
  944.     EditCostRub.Text := '';
  945.     EditCostCop.Text := '';
  946.     RadioButtonA1.Checked := False;
  947.     RadioButtonA2.Checked := False;
  948.     RadioButtonA3.Checked := False;
  949.     RadioButtonA4.Checked := False;
  950.     RadioButtonA5.Checked := False;
  951.     RadioButtonA6.Checked := False;
  952. end;
  953.  
  954. procedure CheckCost(Str: String; var Err: String; var IsCorrect: Boolean; var Rub: Integer; var Cop: Integer);
  955. var
  956.     I: Integer;
  957.     IsFirst: Boolean;
  958. begin
  959.     if (Str = '') then
  960.     begin
  961.         Err := 'В файле не найдено элементов. ';
  962.         IsCorrect := False;
  963.     end
  964.     else
  965.     try
  966.         IsFirst := true;
  967.         I := 1;
  968.         while (I <= Length(Str)) do
  969.         begin
  970.             if (Str[I] = ' ') then
  971.             begin
  972.                 if I = 1 then
  973.                 begin
  974.                     Delete(Str, 1, 1);
  975.                     if (IsFirst) then
  976.                         Dec(I)
  977.                     else
  978.                         Inc(I);
  979.                 end;
  980.                 if (I > 1) and (IsFirst) then
  981.                 begin
  982.                     Rub := StrToInt(Copy(Str, 1, (I - 1)));
  983.                     IsFirst := false;
  984.                     Delete(Str, 1, (I - 1));
  985.                     I := 0;
  986.                 end;
  987.                 if (I > 1) and not(isFirst) then
  988.                 begin
  989.                     Cop := StrToInt(Copy(Str, 1, Length(Str)));
  990.                     I := Length(Str);
  991.                 end;
  992.             end;
  993.             Inc(I);
  994.         end;
  995.         if (Rub > MAX_RUB) or (Rub < MIN_RUB) or
  996.         (Cop > MAX_COP) or (Cop < MIN_COP) then
  997.         begin
  998.             Err := 'Значение цены не входит в допустимый диапазон. ';
  999.             IsCorrect := false;
  1000.         end;
  1001.     except
  1002.         IsCorrect := False;
  1003.         Err := 'Обнаружена некорректно записанная цена. ';
  1004.     end;
  1005. end;
  1006.  
  1007. procedure TFormCreateNewRecord.ButtonAddRecordFromFileClick(Sender: TObject);
  1008. var
  1009.     F: TextFile;
  1010.     Path, Error, Brand, Cost: String;
  1011.     Format, CostRub, CostCop: Integer;
  1012.     Kind: Char;
  1013.     IsCorrect: Boolean;
  1014. begin
  1015.     IsCorrect := True;
  1016.     If OpenDialogForCreateRecord.Execute() Then
  1017.     Begin
  1018.         Path := OpenDialogForCreateRecord.FileName;
  1019.         AssignFile(F, Path);
  1020.         Try
  1021.             Error := 'Нет доступа к файлу. ';
  1022.             Reset(F);
  1023.             Try
  1024.                 Error := '';
  1025.                 Readln(F, Brand);
  1026.                 if (Length(Brand) < MIN_LENGTH) or (Length(Brand) > MAX_LENGTH) then
  1027.                 begin
  1028.                     IsCorrect := false;
  1029.                     Error := Error + 'Неправильная длина названия марки принтера. ';
  1030.                 end;
  1031.                 Readln(F, Kind);
  1032.                 if not(Kind in ['M', 'L', 'J', 'm', 'l', 'j']) then
  1033.                 begin
  1034.                     IsCorrect := false;
  1035.                     Error := Error + 'Неизвестный тип принтера. ';
  1036.                 end;
  1037.                 Readln(F, Cost);
  1038.                 CheckCost(Cost, Error, IsCorrect, CostRub, CostCop);
  1039.                 try
  1040.                     Readln(F, Format);
  1041.                     if (Format < MIN_FORMAT) or (Format > MAX_FORMAT) then
  1042.                     begin
  1043.                         IsCorrect := false;
  1044.                         Error := Error + 'Недопустимый формат принтера. ';
  1045.                     end;
  1046.                 except
  1047.                     IsCorrect := false;
  1048.                     Error := Error + 'Некорректное значение формата принтера. ';
  1049.                 end;
  1050.             Finally
  1051.                 CloseFile(F);
  1052.             End;
  1053.         Except
  1054.             IsCorrect := False;
  1055.             Error := 'Ошибка считывания с файла. ' + Error;
  1056.         End;
  1057.         if (IsCorrect) then
  1058.         begin
  1059.             EditPrinterBrand.Text := UTF8ToAnsi(Brand);
  1060.             if (Kind in ['M', 'm']) then
  1061.             begin
  1062.                 RadioGroupType.ItemIndex := 0;
  1063.                 Printer.Kind := 'M';
  1064.             end;
  1065.             if (Kind in ['J', 'j']) then
  1066.             begin
  1067.                 RadioGroupType.ItemIndex := 1;
  1068.                 Printer.Kind := 'J';
  1069.             end;
  1070.             if (Kind in ['L', 'l']) then
  1071.             begin
  1072.                 RadioGroupType.ItemIndex := 2;
  1073.                 Printer.Kind := 'L';
  1074.             end;
  1075.             EditCostRub.Text := IntToStr(CostRub);
  1076.             EditCostCop.Text := IntToStr(CostCop);
  1077.             case Format of
  1078.             1:
  1079.                 begin
  1080.                     RadioButtonA1.Checked := true;
  1081.                     Printer.Format := 1;
  1082.                 end;
  1083.             2:
  1084.                 begin
  1085.                     RadioButtonA2.Checked := true;
  1086.                     Printer.Format := 2;
  1087.                 end;
  1088.             3:
  1089.                 begin
  1090.                     RadioButtonA3.Checked := true;
  1091.                     Printer.Format := 3;
  1092.                 end;
  1093.             4:
  1094.                 begin
  1095.                     RadioButtonA4.Checked := true;
  1096.                     Printer.Format := 4;
  1097.                 end;
  1098.             5:
  1099.                 begin
  1100.                     RadioButtonA5.Checked := true;
  1101.                     Printer.Format := 5;
  1102.                 end;
  1103.             6:
  1104.                 begin
  1105.                     RadioButtonA6.Checked := true;
  1106.                     Printer.Format := 6;
  1107.                 end;
  1108.             end;
  1109.         end
  1110.         else
  1111.         begin
  1112.             UnitError.FormError.LabelError.Caption := 'Ошибка. ' + Error;
  1113.             UnitError.FormError.ShowModal();
  1114.             UnitError.FormError.LabelError.Caption := '';
  1115.         end;
  1116.     End;
  1117. end;
  1118.  
  1119. procedure TFormCreateNewRecord.ButtonExitClick(Sender: TObject);
  1120. begin
  1121.     EditPrinterBrand.Text := '';
  1122.     RadioGroupType.ItemIndex := -1;
  1123.     EditCostRub.Text := '';
  1124.     EditCostCop.Text := '';
  1125.     RadioButtonA1.Checked := False;
  1126.     RadioButtonA2.Checked := False;
  1127.     RadioButtonA3.Checked := False;
  1128.     RadioButtonA4.Checked := False;
  1129.     RadioButtonA5.Checked := False;
  1130.     RadioButtonA6.Checked := False;
  1131.     ModalResult := mrOk;
  1132. end;
  1133.  
  1134. procedure TFormCreateNewRecord.ButtonInstructionForCreateClick(Sender: TObject);
  1135. begin
  1136.     UnitInstructionCreateRecord.FormInstructionCreateRecord.ShowModal();
  1137. end;
  1138.  
  1139. procedure TFormCreateNewRecord.EditCostCopKeyPress(Sender: TObject;
  1140.   var Key: Char);
  1141. begin
  1142.     if not (Key in ['0'..'9', #8]) then
  1143.         Key := #0;
  1144.     if (Length(EditCostCop.Text) = 1) and (EditCostCop.Text[1] = '0') and not(Length(EditCostCop.SelText) > 0) and not(Key = #8) then
  1145.         Key := #0;
  1146. end;
  1147.  
  1148. procedure TFormCreateNewRecord.EditCostRubKeyPress(Sender: TObject;
  1149.   var Key: Char);
  1150. begin
  1151.     if not (Key in ['0'..'9', #8]) then
  1152.         Key := #0;
  1153.     if (Length(EditCostRub.Text) = 0) and (Key = '0') then
  1154.         Key := #0;
  1155.     if (Length(EditCostRub.SelText) > 0) and (Key = '0') then
  1156.         Key := #0;
  1157. end;
  1158.  
  1159. procedure TFormCreateNewRecord.FormClose(Sender: TObject;
  1160.   var Action: TCloseAction);
  1161. begin
  1162.     EditPrinterBrand.Text := '';
  1163.     RadioGroupType.ItemIndex := -1;
  1164.     EditCostRub.Text := '';
  1165.     EditCostCop.Text := '';
  1166.     RadioButtonA1.Checked := False;
  1167.     RadioButtonA2.Checked := False;
  1168.     RadioButtonA3.Checked := False;
  1169.     RadioButtonA4.Checked := False;
  1170.     RadioButtonA5.Checked := False;
  1171.     RadioButtonA6.Checked := False;
  1172. end;
  1173.  
  1174. procedure TFormCreateNewRecord.RadioButtonA1Click(Sender: TObject);
  1175. begin
  1176.     Printer.Format := 1;
  1177. end;
  1178.  
  1179. procedure TFormCreateNewRecord.RadioButtonA2Click(Sender: TObject);
  1180. begin
  1181.     Printer.Format := 2;
  1182. end;
  1183.  
  1184. procedure TFormCreateNewRecord.RadioButtonA3Click(Sender: TObject);
  1185. begin
  1186.     Printer.Format := 3;
  1187. end;
  1188.  
  1189. procedure TFormCreateNewRecord.RadioButtonA4Click(Sender: TObject);
  1190. begin
  1191.     Printer.Format := 4;
  1192. end;
  1193.  
  1194. procedure TFormCreateNewRecord.RadioButtonA5Click(Sender: TObject);
  1195. begin
  1196.     Printer.Format := 5;
  1197. end;
  1198.  
  1199. procedure TFormCreateNewRecord.RadioButtonA6Click(Sender: TObject);
  1200. begin
  1201.     Printer.Format := 6;
  1202. end;
  1203.  
  1204. procedure TFormCreateNewRecord.RadioGroupTypeClick(Sender: TObject);
  1205. begin
  1206.     if (RadioGroupType.ItemIndex = 0) then
  1207.         Printer.Kind := 'M';
  1208.     if (RadioGroupType.ItemIndex = 1) then
  1209.         Printer.Kind := 'J';
  1210.     if (RadioGroupType.ItemIndex = 2) then
  1211.         Printer.Kind := 'L';
  1212. end;
  1213.  
  1214. end.
  1215.  
  1216. unit UnitChangeRecord;
  1217.  
  1218. interface
  1219.  
  1220. uses
  1221.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  1222.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids, Vcl.Menus;
  1223.  
  1224. type
  1225.   TFormChangeRecord = class(TForm)
  1226.     Records: TStringGrid;
  1227.     ButtonSaveAndExit: TButton;
  1228.     MainMenuChangeRecord: TMainMenu;
  1229.     OpenDialogChangeRecord: TOpenDialog;
  1230.     ButtonUseProofFile: TMenuItem;
  1231.     ButtonInstruction: TMenuItem;
  1232.     procedure FormShow(Sender: TObject);
  1233.     procedure RecordsSelectCell(Sender: TObject; ACol, ARow: Integer;
  1234.       var CanSelect: Boolean);
  1235.     procedure RecordsGetEditMask(Sender: TObject; ACol, ARow: Integer;
  1236.       var Value: string);
  1237.     procedure ButtonSaveAndExitClick(Sender: TObject);
  1238.     procedure ButtonUseProofFileClick(Sender: TObject);
  1239.     procedure ButtonInstructionClick(Sender: TObject);
  1240.     procedure RecordsKeyPress(Sender: TObject; var Key: Char);
  1241.   private
  1242.     { Private declarations }
  1243.   public
  1244.     { Public declarations }
  1245.   end;
  1246.  
  1247. var
  1248.   FormChangeRecord: TFormChangeRecord;
  1249.  
  1250. implementation
  1251.  
  1252. {$R *.dfm}
  1253.  
  1254. uses UnitError, UnitInstructionChangeRecord;
  1255.  
  1256. const
  1257.     PATH = 'Records.rcd';
  1258.     PATH_REWRITE = 'NewRecords.rcd';
  1259.     MAX_RUB = 9999;
  1260.     MIN_RUB = 1;
  1261.     MAX_COP = 99;
  1262.     MIN_COP = 0;
  1263.     MAX_LENGTH = 15;
  1264.     MIN_LENGTH = 1;
  1265.     MAX_FORMAT = 6;
  1266.     MIN_FORMAT = 1;
  1267.     MIN_RECORDS_SIZE = 1;
  1268.  
  1269. type
  1270.     TPrinter = record
  1271.         Brand: String[15];
  1272.         Kind: Char;
  1273.         Format: Integer;
  1274.         CostRub: Integer;
  1275.         CostCop: Integer;
  1276.     end;
  1277.  
  1278. var
  1279.     F: File of TPrinter;
  1280.     Printer: TPrinter;
  1281.     SizeOfFile: Integer;
  1282.  
  1283. procedure TFormChangeRecord.ButtonInstructionClick(Sender: TObject);
  1284. begin
  1285.     UnitInstructionChangeRecord.FormInstructionChangeRecord.ShowModal();
  1286. end;
  1287.  
  1288. procedure TFormChangeRecord.ButtonSaveAndExitClick(Sender: TObject);
  1289. var
  1290.     NewFile: File of TPrinter;
  1291.     IsCorrect: Boolean;
  1292.     Error: String;
  1293.     I: Integer;
  1294. begin
  1295.     I := 1;
  1296.     IsCorrect := true;
  1297.     while (IsCorrect) and (I <= SizeOfFile) do
  1298.     begin
  1299.         Error := '';
  1300.         try
  1301.             if (Length(Records.Cells[1, I]) < MIN_LENGTH) or
  1302.             (Length(Records.Cells[1, I]) > MAX_LENGTH) then
  1303.             begin
  1304.                 Error := Error + 'Не введено название марки в записи №' +
  1305.                 IntToStr(I) + '. ';
  1306.                 IsCorrect := false;
  1307.             end;
  1308.             if (Length(Records.Cells[2, I]) = 0) then
  1309.             begin
  1310.                 Error := Error + 'Не введен тип принтера в записи №' +
  1311.                 IntToStr(I) + '. ';
  1312.                 IsCorrect := false;
  1313.             end;
  1314.             if not(Records.Cells[2, I] = 'Матричный') and
  1315.             not(Records.Cells[2, I] = 'Струйный') and
  1316.             not(Records.Cells[2, I] = 'Лазерный') then
  1317.             begin
  1318.                 IsCorrect := false;
  1319.                 Error := Error + 'Неизвестный тип принтера. Проверьте '
  1320.                 + 'правильность написания типа принтера в записи №' +
  1321.                 IntToStr(I) + '. ';
  1322.             end;
  1323.             Printer.CostRub := StrToInt(Records.Cells[3, I]);
  1324.             if (Printer.CostRub < MIN_RUB) or (Printer.CostRub > MAX_RUB) then
  1325.             begin
  1326.                 Error := Error + 'Значение стоимости(рубли) неверного диапаз' +
  1327.                 'она в записи №' + IntToStr(I) + '. ';
  1328.                 IsCorrect := false;
  1329.             end;
  1330.             if not(Length(Records.Cells[4, I]) = 0) then
  1331.             begin
  1332.                 Printer.CostCop := StrToInt(Records.Cells[4, I]);
  1333.                 if ((Printer.CostCop < MIN_COP) or (Printer.CostCop > MAX_COP))
  1334.                 then
  1335.                 begin
  1336.                     Error := Error + 'Значение стоимости(копейки) неверного ' +
  1337.                     'диапазона в записи №' + IntToStr(I) + '. ';
  1338.                     IsCorrect := false;
  1339.                 end;
  1340.             end
  1341.             else
  1342.                 Printer.CostCop := 0;
  1343.             if (Length(Records.Cells[5, I]) = 0) or (Length(Records.Cells[5, I])
  1344.              = 1) then
  1345.             begin
  1346.                 IsCorrect := false;
  1347.                 Error := Error + 'Не введен формат принтера в записи №' +
  1348.                 IntToStr(I) + '. ';
  1349.             end
  1350.             else
  1351.             begin
  1352.                 if not(Records.Cells[5, I][1] = 'A') then
  1353.                 begin
  1354.                     IsCorrect := false;
  1355.                     Error := Error + 'Название формата принтера должно начина' +
  1356.                     'ться с заглавной буквы А';
  1357.                 end
  1358.                 else
  1359.                 begin
  1360.                     if not(Records.Cells[5, I][2] in ['1'..'6']) then
  1361.                     begin
  1362.                         IsCorrect := false;
  1363.                         Error := Error + 'Выбран неиспользуемый номер формата '
  1364.                         + 'принтера. ';
  1365.                     end
  1366.                     else
  1367.                         Printer.Format := StrToInt(Records.Cells[5, I][2]);
  1368.                 end;
  1369.             end;
  1370.         except
  1371.             IsCorrect := false;
  1372.             Error := Error + 'Найдено некорректно введённое значение цены. ';
  1373.         end;
  1374.         if (IsCorrect) then
  1375.         begin
  1376.             Printer.Brand := Records.Cells[1, I];;
  1377.             if (Records.Cells[2, I] = 'Матричный') then
  1378.                 Printer.Kind := 'M';
  1379.             if (Records.Cells[2, I] = 'Струйный') then
  1380.                 Printer.Kind := 'J';
  1381.             if (Records.Cells[2, I] = 'Лазерный') then
  1382.                 Printer.Kind := 'L';
  1383.             try
  1384.                 AssignFile(NewFile, PATH_REWRITE);
  1385.                 Reset(NewFile);
  1386.                 Seek(NewFile, FileSize(NewFile));
  1387.                 try
  1388.                     Write(NewFile, Printer);
  1389.                 finally
  1390.                     CloseFile(NewFile);
  1391.                 end;
  1392.             except
  1393.                 UnitError.FormError.LabelError.Caption := 'Ошибка доступа к ' +
  1394.                 'файлу. Проверьте, находится ли файл NewRecords.rcd в папке с ' +
  1395.                 'приложением, а также доступ к нему. ';
  1396.                 UnitError.FormError.ShowModal();
  1397.                 UnitError.FormError.LabelError.Caption := '';
  1398.             end;
  1399.         end
  1400.         else
  1401.         begin
  1402.             UnitError.FormError.LabelError.Caption := 'Ошибка. ' + Error;
  1403.             UnitError.FormError.ShowModal();
  1404.             UnitError.FormError.LabelError.Caption := '';
  1405.         end;
  1406.         Inc(I);
  1407.     end;
  1408.     if (IsCorrect) then
  1409.     begin
  1410.         DeleteFile(PATH);
  1411.         RenameFile(PATH_REWRITE, PATH);
  1412.         ModalResult := mrOk;
  1413.     end;
  1414. end;
  1415.  
  1416. procedure CheckCost(Str: String; var Err: String; var IsCorrect: Boolean; var Rub: Integer; var Cop: Integer);
  1417. var
  1418.     I: Integer;
  1419.     IsFirst: Boolean;
  1420. begin
  1421.     if (Str = '') then
  1422.     begin
  1423.         Err := 'В файле не найдено элементов. ';
  1424.         IsCorrect := False;
  1425.     end
  1426.     else
  1427.     try
  1428.         IsFirst := true;
  1429.         I := 1;
  1430.         while (I <= Length(Str)) do
  1431.         begin
  1432.             if (Str[I] = ' ') then
  1433.             begin
  1434.                 if I = 1 then
  1435.                 begin
  1436.                     Delete(Str, 1, 1);
  1437.                     if (IsFirst) then
  1438.                         Dec(I)
  1439.                     else
  1440.                         Inc(I);
  1441.                 end;
  1442.                 if (I > 1) and (IsFirst) then
  1443.                 begin
  1444.                     Rub := StrToInt(Copy(Str, 1, (I - 1)));
  1445.                     IsFirst := false;
  1446.                     Delete(Str, 1, (I - 1));
  1447.                     I := 0;
  1448.                 end;
  1449.                 if (I > 1) and not(isFirst) then
  1450.                 begin
  1451.                     Cop := StrToInt(Copy(Str, 1, Length(Str)));
  1452.                     I := Length(Str);
  1453.                 end;
  1454.             end;
  1455.             Inc(I);
  1456.         end;
  1457.         if (Rub > MAX_RUB) or (Rub < MIN_RUB) or
  1458.         (Cop > MAX_COP) or (Cop < MIN_COP) then
  1459.         begin
  1460.             Err := 'Значение цены не входит в допустимый диапазон. ';
  1461.             IsCorrect := false;
  1462.         end;
  1463.     except
  1464.         IsCorrect := False;
  1465.         Err := 'Обнаружена некорректно записанная цена. ';
  1466.     end;
  1467. end;
  1468.  
  1469. procedure TFormChangeRecord.ButtonUseProofFileClick(Sender: TObject);
  1470. var
  1471.     F: TextFile;
  1472.     Path, Error, Brand, Cost: String;
  1473.     Format, CostRub, CostCop, Number: Integer;
  1474.     Kind: Char;
  1475.     IsCorrect: Boolean;
  1476.     NewPrinter: TPrinter;
  1477. begin
  1478.     IsCorrect := True;
  1479.     If OpenDialogChangeRecord.Execute() Then
  1480.     Begin
  1481.         Path := OpenDialogChangeRecord.FileName;
  1482.         AssignFile(F, Path);
  1483.         Try
  1484.             Error := 'Нет доступа к файлу. ';
  1485.             Reset(F);
  1486.             Try
  1487.                 Error := '';
  1488.                 Readln(F, Number);
  1489.                 if (Number < MIN_RECORDS_SIZE) or (Number > SizeOfFile) then
  1490.                 begin
  1491.                     IsCorrect := false;
  1492.                     Error := Error + 'Неверный номер записи. ';
  1493.                 end;
  1494.                 Readln(F, Brand);
  1495.                 if (Length(Brand) < MIN_LENGTH) or (Length(Brand) > MAX_LENGTH) then
  1496.                 begin
  1497.                     IsCorrect := false;
  1498.                     Error := Error + 'Неправильная длина названия марки принтера. ';
  1499.                 end;
  1500.                 Readln(F, Kind);
  1501.                 if not(Kind in ['M', 'L', 'J', 'm', 'l', 'j']) then
  1502.                 begin
  1503.                     IsCorrect := false;
  1504.                     Error := Error + 'Неизвестный тип принтера. ';
  1505.                 end;
  1506.                 Readln(F, Cost);
  1507.                 CheckCost(Cost, Error, IsCorrect, CostRub, CostCop);
  1508.                 try
  1509.                     Readln(F, Format);
  1510.                     if (Format < MIN_FORMAT) or (Format > MAX_FORMAT) then
  1511.                     begin
  1512.                         IsCorrect := false;
  1513.                         Error := Error + 'Недопустимый формат принтера. ';
  1514.                     end;
  1515.                 except
  1516.                     IsCorrect := false;
  1517.                     Error := Error + 'Некорректное значение формата принтера. ';
  1518.                 end;
  1519.             Finally
  1520.                 CloseFile(F);
  1521.             End;
  1522.         Except
  1523.             IsCorrect := False;
  1524.             Error := 'Ошибка считывания с файла. ' + Error;
  1525.         End;
  1526.         if (IsCorrect) then
  1527.         begin
  1528.             Records.Cells[1, Number] := UTF8ToAnsi(Brand);
  1529.             if (Kind in ['M', 'm']) then
  1530.             begin
  1531.                 Records.Cells[2, Number] := 'Матричный';
  1532.             end;
  1533.             if (Kind in ['J', 'j']) then
  1534.             begin
  1535.                 Records.Cells[2, Number] := 'Струйный';
  1536.             end;
  1537.             if (Kind in ['L', 'l']) then
  1538.             begin
  1539.                 Records.Cells[2, Number] := 'Лазерный';
  1540.             end;
  1541.             Records.Cells[3, Number] := IntToStr(CostRub);
  1542.             Records.Cells[4, Number] := IntToStr(CostCop);
  1543.             Records.Cells[5, Number] := 'A' + IntToStr(Format);
  1544.         end
  1545.         else
  1546.         begin
  1547.             UnitError.FormError.LabelError.Caption := 'Ошибка. ' + Error;
  1548.             UnitError.FormError.ShowModal();
  1549.             UnitError.FormError.LabelError.Caption := '';
  1550.         end;
  1551.     End;
  1552. end;
  1553.  
  1554. procedure TFormChangeRecord.FormShow(Sender: TObject);
  1555. var
  1556.     I: Integer;
  1557.     New: File of TPrinter;
  1558. begin
  1559.     AssignFile(F, PATH);
  1560.     AssignFile(New, PATH_REWRITE);
  1561.     try
  1562.         Rewrite(New);
  1563.         CloseFile(New);
  1564.         Reset(F);
  1565.         Seek(F, 0);
  1566.         SizeOfFile := FileSize(F);
  1567.         Records.RowCount := SizeOfFile + 1;
  1568.         I := 1;
  1569.         while I <= SizeOfFile do
  1570.         begin
  1571.             Read(F, Printer);
  1572.             Records.Cells[0, I] := IntToStr(I);
  1573.             with Printer do
  1574.             begin
  1575.                 Records.Cells[1, I] := Brand;
  1576.                 case Kind of
  1577.                     'M': Records.Cells[2, I] := 'Матричный';
  1578.                     'J': Records.Cells[2, I] := 'Струйный';
  1579.                     'L': Records.Cells[2, I] := 'Лазерный';
  1580.                 end;
  1581.                 Records.Cells[3, I] := IntToStr(CostRub);
  1582.                 Records.Cells[4, I] := IntToStr(CostCop);
  1583.                 Records.Cells[5, I] := 'A' + IntToStr(Format);
  1584.             end;
  1585.             Inc(I);
  1586.         end;
  1587.         CloseFile(F);
  1588.     except
  1589.         UnitError.FormError.LabelError.Caption := 'Ошибка доступа к файлу' +
  1590.         '. Проверьте, находится ли файл Records.rcd в папке с приложением' +
  1591.         ', а также доступ к нему. ';
  1592.         UnitError.FormError.ShowModal();
  1593.         UnitError.FormError.LabelError.Caption := '';
  1594.     end;
  1595.     //layot table
  1596.     Records.Cells[0, 0] := '№';
  1597.     Records.ColWidths[0] := 35;
  1598.     Records.Cells[1, 0] := 'Марка';
  1599.     Records.ColWidths[1] := 120;
  1600.     Records.Cells[2, 0] := 'Тип';
  1601.     Records.ColWidths[2] := 120;
  1602.     Records.Cells[3, 0] := 'Цена(руб)';
  1603.     Records.Cells[4, 0] := 'Цена(коп)';
  1604.     Records.Cells[5, 0] := 'Формат печати';
  1605.     Records.ColWidths[5] := 135;
  1606. end;
  1607.  
  1608. procedure TFormChangeRecord.RecordsGetEditMask(Sender: TObject; ACol,
  1609.   ARow: Integer; var Value: string);
  1610. begin
  1611.     if (ACol = 3) and (ARow > 0) then
  1612.         Value := '0999;0; ';
  1613.     if (ACol = 4) and (ARow > 0) then
  1614.         Value := '09;1; ';
  1615.     if (ACol = 5) and (ARow > 0) then
  1616.         Value := 'L0;1; ';
  1617. end;
  1618.  
  1619. procedure TFormChangeRecord.RecordsKeyPress(Sender: TObject; var Key: Char);
  1620. begin
  1621.     if Key = #13 then
  1622.         ButtonSaveAndExitClick(Sender);
  1623. end;
  1624.  
  1625. procedure TFormChangeRecord.RecordsSelectCell(Sender: TObject; ACol,
  1626.   ARow: Integer; var CanSelect: Boolean);
  1627. begin
  1628.     if (ARow = 0) and (ACol = 0) then
  1629.         CanSelect := false;
  1630. end;
  1631.  
  1632. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement