2012-04-18 23 views
12

Tôi cần TMemo đơn giản KHÔNG hiển thị thanh cuộn khi chúng không cần thiết (ví dụ: văn bản không đủ), nhưng khi nào chúng cần. một cái gì đó như ScrollBars = ssAuto hoặc giống như TRichEdit HideScrollBars.TMemo với Auto Show/Hide Scrollbars

Tôi đã cố gắng phân lớp một TMemo và sử dụng ES_DISABLENOSCROLL trong CreateParams như trong TRichEdit nhưng nó không hoạt động.

Chỉnh sửa: Tính năng này sẽ hoạt động khi có hoặc không có WordWrap được bật.

+2

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)? –

+2

Tôi nghĩ đó là vấn đề của Windows. Nhìn vào Notepad, ví dụ. –

+0

@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

Trả lời

5

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?.

+2

Sẽ có thanh cuộn ngang khi WordWrap là Sai và văn bản vượt quá vùng hiển thị của TMemo. – ZigiZ

+3

@ZigiZ - Tôi đã cung cấp một ý tưởng có thể cho bạn để chơi cùng. Câu hỏi không đưa ra chi tiết cụ thể. Bạn có thể làm việc trên các chi tiết chính mình nếu bạn thích :). –

+0

Cảm ơn bạn đã nỗ lực! Tôi sẽ nhìn sâu hơn vào nó :) – ZigiZ