procedure RedrawCoordinate(ChartTyle:integer); var TBName:String; DBName:String; IP:string; User:string; PWD:string; PORT:string; MADOQuery:TADOQuery; begin MADOQuery:=TADOQuery.Create(nil); MADOQuery.SQL.Clear;
with MainForm do begin
IP:=DBServerIP.Text; User:=DBSERVERUSER.Text; PWD:= DBSERVERPWD.Text; PORT:=DBSERVERPORT.Text; DBName:=DBSERVERDBName.Text; TBName:=DBTABLELIST.Text;
end;
if MADOQuery.Active=true then MADOQuery.Close;
MADOQuery.ConnectionString:= 'Provider=SQLOLEDB.1;Persist Security Info=True;'+ 'Password='+PWD+ ';User ID='+User+ ';Initial Catalog='+DBName+ ';NetWork Library=DBMSSOCN;NetWork Address='+IP+','+PORT;
MADOQuery.SQL.Add('select * from '+TBName);
MADOQuery.ExecSQL;
MADOQuery.Active:=True; MainForm.PDBChart.Legend.Visible:=False; MainForm.PDBChart.SeriesList.Series[0].Active:=False; MainForm.PDBChart.SeriesList.Series[1].Active:=False; MainForm.PDBChart.SeriesList.Series[2].Active:=False; with MainForm.PDBChart.SeriesList.Series[ChartTyle] do begin Active:=True; MainForm.PDBChart.Title.Text.Clear; MainForm.PDBChart.Title.Text.add(MainForm.ZongZhou.Text); DataSource := MADOQuery; XLabelsSource := MainForm.HengZhou.Text; XValues.ValueSource := MainForm.HengZhou.Text; YValues.ValueSource := MainForm.ZongZhou.Text; Marks.Style := smsXValue; CheckDataSource; end; MADOQuery.Open; end; |
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; |
这里即实现了可以在图表中拖动某一个点使其在纵轴上变化位置 |