How can I create a dynamic array of TPoints to draw a polygon?

Question:

How can I create a dynamic array of TPoints to draw a polygon?

Answer:

The easist way is to declare a type of array that has only one element, turn range checking off, access the array through the use of a variable, and call the Windows API function Polygon().

Example:

type

  TPtArray = array[0..0] of TPoint;

  PPtArray = ^TPtArray;

 

procedure DrawDynamicPolyArray(NumPoints : integer;

  Canvas : TCanvas);

var

  p : PPtArray;

  i : integer;

begin

{$IFOPT R+}

  {$DEFINE CKRANGE}

  {$R-}

{$ENDIF}

  GetMem(p, sizeof(TPoint) * NumPoints);

  Randomize;

  for i := 0 to (NumPoints -1) do begin

  p^[i].x := Random(Form1.Width);

  p^[i].y := Random(Form1.Height);

  end;

  Polygon(Canvas.Handle, p, NumPoints);

  FreeMem(p, sizeof(TPoint) * NumPoints);

{$IFDEF CKRANGE}

  {$UNDEF CKRANGE}

  {$R+}

{$ENDIF}

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

  Form1.Canvas.Brush.Color := clWhite;

  Form1.Canvas.FillRect(Rect(0, 0, Form1.Width, Form1.Height));

  Form1.Canvas.Brush.Color := clRed;

  DrawDynamicPolyArray(SpinEdit1.Value,

  Form1.Canvas);

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

  SpinEdit1.MinValue := 2;

  SpinEdit1.MaxValue := 1000;

  SpinEdit1.Value := 100;

end;

 

end.