13

スクロールバーが必要ないとき (テキストが不十分なとき) は表示しないが、必要なときは表示する単純な TMemo が必要です。ScrollBars =ssAutoまたは TRichEdit のようなものHideScrollBars

TMemo をサブクラス化し、ES_DISABLENOSCROLLのように CreateParams で を使用しようとしましたTRichEditが、機能しません。

編集:これは、有効になっているかどうかに関係なく機能するはずWordWrapです。

4

1 に答える 1

6

フォームにメモを入れると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のテキスト行の高さをプログラムで決定するにはどうすればよいですか。

于 2012-04-18T16:04:49.767 に答える