我有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;