Page 1 of 1
Drill-down help and examples
Posted: Thu Jan 11, 2007 12:58 am
by 9336232
Environment - Delphi 7 and TChart 7.07 working against an Oracle database (using DOA components).
I have a fairly standard bar chart and my user wants to double-click on a bar and then navigate to a new screen that displays the detail data. What I need to be able to do on the Double-click event is determine the text of the X-Axis (the bars go up the Y-Axis and the points go along the X-Axis) under the bar they double-clicked on. I can use that value to then get the detail data and show this data (thats easy). I can't quite figure out is how to get the value of the X-Axis label. Is there an easy way to do this? Also, is there any built in "Drill-down" capability in this version.
Thanks
Richard Anderson
Posted: Thu Jan 11, 2007 10:18 am
by narcis
Hi Richard,
Yes, labels can be retrieved like this:
Code: Select all
procedure TForm1.Series1DblClick(Sender: TChartSeries; ValueIndex: Integer;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
Chart1.Title.Text[0]:=Sender.Labels[ValueIndex];
end;
Regarding built in drill-down, there's MarkTips tool, another option is interpolating series like shown
here or using hints over the line like this:
Code: Select all
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, TeEngine, Series, ExtCtrls, TeeProcs, Chart;
type
TForm1 = class(TForm)
Chart1: TChart;
Series1: TLineSeries;
procedure FormCreate(Sender: TObject);
procedure Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
OnSeriesPoint : Boolean;
OnLegendPoint : Boolean;
tmpL2 : Integer;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Series1.FillSampleValues(10);
Chart1.View3D := False;
end;
procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var tmp, tmpL : Integer;
begin
With Chart1 do
begin
If (Series1.Clicked(X, Y) <> -1) And (OnSeriesPoint = False) Then
begin
Canvas.Brush.Style := bsSolid;
Canvas.Pen.Color := clBlack;
Canvas.Brush.Color := clWhite;
canvas.TextOut(x+10,y,FormatFloat('#.00',Series1.XScreenToValue(x))+','+FormatFloat('#.00',Series1.YScreenToValue(y)));
OnSeriesPoint := True;
End;
//Repaint Chart to clear Textoutputted Mark
If (Series1.Clicked(X, Y) = -1) And (OnSeriesPoint = True) Then
begin
OnSeriesPoint := False;
Repaint;
End;
tmpL := Chart1.Legend.Clicked(X, Y);
If (tmpL <> -1) And ((tmpL <> tmpL2) Or (OnLegendPoint = False)) Then
begin
Repaint;
Canvas.Brush.Color := Series1.LegendItemColor(tmpL);
Canvas.Rectangle( X, Y, X + 20, Y + 20);
Canvas.Brush.Color := clWhite;
canvas.TextOut(x+7,y+7,FormatFloat('#.00',Series1.XValues.Items[Series1.LegendToValueIndex(tmpl)]));
tmpL2 := tmpL;
OnLegendPoint := True;
End;
If (Legend.Clicked(X, Y) = -1) And (OnLegendPoint = True) Then
begin
OnLegendPoint := False;
Repaint;
End;
End;
end;
end.