From 35a2cee98976ccf006d5c5cee6735c5135e73a9c Mon Sep 17 00:00:00 2001 From: ask Date: Wed, 20 Apr 2011 10:22:27 +0000 Subject: [PATCH] TAChart: Add TDataPointHintTool git-svn-id: trunk@30396 - --- components/tachart/tatools.pas | 73 +++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 2 deletions(-) diff --git a/components/tachart/tatools.pas b/components/tachart/tatools.pas index 0cddd6602a..3f68e1ff25 100644 --- a/components/tachart/tatools.pas +++ b/components/tachart/tatools.pas @@ -46,8 +46,6 @@ type private FOldCursor: TCursor; function GetMouseEvent(AIndex: Integer): TChartToolMouseEvent; - procedure RestoreCursor; - procedure SetCursor; procedure SetMouseEvent(AIndex: Integer; AValue: TChartToolMouseEvent); protected procedure ReadState(Reader: TReader); override; @@ -62,6 +60,8 @@ type procedure MouseDown(APoint: TPoint); virtual; procedure MouseMove(APoint: TPoint); virtual; procedure MouseUp(APoint: TPoint); virtual; + procedure RestoreCursor; + procedure SetCursor; procedure SetIndex(AValue: Integer); override; public constructor Create(AOwner: TComponent); override; @@ -308,6 +308,29 @@ type read FOnPointClick write FOnPointClick; end; + TDataPointHintTool = class; + + TChartToolHintEvent = procedure ( + ATool: TDataPointHintTool; const APoint: TPoint; var AHint: String) of object; + + { TDataPointHintTool } + + TDataPointHintTool = class(TDataPointTool) + strict private + FOnHint: TChartToolHintEvent; + FPrevPointIndex: Integer; + FPrevSeries: TBasicChartSeries; + FUseDefaultHintText: Boolean; + public + constructor Create(AOwner: TComponent); override; + procedure MouseMove(APoint: TPoint); override; + published + property ActiveCursor; + property UseDefaultHintText: Boolean + read FUseDefaultHintText write FUseDefaultHintText default true; + property OnHint: TChartToolHintEvent read FOnHint write FOnHint; + end; + { TReticuleTool } TReticuleTool = class(TChartTool) @@ -1204,6 +1227,51 @@ begin Handled; end; +{ TDataPointHintTool } + +constructor TDataPointHintTool.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FUseDefaultHintText := true; +end; + +procedure TDataPointHintTool.MouseMove(APoint: TPoint); + + function GetHintText: String; + begin + if UseDefaultHintText then begin + if Series is TChartSeries then + Result := (Series as TChartSeries).FormattedMark(PointIndex) + else + Result := Format('%s: %d', [Series.Title, PointIndex]); + end; + if Assigned(OnHint) then + OnHint(Self, APoint, Result); + end; + +begin + FSeries := nil; + FindNearestPoint(APoint); + if Series = nil then begin + FChart.ShowHint := false; + Application.CancelHint; + RestoreCursor; + FPrevSeries := nil; + exit; + end; + if (FPrevSeries = Series) and (FPrevPointIndex = PointIndex) then + exit; + if FPrevSeries = nil then + SetCursor; + FPrevSeries := Series; + FPrevPointIndex := PointIndex; + FChart.Hint := GetHintText; + FChart.ShowHint := FChart.Hint <> ''; + if not FChart.ShowHint then exit; + Application.HintPause := 0; + Application.ActivateHint(FChart.ClientToScreen(APoint)); +end; + initialization ToolsClassRegistry := TStringList.Create; @@ -1215,6 +1283,7 @@ initialization RegisterChartToolClass(TReticuleTool, 'Reticule'); RegisterChartToolClass(TDataPointClickTool, 'Data point click'); RegisterChartToolClass(TDataPointDragTool, 'Data point drag'); + RegisterChartToolClass(TDataPointHintTool, 'Data point hint'); RegisterChartToolClass(TUserDefinedTool, 'User-defined'); finalization