2016-11-10 13 views
6

Tôi đang làm việc trên một dự án trong delphi XE5. Các menu Popup khác nhau được tạo tại thời gian chạy bằng cách sử dụng cùng chức năng. Tên được cung cấp mỗi lần bật lên bằng cách sử dụng "Xử lý" từ lớp Tcomponent.Xử lý Delphi trong tiêu cực

popupname := 'XYZ' + IntToStr(handle); 

Trên một số hệ thống tôi nhận được "xử lý" giá trị là tiêu cực, khi tôi cố gắng cung cấp cho tên với "-" ký hợp đồng với một thành phần tôi nhận được thông báo lỗi "XYZ-5645 không phải là một tên thành phần hợp lệ"

Bạn có thể gợi ý cho tôi một lối thoát không?

+0

Trong XE3 'THandle = NativeUInt;' Lưu ý loại chưa ký. Làm thế nào nó được định nghĩa trong XE5? Bạn có chắc chắn rằng giá trị xử lý là âm? – MBo

+2

@MBo IntToStr chấp nhận chữ ký int để có một diễn viên tiềm ẩn để ký. –

+0

Mặc dù trên XE7, Int64 quá tải được chọn đầu tiên, vì vậy tôi nghĩ rằng bạn cần một mục tiêu 64 bit trước khi bạn có thể nhấn tình trạng này ........ Có lẽ có một bộ khác nhau của quá tải trong XE5 RTL. –

Trả lời

10

Thay vì IntToStr, mà chấp nhận một số nguyên ký, bạn có thể đối xử với tay cầm như một con trỏ, và do đó đại diện cho giá trị số như hex:

popupname := Format('XYZ%p', [Pointer(Handle)]); 

này có ý nghĩa bởi vì một xử lý trong Windows là, như được xác định trong các tệp tiêu đề, một con trỏ không được nhập, void*.

Như một lợi ích bổ sung, mã của bạn giờ đây sẽ chính xác trên cả nền tảng 32 bit và 64 bit.

Suy nghĩ bên ngoài hộp, có lẽ thành phần không cần một tên nào cả. Nếu vậy, hãy xóa mã này, để mã không bị người quản lý và do đó, hãy giải quyết vấn đề của bạn.

+0

Cảm ơn bạn David. – poonam

+0

@poonam Hãy chú ý đến câu cuối cùng. Nếu bạn buộc phải cung cấp cho một thành phần thời gian chạy được tạo ra một '.Name' để giải quyết một số vấn đề, rất có khả năng nó chỉ đơn giản là giải pháp sai và có cách tốt hơn để tạo ra hành vi tương tự. –

+0

"Chưa được khai báo"? Ý bạn là "untyped"? –

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