2013-04-09 21 views
5

Sau khi áp dụng một kiểu mới khi chạy ứng dụng MainForm của ứng dụng tạo một cửa sổ mới - có cách nào để ngăn chặn điều này hoặc gán lại Xử lý khi tôi nhận được một lỗi sau :Xử lý cửa sổ Delphi XE2, vcl

'Lỗi hệ thống. Mã số: 1400. Tay cầm cửa sổ không hợp lệ '

Có cách nào để thao tác quá trình bắt buộc xử lý mới không?

tôi giải quyết này làm như sau:

hình thức chính của tôi đã tạo ra một hình thức vô hình 'helper' mà không bao giờ được hiển thị, nhưng điều đó không có các thành phần thị giác - nó đã được ném các lỗi xử lý khi nó đang cố gắng vẽ lại những thành phần trực quan, vì vậy tôi đã thay thế các thành phần có liên quan bằng các đối tượng thay thế (lưu ý tôi không viết mã này ban đầu).

+1

Không lưu trữ các bản sao của cửa sổ xử lý (đặc biệt là trong chủ đề), xem ['PostMessage trả về" xử lý cửa sổ không hợp lệ "trong thread'] (http://stackoverflow.com/q/3474227/576719). –

+1

Có nhiều cách để tránh điều đó. Nếu bạn cho chúng tôi biết lý do tại sao điều đó xảy ra thì chúng tôi có thể trợ giúp. Vì vậy, tại sao bạn có một cửa sổ xử lý cũ? –

Trả lời

5

Không có cách nào để tránh tạo lại tay cầm cửa sổ. Thay vào đó, hãy ghi đè các phương thức CreateWndDestroyWnd của cửa sổ để bạn được thông báo khi cửa sổ được tạo lại.

Ngoài ra, tránh lưu giữ các tham chiếu liên tục đến các chốt của cửa sổ có thể bị hủy. Thay vào đó, hãy đọc thuộc tính Handle mỗi khi bạn cần. Sau đó, bạn sẽ không phải xem thông báo.

Hãy coi chừng việc đọc Handle từ một chuỗi khác, vì nó có thể khiến cửa sổ bị liên kết với chuỗi không đúng. Quấn bất kỳ mã nào cần tương tác với cửa sổ VCL vào một phương thức mà bạn gọi qua Synchronize hoặc Queue.