Solved

DoubleClick on a TStatusPanel

Posted on 2007-04-02
6
476 Views
Last Modified: 2012-08-13
I need to have a OnDubleClick event on a TStatusPanel

(IE inside a statusBar OnDoubleClick I need to know which of the StatusPanels the double click is on
0
Comment
Question by:wqclatre
6 Comments
 
LVL 17

Expert Comment

by:mokule
ID: 18835534
Maybe try like this

var
    xm,ym: integer;


procedure TForm1.StatusBar1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  xm := X;
  ym := Y;
end;

procedure TForm1.StatusBar1DblClick(Sender: TObject);
var
  i: integer;
  dx: integer;
begin
  dx := 0;
  for i := 0 to StatusBar1.Panels.Count - 1 do
    begin
    if (xm > dx) and (xm < dx+ StatusBar1.Panels[i].Width) then
      begin
      ShowMessage(IntToStr(i));
      exit;
      end;
    dx := dx + StatusBar1.Panels[i].Width;
    end;
  ShowMessage('No panel clicked');
end;
0
 
LVL 2

Author Comment

by:wqclatre
ID: 18835706
I don't like the idea of Global variables.

Isn't there a way to get the ScreenPositions for the StatusPanel[2] for example ?
0
 
LVL 17

Expert Comment

by:mokule
ID: 18835776
It's up to You how You declare xm, ym.
They can be private members in the Form's class.
0
Courses: Start Training Online With Pros, Today

Brush up on the basics or master the advanced techniques required to earn essential industry certifications, with Courses. Enroll in a course and start learning today. Training topics range from Android App Dev to the Xen Virtualization Platform.

 
LVL 11

Expert Comment

by:calinutz
ID: 18835781
Have you tryed this:

Statusbar2.ClientOrigin.X
Statusbar2.ClientOrigin.Y


Regards
0
 
LVL 2

Author Comment

by:wqclatre
ID: 18835787
Feels "global" to me.....  (global within the unit)
0
 
LVL 17

Accepted Solution

by:
TheRealLoki earned 500 total points
ID: 18920521
This is all you need, and is not global

procedure TForm1.StatusBar1DblClick(Sender: TObject);
var
  WhichPanel, wdth: integer;
  cp: tpoint;
begin
  cp := mouse.CursorPos;
  cp.x := cp.x - (sender as TStatusBar).ClientOrigin.x;
  WhichPanel := 0;
  wdth := 0;
  while (WhichPanel < (sender as TStatusBar).Panels.Count) and
        (cp.x > wdth + (sender as TStatusBar).Panels[WhichPanel].Width) do
  begin
    wdth := wdth + (sender as TStatusBar).Panels[WhichPanel].Width;
    inc(WhichPanel);
  end;
  ShowMessage('You clicked on panel # ' + Inttostr(WhichPanel));
end;
0

Featured Post

Courses: Start Training Online With Pros, Today

Brush up on the basics or master the advanced techniques required to earn essential industry certifications, with Courses. Enroll in a course and start learning today. Training topics range from Android App Dev to the Xen Virtualization Platform.

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…
This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
Two types of users will appreciate AOMEI Backupper Pro: 1 - Those with PCIe drives (and haven't found cloning software that works on them). 2 - Those who want a fast clone of their boot drive (no re-boots needed) and it can clone your drive wh…
A short tutorial showing how to set up an email signature in Outlook on the Web (previously known as OWA). For free email signatures designs, visit https://www.mail-signatures.com/articles/signature-templates/?sts=6651 If you want to manage em…

776 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