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