Всем привет. Столкнулся с задачкой, чтобы вывести значения работы двигателя. Необходимо показывать значения за последние 30 секунд. На ум пришло решение положить TChart на форму и по таймеру с интервалом в 1 секунду добавлять значения в график.
При создании формы проинициализировал основные параметры
| Код | Chart1.View3D := false; Chart1.AnimatedZoom := false; Chart1.ScaleLastPage := true; Chart1.Zoomed := false; Chart1.AnimatedZoomSteps := 4; Chart1.MaxPointsPerPage := 30; Chart1.BottomAxis.Increment := DateTimeStep[ dtFiveSeconds ]; Chart1.BottomAxis.LabelsMultiLine := true; Chart1.BottomAxis.DateTimeFormat := 'dd/mm/yy hh:mm:ss'; Chart1.BottomAxis.ExactDateTime := true; Chart1.Series[0].XValues.DateTime := true; Chart1.Series[1].XValues.DateTime := true; Chart1.Series[2].XValues.DateTime := true; Chart1.Series[3].XValues.DateTime := true; Chart1.Series[4].XValues.DateTime := true; Chart1.Series[5].XValues.DateTime := true; Chart1.Series[6].XValues.DateTime := true;
|
В таймере добавляю для теста значения
| Код | Chart1.Series[0].AddXY(now,random(100)); Chart1.Series[1].AddXY(now,random(50)); Chart1.Series[2].AddXY(now,random(120)); Chart1.Series[3].AddXY(now,random(75)); Chart1.Series[4].AddXY(now,random(102)); Chart1.Series[5].AddXY(now,random(100)); Chart1.Series[6].AddXY(now,random(250));
if Chart1.Series[0].XValues.Count > 30 then begin
Chart1.BottomAxis.Maximum := Chart1.Series[0].MaxXValue + Sec; Chart1.BottomAxis.Minimum := Chart1.BottomAxis.Minimum + Sec;
Chart1.Series[0].XValues.Delete(Chart1.Series[0].XValues.Count-31); Chart1.Series[0].YValues.Delete(Chart1.Series[0].YValues.Count-31); Chart1.Series[1].XValues.Delete(Chart1.Series[1].XValues.Count-31); Chart1.Series[1].YValues.Delete(Chart1.Series[1].YValues.Count-31); Chart1.Series[2].XValues.Delete(Chart1.Series[2].XValues.Count-31); Chart1.Series[2].YValues.Delete(Chart1.Series[2].YValues.Count-31); Chart1.Series[3].XValues.Delete(Chart1.Series[3].XValues.Count-31); Chart1.Series[3].YValues.Delete(Chart1.Series[3].YValues.Count-31); Chart1.Series[4].XValues.Delete(Chart1.Series[4].XValues.Count-31); Chart1.Series[4].YValues.Delete(Chart1.Series[4].YValues.Count-31); Chart1.Series[5].XValues.Delete(Chart1.Series[5].XValues.Count-31); Chart1.Series[5].YValues.Delete(Chart1.Series[5].YValues.Count-31); Chart1.Series[6].XValues.Delete(Chart1.Series[6].XValues.Count-31); Chart1.Series[6].YValues.Delete(Chart1.Series[6].YValues.Count-31); end;
|
И в добавок
| Код | const Sec = 1 / (24 * 60 * 60);
|
Вроде бы все даже и работает. Но заметил одну не очень хорошую особенность (собственно почему и решил удалять значения). Что в менеджере процессов приложение понемножечку растет в оперативной памяти. Если отключаю таймер - все замерает на месте. За минут 5 набирается примерно 500 КБ.. вроде бы и не так много, но что-то надо делать. А а вдруг люди будут весь день с программой работать и что тогда? Посоветуйте что поправить! Использую Delphi XE6 Fire Monkey |