Pertanyaan Dapatkah saya menetapkan metode catatan diperpanjang ke suatu peristiwa di Delphi?


Diberikan jenis catatan berikut:

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

apakah mungkin untuk menetapkan metode ini sebagai pengendali event?

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

Dalam Delphi 2007 saya mendapatkan kesalahan kompiler internal C1264 setelah penugasan.

Saya tidak yakin apakah struktur internal dari metode Record memenuhi persyaratan untuk ditugaskan ke penunjuk kejadian.

EDIT: Seperti yang ditunjukkan David Heffernan, ini adalah bug kompilator dalam Delhpi 2007. Saya akhirnya menggunakan solusi berikut:

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;

Tidak sebaik tugas sederhana, tapi cukup baik. Saya hanya berharap dapat memperbarui ke Delphi versi yang lebih baru ketika bug itu diperbaiki.


7
2018-04-13 13:56


asal


Jawaban:


Ya, Anda seharusnya bisa melakukan ini. Anda dapat menetapkan jenis metode berikut:

  • Instance metode kelas.
  • Kelas metode kelas.
  • Instance metode rekaman.
  • Instance metode objek, itu adalah jenis yang diperkenalkan dengan deprecated object kata kunci.

Karena ini adalah kesalahan kompiler internal, ini akan tampak sebagai bug kompilator dalam Delphi 2007. Tentu saja kode Anda akan dikompilasi dalam versi Delphi yang lebih baru.

QC # 59807 tampaknya sangat mirip dengan masalah Anda. Menurut laporan bug itu diselesaikan dalam membangun 11.0.2902.10471. Kemudian lagi, mungkin ini yang ini: QC # 60621 yang dilaporkan telah diatasi dalam versi 12.0.0.15784.

Jika Anda tidak dapat meng-upgrade ke compiler yang tidak memiliki kesalahan, maka lakukan ini:

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

6
2018-04-13 14:01



Ia bekerja di XE7. Tidak ada peringatan. Metode konten dieksekusi seperti yang diharapkan pada klik tombol.


2
2018-04-13 14:03