2012-02-11 7 views
3

レコードと、互いに使用するいくつかのオブジェクトイベントを宣言する方法を理解しようとしています。問題はどのように宣言しても、私は「宣言されていない識別子」を持っています。レコードをパラメータとして使用するイベントを含むレコードを宣言する方法

以下のコードでは、それらをお互いに使うことができますか?イベントはオブジェクトで使用され、レコードはオブジェクトのコンストラクタに渡されて使用されます。

TMyEvent = procedure(Sender: TObject; var Rec: TMyRecord) of object; 

    TMyRecord = record 
    OnMyEvent: TMyEvent; 
    end; 

これは可能ですか? Delphi 7以上のすべてのバージョンで動作する必要があります。私の知っている唯一の方法は、ポインタを使用することですので

+2

+1です。 BTW:あなたのイベント処理コードが新しいレコードを割り当てて、それを 'Rec'に割り当てる場合を除き、Rec:PMyRecordの前のvarは必要ありません。オブジェクトを渡すときと同じです。たとえば、 'TStringList'を手続きに渡して追加の文字列を追加する場合は、' var SList:TStringList'を使う必要はありませんが、 'const SList:TStringList'を使うことができます。 –

+0

@jerryあなたはあまりにも速く答えを受け入れました –

+0

@DavidHeffernan私はそれが私の問題を完全に解決したと思います。ちょうど7までのすべてのバージョンとの互換性について何も言及していませんでした。 –

答えて

3

残念ながら、前方宣言は唯一、クラスではなく、レコードのために許可されています。

PMyRecord = ^TMyRecord; 

TMyEvent = procedure(Sender: TObject; Rec: PMyRecord) of object; 

TMyRecord = record 
    OnMyEvent: TMyEvent; 
end; 
+1

イベント処理コードが 'Rec'のアドレスを変更しない限り、' Rec:PMyRecord'の前の 'var'は必要ありません。あなたはそれなしでレコードの内容を変更することができます。 –

+1

もし私がそれをしなければならなかったら、私はそれをレコードの代わりにクラスにしたでしょう。 –

+0

これは、実際にはすでにこのレコードをいくつかの場所でポインタとして使用しているため、完璧に機能します。 –

14

あなたはより多くの最近のDelphiのバージョンを使用している場合は、型を宣言することができますレコード内。あなたのイベントからレコードを参照する方法は次のとおりです。

type 
    TMyRecord = record 
    public type 
    TMyEvent = procedure (Sender: TObject; var Rec: TMyRecord) of object; 
    public 
    OnMyEvent: TMyEvent; 
    end; 
+1

+1これが最適な解決策です。私が現時点で制限していることの1つは、演算子のオーバーロードを使用しているときに、レコードの前方参照ができないことです。私はrec Aにrec Bを操作するopsを、またその逆もしたい。それは言語の現時点では不可能です。しかし、それは簡単にできます。オペランドはポインタとして渡されるため、宣言のポイントでレイアウトを知る必要はありません。 –

+0

補遺:最新の宣言記録にすべての操作を入れることができることは分かっていますが、時にはもっと自然に属する場所に置くこともあります。 –

+0

+1これは本当に知っておくべきことですが、a)互換性についてD7に言及しておき、b)他の場所でこのイベントタイプを使用する必要があります。 –

関連する問題