Проблема Delphi Copy Memo в Richedit

У меня проблема с копированием содержимого заметки в компонент richedit.

Я думал, что это будет

Richedit.text := memo.text;

Однако, если я использую это, Richedit начинает новую строку, когда текст заметки переносится на новую новую строку (не CR/LF), а просто переносится. RichEdit также начинает новую строку, когда заметка начинает новую строку, и это нормально.

У кого-нибудь есть идеи, как скопировать текст из заметки в RichEditBox без разрыва строк в RichEdit, когда текст заметки переносится

Спасибо

Колин


person colin    schedule 24.11.2010    source источник
comment
Не могли бы вы указать версию Delphi и версию ОС, пожалуйста?   -  person Andreas Rejbrand    schedule 25.11.2010
comment
Это Delphi 7 на Windows Vista   -  person colin    schedule 25.11.2010


Ответы (2)


Когда я делаю

RichEdit1.Text := Memo1.Text

виртуальные «разрывы строк» ​​Memo1 не преобразуются волшебным образом в разрывы строк (CRLF) в RichEdit, и этого не должно быть. Эти «разрывы строк» ​​не сохраняются в текстовом буфере памятки. Действительно, в официальной документации Embarcadero говорится

Установите для WordWrap значение true, чтобы элемент управления редактированием переносил текст по правому полю, чтобы он помещался в клиентской области. Обертывание только косметическое. Текст не содержит символов возврата, которые не были введены явно.

Во всяком случае, альтернативный способ сделать

RichEdit1.Lines.Assign(Memo1.Lines);

хотя это сохранит виртуальные разрывы строк, как указано ниже.

Обновлять

Скорее всего у вас в коде есть еще какая-то странность (баг), либо вы слишком расплывчато сформулировали свой вопрос. Однако, чтобы исключить риск возникновения проблем с оболочками VCL, попробуйте следующее:

procedure TForm4.FormClick(Sender: TObject);
var
  buf: PChar;
const
  MAX_BUF_SIZE = 65536;
begin
  GetMem(buf, MAX_BUF_SIZE * sizeof(char));
  Memo1.Perform(WM_GETTEXT, MAX_BUF_SIZE, buf);
  RichEdit1.Perform(WM_SETTEXT, 0, buf);
  FreeMem(buf);
end;
person Andreas Rejbrand    schedule 24.11.2010
comment
это вообще не разрывы строк, на самом деле - person Free Consulting; 25.11.2010
comment
Нет, их иногда называют виртуальными разрывами строк, как я уже писал. - person Andreas Rejbrand; 25.11.2010
comment
На самом деле, когда я пытаюсь использовать RichEdit1.Lines.Assign(Memo1.Lines), виртуальные разрывы строк переносятся в RichEdit. Это действительно имеет смысл. Базовый список TStringList содержит по одному элементу для каждой нарисованной строки, а не только для жестких разрывов. Меня больше смущает то, как назначение свойства Text, кажется, правильно определяет разрывы. - person Mark Elder; 25.11.2010
comment
@Mark, когда вы читаете свойство Text, памятка отправляет себе сообщение wm_GetText, чтобы прочитать всю строку, поскольку она есть в базовом элементе управления редактированием. Он не использует метод базового класса TStrings для объединения каждого элемента, разделенного разрывами строк. - person Rob Kennedy; 25.11.2010
comment
2Андреас Рейбранд: не хотите ли добавить проверочную ссылку на эти виртуальные разрывы строк? В настоящее время я убежден, что текст, который отрисовывается, вообще не изменился. TMemo и подобные элементы управления пока не имеют ограничения в 64 КБ, кстати - person Free Consulting; 25.11.2010
comment
Я пробовал выше, я получаю сообщение об ошибке в строке Memo.Perform(WM_GETTEXT, MAX_BUF_SIZE, buf); несовместимые типы: целое число и PAnsiChar Колин - person colin; 25.11.2010
comment
@ user435406, вы должны преобразовать buf в Integer; Целое (баф). Это потому, что параметры WParam и LParam являются просто целочисленными параметрами. - person vcldeveloper; 25.11.2010

Как грязный хак, не могли бы вы отключить перенос слов в своей записке, затем выполнить задание, а затем снова включить перенос слов? Это неприятный хак, но он может помочь вам, если будет какое-то странное поведение.

person Toby Allen    schedule 25.11.2010