Я пытаюсь использовать компонент TChart для экспорта графика в файл растрового изображения, но я получаю очень странную ошибку.
Каждый раз, когда я пытаюсь добавить значение в диаграмму, я вызываю AddY
функция из компонента TLineSeries
, передающая значение в качестве параметра.Когда я пытаюсь добавить небольшие значения, график ведет себя совершенно нормально, как показано:
Проблема возникает, когда я пытаюсь добавить какое-то большое значение в его первой точке, я получаю нарушение прав доступа, как это:
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.
Когда я продолжаю нажимать, появляются другие ошибки:
Поскольку я не достаточно разбираюсь с этими ошибками, мне не удалось отладить точно, что происходит, я предполагаю, что это какая-то разновидность поврежденной кучи, но я не могу понять, где, так как код такпросто, и компонент имеет скрытый код, потому что это сторонний компонент.
Самое смешное, что если я просто нажимаю кнопку ОК, пока ошибки не исчезают, и добавляю другое значение, оно отображается нормально, а также добавляя некоторыесначала небольшое значение, а затем большое значение (по большомуточно знаю число, но 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.
Есть ли у кого-нибудьИдея о том, что происходит?