Delphi 带有自动显示/隐藏滚动条的TMemo

Delphi 带有自动显示/隐藏滚动条的TMemo,delphi,delphi-7,Delphi,Delphi 7,我需要一个简单的TMemo,它在不需要滚动条(即文本不足)时不显示滚动条,但在需要滚动条时显示滚动条。类似滚动条=sAuto或类似TRichEditHideScrollBars 我曾尝试对TMemo进行子类化,并在CreateParams中使用ES_DISABLENOSCROLL,就像在TRichEdit中一样,但它不起作用 编辑:无论是否启用WordWrap。如果您的备忘录被放置在表单上,当文本被更改并且内容将被重新绘制时,表单将被通知EN\u更新。你可以在这里决定是否有滚动条。我假设我们使用

我需要一个简单的TMemo,它在不需要滚动条(即文本不足)时不显示滚动条,但在需要滚动条时显示滚动条。类似滚动条=
sAuto
或类似TRichEdit
HideScrollBars

我曾尝试对TMemo进行子类化,并在CreateParams中使用
ES_DISABLENOSCROLL
,就像在
TRichEdit
中一样,但它不起作用


编辑:无论是否启用
WordWrap

如果您的备忘录被放置在表单上,当文本被更改并且内容将被重新绘制时,表单将被通知
EN\u更新。你可以在这里决定是否有滚动条。我假设我们使用的是垂直滚动条,而没有水平滚动条:

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;
类型
TForm1=类(TForm)
备忘录1:TMemo;
过程表单创建(发送方:ToObject);
受保护的
程序WMCommand(var Msg:TWMCommand);消息WM_命令;
公众的
...
程序设置页边距(备注:HWND);
变量
Rect:TRect;
开始
SendMessage(Memo,EM_GETRECT,0,Longint(@Rect));
Rect.Right:=Rect.Right-GetSystemMetrics(SM_CXHSCROLL);
SendMessage(Memo,EM_SETRECT,0,Longint(@Rect));
结束;
过程TForm1.FormCreate(发送方:TObject);
开始
备注1.滚动条:=ssVertical;
备忘录1.Lines.Text:='';
设置边距(备注1.手柄);
Memo1.Lines.Text:=“EM_GETRECT消息检索格式”+
'编辑控件的矩形。格式化矩形是限制性的'+
'控件将文本绘制到其中的矩形';
结束;
过程TForm1.WMCommand(var Msg:TWMCommand);
开始
如果(Msg.Ctl=Memo1.Handle)和(Msg.NotifyCode=EN_UPDATE),则开始
如果Memo1.Lines.Count>6,则//最多6行
备注1.滚动条:=ssVertical
否则开始
如果Memo1.ScrollBars无,则开始
备注1.滚动条:=ssNone;
设置边距(备注1.手柄);
结束;
结束;
结束;
继承;
结束;

设置右边距的问题是,如果文本必须重新构造以适应,则删除/放置垂直滚动条看起来非常难看


请注意,上述示例假设最多有6行。要知道备忘录中可以容纳多少行,请参见以下问题:
.

是否有人知道这是VCL问题,或者Microsoft Windows(多行)编辑控件的行为是否与此类似(即,没有自动设置滚动条可见性)?我认为这是Windows的“问题”。例如,看看记事本。@zigiz-Hi。您找到了完整的解决方案吗?当WordWrap为False,并且文本超出了TMemo的可见区域时,应该有水平滚动条。@ZigiZ-我已经为您提供了一个可能的想法来使用。这个问题没有给出细节。如果愿意,您可以自己处理细节:)。谢谢您的努力!我将更深入地研究它:)