图中区域系列中的模式



我有TChart与TAreaSeries。我想改变图案在这个系列的背对角线(arebrush = bsBDiagonal),但不是整个系列,我需要改变它只有一些值。这可能吗?我用Delphi7, teechar8

您可以找到每次绘制值时触发的事件。然后,您可以使用它来更改系列设置(或图表画布设置取决于事件),根据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;

注意,在本例中,我在OnGetPointerstyle事件中更改了ValueIndex=3的系列画笔,在区域段4-5中可以看到更改。这是因为OnGetPointerstyle事件实际上是在绘制当前区域段之后调用的,所以我们设置的Brush样式将在下一次绘制值时应用。


编辑:

正如@Michael在评论中注意到的,这个解决方案的唯一问题是如何改变第一个片段的模式。如果上面的事件允许您将ValueIndex+1的模式更改为ValueIndex+2,并且在ValueIndex=0时第一次调用它,则似乎不可能将片段的模式从0更改为1。

注:每次绘制序列时,OnGetPointerstyle事件将触发链接序列中的所有点。第一个线段是使用序列模式绘制的,因此在开始绘制序列之前,您只需要确保序列模式具有您想要设置到第一个线段的值。有两种方法:

1)当最后一次触发OnGetPointerstyle事件(ValueIndex=Sender.Count-1)时,你可以设置你想要在0到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;

最新更新