我需要简单的 TMemo,它在不需要时不显示滚动条(即文本不足),但在需要时显示。类似 ScrollBars =ssAuto
或类似 TRichEdit 的东西HideScrollBars
。
我试图继承一个 TMemo 并ES_DISABLENOSCROLL
像在 CreateParams 中一样使用它,TRichEdit
但它不起作用。
编辑:这应该在启用或不WordWrap
启用的情况下工作。
如果您的备忘录放在表单上,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 中文本行的高度?.