2013-03-25 119 views
1

我使用Rad Studio XE3附帶的TeeChart版本。TeeChart系列OnMouseEnter事件

TeeChart提供了一個TChartSeries事件,當鼠標指針在一系列線上移動時觸發。我使用這個事件來顯示指針下的系列名稱。

問題是,給出一個1像素寬的系列行,很難讓指針正好在行上。有沒有辦法給事件添加「填充」,以便在該行的每一側觸發X個像素點?

或者還有其他方法可以實現嗎?

回答

3

我正在爲Line(TLineSeries)和FastLine(TFastLineSeries)類添加一個新屬性來完成此操作。

Series1.ClickTolerance := 4; // <-- number of pixels around mouse XY 

默認值爲零(鼠標XY應該正好在線上),就像當前行爲一樣。

作爲一種解決辦法,如果你正在使用TLineSeries,指針可以在行點位置顯示,並且內部的「點擊」功能會考慮指針大小:

Series1.Pointer.Visible:=True; 

而對於更多的自定義控制,代碼下面與用於檢測鼠標點擊的內部代碼非常相似。 Tolerance常量指定要考慮的「在該行中」的額外像素的數量。

procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X, 
    Y: Integer); 

const 
    Tolerance=4; 

var Clicked, 
    t : Integer; 
    Position, 
    P,Old : TPoint; 
begin 
    Clicked:= -1; 

    Position.X:=X; 
    Position.Y:=Y; 

    for t:=Series1.FirstValueIndex to Series1.LastValueIndex do 
    begin 
    P.X:=Series1.CalcXPos(t); 
    P.Y:=Series1.CalcYPos(t); 

    if t>Series1.FirstValueIndex then 
     if PointInLine(Position,P.X,P.Y,Old.X,Old.Y,Tolerance) then 
     begin 
     Clicked:=t; 
     break; 
     end; 

    Old:=P; 
    end; 

    if Clicked = -1 then 
    Caption:='' 
    else 
    Caption:=IntToStr(Clicked); 
end; 
+0

謝謝大衛,工作完美。 XE3附帶的版本是否會有更新? – casterle 2013-04-17 13:27:38

+0

我會很感激,如果你請你看看下面的問題(在接下來的評論)。我一直試圖讓這個工作一段時間,而且我沒有時間了。 – casterle 2013-04-19 18:29:56

+0

http://stackoverflow.com/questions/16044047/teechart-x-axis-label-formatting – casterle 2013-04-19 18:32:23

1

您可以使用PointInLineTolerance函數在OnMouseMove事件中檢查它。 但是,您必須手動循環系列點以將系列值轉換爲像素並將它們傳遞給此函數。

uses Series; 

procedure TForm1.FormCreate(Sender: TObject); 
var i: Integer; 
begin 
    Chart1.View3D:=false; 

    for i:=0 to 5 do 
    Chart1.AddSeries(TLineSeries).FillSampleValues; 
end; 

procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X, 
    Y: Integer); 
var series, valueIndex: Integer; 
    P0, P1: TPoint; 
begin 
    Chart1.Draw; 
    for series:=0 to Chart1.SeriesCount-1 do 
    with Chart1[series] do 
    for valueIndex:=FirstValueIndex to LastValueIndex-1 do 
    begin 
     P0.X:=CalcXPos(valueIndex); 
     P0.Y:=CalcYPos(valueIndex); 
     P1.X:=CalcXPos(valueIndex+1); 
     P1.Y:=CalcYPos(valueIndex+1); 
     if PointInLineTolerance(Point(X, Y), P0.X, P0.Y, P1.X, P1.Y, 5) then 
     begin 
     Chart1.Canvas.TextOut(X+5,Y-10,'Series ' + IntToStr(series)); 
     exit; 
     end; 
    end; 
end;