2013-03-25 43 views
7

Tôi đang sử dụng Delphi XE3.
Khi tôi tạo một dự án VCL mới và thả một TToolbar vào nó, mọi thứ hoạt động tốt - ngoại trừ khi tôi kích hoạt Form1.DoubleBuffered.
Từ thời điểm đó, bản vẽ của thanh công cụ bị hỏng - trong thời gian chờ, màu đen, trong suốt hoặc một phần của IDE (thanh trạng thái, thanh công cụ, v.v.) được sao chép vào đó. Nó thay đổi giữa các tùy chọn này khi tôi nhấp vào nó và khi tôi đổi thành mã nguồn (F12) và ngược lại.
Trong thời gian chạy, nó luôn có màu đen.TToolbar không tương thích với TForm.DoubleBuffered?

Với DrawingStyle=dsGradient, mọi thứ hoạt động như mong đợi. Chuyển trở lại để dsNormal ngắt kết nối lại.

Hủy kích hoạt Form1.DoubleBuffered sửa chữa.

Bất kỳ gợi ý nào về cách khắc phục sự cố đó?

+2

Xem ['Khi không sử dụng DoubleBuffered'] (http://chee-yang.blogspot.se/2010/02/when-not-to-use-doublebuffered.html). Cách giải quyết ở đây là đặt 'TToolBar' trên' TPanel'. –

+0

Cảm ơn LU RD - hoạt động hoàn hảo. Nếu bạn đăng câu trả lời này, tôi sẽ đánh dấu câu trả lời là đã được giải quyết. – Pharaoh

+0

Hoặc bạn có thể điền vào hình chữ nhật của khách hàng của thanh công cụ trong sự kiện 'OnAdvancedCustomDraw' ở giai đoạn vẽ' cdPrePaint' (khá là ['workaround'] (http://pastebin.com/b9yXE5Su) mặc dù). – TLama

Trả lời

4

Theo ý kiến ​​của tôi, giải pháp là đặt TForm.DoubleBuffered thành False. Sử dụng giá trị True gây ra tất cả các loại sự cố khác. Tài sản này đã làm việc khá tốt trước các chủ đề XP, nhưng kể từ khi họ đến, sử dụng TForm.DoubleBuffered đã không thể thực hiện được, theo quan điểm của tôi.

Ngoài các vấn đề bạn gặp phải, tôi đã gặp rất nhiều lỗi khi sử dụng chủ đề Windows Basic. Tôi biết đó không phải là chủ đạo, nhưng tôi thấy rằng rất nhiều với truy cập từ xa. Và còn nhiều hơn nữa. Khi bạn đệm đôi một biểu mẫu, bạn dừng hoạt ảnh chủ đề không hoạt động. Ví dụ, một nút mặc định xung để cho biết rằng đó là nút mặc định.

Nếu bạn nhận được thay đổi kích thước nhấp nháy mà không cần đệm đôi biểu mẫu, hãy sử dụng ideas from my answer to another question. Từ những lời bình luận, có vẻ như sự nhấp nháy mà bạn muốn chiến đấu là trong một hộp sơn. Tôi rõ ràng không biết chi tiết, nhưng kinh nghiệm và bản năng của tôi nói rằng bạn sẽ có thể đối phó khá dễ dàng với việc nhấp nháy ở cấp địa phương. Chắc chắn không cần phải có bộ đệm kép toàn cầu.

+0

Cảm ơn bạn đã gợi ý. Khi tôi đăng bình luận của bạn về câu hỏi của tôi, tôi sẽ sử dụng giải pháp 'TPanel' ngay bây giờ - nhưng tôi sẽ lưu ý đến bạn và chắc chắn sẽ xem xét các vấn đề bạn đã đề cập; có lẽ tôi sẽ làm những gì bạn nói. Cảm ơn một lần nữa. – Pharaoh

+0

Ngừng nhấp nháy hộp sơn của bạn rất dễ dàng. Đệm đôi hình thức là grossly trên đầu trang. Nó ảnh hưởng rất nhiều. Đó là một giải pháp toàn cầu cho một vấn đề địa phương. Nó nên tránh. –

+0

Có, tôi không thể phủ nhận những gì bạn nói. Tôi không biết 'TForm.DoubleBuffered' gây ra nhiều vấn đề; Tôi nghĩ rằng tôi sẽ đi và tắt nó ở khắp mọi nơi tôi đã sử dụng nó cho đến bây giờ. Một lân nưa xin cảm ơn ;) – Pharaoh

4

Như được báo cáo trong bài viết này, When not to use DoubleBuffered, một số điều khiển như TToolBarTRichEdit không hoạt động tốt với thuộc tính DoubleBuffered được đặt thành true.

Lý do được tìm thấy trong tài liệu, TWinControl.DoubleBuffered, trong đó một số WinControls không thể tự vẽ trên một bitmap tạm thời (như xảy ra khi DoubleBuffered là đúng).

Một cách giải quyết có thể là đặt TToolBar trên TPanel.