Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка DELPHI.DOC
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.73 Mб
Скачать

Пример 17

Пусть имеется некоторый текст, его необходимо занести в текстовый файл, зашифровать, переписывая в другой файл, и, таким образом, подготовить для отправки, например, по электронной почте.

Пусть шифрование производится методом простой одноалфавитной подстановки. Все символы исходного файла заменяются кодами, отличающимися от исходных символов на определенную величину, которая меняется от символа к символу. Для кодирования с помощью генератора случайных чисел создается кодировочная таблица, например, из 23 чисел (адресат знает о числе 23). Эта таблица представляет собой алфавит кодирования. Текст разбивается на группы символов, включая 13 10, и каждый символ изменяется в соответствии с кодировочной таблицей, т.е. код первого символа увеличивается на первое число из таблицы, код второго - на второе число из таблицы и т.д. Для осуществления дешифровки кодировочную таблицу также необходимо записать в итоговый файл.

Компонент tmainmenu

При решении данной задачи построим меню с помощью компонента TMainMenu. Это меню можно представить в виде табл. 13. Список объектов меню (строк меню, табл. 13) в TMainMenu содержится в свойстве Items. Строки меню имеют тип TMenuItems. TmenuItems в свою очередь содержит свойство Items, с помощью которого можно создавать подменю. Текст строки меню записывается в свойстве Caption свойства Items.

Таблица 13

Меню примера 17 (Caption).

Исходный файл

Кодирование

Проверка

Выход

Новый файл

Таблица кодировки

Добавить

Кодирование файла

Прочитать

В табл. 14 приводятся варианты имён пунктов меню, которые используются далее в программе.

Таблица 14

Имена (Name) пунктов меню в программе.

MainFile

CodeFile

InfoCompare

ExitPoint

NewFile

CodeTabl

AddFile

InfoCode

ReadFile

С активизацией меню связано событие OnClick. Данное событие выполняется, когда пользователь, выбирает какой либо пункт меню. К каждому пункту меню необходимо привязать свой обработчик. Для придания меню более привлекательного вида можно добавлять разделительные полосы (достаточно задать одним символом минус “-“). При проектировании меню с помощью редактора меню (рис. 37) необходимо выбрать имена (свойство Name) пунктам меню (табл. 14).

Рис. 36 Редактор меню.

В пункте меню можно назначить быструю клавишу, для этого перед каким-либо символом нужно поставить символ &, например &Close, и можно вызывать пункт меню в данном случае с помощью Alt + C (первая буква слова Close). Пункту меню можно назначить горячую клавишу, тогда в любое время можно выполнить данный пункт меню. Для этого нужно воспользоваться свойством ShortCut. Пункт меню можно сделать недоступным, если в процессе выполнения свойству Enabled задать false. С помощью Visible можно скрыть любой пункт меню или подменю. Свойство Checked, позволяет отмечать флажком последний выбранный пункт меню.

Форма примера 17 приводится на рис. 38.

Рис. 37 Форма к примеру 17.

Справа на компоненте Memo1 формы примера 17 находится изображение компонента MainMenu1, которое будет невидимым при выполнении программы. Ниже приводится программный код примера.

unit Prim17;

interface

uses Windows, Messages, SysUtils, Classes,

Graphics, Controls, Forms, Dialogs,

StdCtrls, ExtCtrls, Menus, Buttons;

type

TMainForm = class(TForm)

MainMenu1: TMainMenu;

MainFile: TMenuItem;

CodeFile: TMenuItem;

InfoCompare: TMenuItem;

ExitPoint: TMenuItem;

NewFile: TMenuItem;

AddFile: TMenuItem;

ReadFile: TMenuItem;

CodeTabl: TMenuItem;

InfoCode: TMenuItem;

Panel1: TPanel;

Memo1: TMemo;

BitBtn1: TBitBtn;

BitBtn2: TBitBtn;

procedure NewFileClick(Sender: TObject);

procedure ExitPointClick(Sender: TObject);

procedure AddFileClick(Sender: TObject);

procedure ReadFileClick(Sender: TObject);

procedure CodeTablClick(Sender: TObject);

procedure InfoCodeClick(Sender: TObject);

procedure BitBtn1Click(Sender: TObject);

procedure BitBtn2Click(Sender: TObject);

procedure InfoCompareClick(Sender: TObject);

end;

Const n=25;

stext='Ошибка открытия файла';

Type TTableCode=array [1..n] of char;

var MainForm: TMainForm;

TableCode:TTableCode;

T: TextFile;

F: File of TTableCode;

FNoType: File;

implementation

{$R *.DFM}

procedure TMainForm.NewFileClick(Sender: TObject);

begin

Panel1.Visible:=true;

BitBtn2.Visible:=true;

memo1.SetFocus;

end;

procedure TMainForm.ExitPointClick(Sender: TObject);

begin

close;

end;

procedure TMainForm.AddFileClick(Sender: TObject);

begin

Panel1.Visible:=true;

BitBtn2.Visible:=true;

Memo1.Lines.LoadFromFile('Inpfil.txt');

memo1.SetFocus;

end;

procedure TMainForm.ReadFileClick(Sender: TObject);

var str:string;

begin

{$I-}

AssignFile(T,'Inpfil.txt');

reset(T);

{$I+}

if IOResult<>0 then begin

MessageDlg(sText,mtError,[mbOk],0);

exit;

end;

Panel1.Visible:=true;

BitBtn2.Visible:=true;

while not eof(T) do begin

readln(T,str);

Memo1.Lines.Add(str);

end;

CloseFile(T);

memo1.SetFocus;

end;

procedure TMainForm.CodeTablClick(Sender: TObject);

var i: byte;

str:string;

begin

Randomize;

for i:=1 to n do

TableCode[i]:=char(Random(256));

Panel1.Visible:=true;

BitBtn2.Visible:=false;

str:='';

for i:=1 to n do str:=str+TableCode[i]+' ';

Memo1.Lines.Add(str);

end;

procedure TMainForm.InfoCodeClick(Sender: TObject);

var i,res: integer;

Buffer,Buf:TTableCode;

str: string;

k: byte;

begin

{$I-}

AssignFile(F,'Outfil.dat');

rewrite(F);

if IOResult<>0 then begin

MessageDlg(sText,mtError,[mbOk],0);

exit;

end;

AssignFile(FNoType,'Inpfil.txt');

reset(FNoType,1);

{$I+}

if IOResult<>0 then begin

MessageDlg(sText,mtError,[mbOk],0);

CloseFile(F);

exit;

end;

Write(F,TableCode);

Panel1.Visible:=true;

BitBtn2.Visible:=false;

while not eof(FNoType) do begin

BlockRead(FNoType,Buffer,n,res);

str:='';

for i:=1 to n do begin

if i<=res then begin

k:=ord(Buffer[i])+ord(TableCode[i]);

Buf[i]:=chr(k);

end else Buf[i]:=TableCode[i];

str:=str+Buf[i]+' ';

end;

Memo1.Lines.Add(str);

Write(F,Buf);

end;

CloseFile(FNoType);

CloseFile(F);

end;

procedure TMainForm.BitBtn1Click(Sender: TObject);

begin

Memo1.Lines.Clear;

Panel1.Visible:=false;

end;

procedure TMainForm.BitBtn2Click(Sender: TObject);

begin

Memo1.Lines.SaveToFile('Inpfil.txt');

BitBtn1Click(Sender);

end;

procedure TMainForm.InfoCompareClick(Sender: TObject);

var i: integer;

Buf:TTableCode;

str:string;

k: byte;

begin

{$I-}

AssignFile(F,'Outfil.dat');

reset(F);

{$I+}

if IOResult<>0 then begin

MessageDlg(sText,mtError,[mbOk],0);

exit;

end;

Panel1.Visible:=true;

BitBtn2.Visible:=false;

str:='';

seek(F,1);

while not eof(F) do begin

read(F,Buf);

for i:=1 to n do begin

k:=ord(Buf[i])-ord(TableCode[i]);

if k=10 then begin

Memo1.Lines.Add(str);

str:='';

end else str:=str+chr(k);

end;

end;

CloseFile(F);

end;

end.

Следует отметить, что в данной программе происходит управление доступом к Panel1 и кнопке BitBtn2 (отдельно) с помощью свойств Visible.

В примере 17 используются два файла: текстовый - InpFil.txt и типизированный - OutFil.dat. Для работы с этими файлами введены три файловые переменные. Текстовый файл открывается как стандартный текстовый для корректировки и просмотра и как файл без типа, чтобы посимвольно прочитать информацию и закодировать её. Для кодирования введена переменная k типа Byte. Обратить внимание, что при сложении, возможно, может получиться значение, выходящее за пределы диапазона этого типа, т.е. более 255. Однако перекодирование происходит корректно, так как при вычитании также происходит выход за пределы диапазона и прежнее число восстанавливается (поэксперементировать с подобными способами сложения и вычитания, используя отдельную программу). При добавлении или занесении новой информации через компонент Memo необходимо в конце текста обязательно набирать Enter.