これを実現するために、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;