1. Постановка задачи
Создать компонент для шифрования – дешифрования текста тремя алгоритмами (алгоритм «Цезаря», алгоритм «Модифицированного Цезаря», алгоритм «Скитала») и применить его в программе.
2. Алгоритм создания компонента
Для создания компонента нужно сначала определить визуальный он будет или нет.
Теперь нужно выбрать предка. Как правило, используются в виде предков TComponent, TControl, TWinControl, TGraphicControl, TCustomXXXXXX, а также все компоненты палитры компонентов. Для своего компонента я взял предка TOpenDialog.
В Borland Delphi в меню Component мы выбираем пункт New Component.
Далее выводится небольшая таблица для нового компонента:
Ancestor type – выбираем предка для компонента;
Class Name – имя класса для компонента;
Palette Page – выбираем вкладку на которой будет наш компонент. В данном случае мы создали новую вкладку с названием My Component.
Поля Unit file name и Search path определяются автоматически и в них ничего вводить не нужно.
При нажатии кнопки ОК появляется шаблон нашего будущего компонента.
Переопределяем конструктор у этого компонента:
В директиве public вставляем строку
constructor Create(AOwner: TComponent); override;
нажатие на этой строке Ctrl + Shift + C создает шаблон для этого метода, внутри которого мы вставляем такие строки:
inherited Create(AOwner); {Вызываем унаследованный конструктор} Options := Options + [ofFileMustExist, ofPathMustExist]; {Выполняем необходимые нам действия}
Теперь нужно сохранить и установить созданный компонент.
В меню Component выбираем пункт Install Component…
В поле Unit file name указываем имя нашего сохранённого модуля и нажимаем ОК.
Тут появиться сообщение «Такой то пакет будет изменён. Продолжить?», на это сообщение мы нажимаем кнопку ОК.
Теперь на в новой вкладе My component появился наш собственный компонент ShifText.
3. Исходный текст компонента
unit ShifText;
interface
uses
SysUtils, Classes, Dialogs;
type
TShifText = class(TOpenDialog)
private
{ Private declarations }
protected
{ Protected declarations }
public
function AlgCez(S,Cl:string):string;
function DeAlgCez(S,Cl:string):string;
function AlgVijen(S,Cl:string):string;
function DeAlgVijen(S,Cl:string):string;
function AlgSkit(S,Cl:string):string;
function DeAlgSkit(S,Cl:string):string;
constructor Create(AOwner: TComponent); override;
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('My Component', [TShifText]);
end;
{ TShifText }
constructor TShifText.Create(AOwner: TComponent);
begin
inherited Create(AOwner); {Вызываем унаследованный конструктор}
Options := Options + [ofFileMustExist, ofPathMustExist]; {Выполняем необходимые нам действия}
end;
function TShifText.AlgCez(S,Cl:string):string;
var i,k,k1,a,Cluch:Integer;
begin
Cluch:=StrToInt(Cl);
for i:=1 to Length(S) do
begin
k:=Ord(S[i]);
k1:=k+Cluch;
if (k1>=255) then
begin
a:=k1-255;
k1:=a+1;
end;
S[i]:=Chr(k1);
end;
Result:=S;
end;
function TShifText.DeAlgCez(S,Cl:string):string;
var i,k,k1,a,Cluch:integer;
begin
Cluch:=StrToInt(Cl);
for i:=1 to Length(S) do
begin
k:=Ord(S[i]);
k1:=k-Cluch;
if (k1<=1) then
begin
a:=1-k1;
k1:=255-a;
end;
S[i]:=Chr(k1);
end;
Result:=S;
end;
function TShifText.AlgVijen(S,Cl:string):string;
var i,k,k1,a,Cluch,Cl1:Integer;
begin
Cluch:=StrToInt(Cl);
Cl1:=1;
for i:=1 to Length(S) do
begin
k:=Ord(S[i]);
if Cl1<Cluch then
begin
k1:=k+Cl1;
if k1>=255 then
begin
a:=k1-255;
k1:=a+1;
end;
end
else if Cl1=Cluch then
begin
k1:=k+Cl1;
if k1>=255 then
begin
a:=k1-255;
k1:=a+1;
end;
end
else
begin
Cl1:=1;
begin
k1:=k+Cl1;
if k1>=255 then
begin
a:=k1-255;
k1:=a+1;
end;
end;
end;
S[i]:=Chr(k1);
Cl1:=Cl1+1;
end;
Result:=S;
end;
function TShifText.DeAlgVijen(S,Cl:string):string;
var i,k,k1,a,Cluch,Cl1:integer;
begin
Cluch:=StrToInt(Cl);
Cl1:=1;
for i:=1 to Length(S) do
begin
k:=Ord(S[i]);
k1:=k-1;
if Cl1<Cluch then
begin
k1:=k-Cl1;
if k1<=1 then
begin
a:=1-k1;
k1:=255-a;
end;
end
else if Cl1=Cluch then
begin
k1:=k-Cl1;
if k1<=1 then
begin
a:=1-k1;
k1:=255-a;
end;
end
else
begin
Cl1:=1;
k1:=k-Cl1;
if k1<=1 then
begin
a:=1-k1;
k1:=255-a;
end;
end;
S[i]:=Chr(k1);
Cl1:=Cl1+1;
end;
Result:=S;
end;
function TShifText.AlgSkit(S,Cl:string):string;
var S1,n:string;i,j,a,Cl2,Cl1,d:integer;mas:array of array of string;
begin
Cl2:=StrToInt(Cl);
if (Length(S) mod Cl2=0) then Cl1:=(Length(S)div Cl2)
else
Cl1:=(Length(S)div Cl2)+1;
a:=1;
Setlength(mas,Cl2,Cl1+1);
for j:=0 to Cl1 do
for i:=0 to Cl2-1 do
if a<=Length(S) then
begin
if (Ord(S[a])=13) then S[a]:=Char(149);
if (Ord(S[a])=10) then inc(a);
mas[i,j]:=S[a];
inc (a);
end
else
begin
mas[i,j]:=' ';
inc (a);
end;
S1:='';
n:='';
for i:=0 to Cl2-1 do
for j:=0 to Cl1-1 do
begin
n:=mas[i,j];
S1:=S1+n;
inc (a);
end;
Result:=S1;
end;
function TShifText.DeAlgSkit(S,Cl:string):string;
var S1,n:string;i,j,a,Cl2,Cl1,k:integer;mas:array of array of string;
begin
k:=0;
Cl2:=StrToInt(Cl);
if (Length(S) mod Cl2=0) then Cl1:=(Length(S)div Cl2)
else
Cl1:=(Length(S)div Cl2)+1;
a:=1;
Setlength(mas,Cl1+1,Cl2);
for j:=0 to Cl2-1 do
for i:=0 to Cl1-1 do
if a<=Length(S) then
begin
if (Ord(S[a])=149) then S[a]:=Char(13);
if (Ord(S[a])=10) then inc(a);
mas[i,j]:=S[a];
inc (a);
end
else
begin
mas[i,j]:=' ';
inc (a);
end;
n:='';
S1:='';
for i:=0 to Cl1-1 do
for j:=0 to Cl2-1 do
begin
n:=mas[i,j];
begin
S1:=S1+n;
inc (k);
end;
end;
Result:=S1;
end;
end.
