Нумерация с помощью TRichEdit в Delphi - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь реализовать нумерацию в компоненте TRichEdit, Delphi.В идеале я хочу получить то же поведение, что и в этих сторонних компонентах: enter image description here

Как видите, кнопка нумерации работает аналогично кнопке с маркером.Я имею в виду, что он устанавливает FirstIdent или LeftIdent (я не уверен) и ставит числа 1,2,3, ... вместо маркеров.Когда вы перемещаете курсор влево рядом с номером, он не позволяет перейти на число, а переходит на одну строку вверх.

Это то, что я получил до сих пор:

procedure TMainForm.NumberingButtonClick(Sender: TObject);
var
  i: Integer;
  s: String;
begin
  if NumberingButton.Down then
  begin
    Editor.Paragraph.Numbering := nsNone;
    i := Editor.ActiveLineNo;
    s := Editor.Lines[i];
    insert(inttostr(i)+'. ', s, 1);
    //Editor.Paragraph.LeftIndent := 10;
    Editor.Paragraph.FirstIndent := 10;
    Editor.Lines[i] := s;
  end;
end;

Но это делаетне работает, как я хочу.У кого-нибудь есть идеи?

1 Ответ

1 голос
/ 20 сентября 2019

Этот код работает точно так, как я ожидал:

procedure TMainForm.NumberingButtonClick(Sender: TObject);
var
  i: Integer;
  s: String;
  fmt: TParaFormat2;
begin
  FillChar(fmt, SizeOf(fmt), 0);
  fmt.cbSize := SizeOf(fmt);
  fmt.dwMask := PFM_NUMBERING or PFM_NUMBERINGSTART or
                PFM_NUMBERINGSTYLE or PFM_NUMBERINGTAB;
  if NumberingButton.Down then
    fmt.wNumbering := 2
   else
    fmt.wNumbering := 0;
  // wNumbering:
  // 0 - no numbering
  // 1 - bullet list             (·, ·, ·, ...).
  // 2 - Arabic numbers          (1, 2, 3, ...).
  // 3 - small letters           (a, b, c, ...).
  // 4 - capital letters         (A, B, C, ...).
  // 5 - small Roman numbers     (i, ii, iii, ...).
  // 6 - capital Roman numbers   (I, II, III, ...).
  // 7 - Unicode character sequence
  fmt.wNumberingStart := 1;
  // wNumberingStart:
  //  The number at which the numbering starts.
  fmt.wNumberingStyle := $200;
  // wNumberingStyle:
  // Numbering Style
  // 0     :  1)
  // $100  : (1)
  // $200  :  1.
  // $300  :  1
  // $400  : remove list
  // $8000 : continues to number the list without changing the style
  fmt.wNumberingTab := 1440 div 4;
  // wNumberingTab:
  // the space between number and paragraph text
  Editor.Perform( EM_SETPARAFORMAT, 0, lParam( @fmt ) );
  if BulletsButton.Down then
    BulletsButton.Down := False;
end;

enter image description here

Благодаря www.decoding.dax.ru

...