TAChart: Add TChartMarks.Clipped property. Update demo.

git-svn-id: trunk@21840 -
This commit is contained in:
ask 2009-09-23 17:10:51 +00:00
parent d7d5afb621
commit 54485700c3
4 changed files with 34 additions and 15 deletions

View File

@ -41,6 +41,7 @@ object Form1: TForm1
OnMouseMove = Chart1MouseMove OnMouseMove = Chart1MouseMove
OnMouseUp = Chart1MouseUp OnMouseUp = Chart1MouseUp
object Chart1LineSeries1: TLineSeries object Chart1LineSeries1: TLineSeries
Marks.Clipped = False
Marks.Format = '%0:g' Marks.Format = '%0:g'
Marks.Style = smsValue Marks.Style = smsValue
OnGetMark = Chart1LineSeries1GetMark OnGetMark = Chart1LineSeries1GetMark

View File

@ -14,8 +14,9 @@ LazarusResources.Add('TForm1','FORMDATA',[
+'ft key'#0#13'Title.Visible'#9#5'Align'#7#8'alClient'#14'DoubleBuffered'#9#11 +'ft key'#0#13'Title.Visible'#9#5'Align'#7#8'alClient'#14'DoubleBuffered'#9#11
+'ParentColor'#8#11'OnMouseDown'#7#15'Chart1MouseDown'#11'OnMouseMove'#7#15'C' +'ParentColor'#8#11'OnMouseDown'#7#15'Chart1MouseDown'#11'OnMouseMove'#7#15'C'
+'hart1MouseMove'#9'OnMouseUp'#7#13'Chart1MouseUp'#0#11'TLineSeries'#17'Chart' +'hart1MouseMove'#9'OnMouseUp'#7#13'Chart1MouseUp'#0#11'TLineSeries'#17'Chart'
+'1LineSeries1'#12'Marks.Format'#6#4'%0:g'#11'Marks.Style'#7#8'smsValue'#9'On' +'1LineSeries1'#13'Marks.Clipped'#8#12'Marks.Format'#6#4'%0:g'#11'Marks.Style'
+'GetMark'#7#24'Chart1LineSeries1GetMark'#19'Pointer.Brush.Color'#7#8'clPurpl' +#7#8'smsValue'#9'OnGetMark'#7#24'Chart1LineSeries1GetMark'#19'Pointer.Brush.'
+'e'#17'Pointer.HorizSize'#2#6#13'Pointer.Style'#7#9'psDiamond'#16'Pointer.Ve' +'Color'#7#8'clPurple'#17'Pointer.HorizSize'#2#6#13'Pointer.Style'#7#9'psDiam'
+'rtSize'#2#6#11'SeriesColor'#7#7'clBlack'#10'ShowPoints'#9#0#0#0#0 +'ond'#16'Pointer.VertSize'#2#6#11'SeriesColor'#7#7'clBlack'#10'ShowPoints'#9
+#0#0#0#0
]); ]);

View File

@ -70,17 +70,14 @@ begin
Unused(Shift); Unused(Shift);
pt := Point(X, Y); pt := Point(X, Y);
if if
TLineSeriesAccess(Chart1LineSeries1). not TLineSeriesAccess(Chart1LineSeries1).
GetNearestPoint(@PointDist, pt, newNearest, img, val) GetNearestPoint(@PointDist, pt, newNearest, img, val) or
then begin (PointDist(pt, img) > Sqr(Chart1LineSeries1.Pointer.HorizSize))
if PointDist(pt, img) <= Sqr(Chart1LineSeries1.Pointer.HorizSize) then begin then
if newNearest <> FNearestIndex then begin newNearest := -1;
FNearestIndex := newNearest; if newNearest <> FNearestIndex then begin
Chart1.Invalidate; FNearestIndex := newNearest;
end; Chart1.Invalidate;
end
else
FNearestIndex := -1;
end; end;
if FDragIndex < 0 then exit; if FDragIndex < 0 then exit;
Chart1LineSeries1.SetXValue(FDragIndex, Chart1.XImageToGraph(X)); Chart1LineSeries1.SetXValue(FDragIndex, Chart1.XImageToGraph(X));

View File

@ -270,6 +270,7 @@ type
TChartMarks = class(TChartElement) TChartMarks = class(TChartElement)
private private
FClipped: Boolean;
FDistance: Integer; FDistance: Integer;
FFormat: String; FFormat: String;
FFrame: TChartPen; FFrame: TChartPen;
@ -278,6 +279,7 @@ type
FLinkPen: TChartLinkPen; FLinkPen: TChartLinkPen;
FStyle: TSeriesMarksStyle; FStyle: TSeriesMarksStyle;
procedure SetClipped(const AValue: Boolean);
procedure SetDistance(const AValue: Integer); procedure SetDistance(const AValue: Integer);
procedure SetFormat(const AValue: String); procedure SetFormat(const AValue: String);
procedure SetFrame(const AValue: TChartPen); procedure SetFrame(const AValue: TChartPen);
@ -294,6 +296,8 @@ type
ACanvas: TCanvas; const ALabelRect: TRect; const AText: String); ACanvas: TCanvas; const ALabelRect: TRect; const AText: String);
function IsMarkLabelsVisible: Boolean; function IsMarkLabelsVisible: Boolean;
published published
// If false, labels may overlap axises and legend.
property Clipped: Boolean read FClipped write SetClipped default true;
// Distance between series point and label. // Distance between series point and label.
property Distance: Integer property Distance: Integer
read FDistance write SetDistance default DEF_MARKS_DISTANCE; read FDistance write SetDistance default DEF_MARKS_DISTANCE;
@ -988,6 +992,7 @@ end;
constructor TChartMarks.Create(AOwner: TCustomChart); constructor TChartMarks.Create(AOwner: TCustomChart);
begin begin
inherited Create(AOwner); inherited Create(AOwner);
FClipped := true;
FDistance := DEF_MARKS_DISTANCE; FDistance := DEF_MARKS_DISTANCE;
InitHelper(TFPCanvasHelper(FFrame), TChartPen); InitHelper(TFPCanvasHelper(FFrame), TChartPen);
InitHelper(TFPCanvasHelper(FLabelBrush), TChartLabelBrush); InitHelper(TFPCanvasHelper(FLabelBrush), TChartLabelBrush);
@ -1010,13 +1015,21 @@ end;
procedure TChartMarks.DrawLabel( procedure TChartMarks.DrawLabel(
ACanvas: TCanvas; const ALabelRect: TRect; const AText: String); ACanvas: TCanvas; const ALabelRect: TRect; const AText: String);
var
wasClipping: Boolean = false;
begin begin
if not Clipped and ACanvas.Clipping then begin
ACanvas.Clipping := false;
wasClipping := true;
end;
ACanvas.Brush.Assign(LabelBrush); ACanvas.Brush.Assign(LabelBrush);
ACanvas.Pen.Assign(Frame); ACanvas.Pen.Assign(Frame);
ACanvas.Rectangle(ALabelRect); ACanvas.Rectangle(ALabelRect);
ACanvas.Font.Assign(LabelFont); ACanvas.Font.Assign(LabelFont);
ACanvas.TextOut( ACanvas.TextOut(
ALabelRect.Left + MARKS_MARGIN_X, ALabelRect.Top + MARKS_MARGIN_Y, AText); ALabelRect.Left + MARKS_MARGIN_X, ALabelRect.Top + MARKS_MARGIN_Y, AText);
if wasClipping then
ACanvas.Clipping := true;
end; end;
function TChartMarks.IsMarkLabelsVisible: Boolean; function TChartMarks.IsMarkLabelsVisible: Boolean;
@ -1024,6 +1037,13 @@ begin
Result := Visible and (Style <> smsNone) and (Format <> ''); Result := Visible and (Style <> smsNone) and (Format <> '');
end; end;
procedure TChartMarks.SetClipped(const AValue: Boolean);
begin
if FClipped = AValue then exit;
FClipped := AValue;
StyleChanged(Self);
end;
procedure TChartMarks.SetDistance(const AValue: Integer); procedure TChartMarks.SetDistance(const AValue: Integer);
begin begin
if FDistance = AValue then exit; if FDistance = AValue then exit;