RichEdit не уважает PlainText со вставленным содержимым

Я создаю новое приложение, перетаскиваю TRichedit и устанавливаю для свойства PlainText значение true. Затем я запускаю приложение и вставляю текст с расширенным форматированием в RichEdit.

Я ожидал, что он будет отображаться как обычный текст, однако он показывает содержимое с форматированием.

Кто-нибудь знает, как использовать TRichedit как обычный текст (а не использовать памятку :))


person Wizzard    schedule 18.05.2011    source источник
comment
Да ... Чтобы игнорировать информацию в формате RTF, закодированную в файле, установите для PlainText значение true перед потоковой передачей текста в элемент управления. поэтому я установил для него значение True, но не игнорирую. Или мне что-то не хватает :)   -  person Wizzard    schedule 18.05.2011


Ответы (1)


Вам нужно будет выполнить вставку вручную, убедившись, что форматирование игнорируется.

if Clipboard.HasFormat(CF_TEXT) then
  RichEdit.SelText := Clipboard.AsText; 

Запустите этот код из обработчика сообщений для WM_PASTE.

В настоящее время я не знаю, как перехватить нажатие клавиши CTRL + V и заменить его этим кодом. Сообщение WM_PASTE не отправляется элементам управления Rich Edit.


Как предлагает Коди в комментарии, одно из решений заключается в следующем:

  • Убедитесь, что весь текст в поле редактирования помечен как защищенный.
  • Подкласс TRichEdit и переопределить CNNotify.
  • Обработайте сообщение EN_PROTECTED и, если msg=WM_PASTE, используйте вставку как текстовый код выше и верните 1 из обработчика сообщений, чтобы указать, что запрошенная операция (расширенная вставка) отклонена.
person David Heffernan    schedule 18.05.2011
comment
Похоже, вы сможете обработать EN_PROTECTED уведомление. Действительно странно, что элементы управления Rich Edit не получают WM_PASTE. Хорошо, что я не провел с ними слишком много времени. - person Cody Gray; 18.05.2011
comment
Возможно, вы могли бы использовать событие OnProtectChange. - person Ondrej Kelle; 18.05.2011
comment
Или, если этого недостаточно, вы можете попытаться обработать CN_NOTIFY в потомке и обработать случаи, когда NMHdr^.code = WM_PASTE. - person Ondrej Kelle; 18.05.2011
comment
@TOndrej, к сожалению, сообщение Delphi OnProtectChange потеряло полезную информацию, которая указывает на то, что это вставка, а не какое-то другое изменение. - person David Heffernan; 18.05.2011
comment
Это было мое впечатление. В этом случае, вероятно, проще всего будет CN_NOTIFY. Надо поправить свой комментарий выше, я имел ввиду PENProtected(NMHdr)^.msg = WM_PASTE. - person Ondrej Kelle; 18.05.2011