Page 1 of 1
TeeChart DragMark Tool
Posted: Mon Feb 12, 2018 2:54 pm
by 16580604
I am work in Rad Studio 10.1 Berlin with c++. Teechart version 2017.21
If i use DragMark tool and trying to move chart with right click, marks moves with their points. It's normal behavior for me.
But after i dragged any mark and trying to move chart with right click, dragged mark moving wich chart, ignoring it's point.
How can i avoid this movement? I just need the same behavior as before dragging mark.
You can see described behavior in your Teechart Pro Examples(Tee9new.exe) in DragMark tool section
Re: TeeChart DragMark Tool
Posted: Thu Feb 15, 2018 7:33 am
by yeray
Hi Stainslaw,
Here you can find a workaround suggested for this.
http://www.teechart.net/support/viewtop ... ll*#p34033
Don't hesitate to let us know if you still have problems with it.
Re: TeeChart DragMark Tool
Posted: Sun Feb 18, 2018 8:03 am
by 16580604
Thanks for your code.
But that event i can use for changing marks position then i dragging chart with right mouse?
Re: TeeChart DragMark Tool
Posted: Mon Feb 19, 2018 12:01 pm
by yeray
Hi,
Yes, the idea is to store the marks positions manually when you modify them with the DragMark tool, and apply these positions when you scroll the chart.
Re: TeeChart DragMark Tool
Posted: Tue Feb 20, 2018 8:14 am
by 16580604
I just tried to store coordinates of marks relatively to the axis.
I did it in OnChartAfterDrawEvent:
Code: Select all
void __fastcall OnChartAfterDraw(TObject *Sender)
{
MarksCoordinates.clear();
if(Chart && __PointTextSeries)
{
for(int i = 0; i < __PointTextSeries->XValues->Count; i++)
{
pair<double, double> tmp;
tmp.first = Chart->BottomAxis->CalcPosPoint(__PointTextSeries->Marks->Positions->Position[i]->LeftTop.X);
tmp.second = Chart->LeftAxis->CalcPosPoint(__PointTextSeries->Marks->Positions->Position[i]->LeftTop.Y);
MarksCoordinates.push_back(tmp);
}
}
}
Then in OnChartZoomIn and OnChartUndoZoom i tried to repaint marks on them positions, and it works fine BEFORE you drag any point. But after dragging it's works only for UndoZoomEvent. In ZoomIn marks coordinates different everytime i zoom it.
UndoZoom event:
Code: Select all
void __fastcall OnChartUndoZoom(TObject *Sender)
{
if(__PointTextSeries)
{
for(int i = 0; i < __PointTextSeries->XValues->Count; i++)
{
__PointTextSeries->Marks->Positions->Position[i]->LeftTop.X = Chart->BottomAxis->CalcPosValue(MarksCoordinates.at(i).first);
__PointTextSeries->Marks->Positions->Position[i]->LeftTop.Y = Chart->LeftAxis->CalcPosValue(MarksCoordinates.at(i).second);
}
}
}
And ZoomIn event:
Code: Select all
void __fastcall OnChartZoomIn(TObject *Sender)
{
if(__PointTextSeries)
{
for(int i = 0; i < __PointTextSeries->XValues->Count; i++)
{
__PointTextSeries->Marks->Positions->Position[i]->LeftTop.X = __PointTextSeries->CalcPosValue(MarksCoordinates.at(i).first);
__PointTextSeries->Marks->Positions->Position[i]->LeftTop.Y = __PointTextSeries->CalcPosValue(MarksCoordinates.at(i).second);
}
}
}
Re: TeeChart DragMark Tool
Posted: Mon Feb 26, 2018 10:56 am
by yeray
Hello,
Here it is an example in Delphi supporting marks drag, zoom and scroll:
Code: Select all
uses Series;
var Series1: TPointSeries;
var MarksCoordinates: array of TPointFloat;
procedure TForm1.FormCreate(Sender: TObject);
begin
Chart1.View3D:=False;
Chart1.Legend.Hide;
Series1:=Chart1.AddSeries(TPointSeries) as TPointSeries;
with Series1 do
begin
Marks.Show;
Marks.Arrow.Color:=clRed;
Marks.ArrowLength:=10;
FillSampleValues(10);
end;
with Chart1.Tools.Add(TDragMarksTool) as TDragMarksTool do
begin
OnDraggedMark:=DragMarksDragged;
end;
end;
procedure TForm1.Chart1Scroll(Sender: TObject);
begin
ApplyMarks;
end;
procedure TForm1.Chart1UndoZoom(Sender: TObject);
begin
Chart1.Draw;
ApplyMarks;
end;
procedure TForm1.Chart1Zoom(Sender: TObject);
begin
Chart1.Draw;
ApplyMarks;
end;
procedure TForm1.DragMarksDragged(Sender:TDragMarksTool; Index:Integer;
Button:TMouseButton; Shift: TShiftState;
X,Y: Integer);
var i: Integer;
begin
SetLength(MarksCoordinates, Series1.Count);
for i:=0 to Series1.Count-1 do
begin
with Series1.Marks.Positions[i] do
begin
if not Custom then
begin
Custom:=True;
if Index<>i then
begin
LeftTop.X:=Series1.CalcXPos(i) - (Width div 2);
LeftTop.Y:=Series1.CalcYPos(i) - Height - Series1.Marks.ArrowLength;
end;
end;
MarksCoordinates[i].x:=Series1.GetHorizAxis.CalcPosPoint(LeftTop.X + (Width div 2));
MarksCoordinates[i].y:=Series1.GetVertAxis.CalcPosPoint(LeftTop.Y);
end;
end;
end;
procedure TForm1.ApplyMarks;
var i: Integer;
begin
if Length(MarksCoordinates) = Series1.Count then
for i:=0 to Series1.Count-1 do
begin
with Series1.Marks.Positions[i] do
begin
LeftTop.X:=Series1.GetHorizAxis.CalcPosValue(MarksCoordinates[i].x) - (Series1.Marks[i].Width div 2);
LeftTop.Y:=Series1.GetVertAxis.CalcPosValue(MarksCoordinates[i].y);
ArrowTo.X:=LeftTop.X + (Series1.Marks[i].Width div 2);
ArrowTo.Y:=LeftTop.Y + Series1.Marks[i].Height;
ArrowFrom.X:=Series1.CalcXPos(i);
ArrowFrom.Y:=Series1.CalcYPos(i);
end;
end;
end;
Re: TeeChart DragMark Tool
Posted: Tue Feb 27, 2018 3:58 pm
by 16580604
Thanks, it works for zoom in and out. But if i add one mark and move it, and after that add another mark, marks moves then i scroll chart with right mouse button.
Re: TeeChart DragMark Tool
Posted: Fri Mar 02, 2018 9:47 am
by yeray
Hello,
restech wrote:But if i add one mark and move it, and after that add another mark, marks moves then i scroll chart with right mouse button.
I don't understand what should I exactly do to reproduce it. Could you please add a simple example?