Delphi - Как заставить WrapText вести себя как RichEdit.Lines.Text? - PullRequest
2 голосов
/ 20 января 2012

Я использую TRichEdit для редактирования текста.У меня включен WordWrap, который автоматически оборачивает текст по краям элемента управления, чтобы не было полос прокрутки.Ширина RichEdit установлена ​​так, чтобы соответствовать 80 столбцам.

WordWrap хорошо имитирует это поведение, если между словами иногда есть пробел.Но если у вас есть очень неоправданное слово, RichEdit wrap автоматически прервет его, а WordWrap не будет!

Если я хочу сейчас получить доступ к этим обернутым строкам, я могу получить его через RichEdit.Lines.Text, который автоматически поместит CRLF в столбец80. Если я использую RichEdit.Text, я получаю необработанный текст без CRLF, подходящего для WordWrap.

Задача не так проста, как выполнение пользовательской функции, как я уже пробовал, и это была не маленькая функция, но она моглабыть в состоянии использовать функции обтекания TRichEdit?У меня есть идея создать скрытый RichEdit, но этот вид кажется глупым для этой задачи, так как я должен был бы рассчитать его ширину только для переноса слов - довольно бессмысленно, я думаю.

Вопрос - есть ли способ заставитьWordWrap, чтобы вырезать длинные слова, которые нельзя обернуть иначе?Таким образом, если слово имеет длину 170 символов, оно будет заключено в 3 строки 80 + 80 + 10, но также позаботится о словах, прежде чем заполнять предыдущие и последующие строки?

1 Ответ

0 голосов
/ 20 января 2012

Примерьте размер:

procedure TForm1.RichEdit1KeyPress(Sender: TObject; var Key: Char);
const
   MAX_LENGTH = 80;
var
  nLineCount:   integer;
  sCurrentLine: string;
begin
  for nLineCount := 0 to RichEdit1.Lines.Count - 1 do
  begin
    // no space in this line
    if (pos(' ',RichEdit1.Lines.Strings[nLineCount]) = 0) then
    begin
      if (length(RichEdit1.Lines.Strings[nLineCount]) > MAX_LENGTH) then
      begin
        // hold the whole line
        sCurrentLine := RichEdit1.Lines.Strings[nLineCount];
        // the current line, make the max value
        RichEdit1.Lines.Strings[nLineCount] := copy(sCurrentLine,1,MAX_LENGTH);
        // build the next line
        RichEdit1.Lines.Add(
        copy(sCurrentLine,MAX_LENGTH + 1,1));
      end;
    end;
  end;
end;
...