Подтвердить что ты не робот

TMemo с Auto Show/Hide Scrollbars

Мне нужен простой TMemo, который НЕ отображает полосы прокрутки, когда они не нужны (т.е. недостаточно текста), но делает это, когда они есть. что-то вроде ScrollBars = ssAuto или как TRichEdit HideScrollBars.

Я попытался подклассировать TMemo и использовать ES_DISABLENOSCROLL в CreateParams, как в TRichEdit, но он не работает.

Изменить: это должно работать с включенным или без WordWrap.

4b9b3361

Ответ 1

Если ваша заметка помещена в форму, форма будет отмечена символом EN_UPDATE, когда текст будет изменен и содержимое будет перерисовано. Здесь вы можете решить, будут ли полосы прокрутки. Я предполагаю, что мы играем с вертикальной полосой прокрутки и нет горизонтальной полосы прокрутки:

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  protected
    procedure WMCommand(var Msg: TWMCommand); message WM_COMMAND;
  public

...

procedure SetMargins(Memo: HWND);
var
  Rect: TRect;
begin
  SendMessage(Memo, EM_GETRECT, 0, Longint(@Rect));
  Rect.Right := Rect.Right - GetSystemMetrics(SM_CXHSCROLL);
  SendMessage(Memo, EM_SETRECT, 0, Longint(@Rect));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.ScrollBars := ssVertical;
  Memo1.Lines.Text := '';
  SetMargins(Memo1.Handle);
  Memo1.Lines.Text := 'The EM_GETRECT message retrieves the formatting ' +
  'rectangle of an edit control. The formatting rectangle is the limiting ' +
  'rectangle into which the control draws the text.';
end;

procedure TForm1.WMCommand(var Msg: TWMCommand);
begin
  if (Msg.Ctl = Memo1.Handle) and (Msg.NotifyCode = EN_UPDATE) then begin
    if Memo1.Lines.Count > 6 then   // maximum 6 lines
      Memo1.ScrollBars := ssVertical
    else begin
      if Memo1.ScrollBars <> ssNone then begin
        Memo1.ScrollBars := ssNone;
        SetMargins(Memo1.Handle);
      end;
    end;
  end;
  inherited;
end;


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


Обратите внимание, что в приведенном выше примере предполагается не более 6 строк. Чтобы узнать, сколько строк может поместиться в вашей записке, посмотрите этот вопрос: Как определить высоту строки текста в программном обеспечении TMemo?.