Una manera de hacer esto es herramienta "Zoom" y herramienta "Seleccion" y
dos botones (TSpeedButton o TToolButton) por seleccionar las.
Otra manera es hacer Zoom cuando "Ctrl" o "Alt" botones estan presionado.
He hecho la ejemplo de primera manera.
Código Delphi
[-]
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, TeEngine, Series, ExtCtrls, TeeProcs, Chart, StdCtrls,
XYSel, Buttons;
type
TForm1 = class(TForm)
Chart1: TChart;
Series1: TLineSeries;
ListBox1: TListBox;
BGetSelection: TButton;
BSelectTool: TSpeedButton;
BZoomTool: TSpeedButton;
procedure FormCreate(Sender: TObject);
procedure BGetSelectionClick(Sender: TObject);
procedure Chart1AfterDraw(Sender: TObject);
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 BToolClick(Sender: TObject);
private
FSelection: TSelection;
FMouseHandled: Boolean;
FZoomMode: Boolean;
public
procedure SetZoomMode(ZoomOn: Boolean);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
BZoomTool.GroupIndex := 1;
BSelectTool.GroupIndex := 1;
BSelectTool.AllowAllUp := False;
BSelectTool.Down := True;
BZoomTool.OnClick := BToolClick;
BSelectTool.OnClick := BToolClick;
for i := 0 to 30 do
Series1.AddXY(i, Random(i));
SetZoomMode(False);
Chart1.OnAfterDraw := Chart1AfterDraw;
Chart1.OnMouseDown := Chart1MouseDown;
Chart1.OnMouseMove := Chart1MouseMove;
Chart1.OnMouseUp := Chart1MouseUp;
BGetSelection.OnClick := BGetSelectionClick;
FSelection := TSelection.CreateEx(Self, Chart1, Series1);
end;
procedure TForm1.SetZoomMode(ZoomOn: Boolean);
begin
FZoomMode := ZoomOn;
if ZoomOn then
begin
Chart1.AllowPanning := pmBoth;
Chart1.AllowZoom := True;
end
else
begin
Chart1.AllowPanning := pmNone;
Chart1.AllowZoom := False;
end;
end;
procedure TForm1.Chart1AfterDraw(Sender: TObject);
begin
FSelection.Draw(Chart1);
end;
procedure TForm1.Chart1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FMouseHandled := FZoomMode;
FSelection.HandleMouse(X, Y, evMouseDown, Shift, FMouseHandled);
end;
procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
FMouseHandled := FZoomMode;
FSelection.HandleMouse(X, Y, evMouseMove, Shift, FMouseHandled);
end;
procedure TForm1.Chart1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FMouseHandled := FZoomMode;
FSelection.HandleMouse(X, Y, evMouseUp, Shift, FMouseHandled);
end;
procedure TForm1.BGetSelectionClick(Sender: TObject);
var i, idx: Integer;
begin
ListBox1.Items.Clear;
for i := 0 to FSelection.Count-1 do
begin
idx := FSelection.Indexes[i];
ListBox1.Items.Add(
Format('%f %f', [FSelection.Series.XValue[idx], FSelection.Series.YValue[idx]])
);
end;
end;
procedure TForm1.BToolClick(Sender: TObject);
begin
SetZoomMode(Sender = BZoomTool);
end;
end.