Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Кодирование русского текста методом сдвига


Автор: ___Nikolay
WEB-сайт: http://delphiworld.narod.ru

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.
Скачать весь проект
Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay