Nếu bản ghi nhớ của bạn được đặt trên biểu mẫu, biểu mẫu sẽ được thông báo bằng số EN_UPDATE
khi văn bản đã được thay đổi và nội dung sẽ được vẽ lại. Bạn có thể quyết định ở đây nếu có bất kỳ thanh cuộn nào. Tôi giả định chúng ta đang chơi với thanh cuộn dọc và không có thanh cuộn ngang:
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;
Điều với thiết lập lề phải là, loại bỏ/đặt thanh cuộn dọc trông hoàn toàn xấu xí nếu văn bản có được cấu trúc lại để phù hợp.
Lưu ý rằng ví dụ trên giả định tối đa 6 dòng. Để biết có bao nhiêu dòng có thể vừa với bản ghi nhớ của bạn, hãy xem câu hỏi này: How do I determine the height of a line of text in a TMemo programmatically?.
Nguồn
2012-04-18 16:04:49
Có ai biết nếu đây là một vấn đề VCL, hoặc nếu Microsoft Windows (multiline) EDIT kiểm soát hành vi như thế này (có nghĩa là, không tự động thiết lập khả năng hiển thị thanh cuộn)? –
Tôi nghĩ đó là vấn đề của Windows. Nhìn vào Notepad, ví dụ. –
@zigiz - Xin chào. Bạn đã tìm thấy một giải pháp hoàn chỉnh cho điều này? – Ampere