Delphi 带有自动显示/隐藏滚动条的TMemo
我需要一个简单的TMemo,它在不需要滚动条(即文本不足)时不显示滚动条,但在需要滚动条时显示滚动条。类似滚动条=Delphi 带有自动显示/隐藏滚动条的TMemo,delphi,delphi-7,Delphi,Delphi 7,我需要一个简单的TMemo,它在不需要滚动条(即文本不足)时不显示滚动条,但在需要滚动条时显示滚动条。类似滚动条=sAuto或类似TRichEditHideScrollBars 我曾尝试对TMemo进行子类化,并在CreateParams中使用ES_DISABLENOSCROLL,就像在TRichEdit中一样,但它不起作用 编辑:无论是否启用WordWrap。如果您的备忘录被放置在表单上,当文本被更改并且内容将被重新绘制时,表单将被通知EN\u更新。你可以在这里决定是否有滚动条。我假设我们使用
sAuto
或类似TRichEditHideScrollBars
我曾尝试对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-我已经为您提供了一个可能的想法来使用。这个问题没有给出细节。如果愿意,您可以自己处理细节:)。谢谢您的努力!我将更深入地研究它:)