Можно ли провести черту между точками на диаграмме "точка" TChart?
Экземпляр TChart в Delphi отлично справляется с построением графика, показывающего точки. Это серия "Точка" в галерее TeeChart.
Я хотел бы провести линии между некоторыми, но не всеми точками.
Например, представьте точечную диаграмму точек, которую легко сделать с помощью Delphi/TChart. Моя цель - провести прямые линии между некоторыми точками.
Это возможно?
Этот код работает:
With Chart2.ChartRect do
begin
Canvas.MoveTo(0,0);
Canvas.LineTo(500,500);
end;
Линия пересекает график, за исключением того, что линия не видна над графиком. Кажется, что у графа есть свой холст, но я не могу найти документацию по его поиску и использованию.
Итак, мне нужно найти координаты некоторых точек, созданных TChart, а затем провести линию между ними.
3 ответа
Некоторые варианты:
Как сказал Дэвид Хеффернан, лучшим вариантом может быть использование серии, которая поддерживает как отрезки, так и указатели.
TLineSeries
кажется, идеальная серия для этого.Проблема здесь в том, что эта серия рисует отрезок линии между каждыми двумя последовательными точками. Вы можете сделать точку, чтобы быть нулевым с
setNull(index)
метод, и это заставит указатель на этот индекс исчезнуть, но предшествующие и последующие отрезки линии исчезнут вместе с ним.Самым простым решением может быть создание TMyLineSeries, унаследованного от TLineSeries, для переопределения метода DrawValue, как описано здесь.
Добавьте нулевую точку после каждой точки, которую вы хотите видеть. В этом варианте единственными точками, за которыми не следует нулевая точка, будут те, где вы хотите нарисовать отрезок.
Добавить
TLineSeries
за отрезок линииУ вас всегда есть возможность использовать нестандартные методы рисования, как сказал LU RD.
Попытка нарисовать линии сама по себе не способ продолжить. Основой проектирования элементов управления диаграммой является то, что вы определяете диаграмму в логических терминах и позволяете элементу управления рисовать ее.
Таким образом, способ продолжить состоит в том, чтобы добавить ряд линий, которые представляют линии, которые вы хотите нарисовать. Вы можете прекрасно добавить эти серии линий в дополнение к другим сериям вашего графика.
Что касается вашего кода, который пытается рисовать на холсте диаграммы, вы должны знать, что рисование - это деликатный процесс. Конструкция системы такова, что поверхности управления не являются постоянными. Элементы управления окрашены в ответ на WM_PAINT
сообщение. Так что, хотя вы можете рисовать на холсте элемента управления, как вам нравится, то, что вы рисуете, будет существовать только до следующего цикла. Как только элемент управления становится недействительным, он должен перекрасить себя. Урок здесь, как правило, только рисовать в ответ на WM_PAINT
Сообщения. Или в OnPaint
события или переопределены Paint
методы, которые вызываются VCL в ответ на WM_PAINT
,
Чтобы соединить некоторые точки, вы должны следовать принципу рисования, все рисование должно быть выполнено в событии рисования.
В TChart лучший вариант здесь - сделать пользовательский рисунок в OnAfterDraw
событие.
procedure TForm1.Chart2AfterDraw(Sender: TObject);
begin
With Chart2.ChartRect do
begin
Canvas.MoveTo(0,0);
Canvas.LineTo(500,500);
end;
end;
Если вам нужно знать координаты холста для данной точки в вашем массиве точек.
MyYPosX := Series1.CalcXPos( Series1.XValue[ 0 ] ); { <-- first point }
MyYPosY := Series1.CalcYPos( Series1.YValue[ 0 ] ); { <-- first point }
В справке TChart есть глава, которая является хорошим введением в пользовательский рисунок: "Пользовательский рисунок на графике".
Из справки:
Когда рисовать?
Порядок, в котором вы рисуете на холсте, важен.
Если вы хотите, чтобы нарисованные элементы отображались над сериями диаграмм, вам следует использовать событие Chart OnAfterDraw. Событие Chart1.OnAfterDraw вызывается каждый раз, когда компонент Chart перерисовывается, непосредственно перед копированием внутреннего растрового изображения на экран.
Вы можете разместить пользовательские нарисованные элементы над сеткой диаграммы и под серией диаграммы, поместив свой код в событие Chart OnBeforeDrawSeries.
Основные события Paint Chart:
- OnBeforeDrawChart
- OnBeforeDrawAxes
- OnBeforeDrawSeries
- OnAfterDraw