2

複数のポリゴンを TFPolygon = この TObjectList 内の TPoint の配列として格納する Objectlist を定義しました。しかし、私のオブジェクトリストの追加機能を使用すると、アクセス違反エラーが発生します:

type
  TFPolygon = array of TPoint;
  TFPolygonList = class(TObjectList)
  private
    procedure SetPolygon(Index: Integer; Value: TFPolygon);
    function GetPolygon(Index: Integer): TFPolygon;
  public
    procedure Add(p: TFPolygon);
    property Items[index: Integer]: TFPolygon read GetPolygon write SetPolygon; default;
  end;

implementation

procedure TFPolygonList.SetPolygon(Index: Integer; Value: TFPolygon);
begin
  inherited Items[Index] := Pointer(Value);
end;

function TFPolygonList.GetPolygon(Index: Integer): TFPolygon;
begin
  Result := TFPolygon(inherited Items[Index]);
end;

procedure TFPolygonList.Add(p: TFPolygon);
begin
  inherited Add(Pointer(p));
end;

このコード サンプル内のエラーを理解できませんか? クラスを TObjectList 内にのみ格納できますか、それとも TPoints の配列を格納する方法も有効ですか?

4

1 に答える 1

2

あなたのアプローチは有効ではありません。動的配列はマネージド型です。それらの有効期間はコンパイラによって管理されます。それが機能するためには、それらがマネージド型であるという事実を捨ててはなりません。これはまさにあなたがしたことです。

動的配列を にキャストしPointerます。その時点で、動的配列への新しい参照を取得しましたが、aPointerはマネージ型ではないため、コンパイラはそれを認識しません。

問題を解決するためのいくつかのオプションがあります。

  1. 最新の Delphi を使用している場合は、使用を中止してTObjectListください。代わりに、ジェネリック タイプ セーフ コンテナを使用してGenerics.Collectionsください。あなたの場合TList<TFPolygon>、必要なものです。これはコンパイル時のタイプ セーフであるため、マネージド型のすべての有効期間が処理されます。
  2. 古い Delphi を使用している場合は、動的配列をクラス内にラップできます。次に、それらのクラスのインスタンスを に追加しますTObjectList。リストがそのオブジェクトを所有するように構成されていることを確認してください。TFPolygonList物事をうまくカプセル化する実装で純粋にそのラッピングを行うことは完全に可能です。
于 2013-03-27T14:57:05.267 に答える