您的位置:首页 > 其它

TChart使用经验小结

2007-07-22 10:51 561 查看
1、问题:通过Addxy方法给TChart添加标记(Mark)时,发现在TChart的横坐标会随着Mark而变化,后来发现通过以下方法可避免这种情况:双击TChart,点击Axis-> top or bottom ->labels,在styles中将labels的形式改为Value即可!

2、几个有用的属性:
        图表上的每个点都是有索引的,就象一个数组一样,在OnClickSeries事件中有个ValueIndex属性,该属性可以得到鼠标所点击的点的索引值(必须将Series的Point设置为可见,鼠标点击到那个点时才可以触发该事件)。

        xValue[index]、yValue[index]分别表示图表的索引为index的横纵坐标值,用这两个属性可以读取和设置索引为index的点的值,注意:不要用xValues和yValues,这两个属性也可以达到同样的目的,但是速度非常的慢。因为后两个在进行操作的时候可能要遍历整个图表上的值(个人观点)

      在MouseDown,MouseMove,Mouseup中,可以利用xScreentoValue(x),yScreentoValue(y)得到鼠标当时所在点对应在图表上的横纵坐标值。

e.g.

.......

private
  Nowindex:Integer;
  Cantuo:boolean;

........

procedure TfrmMain.Chart1ClickSeries(Sender: TCustomChart;
  Series: TChartSeries; ValueIndex: Integer; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  NowIndex:=ValueIndex;
end;

procedure TfrmMain.Chart1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
Cantuo:=true;

end;

procedure TfrmMain.Chart1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
Cantuo:=false;
end;

procedure TfrmMain.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if Cantuo then
begin
  Series1.yValue[NowIndex]:=  Series1.yScreenToValue(y) ;
end;
end;

这里即实现了可以在图表中拖动某一个点使其在纵轴上变化位置

 [tips]
1.3.1 Pro Version支持Bezier , Contour , Radar 和  point3D 曲线
1.3.2 支持jpeg文件的导出
1.3.3 TChart中的Series 可以连接到Table , Query , RemoteDataset(其他数据集)
1.3.4 TChart里的series的active属性可以实现对已绘制图形的显示或者隐藏
1.3.5 在TChart中, TChartSeries是所有具体series的父类,没有画出什么来的,用一个具体的series类来创建就可以了,比如用TLineSeries、  

     TPieSeries、 TPointSeries、 TPointSeries等等都行
1.3.6 TeeFunctionComponent可以实现在同一个TChart里面,一个Serries对另一个 Serries的统计

1.4 [问题极其使用技巧]
1.4.1 TChart中如何实现只有Y轴的放大与缩小功能?
   设置BottomAxis或者LeftAxis的Automatic:=false并同时设置Minimum,Maximum属性
1.4.2 如何固定TChart中的坐标,不使TChart中的坐标跟随Series的变化而变化?

  //设置底座标
  with myChart.BottomAxis do
  begin
    Automatic:=false;
    Minimum:=0;
    LabelStyle := talText;
  end;

  //设置左坐标
  with myChart.LeftAxis do
  begin
    Automatic:=false;
    Minimum:=0;
    Title.Angle:=270;
    Title.Font:=Self.Font;
    Title.Font.Charset:=ANSI_CHARSET;
    Title.Font.Name:='@宋体';
    Grid.Visible := False;
  end;

  //设置右坐标
  with myChart.RightAxis do
  begin
    Automatic:=false;
    Title.Font:=Self.Font;
    Title.Font.Charset:=ANSI_CHARSET;
    Title.Font.Name:='@宋体';
    Title.Caption:='累计百分比(%)';
    Maximum:=100;
    Minimum:=0;
  end;

1.4.3 如何删除一个图形中的一个点?
     使用Series的delete 方法

1.4.4 如何修改一个点的X或者Y 值?
     LineSeries1.YValue[3] := 27.1 ;
     {In Bubble Series}
     BubbleSeries1.RadiusValues.Value[ 8 ] := 8.1 ;
     {In Pie Series}
     PieSeries1.PieValues.Value[ 3 ] := 111 ;

1.4.5 如果横坐标是时间(日期),如何进行设置?
     {First, you need to set the DateTime property to True in the desired X and/or Y values list.}
     LineSeries1.XValues.DateTime := True ;
     {Second, use the same above described methods, but give the values as Date, Time or DateTime values}
     LineSeries1.AddXY( EncodeDate( 1996 , 1 , 23 ) , 25.4 , 'Barcelona' , clGreen );

1.4.6 如何在chart中画出的曲线某个点上标记出该点的值?
     Series.Marks.Visible:=true;
     Series.Marks.Style:=smsValue;

1.4.7 如何设置横轴或者纵轴的增长率?
     Chart.BottomAxis.Increment := DataTimeStep[ dtOneHour ] ;
     Chart.RightAxis.Increment := 1000;

1.4.8  如何对图象进行缩放?
      TChart的ZoomRect或者ZoomPercent方法 (Pie图可能不支持缩放)

1.5  [TChart可以绘制的图形]
1.5.1 Line ( TLineSeries)
1.5.2 FastLine (TFastLineSeries) 相对Line来说,它损耗了某些属性从而来实现快速绘制
1.5.3 Bar (TBarSeries)
1.5.4 Horizontal bar (THorizBarSeries)
1.5.5 Area (TAreaSeries)
1.5.6 Point (TPointSeries)
1.5.7 Pie (TPieSeries)
1.5.8 Arrow (TArrowSeries)
1.5.9 Bubble (TBubbleSeries)
1.5.10 Gantt (TGanttSeries)
1.5.11 Sharp (TChartShape)

1.6      [TChart的实时绘制]
   实时绘制对机器性能要求比较高,因此我们在编程的时候要注意下面几个方面:
   使用2D图形是Chart尽可能包含少的点,如果需要,可以移除(remove)chart的legend(?????)和Title,使用默认的字体和字体大小,

使用FastLineSeries,使用实体(solid)画笔和画刷格式,尽量避免使用圆形和环行bar样式,不要使用背景图片和渐变效果样式,把Chart的Beve

lInner和BevelOUter属性设置为bcNone; 如果需要,把TChart的AxisVisible属性设置为False,把BufferedDisplay设置为false可以加速chart

的重绘

1.7 [Scrolling]
   TChart有4中scroll选择(AllowPanning属性),分别是 不允许Scroll ( pmNone) ; 水平Scroll (pmHorizontal) ; 垂直Scroll

(pmVertical)  ;  水平和垂直Scroll (pmBoth) Procedure Scroll(Const Offset:Double; CheckLimits:Boolean);

例子如下:
Chart1.BottomAxis.Scroll(  1000, True );这段代码也等同于
With Chart1.BottomAxis do
Begin
Automatic:=false;
SetMinMax( Minimum+1000, Maximum+1000 );
End;

1.8 [TChart中的全局变量]
    TeeScrollMouseButton := mbRight;设置鼠标右键为TChart滚动键(默认)
    TeeScrollKeyShift    := [ ssCtrl ]; 要按住Control键才可以使Scroll滚动

1.9 [TChartSerries使用技巧]
1.9.1 运行时候创建一个Serries, 三种方法:
   1.Var MySeries : TBarSeries ;
      MySeries := TBarSeries.Create( Self );
      MySeries.ParentChart := Chart1 ;
   2.Chart1.AddSeries( TBarSeries.Create( Self ) );
   3.Var MyClass : TChartSeriesClass;
      MyClass := TBarSeries ;
      Chart1.AddSeries( MyClass.Create( Self ) );
1.9.2 获得TChart中的Serries数组,也有三种方法
   1.MySeries := Chart1.SeriesList [ 0 ]
   2.MySeries := Chart1.Series [ 0 ]
   3.MySeries := Chart1 [ 0 ]

1.9.3  SerriesCount属性获得SeriesList中Series的个数
1.9.4  隐藏TChart中的Series有三种方法,但是效果不等价
   1.Series1.Active:=False; 仅仅隐藏,当设置为true的时候还可以显示出来
   2.Series1.ParentChart:=nil ; 隐藏,重新设置ParentChart为TChart时候可以显示
   3.Series1.Free; 删除了Series. 不可以恢复

1.9.5 TChart中的数据排序
    With Series1 do
    begin
       YValues.Order:=loAscending;
       YValues.Sort;
       Repaint;
    end;
   定位一个点(Loacate a point)
   Series1.XValues.Locate(123);
   XValue和YValue都拥有的属性Total , TotalABS , MaxValue , MinValue 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息