1

私は Freepascal でイベント マネージャーをやっています。
各イベントはオブジェクト タイプ TEvent (=オブジェクト) であり、各種類のイベントはこのクラスから派生する必要があります。
イベントは、動的に割り当てられる整数識別子によって区別されます。
問題は、インスタンスのイベント ID を取得したいのですが、うまくできないことです。

  • クラス(オブジェクト)のすべてのインスタンスには一意のID =>があるため、静的フィールドにする必要があります。
  • すべてのクラスには異なる id => があるため、仮想でなければなりません。
  • イベントIDは実行時に割り当てられ、変更される可能性がある=>ため、単純な方法にはなりません

要するに、私はこれをすべてまとめることができません。
私はエレガントなソリューションを探しています。ハードコードされたテーブルを書きたくないので、すべてのコンストラクターでそれを実現します...など、ポリモーフィズムを利用したものを好む
誰かが別の技術的または設計的ソリューションで私を助けてくれますか? ?
オブジェクト構成の代わりにクラスを使用したくないことに注意してください。(プロパティはオブジェクトでは機能しませんか? :(

4

2 に答える 2

0

次のような簡単なテーブル/リストを作成できます。

unit classids;

{$mode objfpc}{$H+}

interface

function GetClassID(c:TClass):Integer;
procedure SetClassID(c:TClass; id:Integer);

property ClassID[c:TClass]:Integer read GetClassID write SetClassID;

implementation
uses Maps;

var Map:TMap;

function GetClassID(c:TClass):Integer;
begin
 if not Map.GetData(c,Result) then
  Result:=0; //Or any default you like
end;

procedure SetClassID(c:TClass; id:Integer);
begin
 Map.Delete(c);
 Map.Add(c,id);
end;

initialization
 Map:=TMap.Create(itu4,SizeOf(Integer));
finalization
 FreeAndNil(Map);
end.

次に、IDを取得/設定できます

ClassID[TMyObject]:=12;
ShowMessage(IntToStr(ClassID[TMyObject])); //shows 12

幸運を

于 2011-10-23T02:49:24.543 に答える
0

新しいデルフィのように、クラス変数のようなものが必要になる場合があります。ただし、それは FPC の開発バージョン (2.5.1+) のみです。

オブジェクト タイプは TP レガシーであり、このミレニアムで開発されていないことに注意してください。それが変わるとは思っていません。それ以上のものが必要な場合は、クラスを使用することをお勧めします。

于 2010-04-10T22:29:23.073 に答える