TChart中AreaSeries中的模式

时间:2014-05-21 15:34:08

标签: delphi delphi-7 teechart

我有TAreaSeries的TChart。我想将此系列中的Pattern更改为Back Diagonal(AreaBrush = bsBDiagonal),但不是整个Serie,我只需要为某些值更改它。可能吗?我使用的是Delphi7,TeeChart8。

1 个答案:

答案 0 :(得分:1)

您可以找到每次绘制值时触发的事件。然后,您可以使用它来更改系列设置(或图表画布设置,具体取决于事件),根据ValueIndex分配不同的画笔或颜色。

在您的情况下,可以使用系列' OnGetPointerStyle事件如下:

procedure TForm1.FormCreate(Sender: TObject);
begin
  Chart1.View3D:=false;

  with Chart1.AddSeries(TAreaSeries) as TAreaSeries do
  begin
    FillSampleValues(10);
    Pointer.Visible:=true;
    OnGetPointerStyle:=Series1GetPointerStyle;
  end;
end;


function TForm1.Series1GetPointerStyle(Sender: TChartSeries;
  ValueIndex: Integer): TSeriesPointerStyle;
begin
  if ValueIndex=3 then
    (Sender as TAreaSeries).AreaBrush:=bsBDiagonal
  else
    (Sender as TAreaSeries).AreaBrush:=bsSolid;

  result:=psNothing;
end;

请注意,在这种情况下,我已更改了ValueIndex=3事件中OnGetPointerstyle的系列画笔,这些更改在4-5区域中可见。这是因为在绘制当前区域段之后实际调用了OnGetPointerstyle事件,因此我们设置的画笔样式将在下次绘制值时应用。


编辑:

正如@Michael在评论中所注意到的,此解决方案的唯一问题是如何更改第一个细分的模式。如果上面的事件允许您将段的模式从ValueIndex + 1更改为ValueIndex + 2并且第一次使用ValueIndex = 0调用它,则似乎无法更改模式对于从0到1的段。

每次绘制系列时,都会针对链接系列中的所有点触发OnGetPointerstyle事件。第一个段是使用系列图案绘制的,因此您只需确保在开始绘制系列之前,系列图案具有您要设置为第一个段的值。您有两种方法可以做到这一点:

1)当上次OnGetPointerstyle事件被触发时,您可以设置要在段0到1处显示的模式(ValueIndex = Sender.Count-1)。此时,所有细分都已被绘制,只有在下次绘制系列时才会应用:

uses Series;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Chart1.View3D:=false;

  with Chart1.AddSeries(TAreaSeries) as TAreaSeries do
  begin
    FillSampleValues(10);
    Pointer.Visible:=true;
    AreaBrush:=bsBDiagonal;
    OnGetPointerStyle:=Series1GetPointerStyle;
  end;
end;

function TForm1.Series1GetPointerStyle(Sender: TChartSeries;
  ValueIndex: Integer): TSeriesPointerStyle;
begin
  if (ValueIndex=0) or (ValueIndex=Sender.count-1) then
    (Sender as TAreaSeries).AreaBrush:=bsBDiagonal
  else
    (Sender as TAreaSeries).AreaBrush:=bsSolid;

  result:=psNothing;
end;

2)您可以使用OnBeforeDrawSeries事件来设置第一个细分的模式:

uses Series;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Chart1.View3D:=false;

  with Chart1.AddSeries(TAreaSeries) as TAreaSeries do
  begin
    FillSampleValues(10);
    Pointer.Visible:=true;
    OnGetPointerStyle:=Series1GetPointerStyle;
  end;

  Chart1.OnBeforeDrawSeries:=BeforeDrawSeries;
end;

function TForm1.Series1GetPointerStyle(Sender: TChartSeries;
  ValueIndex: Integer): TSeriesPointerStyle;
begin
  if ValueIndex=0 then
    (Sender as TAreaSeries).AreaBrush:=bsBDiagonal
  else
    (Sender as TAreaSeries).AreaBrush:=bsSolid;

  result:=psNothing;
end;

procedure TForm1.BeforeDrawSeries(Sender: TObject);
begin
  (Chart1[0] as TAreaSeries).AreaBrush:=bsBDiagonal;
end;