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