Помощь - Поиск - Пользователи - Календарь
Полная версия: Решётка Кардано
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
cooler
Вот решил сделать в Delphi
Но почему-то выводит неправильный результат в форму, либо обрезает, либо выдаёт в не той кодировке
Чувствуется где-то ошибка в выводе
Подскажите
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
for i := 1 to n do mx[i]:=#0;

{ Заполнение матрицы mx строками по N пробелов }
for i := 1 to n do
for j := 1 to n do mx[i] := mx[i]+ '_';



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
memo1.Lines.Clear;
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.
volvo
Цитата
Чувствуется где-то ошибка в выводе
dry.gif

Ошибок в выводе нет. Ошибка у тебя в голове. С какого перепуга ты обрезаешь входную строку, ограничивая ее 24 символами? Ты у меня на сайте это ограничение видел? Нет. Вот и не ограничивай. А то перековеркают все что можно, а потом им "в выводе проблема".

Это было первое. А второе - Дельфи и Паскаль - это вообще-то разные языки, тебе не кажется? В Паскале строка string[n] - это одно, в Дельфи - другое (не надо путать String, ShortString и AnsiString - это приводит вот к таким постам, как твой). В Дельфи 2009/2010 код вообще не компилируется, чтоб работало - надо сделать так:

type
sType = String; // [n];

...
procedure EncodeText(const s: string;
const mask: matrix; var mx: matrix);
var
i, j, count: integer;
masked: matrix;
begin
for i := 1 to n do begin
SetLength(mx[i], n);
mx[i] := '';
// mx[i]:=#0;
end;
...
, тогда программа запускается и выдает:
Нажмите для просмотра прикрепленного файла
(Edit2.MaxLength сброшено в 0, если что). Что обрезается? Какая не та кодировка?
cooler
Спасибо большое smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.