lazarus/components/tachart/demo/dragdrop/main.pas
2010-03-29 10:12:39 +00:00

110 lines
2.4 KiB
ObjectPascal

unit Main;
{$mode objfpc}{$H+}
interface
uses
Classes, ExtCtrls, SysUtils, FileUtil, LResources, Forms, Controls, Graphics,
Dialogs, TAGraph, TASeries;
type
{ TForm1 }
TForm1 = class(TForm)
Chart1: TChart;
Chart1LineSeries1: TLineSeries;
procedure Chart1LineSeries1GetMark(out AFormattedMark: String;
AIndex: Integer);
procedure Chart1MouseDown(
Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure Chart1MouseMove(
Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure Chart1MouseUp(
Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
private
FDragIndex: Integer;
FNearestIndex: Integer;
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
uses
TAChartUtils;
type
TLineSeriesAccess = class(TLineSeries);
{ TForm1 }
procedure TForm1.Chart1LineSeries1GetMark(
out AFormattedMark: String; AIndex: Integer);
begin
if AIndex = FNearestIndex then
AFormattedMark := Chart1LineSeries1.FormattedMark(AIndex)
else
AFormattedMark := '';
end;
procedure TForm1.Chart1MouseDown(
Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
Unused(Button);
Unused(X, Y);
if Shift = [ssShift, ssLeft] then
FDragIndex := FNearestIndex;
end;
procedure TForm1.Chart1MouseMove(
Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
newNearest: Integer;
pt, img: TPoint;
val: TDoublePoint;
begin
Unused(Shift);
pt := Point(X, Y);
if
not TLineSeriesAccess(Chart1LineSeries1).
GetNearestPoint(@PointDist, pt, newNearest, img, val) or
(PointDist(pt, img) > Sqr(Chart1LineSeries1.Pointer.HorizSize))
then
newNearest := -1;
if newNearest <> FNearestIndex then begin
FNearestIndex := newNearest;
Chart1.Invalidate;
end;
if FDragIndex < 0 then exit;
Chart1LineSeries1.SetXValue(FDragIndex, Chart1.XImageToGraph(X));
Chart1LineSeries1.SetYValue(FDragIndex, Chart1.YImageToGraph(Y));
end;
procedure TForm1.Chart1MouseUp(
Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
Unused(Button, Shift);
Unused(X, Y);
FDragIndex := -1;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
RandSeed := 675402;
for i := 1 to 10 do
Chart1LineSeries1.AddXY(i, Random(20) - 10);
FDragIndex := -1;
FNearestIndex := -1;
end;
end.