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.
TList có thông báo nhưng bạn phải ghi đè phương thức 'Notify' được bảo vệ. –
@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. –