2015-04-13 12 views
7

Với loại kỷ lục sau đây:Tôi có thể gán phương thức của một bản ghi mở rộng cho một sự kiện trong Delphi không?

type 
    TMyRecord = record 
    private 
    procedure SomeMethod(_Sender: TObject); 
    end; 

chúng ta có thể gán phương pháp này là xử lý sự kiện?

var 
    MyRecord: TMyRecord; 
begin 
    Button1.OnClick := MyRecord.SomeMethod; 
end; 

Trong Delphi 2007, tôi nhận được lỗi trình biên dịch nội bộ C1264 sau khi gán.

Tôi không chắc liệu cấu trúc nội bộ của phương thức của Bản ghi có đáp ứng các yêu cầu được gán cho con trỏ sự kiện hay không.

EDIT: Như David Heffernan chỉ ra, đây là một lỗi biên dịch trong Delhpi 2007. Tôi đã kết thúc bằng cách sử dụng workaround sau:

type 
    TMyRecord = record 
    private 
    procedure SomeMethod(_Sender: TObject); 
    function GenerateNotifyEvent(_CodePtr: pointer): TNotifyEvent; 
    end; 

function TMyRecord.GenerateNotifyEvent(_CodePtr: pointer): TNotifyEvent; 
var 
    Method: TMethod; 
begin 
    Method.Data := @Self; 
    Method.Code := _CodePtr; 
    Result := TNotifyEvent(Method); 
end; 

var 
    MyRecord: TMyRecord; 
begin 
    Button1.OnClick := MyRecord.GenerateNotifyEvent(@TMyRecord.SomeMethod); 
end; 

Không đẹp như một nhiệm vụ đơn giản, nhưng đủ tốt. Tôi chỉ muốn tôi có thể chỉ cần cập nhật lên một phiên bản mới hơn của Delphi, nơi mà lỗi đã được cố định.

+0

Điều gì sẽ xảy ra nếu bạn viết thuộc tính sự kiện trên hồ sơ của mình? –

+1

Nếu bạn có thể thay đổi 'TMyRecord', bạn có thể biến nó thành một' đối tượng' như một giải pháp thay thế. Tôi đã làm điều đó trong D2007 một thời gian và không nhận thấy vấn đề. –

+0

@LURD cùng một vấn đề: Lỗi trình biên dịch nội bộ – dummzeuch

Trả lời

6

Có, bạn sẽ có thể thực hiện việc này. Bạn có thể chỉ định các loại phương pháp sau:

  • Phương pháp thể hiện của các lớp.
  • Phương pháp lớp học của lớp học.
  • Phương pháp bản ghi sơ thẩm.
  • Phương pháp thể hiện của các đối tượng, đó là các loại không dùng nữa được giới thiệu với từ khóa object.

Vì đây là lỗi trình biên dịch nội bộ, đây có vẻ là lỗi trình biên dịch trong Delphi 2007. Chắc chắn mã của bạn sẽ biên dịch trong các phiên bản sau của Delphi.

QC#59807 có vẻ rất giống với vấn đề của bạn. Theo báo cáo lỗi đó đã được giải quyết trong xây dựng 11.0.2902.10471. Sau đó, một lần nữa, có lẽ nó là cái này: QC#60621 được báo cáo là đang được giải quyết trong xây dựng 12.0.0.15784.

Nếu bạn không thể nâng cấp lên một trình biên dịch mà không có lỗi, sau đó làm điều này:

var 
    Method: TMethod; 
.... 
Method.Code := @TMyRecord.SomeMethod; 
Method.Data := @MyRecord; 
Button1.OnClick := TNotifyEvent(Method); 
+0

Có cách nào khác để gán phương thức như vậy không? ví dụ. Tôi có thể typecast nó để một cái gì đó (như TMethod) để tránh lỗi trình biên dịch? – dummzeuch

+0

Nó không phải là một lỗi biên dịch. Đó là lỗi trình biên dịch nội bộ. Đó là một ICE. Nói cách khác, một lỗi trình biên dịch. –

+0

Vâng, tôi biết sự khác biệt. Tôi vẫn muốn phá vỡ điều này. – dummzeuch

2

Nó hoạt động trong XE7. Không có cảnh báo. Nội dung phương thức thực hiện như mong đợi khi nhấp vào nút.

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