Pascal:在Windows PolyLine函数中使用指针指向TPoint?

时间:2014-01-08 21:40:15

标签: pascal freepascal lazarus polyline

所以我是一个完整的编程新手,并会感谢任何帮助/'指向'正确的方向。如果不需要太多,那么如果有人能够实际发布解决方案,我会很感激。

基本上,我正在创建一个射弹运动模拟器。模拟器工作得很好,但是我有一个小问题:我需要在程序中连接的点数有所不同。目前,我只是使用巨大的阵列大小(例如10,000)进行补偿。真的,我想要一个更干净的方式来做这件事。现在我确定你们都在想:动态阵列!但是,在尝试使用动态数组时,我会收到错误的页面和页面。我被告知这是因为Windows API函数无法访问动态数组的内存堆。这是我目前的代码:

procedure TNewPageControl.PaintWindow(DC : HDC);
  var
    Points : Array [1..10000] of TPoint;
    NumOfPoints : integer;
  begin
    {Generate Point Co-Ordinates and Increment NumOfPoints}
    PolyLine(DC, Points, NumOfPoints);
  end;   

正如我所说,虽然我的代码完美无缺,但我想要的解决方案比现在的解决方案更复杂。我被告知我可以使用指针(我什么都不知道)来表达几乎像Windows功能可以理解的动态数组。有谁知道我怎么做到这一点?

我正在使用拉撒路,如果这有任何区别的话。如果我在这里没有得到任何答案,我会尝试在Lazarus论坛上提问。

谢谢:)

1 个答案:

答案 0 :(得分:2)

只要它们是兼容的数据类型,您就可以安全地使用动态数组和API调用。对于TPoint,该类型实际上是Windows API类型,因此完全能够传递给PolyLine

procedure TNewPageControl.PaintWindow(DC : HDC);
var
  Points : array of TPoint;
  NumOfPoints : integer;
begin
  {Generate Point Co-Ordinates and Increment NumOfPoints, 
   using SetLength(Points) there to size array properly}

  // Pass reference to first element of array
  PolyLine(DC, Points[0], NumOfPoints); 
end;

事实上,由于PolyLine所需的点数是常数,因此根本不需要NumOfPoints

PolyLine(DC, Points[0], Length(Points));