некорректное отображение текста в Memo

  • Автор темы rocketsolid
  • Дата начала
R

rocketsolid

#1
Здравствуйте! Делаю программу для шифрования текста по алгоритму решетки Кардано. Возникла проблема при выводе в memo, а именно в том что не все символы закодированного текста выводятся в корректной форме (вместо некоторых и там где ничего не должно быть выводится какая-то "кракозябра"). Помогите исправить.
а если у кого-нибудь есть уже готовая, то будет просто замечательно)
p.s. этаже программа в чистом паскале работает на ура
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Memo1: TMemo;
Label5: TLabel;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Unit2, Unit3;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
n = 8;
type
sType = string[n];
matrix = array[1 .. n] of sType;
const
mask: matrix = (
'x...x...',
'.x...x..',
'..x...x.',
'...x...x',
'..x...x.',
'...x....',
'x...x..x',
'..x..x..'
);


var
st:string;


encoded: matrix;
masked: matrix;

{ поворот матрицы }
procedure T(var res: matrix);
var
i, j: integer;
mx: matrix;
begin
mx := res;
for i := 1 to n do
for j := 1 to n do
res[j, n - i + 1] := mx[i, j];
end;

{ зашифровка текста }
procedure EncodeText(const s: string;
const mask: matrix; var mx: matrix);
var
i, j, count: integer;
masked: matrix;
begin
{ заполнение матрицы mx строками по N пробелов }
for i := 1 to n do
for j := 1 to n do mx[i] := mx[i] + #32;

masked := mask;
count := 1;
while count <= length(s) do begin

for i := 1 to n do
for j := 1 to n do
if masked[i, j] = 'x' then begin
mx[i][j] := s[count];
inc(count)
end;
T(masked);

end;
end;

{расшифровка текста}
function DecodeText(const mask, encoded: matrix): string;
var
s: string;
i, j, count: integer;
masked: matrix;
begin

masked := mask;
count := 0; s := '';
while length(s) < n*n do begin
for i := 1 to n do
for j := 1 to n do
if masked[i, j] = 'x' then s := s + encoded[i, j];
T(masked);
end;
DecodeText := s;

end;
var
i: integer;
begin
st:=edit2.text;
EncodeText(st, mask, encoded);
for i := 1 to 8 do begin
memo1.lines.add(encoded[i]);
end;
edit1.text:=DecodeText(mask, encoded);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
edit2.Text:='';
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
form2.showmodal;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
form3.showmodal;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
memo1.Clear();
edit1.Text:='';
end;

end.
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable"> Версия на Паскале</div></div><div class="sp-body"><div class="sp-content">
Код:
uses crt;
const
n = 8;
type
sType = string[n];
matrix = array[1 .. n] of sType;
const
mask: matrix = (
'x...x...',
'.x...x..',
'..x...x.',
'...x...x',
'..x...x.',
'...x....',
'x...x..x',
'..x..x..'
);

st: string =
'gorogckayamynicypalnyabolnica';

var
encoded: matrix;
masked: matrix;

{ Процедура поворота матрицы }
procedure T(var res: matrix);
var
i, j: integer;
mx: matrix;
begin
mx := res;
for i := 1 to n do
for j := 1 to n do
res[j, n - i + 1] := mx[i, j];
end;

{ Зашифровка текста }
procedure EncodeText(const s: string;
const mask: matrix; var mx: matrix);
var
i, j, count: integer;
masked: matrix;
begin
{ Заполнение матрицы mx строками по N пробелов }
for i := 1 to n do
for j := 1 to n do mx[i] := mx[i] + #32;

masked := mask;
count := 1;
while count <= length(s) do begin

for i := 1 to n do
for j := 1 to n do
if masked[i, j] = 'x' then begin
mx[i][j] := s[count];
inc(count)
end;
T(masked);

end;
end;

{ Расшифровка текста }
function DecodeText(const mask, encoded: matrix): string;
var
s: string;
i, j, count: integer;
masked: matrix;
begin

masked := mask;
count := 0; s := '';
while length(s) < n*n do begin
for i := 1 to n do
for j := 1 to n do
if masked[i, j] = 'x' then s := s + encoded[i, j];
T(masked);
end;
DecodeText := s;

end;
var
i: integer;
begin
clrscr;
EncodeText(st, mask, encoded);

writeln('encoded text: ');
for i := 1 to n do begin
writeln(encoded[i]);
end;

writeln(DecodeText(mask, encoded));
readln;
end.
 

Вложения

I

isqoff

#2
паскалевский примерчик выложи...для сравнения...
 
M

Mun2

#4
1)
для начала mx надо забить пустыми, прежде чем в него что-то прибавлять
вместо
Код:
 { Заполнение матрицы mx строками по N пробелов }
for i := 1 to n do
for j := 1 to n do mx[i] := mx[i] + #32;
надо

Код:
 for i := 1 to n do mx[i]:='';
{ Заполнение матрицы mx строками по N пробелов }
for i := 1 to n do
for j := 1 to n do mx[i] := #32;
2)
при выводе в Memo символ #0 выводится как конец строки.

Console (пробелы заменены на '_', а пробелом указан символ #0)
Код:
gp__o__a
_r___ol_
n_gy_ac_
__bko__a
_ly___an
i__m__c_
y__an _i
_ c_ y__
Form(Строки обрываются)
Код:
gp__o__a
_r___ol_
n_gy_ac_
__bko__a
_ly___an
i__m__c_
y__an
_