ArrowSeries

TeeChart VCL for Borland/CodeGear/Embarcadero RAD Studio, Delphi and C++ Builder.
Post Reply
jradke
Newbie
Newbie
Posts: 5
Joined: Fri Oct 25, 2019 12:00 am

ArrowSeries

Post by jradke » Tue Dec 03, 2019 8:54 am

Hi!
To plot a time series of wind vectors I use TArrowSeries (see attached sample).
In order to point the arrowhead always to the respective time on the x-axis I draw the arrow inverted:

Code: Select all

AddArrow(x+dx,y+dy,x,y)
Unfortunately the OnGetMarkText event delivers wrong value for ValueIndex because it is related to x+dx instead of x.
My question: Is it possible to draw inverted arrows using AddArrow in the normal form:

Code: Select all

AddArrow(x,y,x+dx,y+dy)
Regards
Jürgen
Attachments
ArrowChart.jpg
ArrowChart.jpg (23.16 KiB) Viewed 52 times

jradke
Newbie
Newbie
Posts: 5
Joined: Fri Oct 25, 2019 12:00 am

Re: ArrowSeries

Post by jradke » Wed Dec 04, 2019 7:42 pm

Ok, meanwhile I have found out, that after creating a series the XValueList is sorted automatically.
By setting

Code: Select all

XValues.Order := loNone
everything works fine.

Yeray
Site Admin
Site Admin
Posts: 8746
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Re: ArrowSeries

Post by Yeray » Thu Dec 05, 2019 8:08 am

Hello,

If I'm understanding you correctly, you can get your ArrowSeries' EndXValues at OnGetMarkText. Ie:

Code: Select all

uses VCLTee.ArrowCha, DateUtils;

procedure TForm1.FormCreate(Sender: TObject);
var x, dx: TDateTime;
    y, dy: double;
begin
  Chart1.View3D:=False;
  Chart1.Legend.Hide;

  x:=IncHour(Today, 10);
  dx:=DateTimeStep[dtOneHour];
  y:=10;
  dy:=1;

  Chart1.Axes.Left.SetMinMax(8, 13);
  Chart1.Axes.Bottom.SetMinMax(IncHour(x,-2), IncHour(x,3));

  with TArrowSeries(Chart1.AddSeries(TArrowSeries)) do
  begin
    AddArrow(x+dx,y+dy,x,y);
    //AddArrow(x,y,x+dx,y+dy);

    OnGetMarkText:=ArrowGetMarkText;
    Marks.Visible:=True;
    Marks.Style:=smsXValue;
  end;
end;

procedure TForm1.ArrowGetMarkText(Sender: TChartSeries; ValueIndex: Integer; var MarkText: string);
begin
  if (ValueIndex>-1) and (Sender is TArrowSeries) then
      MarkText:=FormatDateTime('hh:mm', TArrowSeries(Sender).EndXValues[ValueIndex]);
end;
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

jradke
Newbie
Newbie
Posts: 5
Joined: Fri Oct 25, 2019 12:00 am

Re: ArrowSeries

Post by jradke » Thu Dec 05, 2019 10:30 am

Hello Yeray,
Thank you for your answer.
Indeed I am using the OnGetMarkText event to display some additional information that is stored in an external data array.
Therefore I needed the correct ValueIndex. By setting XValues.Order to loNone all values will remain at their original positions.

By the way:
How can I format the MarkText? I always get a shadowed silver rectangle with black font color, no matter how I set the Marks property of the series.

Regards.

Post Reply