![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
||||
|
||||
|
Программа работает исправно с английскими буквами но если ввести в программу что ни будь на русском то ни чего не происходит.
Как это можно исправить? При ключе hi Hello - Hflmo При ключе пр Привет -Привет Код:
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls, ActnList, Menus, ClipBrd, Buttons;
type
TMainForm = class(TForm)
StatusBar1: TStatusBar;
ActionList1: TActionList;
actExit: TAction;
actLoad: TAction;
actSave: TAction;
actRun: TAction;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
GrBoxOutPut: TGroupBox;
memoOutput: TMemo;
GrBoxInput: TGroupBox;
memoInput: TMemo;
Button1: TButton;
GroupBox1: TGroupBox;
edtKey: TLabeledEdit;
CheckBox1: TCheckBox;
BitBtn1: TBitBtn;
Button2: TButton;
Button3: TButton;
procedure actExitExecute(Sender: TObject);
procedure actLoadExecute(Sender: TObject);
procedure actSaveExecute(Sender: TObject);
procedure actRunExecute(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure actSaveUpdate(Sender: TObject);
procedure actRunUpdate(Sender: TObject);
procedure edtKeyKeyPress(Sender: TObject; var Key: Char);
procedure CheckBox1Click(Sender: TObject);
procedure memoInputChange(Sender: TObject);
procedure memoInputKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.actExitExecute(Sender: TObject);
begin
Close;
end;
procedure TMainForm.actLoadExecute(Sender: TObject);
begin
if OpenDialog1.Execute then
memoInput.Lines.LoadFromFile(OpenDialog1.FileName);
end;
procedure TMainForm.actRunExecute(Sender: TObject);
var i, j, n, fl, pw: integer;
ch: Char;
stKey: string;
flag: Boolean;
begin
memoOutput.Text := '';
stKey := edtKey.Text;
j := 1; fl := 0; pw := 0;
for i := 1 to Length(memoInput.Text) do
begin
ch := memoInput.Text[i];
flag := false;
if ch in ['a'..'z'] then
begin
flag := true;
fl := Ord('a'); pw := 26;
end;
if ch in ['A'..'Z'] then
begin
flag := true;
fl := Ord('A'); pw := 26;
end;
if ch in ['а'..'я'] then
begin
flag := true;
fl := Ord('а'); pw := 33;
end;
if ch in ['А'..'Я'] then
begin
flag := true;
fl := Ord('А'); pw := 33;
end;
if flag then
begin
if CheckBox1.Checked then
n := (ORD(ch) - fl - ORD(stKey[j])+ 10*pw) mod pw + fl
else
n := (ORD(ch) - fl + ORD(stKey[j])) mod pw + fl;
ch := Chr(n);
Inc(j);
if j > Length(stKey) then j := 1;
end;
memoOutput.Text := memoOutput.Text + ch;
end;
end;
procedure TMainForm.actRunUpdate(Sender: TObject);
begin
actRun.Enabled := ((TRIM(memoInput.Text) <> '') AND (edtKey.Text <> ''));
end;
procedure TMainForm.actSaveExecute(Sender: TObject);
begin
if SaveDialog1.Execute then
memoOutput.Lines.SaveToFile(SaveDialog1.FileName);
end;
procedure TMainForm.actSaveUpdate(Sender: TObject);
begin
actSave.Enabled := memoOutput.Text <>'';
end;
procedure TMainForm.Button2Click(Sender: TObject);
begin
if SaveDialog1.Execute then
memoOutput.Lines.SaveToFile(SaveDialog1.FileName);
end;
procedure TMainForm.Button3Click(Sender: TObject);
begin
if OpenDialog1.Execute then
memoInput.Lines.LoadFromFile(OpenDialog1.FileName);
end;
procedure TMainForm.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.Checked then
actRun.Caption := 'Расшифровать'
else
actRun.Caption := 'Зашифровать';
end;
procedure TMainForm.edtKeyKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then
actRun.Execute;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
memoInput.Text:='';
memoOutput.Text:='';
end;
procedure TMainForm.memoInputChange(Sender: TObject);
begin
StatusBar1.Panels[0].Text := IntToStr(Length(memoInput.Text)) + ' символов';
end;
procedure TMainForm.memoInputKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if ((Key = VkKeyScan('a')) or (Key = VkKeyScan('ф'))) and (ssCtrl in Shift) then
(Sender as TMemo).SelectAll;
end;
end. |
|
#2
|
||||
|
||||
|
Символы а..я идут не подряд в кодировке. В середине (около буквы "п" кажется) есть разрыв.
А вообще имхо надо шифровать не только буквы, а всё. Последний раз редактировалось Bargest, 25.01.2012 в 20:49. |
|
#3
|
||||
|
||||
|
Цитата:
Попробовал так, та же проблема. Код:
if ch in ['а'..'п'] then
begin
flag := true;
fl := Ord('а'); pw := 16;
end;
if ch in ['р'..'я'] then
begin
flag := true;
fl := Ord('р'); pw := 16;
end;Последний раз редактировалось Amilman, 25.01.2012 в 21:16. |
|
#4
|
||||
|
||||
|
Еще ord(stKey[j]) будет номером буквы не в алфавите, а в кодировке. И второго вычитания fl нету. Хотя повторюсь - лучше шифровать всё сразу.
|
|
#5
|
||||
|
||||
|
Цитата:
Можете привести пример? Если не трудно. |
|
#6
|
||||
|
||||
|
Пример чего именно?
Если stKey[j] в данный момент равно "а", то ord(stKey[j]) будет равно номеру символа 'а' в кодовой таблице, а не 0, как предполагает шифр. |
|
#7
|
||||
|
||||
|
Цитата:
|
|
#8
|
||||
|
||||
|
А, да, попутал. Это в досе было так. Сейчас действительно нормально.
|
|
#9
|
||||
|
||||
|
Цитата:
Настали времена Doom на калькуляторах и компьютеров на плате, которую в карман можно сунуть А ты ещё про кодировки в Досе помнишь... |