2012-06-20 43 views
17

Tại sao Memo.Lines sử dụng lớp TStrings trừu tượng? Tại sao nó không sử dụng TStringList thay thế?Tại sao memo.Lines sử dụng TStrings thay vì TStringList?

Và tôi có nên chuyển đổi nó thành TStringList trước khi làm việc với nó không?

+2

'TMemo.Lines là TStringList = false'. Trong thực tế, đối tượng thực sự đằng sau này là một trình bao bọc xung quanh API Windows. Việc lưu trữ được tổ chức bởi điều khiển Windows EDIT thực hiện 'TMemo'. "Tôi có nên chuyển nó sang TStringList trước khi làm việc với nó không?" Không. Tại sao bạn muốn làm điều đó? –

+5

TStrings là một "hợp đồng" nhỏ hơn cho phép sự linh hoạt lớn hơn cho nhà phát triển. Bạn có thể tương tác với bất kỳ lớp nào thực hiện lớp trừu tượng TStrings. – Simon

Trả lời

21

TMemo.Lines, TListBox.Items, TComboBox.Items, v.v ...; tất cả được khai báo là TStrings. Cẩn thận, nói về tài sản đó! Các loại được tạo bên trong tương ứng là TMemoStrings, TListBoxStringsTComboBoxStrings, tất cả đều là hậu duệ của TStrings và khác nhau theo cách lưu trữ.

Và tại sao? Đối với khả năng thay thế và khả năng tương tác. Vì vậy, mỗi một thuộc tính TStrings đều có cùng thuộc tính và bạn có thể làm:

Memo1.Lines := ListBox1.Items; 

Cách sử dụng? Vâng, một tài sản TStrings như TMemo.Lines hoạt động tốt. Bạn có thể thêm, xóa, thay đổi, gia hạn và xóa các chuỗi (và các đối tượng) trên thuộc tính, vì nội bộ nó là một TMemoStrings thực hiện tất cả tương tác này. Tuyên bố <> triển khai.

Nhưng khi bạn muốn xử lý đặc biệt, ví dụ: như phân loại mà TStringList cung cấp, sau đó bạn cần trợ giúp. Bạn không thể định kiểu cũng không chuyển đổi một TMemo.Lines đến một TStringList, bởi vì nó không phải là một, nhưng thay vào đó bạn cần phải tạo ra một đối tượng trung gian để chế biến đặc biệt này:

var 
    Temp: TStringList; 
begin 
    Temp := TStringList.Create; 
    try 
    Temp.Assign(Memo1.Lines); 
    Temp.Sort; 
    Memo1.Lines.Assign(Temp); 
    finally 
    Temp.Free; 
    end; 
end; 
+1

Ok cảm ơn, điều đó có ý nghĩa. Vì vậy, tôi đoán ví dụ Memo.Lines.Delete (0) hoạt động vì nó không sử dụng nội bộ TStrings? – Illiou

+0

Có. Khi thả một thành phần ghi nhớ trên biểu mẫu của bạn không dẫn đến lỗi trình biên dịch _abstract, hãy giả sử rằng không có đối tượng trừu tượng nào được khởi tạo. ;) – NGLN

+1

Chắc chắn có một cách trượt tuyết để sắp xếp tại chỗ. –

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