Кодирование русского текста методом сдвига

Кодирование русского текста методом сдвига Автор: ___Nikolay

unit uMain;
interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, ExtCtrls, ComCtrls, Spin;
type
 TForm1 = class(TForm)
  Panel1: TPanel;
  mmText: TMemo;
  Label1: TLabel;
  seN: TSpinEdit;
  Label2: TLabel;
  btEncode: TButton;
  btDecode: TButton;
  procedure btEncodeClick(Sender: TObject);
 private
  { Private declarations }
  procedure Encode(bCode: boolean; n: integer); // Encode - ПРОЦЕДУРА
  // bCode - зашифровать/расшифровать
  // n - шаг смещения
 public
  { Public declarations }
 end;
var
 Form1: TForm1;
implementation
{$R *.DFM}
// ПРОЦЕДУРА КОДИРОВАНИЯ
procedure TForm1.Encode(bCode: boolean; n: integer);
const
 sMsgRangeErr = 'Значение шага должно быть от %d до %d!';
 // Крайние символы для кодирования
 chBigFirstLetter: char = 'А';
 chBigLastLetter: char = 'Я';
 chFirstLetter: char = 'а';
 chLastLetter: char = 'я';
var
 iMinOrd: integer; // Код символа с наименьшим кодом
 iMaxOrd: integer; // Код символа с наибольшим кодом
 i: integer; // Для фикла
 iTempOrd: integer; // Код подставляемого символа
 ch: char; // Каждый символ текста
 s: string; // Преобразуемый текст
begin
 // Проверка шага на диапазон допустимых значений
 if (n > Ord(chBigLastLetter) - Ord(chBigFirstLetter)) or (n < 1) then
 begin
  MessageDlg(Format(sMsgRangeErr, [1, Ord(chBigLastLetter) - Ord(chBigFirstLetter)]), mtError, [mbOk], 0);
  Exit;
 end;
 s := Trim(mmText.Text);
 if s <> '' then // Если есть текст
  for i := 1 to Length(s) do // Проходит каждый символ
  begin
  ch := s[i];
  // Если очередной символ нужно кодировать
  if ch in [chBigFirstLetter .. chBigLastLetter] then // Заглавные буквы
  begin
  iMinOrd := Ord(chBigFirstLetter);
  iMaxOrd := Ord(chBigLastLetter);
  end
  else
  if ch in [chFirstLetter .. chLastLetter] then // Строчные буквы
  begin
  iMinOrd := Ord(chFirstLetter);
  iMaxOrd := Ord(chLastLetter);
  end
  else // Символ кодировать не нужно
  continue;
  if bCode then // Закодировать
  begin
  iTempOrd := Ord(ch) + n; // Получаем потенциальную позицию
  if iMaxOrd - iTempOrd < 0 then // Если символ зашел за границу предельного
  ch := Chr(iMinOrd + abs(iMaxOrd - iTempOrd) - 1) // Возьмем символ с другого конца круга
  else // Если нет..
  ch := chr(iTempOrd); //..все нормально
  end
  else // Раскодировать
  begin
  iTempOrd := Ord(ch) - n; // Получаем потенциальную позицию
  if iMinOrd - iTempOrd > 0 then // Если символ зашел за границу предельного
  ch := Chr(iMaxOrd - (iMinOrd - iTempOrd - 1)) // Возьмем символ с другого конца круга
  else // Если нет..
  ch := chr(iTempOrd); //..все нормально
  end;
  s[i] := ch;
  end;
 mmText.Text := s;
end;
procedure TForm1.btEncodeClick(Sender: TObject);
begin
 Encode(boolean((Sender as TButton).Tag), seN.Value);
end;
end.
DelphiWorld 6.0

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...