Нарушение прав доступа при добавлении значения в компонент TChart Delphi - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь использовать компонент TChart для экспорта графика в файл растрового изображения, но я получаю очень странную ошибку.

Каждый раз, когда я пытаюсь добавить значение в диаграмму, я вызываю AddY функция из компонента TLineSeries, передающая значение в качестве параметра.Когда я пытаюсь добавить небольшие значения, график ведет себя совершенно нормально, как показано:

Working chart

Проблема возникает, когда я пытаюсь добавить какое-то большое значение в его первой точке, я получаю нарушение прав доступа, как это:

Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00450047 in module 'Project1.exe'. Write of address 022AC000'. Process stopped. Used Step or Run to continue.

И стека вызовов полностью пуст, единственная строка там это имя моего проекта, а выделенная строка является "конец""моего файла dpr.

Когда я продолжаю нажимать, появляются другие ошибки: Access violation 1

CPU

Поскольку я не достаточно разбираюсь с этими ошибками, мне не удалось отладить точно, что происходит, я предполагаю, что это какая-то разновидность поврежденной кучи, но я не могу понять, где, так как код такпросто, и компонент имеет скрытый код, потому что это сторонний компонент.

Самое смешное, что если я просто нажимаю кнопку ОК, пока ошибки не исчезают, и добавляю другое значение, оно отображается нормально, а также добавляя некоторыесначала небольшое значение, а затем большое значение (по большомуточно знаю число, но 2000+ начинает происходить так)

Я изолировал TChart от своего основного программного обеспечения и создал фрагмент кода только для проверки, и вот простой код, который я выполняю:

procedure TdesktopForm.Button1Click(Sender: TObject);
var
  vBMP: TBitmap;
begin
  vBMP := TBitmap.Create();
  try
    config();
    c.series[0].AddY(StrToFloat(edit.text));
    c.PaintTo(vBMP.Canvas.Handle, 0, 0);
    vBMP.SaveToFile('D:\test.bmp');
  finally
    vBMP.Free();
  end;
end;

Где c - это мой визуально добавленный TChart компонент, edit - это просто визуальный TEdit для управления тем, что я добавляю, а config - это метод для настройки визуальных элементов на графике с помощьюследующий код:

procedure TdesktopForm.config();
begin
  c.Height:=200;
  c.Width:=200;

  c.LeftAxis.LabelsFont.Size:=13;
  c.BottomAxis.LabelsFont.Size:=13;

  c.MarginBottom:=20;
  c.MarginTop:=10;
  c.LeftAxis.StartPosition:=10;
  c.LeftAxis.EndPosition:=90;
  c.BottomAxis.LabelsAngle:=0;
  c.BottomAxis.Grid.Color:=clBlack;
  c.LeftAxis.Grid.Color:=clBlack;
  c.BottomAxis.Ticks.Color:=clBlack;
  c.LeftAxis.Ticks.Color:=clBlack;
  c.LeftAxis.MinorTicks.Color:=clBlack;
  c.BottomAxis.MinorTicks.Color:=clBlack;
  c.BottomAxis.LabelsMultiLine:=True;
  c.BottomAxis.DateTimeFormat:='DD/MM/AAAA hh:mm:ss';
  c.BottomAxis.StartPosition:=10;
  c.BottomAxis.EndPosition:=90;
  c.View3D:=False;
  c.Color:= clWhite;
  c.Legend.Visible:=False;

  c.Series[0].Marks.Visible:=true;
  c.Series[0].Marks.Transparent:=false;
  c.Series[0].Marks.Style:= smsValue;
  c.Series[0].Marks.Frame.Visible:=True;
  c.Series[0].Marks.Frame.Color:=clBlack;
  c.Series[0].Marks.BackColor:=clWhite;
  c.Series[0].Marks.Font.Size:=12;
  c.Series[0].Marks.Font.Color:=clBlack;
end;

Если это не было достаточно странно, то во всех приведенных выше тестах использовался «ряд линий». Если я попробую то же самое с серией столбцов, например, все будет работать нормальноЯ попытался добавить некоторые абсурдные значения, такие как 999999999, и не было выдано никаких ошибок.

Все вышеперечисленное использовало Delphi 5, так как мое основное программное обеспечение построено на Delphi 5.

Есть ли у кого-нибудьИдея о том, что происходит?

...