Паскаль: использование указателей на TPoint в функции Windows 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, если это имеет значение. Если я не получу ответов здесь, я попробую спросить на форумах Lazarus.

Спасибо :)


person Sam    schedule 08.01.2014    source источник


Ответы (1)


Вы можете безопасно использовать динамические массивы с вызовами 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));
person Ken White    schedule 09.01.2014