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;

...

唯一の違いは、一方の点配列が動的で、もう一方が静的であることです。明らかに、基礎となるメモリ値は異なりますが、どのように?

4

2 に答える 2

8

あなたのコードは無効です。(最初に、に はありませんFillPolygonTCanvas次に、ポリゴンには少なくとも 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)

動的配列の場合。その理由は、静的配列がメモリに「その場で」格納されるためです。つまり、数値@Polygon(たとえば、反対に、が動的配列の場合、実際には実際の可変長データへのポインターです (通常の可変長文字列とほとんど同じように機能します)。つまり、あなたにはポインタしかありません。実際のデータは、この新しいアドレスから始まります。これは、.cardinalShortStringPolygon@PolygonNativeUInt@Polygon[0]

于 2012-11-15T13:11:56.807 に答える
5

動的配列はすでにポインターであるため、動的配列を:@に渡すときに演算子を削除するだけです。FillPolygon()

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

または、静的配列と動的配列の両方で機能する構文を使用する場合は、代わりに次のようにします。

ACanvas.FillPolygon(MyBrush, PGPPoint(@Polygon[0]), length(Polygon));
于 2012-11-15T17:15:50.407 に答える