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.
Đ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? –
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 đề. –
@LURD cùng một vấn đề: Lỗi trình biên dịch nội bộ – dummzeuch