2012-11-15 5 views
1

GDI를 사용하여 다각형을 그리려합니다. 이 코드는 작동 :동적 배열은 정적 배열과 어떻게 다릅니 까?

type 
    TPolygon: Array[0..2] of TPoint; 

var 
    ACanvas: TGPGraphics; 
    MyBrush: TGPLinearGradientBrush; 

... 

procedure DrawPolygon; 
var 
    Polygon: TPolygon; 
begin 
    Polygon[0].X := 1; 
    Polygon[0].Y := 5; 
    Polygon[1].X := 10; 
    Polygon[1].Y := 15; 
    Polygon[2].X := 1; 
    Polygon[2].Y := 5; 

    ACanvas.FillPolygon(MyBrush, PGPPoint(@Polygon), length(Polygon)); 
end; 

... 

이 코드는 GDI 값 오버플 오류 발생 :

type 
    TPolygon: Array of TPoint; 

var 
    ACanvas: TGPGraphics; 
    MyBrush: TGPLinearGradientBrush; 

... 

procedure DrawPolygon; 
var 
    Polygon: TPolygon; 
begin 
    SetLength(Polygon, 3); 

    Polygon[0].X := 1; 
    Polygon[0].Y := 5; 
    Polygon[1].X := 10; 
    Polygon[1].Y := 15; 
    Polygon[2].X := 1; 
    Polygon[2].Y := 5; 

    ACanvas.FillPolygon(MyBrush, PGPPoint(@Polygon), length(Polygon)); 
end; 

... 

유일한 차이점은 하나 개의 포인트 어레이 동적 있다는을 다른 정적이다. 분명히 기본 메모리 값은 다르지만 어떤 방식으로?

답변

8

코드가 유효하지 않습니다. (첫번째로, TCanvasFillPolygon이없고 둘째, 폴리곤에 꼭지점이 3 개 이상 필요합니다. 또한 const 대신에 : =와 같은 구문 오류가 있습니다.) 샘플을 제안합니다.

Polygon[0].X := 1; 
Polygon[0].Y := 1; 
Polygon[1].X := 1; 
Polygon[1].Y := 100; 
Polygon[2].X := 100; 
Polygon[2].Y := 1; 

멋진 삼각형입니다. 어쨌든, 정적 배열

Windows.Polygon(Canvas.Handle, Polygon, 3) 

작동하는 동안, 당신은 동적 배열에 대한

Windows.Polygon(Canvas.Handle, Polygon[0], 3) 

을해야한다. 이유는 정적 인 배열이 숫자 (예 : cardinal)가 저장되는 것처럼 @Polygon에 직접 메모리에 저장되거나 ShortString 또는 이러한 간단한 유형의 레코드가 메모리에 '현재 위치에'저장되어 있기 때문입니다. 반대로, Polygon동적 인 어레이 인 경우 실제로는 실제 가변 길이 데이터에 대한 포인터입니다 (일반적인 가변 길이 문자열이 작동하는 것과 거의 같은 방식으로). 즉, @Polygon에는 NativeUInt이라는 포인터 만 있습니다. 실제 데이터는이 새로운 주소에서 시작합니다. 주소는 @Polygon[0]입니다.

ACanvas.FillPolygon(MyBrush, PGPPoint(Polygon), length(Polygon)); 

을 또는 당신이 정적 및 동적 배열 모두를 위해 작동하는 구문을 사용하려는 경우 : FillPolygon()에 동적 배열을 전달할 때 동적 배열이 이미 포인터입니다

+0

감사합니다. Andreas. 내 게시물에 Canvas가 TCanvas라고 나와 있지 않습니다. 실제로 TGP 그래픽입니다. 더 명확하게 질문을 편집하겠습니다. – norgepaul

+1

@norgepaul : 알겠습니다. 글쎄, 그 대답은 거의 똑같습니다. 하지만이 경우에도 적어도 세 개의 정점이 필요합니까? –

+0

기술적으로, 폴리곤을 동봉해야합니다. 그러나이 경우 2 점은 직선을 그립니다. 그러나 귀하의 요점을보고 나는 질문을 업데이 트했습니다 : – norgepaul

5

, 그래서 그냥 @ 연산자를 제거 대신 다음을 수행하십시오.

ACanvas.FillPolygon(MyBrush, PGPPoint(@Polygon[0]), length(Polygon)); 
관련 문제