freePascal:在Windows PolyLine函数中使用指针进行TPoint



所以我是一个完全的编程新手,如果有任何帮助/"指点"正确的方向,我将不胜感激。如果不需要太多,那么如果有人能发布解决方案,我将不胜感激。

基本上,我正在创建一个抛射体运动模拟器。模拟器工作得很好,但我有一个小问题:我需要在程序中连接的点的数量各不相同。目前,我只是使用一个巨大的数组大小(例如10000)来进行补偿。真的,我想要一种更干净的方式。现在我相信你们都在想:动态数组!然而,当尝试使用动态数组时,我会得到一页又一页的错误。我被告知这是因为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论坛上提问。

谢谢:)

只要动态数组的数据类型兼容,就可以安全地将其与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));

最新更新