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

Тема в разделе "Delphi - Компоненты", создана пользователем rocketsolid, 14 дек 2009.

  1. rocketsolid

    rocketsolid Гость

    Здравствуйте! Делаю программу для шифрования текста по алгоритму решетки Кардано. Возникла проблема при выводе в memo, а именно в том что не все символы закодированного текста выводятся в корректной форме (вместо некоторых и там где ничего не должно быть выводится какая-то "кракозябра"). Помогите исправить.
    а если у кого-нибудь есть уже готовая, то будет просто замечательно)
    p.s. этаже программа в чистом паскале работает на ура
    Код (Text):
    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">
    Код (Text):
    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.
     

    Вложения:

  2. isqoff

    isqoff Гость

    паскалевский примерчик выложи...для сравнения...
     
  3. rocketsolid

    rocketsolid Гость

    добавил под спойлер
     
  4. Mun2

    Mun2 Гость

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

    Код (Text):
     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)
    Код (Text):
    gp__o__a
    _r___ol_
    n_gy_ac_
    __bko__a
    _ly___an
    i__m__c_
    y__an _i
    _ c_ y__
    Form(Строки обрываются)
    Код (Text):
    gp__o__a
    _r___ol_
    n_gy_ac_
    __bko__a
    _ly___an
    i__m__c_
    y__an
    _
     
Загрузка...

Поделиться этой страницей