2011-09-13 41 views
7

Tôi đã cố gắng tìm một cách chung để thông báo cho kiểm soát giao diện người dùng về các thay đổi trong danh sách. Ví dụ, khi một đối tượng được thêm vào danh sách, tôi muốn nó được thêm tự động vào hộp danh sách. Nếu một đối tượng bị xóa khỏi danh sách, tôi muốn nó bị xóa tự động khỏi hộp danh sách.Danh sách theo dõi sử dụng LiveBindings

Thật không may có một số mâu thuẫn không hài lòng giữa danh sách của Delphi: TList <> .Notify là tốt nhưng TStringList.OnChange thậm chí không cho bạn biết những gì thay đổi và TList thậm chí không có bất kỳ thông báo nào!

Tôi đã hy vọng LiveBindings sẽ cho tôi một cách thích hợp để theo dõi các thay đổi trong hầu hết các danh sách, nhưng cho đến nay tôi không thấy nó. Tất cả các ví dụ tôi đã thấy điền vào điều khiển và thiết lập các ràng buộc giữa các mục danh sách và các mục điều khiển (các mục danh sách trong ví dụ của tôi). Nhưng việc thêm/xóa một đối tượng khỏi danh sách không ảnh hưởng đến điều khiển.

Có ai biết một cơ chế mà tôi đã bỏ lỡ hoặc nói chung là một cách chung chung tốt đẹp để làm điều này?

Làm rõ: Dường như tôi chưa đủ rõ ràng trước đây. Lý do tôi cần một cách chung chung, là vì tôi đã viết một điều khiển lưới có thể kết nối với nhiều nguồn khác nhau, bao gồm một số mã hiện có. Tôi đã viết một giao diện mà lưới chấp nhận như là nguồn và sau đó một số lớp bộ điều hợp để chấp nhận một số danh sách và làm cho chúng có sẵn như là giao diện đó. Vì tôi cũng cần phải chấp nhận mã hiện tại, hãy ghi đè TList.Notify không phải là một tùy chọn. Và vì không có sự kiện để xem các thay đổi, nó có nghĩa là TList không có cơ chế thông báo có thể sử dụng được bởi một máy khách, chẳng hạn như lớp bộ điều hợp của tôi. TStrings không có một trong hai, nhưng TStringList tạo ra một OnChange đơn giản, có nghĩa là lớp bộ điều hợp không thể thực sự xác định những gì đã thay đổi.

Tôi thực sự đã có một giải pháp rất tốt đẹp sử dụng TVirtualMethodInterceptor, nhưng điều đó hoàn toàn ngừng hoạt động trong Delphi XE và không cố định trong XE2.

+2

TList có thông báo nhưng bạn phải ghi đè phương thức 'Notify' được bảo vệ. –

+0

@The_Fox Đây là câu trả lời, ít nhất là cho TList. Bạn nên viết nó như một câu trả lời. –

Trả lời

3

Bạn đã bỏ lỡ cơ chế TList.Notify.

TList có quy trình Notify được bảo vệ mà bạn phải ghi đè. Đây là cách TObjectList hoạt động.

+1

Cảm ơn bạn đã trả lời, The_Fox, nhưng vấn đề của tôi là tôi không kiểm soát mã chứa danh sách. Do đó tôi không thể ghi đè lên một phương thức ảo để làm những gì tôi muốn và TList.Notify mặc định không làm gì cả. Tôi cần mã bên ngoài vào danh sách để có thể theo dõi các thay đổi, đó là lý do tại sao tôi hy vọng LiveBindings có thể cung cấp một cơ chế có thể sử dụng. Tôi đã cập nhật mô tả để phản ánh chính xác trường hợp sử dụng của mình và tại sao việc ghi đè ảo sẽ không hoạt động. –

0

Trả lời trễ bit, nhưng TList chung có OnNotify bao gồm mục được thêm hoặc xóa.

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