How do I setup a "onClick" event without using the object inspector?

Posted on 2002-06-28
Last Modified: 2011-09-20
I have a form that has 56 charts on it.  I defined the charts as an array and set the properties in the code snippet below:

  TestProgressForm: TTestProgressForm;
  Charts : array[1..MAX_WFR_COL,1..MAX_WFR_ROW] of Tchart

Procedure TTestProgressForm.AssignChartProperties;
var col,row : integer;
    ChartSeries : TChartSeries;
  for col := 1 to MAX_WFR_COL do begin
    for row := 1 to MAX_WFR_ROW do begin
      Charts[col,row] := Tchart.Create(TestProgressForm);
      Charts[col,row].Parent := TestProgressForm;
      BarSeries[col,row] := TBarSeries.Create(self);
      charts[col,row].Enabled := TRUE;
      charts[col,row].Width := 80;
      charts[col,row].Height := 80;
      {set up properties here}
      charts[col,row].Top := 15 + (row-1)*(charts[col,row].Height + 5);
      charts[col,row].Left := 55 + (col-1)*(charts[col,row].Width + 5);
      with charts[col,row].Series[0] as TBarSeries do begin
        CustomBarWidth := 10;
        title := '';
        Marks.Visible := FALSE;
        ColorEachPoint := True;
        Marks.Style := smsPercent;
        Visible := False ;
        ShowInLegend := False;
        AutoMarkPosition := False;
        HorizAxis := aBottomAxis;
        VertAxis := aLeftAxis;

What I would like to do is set up the code so that when I click or double click on the chart a new form is displayed showing the details.  The new form would be called TestDetails and would need to know which chart was double clicked on.   I do not how to go about defining this.

Thank you,
Question by:PattiGaultney
LVL 17

Accepted Solution

geobul earned 100 total points
ID: 7117693

1. In your form declaration add a new procedure declaration:

TTestProgressForm =
  procedure ChartsClick(Sender: TObject); // common to all charts clicks

2. Write that procedure in the 'implementation' section

procedure TTestProgressForm.ChartsClick(Sender: TObject);
  if (Sender is TChart) then begin
    // Assign the chart to a property of TestDetails form
    TestDetails.TheChart := (Sender as TChart);
    // Show the form

3. Add next line somewhere in your loop above (when creating the charts:
  // This line assigns ChartsClick procedure as OnClick event handler (their declarations must be the same)
  charts[col,row].OnClick := ChartsClick;

4. In TestDetails form:

TestDetails =
  FChart: TChart; // new private field
  property TheChart: TChart read FChart write FChart; // new public property to hold a reference to a chart

Now, in the events of TestDetails form you can use 'TheChart' to obtain a reference to the chart that has been clicked last. For example:

with TheChart.Series[0] as TBarSeries do begin

Perhaps there is an easier way but that's coming up in my mind now and it's almost 5 AM here. If you need more info, please ask.

Regards, Geo

Expert Comment

ID: 7118983
I think it would be easier just to use some determining code in the OnClick handler... like this:

if (Sender as TChart).Name = "Chart1" then...

If there is position information, where you can determine
which chart is being accessed by it's X and Y coordinates, you can do that too, like

ChartID : integer;

ChartID = Idfunc((Sender as TChart).Left,(Sender as TChart).Bottom);

Where IDfunc returns the index as a function of left and right.

Finally, if you use the tag field when you create, putting in the number of the chart, then you can just do this:

...during creation of the charts
Charts[col,row].tag = col*100+row;

...during the OnClick
switch(Sender as TChart).tag)


Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
Established in 1997, Technology Architects has become one of the most reputable technology solutions companies in the country. TA have been providing businesses with cost effective state-of-the-art solutions and unparalleled service that is designed…
With Secure Portal Encryption, the recipient is sent a link to their email address directing them to the email laundry delivery page. From there, the recipient will be required to enter a user name and password to enter the page. Once the recipient …

840 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question