2013-03-27 5 views
2

이 TObjectList 안에 TFPolygon = TPoint 배열로 여러 Polygons를 저장할 Objectlist를 정의했습니다.TObjectList 내부에 TPoint의 배열을 저장합니다.

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; 

이 코드 샘플 내부 오류를 이해할 수 없다 :하지만 내 통해 Objectlist의 추가 기능 나는 액세스 위반 오류 를 얻을? TObjectList 내에서만 클래스를 저장할 수 있습니까? 아니면 TPoint 배열을 저장할 수있는 방법이 유효합니까?

답변

2

귀하의 접근 방법은 유효하지 않습니다. 동적 배열은 관리되는 유형입니다. 그들의 수명은 컴파일러에 의해 관리됩니다. 그렇게하기 위해서 당신은 당신이했던 것과 정확히 같은 관리 형이라는 사실을 버려서는 안됩니다.

동적 배열을 Pointer으로 변환합니다. 이 시점에서 동적 배열에 대한 새 참조를 가져 왔지만 Pointer이 관리되는 유형이 아니므로 컴파일러는이를 인식하지 못합니다.

문제를 해결할 수있는 몇 가지 옵션이 있습니다.

  1. 현대 델파이를 사용하는 경우 TObjectList을 사용하지 마십시오. 대신 Generics.Collections에 제네릭 유형 안전 컨테이너를 사용하십시오. 귀하의 경우에는 TList<TFPolygon>이 필요합니다. 이것은 컴파일 타임 타입 안전이므로 모든 관리되는 유형의 수명이 처리됩니다.
  2. 이전 델파이를 사용하는 경우 동적 배열을 클래스 내에 래핑 할 수 있습니다. 그런 다음 해당 클래스의 인스턴스를 TObjectList에 추가하십시오. 목록이 해당 개체를 소유하도록 구성되어 있는지 확인하십시오. 일을 잘 캡슐화하는 TFPolygonList의 구현에서 순전히 래핑을 수행하는 것이 완벽하게 가능합니다.
+1

내 코드가 모두 TFPolygonList = TList로 바뀝니다. ; 멋진 짧은 버전 :-) – user1769184

+0

@user 예, 필요한 것처럼 들립니다. 제네릭 전에 우리가 어떻게 관리했는지 모르겠군요! –

+1

@David, 우리는 더 많은 코드를 작성했고 더 작은 실행 파일을 가지고 있습니다. – Runner

관련 문제