所以我是一个完整的编程新手,并会感谢任何帮助/'指向'正确的方向。如果不需要太多,那么如果有人能够实际发布解决方案,我会很感激。
基本上,我正在创建一个射弹运动模拟器。模拟器工作得很好,但是我有一个小问题:我需要在程序中连接的点数有所不同。目前,我只是使用巨大的阵列大小(例如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论坛上提问。
谢谢:)
答案 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));