2009-06-01 25 views
11

Khi bạn chỉnh sửa chú thích của TLabel trong trình thiết kế biểu mẫu, nó sẽ thay đổi kích thước nhãn TLabel cho bạn. Có cách nào tôi có thể nhận được một TMemo để làm điều đó, tại thời gian chạy?Tôi có thể tự tạo kích thước TMemo cho văn bản chứa nó không?

Tôi muốn có thể lấy TMemo, gán thứ gì đó cho thuộc tính .lines.text của nó và sau đó yêu cầu nó tự thay đổi kích cỡ và không vượt quá chiều rộng nhất định, mặc dù nó có thể cao bằng . Có ai biết làm như thế nào không?

Trả lời

6

Đặt WordWrap tài sản của TMemo true, đổ văn bản của bạn vào nó, đếm dòng, và thiết lập chiều cao đối với sản phẩm của các số dòng và chiều cao dòng, nhưng bạn cần phải biết dòng Chiều cao.

TMemo không hiển thị thuộc tính chiều cao dòng, nhưng nếu bạn không thay đổi phông chữ hoặc kích thước phông chữ khi chạy, bạn có thể xác định chiều cao dòng thử nghiệm tại thời điểm thiết kế.

Đây là mã tôi đã sử dụng để đặt chiều cao của TMemo có chiều cao dòng là 13 pixel. Tôi cũng thấy rằng tôi cần một hằng số nhỏ để tính đến biên giới trên cùng và dưới của TMemo. Tôi giới hạn chiều cao đến 30 dòng (396 pixel) để giữ nó trên biểu mẫu.

// Memo.WordWrap = True (at design time) 
Memo.Text := <ANY AMOUNT OF TEXT>; 
Memo.Height := Min(19 + Memo.Lines.Count * 13, 396); 

Nếu bạn hoàn toàn phải rút chiều cao dòng khỏi đối tượng trong thời gian chạy, khi đó bạn có thể sử dụng Someone's answer. Hoặc, bạn có thể sử dụng TRichEdit, có thuộc tính SelAttributes chứa thuộc tính Height cho chiều cao dòng.

-Al.

+0

Tôi nên nghĩ về điều đó. Tôi đã quá quen với việc làm việc với TStringLists, điều này làm cho dòng sản phẩm bị hỏng ở CRLF, rằng nó không bao giờ xảy ra với tôi rằng thuộc tính WordWrap sẽ thực sự đặt các dòng bọc trên các chuỗi .Lines khác nhau. Cảm ơn! –

+0

Font.Height giữ một số âm đếm số lượng pixel trong một dòng văn bản. Ngoài ra, bạn có thể gọi Canvas.TextExtent để có chiều cao văn bản được tính toán. –

7

Điều này làm việc tốt cho tôi. Hằng số được thêm (8) có thể thay đổi tùy thuộc vào việc bạn đang sử dụng đường viền và/hoặc bevel, thử nghiệm với nó.

procedure TForm1.Memo1Change(Sender: TObject); 
var 
    LineHeight: Integer; 
    DC: HDC; 
    SaveFont : HFont; 
    Metrics : TTextMetric; 
    Increase: Integer; 
    LC: Integer; 
begin 
    DC := GetDC(Memo1.Handle); 
    SaveFont := SelectObject(DC, Memo1.Font.Handle); 
    GetTextMetrics(DC, Metrics); 
    SelectObject(DC, SaveFont); 
    ReleaseDC(Memo1.Handle, DC); 
    LineHeight := Metrics.tmHeight; 
    Increase := Memo1.Height; 
    LC := Memo1.Lines.Count; 
    if LC < 1 then 
    LC := 1; 
    Memo1.Height := LC * LineHeight + 8; 
    Increase := Memo1.Height - Increase; 
    Memo1.Parent.Height := Memo1.Parent.Height + Increase; 
end; 
+0

Câu trả lời hay. Tôi chọn cái khác vì nó đơn giản hơn, nhưng nó hoạt động khá tốt. BTW bạn không cần phải lo lắng về +8; bạn có thể chỉ định ClientHeight và để hệ thống quản lý biên giới. –

+0

Tôi biết điều này là cũ, nhưng tôi đã cố gắng gợi ý @MasonWheeler và nó không bao giờ làm việc đúng. Tôi tin rằng vì ClientHeight bao gồm phần đệm nội bộ mà Memo có. Vì vậy, ngay cả thiết lập ClientHeight bạn cần phải thực hiện một cuộc gọi đến EM_GETRECT để thực sự tính toán điều chỉnh kích thước. – Tony

1
procedure TTmpMessage.edMsgChange (Sender: TObject); 
var 
    LineHeight : Integer; 
    DC   : HDC; 
    SaveFont : HFont; 
    Metrics : TTextMetric; 
begin 
    DC := GetDC (TRxRichEdit (Sender).Handle); 
    SaveFont := SelectObject (DC, TRxRichEdit (Sender).Font.Handle); 
    GetTextMetrics (DC, Metrics); 
    SelectObject (DC, SaveFont); 
    ReleaseDC (TRxRichEdit (Sender).Handle, DC); 
    LineHeight := Metrics.tmHeight; 
    Height := TRxRichEdit (Sender).Lines.Count * LineHeight + 32; 
end; 
2

Tôi đã thực hiện một sự tự phát triển TMemo như một ví dụ tốt đẹp của LiveBindings (một trong số ít các ví dụ hữu ích tôi có thể đưa ra cho LiveBindings trong VCL).

một trích dẫn từ chương trình học của nhãn hiệu Delphi XE2 Phát triển Essentials của tôi:.

"Xây dựng ví dụ này, đặt một thành phần TMemo trên một hình thức VCL, mở LiveBindings bất động sản, và chọn‘LiveBinding mới’tùy chọn Chọn Mở BindExpressionMemo11 trong Thanh tra đối tượng và đặt SourceComponent thành Memo1 và SourceExpression thành Lines.Count * 22. Để có kết quả tốt hơn khi chạy, hãy đặt SourceExpression thành biểu thức chính xác hơn

Font.Size - 4 + (Lines.Count + 1) * -1 * (Font.Height - 3)

Cuối cùng, trong trình xử lý sự kiện OnChange của TMemo, hãy viết một dòng mã:

BindingsList1.Notify (Sender, '');

Chính là vậy. Biên dịch và chạy để xem bản ghi nhớ đang hoạt động.cao

[ảnh chụp màn hình]

Ban đầu, sự kiểm soát TMemo sẽ có hai dòng (dòng với những nội dung, và một dòng tiếp theo), và bất cứ khi nào chúng ta nhấn Enter hoặc từ gói ứng trước chúng ta đến dòng tiếp theo, các TMemo điều khiển sẽ phát triển chiều cao (tăng trưởng xuống trên thực tế, do đó hãy chắc chắn để lại đủ không gian trên dưới hình thức cho TMemo để mở rộng bản thân) "

Groetjes, Bob Swart

+0

Tôi đã thực sự vui mừng về câu trả lời này nhưng nó dường như không còn là một lựa chọn nữa của XE10 Berlin. – Tony

0

Và tại sao không chỉ:.

Memo1.Height := Memo1.ContentBounds.Height + 5; 
+0

bởi vì nó không phải là fmx –

Các vấn đề liên quan