TRichEdit и удаление последней пустой строки

Ognev

ex-Team DUMPz
Местный
Регистрация
20 Авг 2004
Сообщения
2,079
Реакции
908
Credits
0
Ректальный метод придется использовать и для Memo и для RichEdit, потому что этот перевод строки наследие TStrings. А на счет того, какой компонент здесь нужен, так я никого не уговариваю. Нравится вам Memo, используйте его. А я буду использовать RichEdit )))
 

demav

Местный
Регистрация
20 Ноя 2008
Сообщения
97
Реакции
13
Credits
158
Не поленился и проверил. Нет такой проблемы у TMemo.

Какой проблемы? Добавление пустой строки?

Есть! Я проверял.
Уже озвучивали, что это дело не в компоненте, а в реализации TStrings
 

demav

Местный
Регистрация
20 Ноя 2008
Сообщения
97
Реакции
13
Credits
158
Проверьте еще раз.

Вот блин. И правда для TMemo не добавляется строка.
Я наверное проверял на TRichEdit, вот код, проверьте:

Код:
 RichEdit1.Lines.Clear;
 RichEdit1.Lines.Text := 'ABCD';
 Showmessage('|' + RichEdit1.Lines.Text + '|');

Я посмотрю почему в TMemo не так, ведь там тоже по идее TStrings.SetTextStr используется.

Хотя, нет, не стану. Что-то мы на какую-то фигню скатываемся :)
 

Ognev

ex-Team DUMPz
Местный
Регистрация
20 Авг 2004
Сообщения
2,079
Реакции
908
Credits
0
Забавно. Проверил на D10 - в мемо строка не добавляется. Интересно было бы понять - почему. Чисто из платонической любви к знанию )))
 

dustypup

Турист
Регистрация
27 Ноя 2008
Сообщения
21
Реакции
1
Credits
57
Тут все дело в том, что Memo.Lines это TStrings, а RichEdit.Lines это TRichEditStrings. Поэтому разница в поведении.
Смотреть в ComCtrls:
Код:
procedure TRichEditStrings.Insert(Index: Integer; const S: string);

  function CountLineBreaks(const S: string): Integer;
  const
    LB = #13#10;
  var
    P: Integer;
  begin
    Result := 0;
    P := Pos(LB, S);
    while P <> 0 do
    begin
      Inc(Result);
      P := PosEx(LB, S, P + 2);
    end;
  end;

const
  CRLF = #13;
var
  L: Integer;
  Selection: TCharRange;
  Fmt, Str: string;
begin
  if Index >= 0 then
  begin
    Selection.cpMin := SendMessage(RichEdit.Handle, EM_LINEINDEX, Index, 0);
    if Selection.cpMin >= 0 then
      Fmt := '%s' + CRLF
    else
    begin
      Selection.cpMin := SendMessage(RichEdit.Handle, EM_LINEINDEX, Index - 1, 0);
      if Selection.cpMin < 0 then Exit;
      L := SendMessage(RichEdit.Handle, EM_LINELENGTH, Selection.cpMin, 0);
      if L = 0 then Exit;
      Inc(Selection.cpMin, L);
      Fmt := CRLF + '%s';
    end;
    Selection.cpMax := Selection.cpMin;
    SendStructMessage(RichEdit.Handle, EM_EXSETSEL, 0, Selection);
    Str := Format(Fmt, [S]);
    SendTextMessage(RichEdit.Handle, EM_REPLACESEL, 0, Str);
    // RichEdit 2.0 replaces CRLF pairs with CR. We need to account for that when
    // verifying that the insertion succeeded in case S contains a CRLF pair.
    if RichEdit.SelStart <> (Selection.cpMax + Length(Str) - CountLineBreaks(Str)) then
      raise EOutOfResources.Create(sRichEditInsertError);
  end;
end;
 

demav

Местный
Регистрация
20 Ноя 2008
Сообщения
97
Реакции
13
Credits
158
Тут все дело в том, что Memo.Lines это TStrings, а RichEdit.Lines это TRichEditStrings. Поэтому разница в поведении.
Похоже, дело не только в этом. При таком исполнении ЕСТЬ перенос строки:
Код:
  with TStringList.Create do
  try
  Text := 'ABCD';
  Showmessage('|' + Text + '|');
  finally
  Free;
  end;