Recent

Author Topic: Некорректно копирует символы из TMemo. Incorrectly copies characters from TMemo  (Read 4920 times)

Leonid

  • Newbie
  • Posts: 2
Добрый день!
Не получается корректно скопировать символ из TMemo в Lazarus 2.0.8.
Начать решил с простого, разместил на форме Memo1, Memo2, Button1 и написал следующий программный код:

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
    S:string;
begin
  i:=0;
  S:=copy(Memo1.Lines.strings,1,1);
  Memo2.Lines.Add(S);
end;

Однако при запуске программы, если ввожу в Memo1 любые несколько русских букв (Russian letter), например "абв", нажимаю Button1, то в Memo2 появляется "?".
При этом, если ввожу в Memo1 любые несколько цифр, например "123", или несколько любых английских символов, например "abc", то в Memo2 появится "1" или "a" соответственно (т.е. все корректно).
Если в программном коде поменяю на:
S:=copy(Memo1.Lines.strings,1,2);
то в Memo2 будет появляться два числа или латинских символа, а русская буква одна.
Это ошибка или я что-то не так делаю?
Сравнивал с delphi7, там такого нет.
« Last Edit: June 28, 2020, 04:37:07 pm by Leonid »

skalogryz

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 2770
    • havefunsoft.com
LCL кодировка это UTF8.
Огрубляя - все английские буквы это 1 символ в string, все русские буквы это 2 символа.

Если тебе нужно скопировать выбранный в TMemo текст, что проще использовать свойство SelText.

Если тебе нужно скопировать произвольный текст из TMemo, то придёться парсить UTF8 символы

Самый простой для тебя вариант это добавить модуль LazUTF8 и вызывать UTF8Copy.
она как-раз занимается парсингом utf8
Code: Pascal  [Select][+][-]
  1. uses ...  LazUTF8;
  2. ...
  3. procedure TForm1.Button1Click(Sender: TObject);
  4. var i:integer;
  5.     S:string;
  6. begin
  7.   i:=0;
  8.   S:=UTF8copy(Memo1.Lines.strings,1,1);
  9.   Memo2.Lines.Add(S);
  10. end;
« Last Edit: June 28, 2020, 04:35:22 pm by skalogryz »

Leonid

  • Newbie
  • Posts: 2
Получилось, спасибо большое!

Zeno

  • Newbie
  • Posts: 6
А как скопировать один русский символ из строки типа String в переменную типа Char? У переменной типа string есть свойство Chars, дающее доступ к строке как массиву символов, но оно не обрабатывает русские символы корректно.

skalogryz

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 2770
    • havefunsoft.com
А как скопировать один русский символ из строки типа String в переменную типа Char? У переменной типа string есть свойство Chars, дающее доступ к строке как массиву символов, но оно не обрабатывает русские символы корректно.
два пути:
1) следует использовать тип UTF8Char (который по сути есть строка)
2) (delphi-образный) конверитовать String в WideString (или UnicodeString), и использовать WideChar (или UnicodeChar) вместо Char.


Zeno

  • Newbie
  • Posts: 6
Как тогда заставить такой простой с виду код:

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: char);
begin
  label1.caption:= label1.caption+Key;
end;

корректно обрабатывать русские символы? С латиницей все в порядке, а вот вместо кириллических символов одни знаки вопроса. Здесь ведь переменная Key типа char. Как сделать UTF8Char?

skalogryz

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 2770
    • havefunsoft.com
кроме OnKeyPress, ещё есть обработчик OnUTF8KeyPress, именно его и нужно использовать.

Code: Pascal  [Select][+][-]
  1. procedure TForm1.Memo1UTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
  2. begin
  3.    label1.caption:= label1.caption+UTF8Key;
  4. end;    

Zeno

  • Newbie
  • Posts: 6
Спасибо, помогло!

 

TinyPortal © 2005-2018