Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

MOuseMove и ширина понели на StatusBar   Найти похожие ветки 

 
AAsdr   (2012-07-12 11:15) [0]

Здравсвуйте!
У меня есть StstusBar внизу формы. Данный StatusBar разделяется на четыре части (панельки). Каждая из панелек содержит собственную информацию. Мне необходимо узнать когда пользователь навел мышь на панельки 1, 2, 3 или 4. У этих панелек в Statusbar нет собственного события OnMouseMove - оно есть только у StstusBar  в целом.

Я попытался сравнить координату X события mouseMove  StstusBar с Width первой панели и если X>Width  то это означает, что пользователь перевел курсор на вторую ппнельку и т.д..
Но что-то не срабатывает, программа показывает мне что курсор уже перешел на вторую панельку, хотя я еще нахожусь в середине первой. По ходу X  и width меряются в разных единицах измерения и необходим перевод из одной в другую. Не подскажите - как это сделать?


 
brother ©   (2012-07-12 11:18) [1]

имхо, ты не учитываешь толшину бордюра...


 
AAsdr   (2012-07-12 11:18) [2]

Что за бордюр?


 
brother ©   (2012-07-12 11:20) [3]

смотри:
|----|---|-----|
Где:
|     - бордюр
-x-   - ширины панелей...


 
brother ©   (2012-07-12 11:21) [4]

> ширины

*ширина О_о


 
brother ©   (2012-07-12 11:21) [5]

> толшину

*толщину О_о ппц.


 
brother ©   (2012-07-12 11:22) [6]

> По ходу X  и width меряются в разных единицах измерения

нет, везде в пикселах! ;)


 
brother ©   (2012-07-12 11:34) [7]

нет, эт я чет тупанул, все работает как надо:
procedure TForm1.StatusBar1MouseMove(Sender: TObject; Shift: TShiftState;
 X, Y: Integer);
begin
 caption:= IntToStr(x);

 if x<= StatusBar1.Panels[0].Width then label1.Caption:="0"
 else
 if x<= StatusBar1.Panels[0].Width + StatusBar1.Panels[1].Width then label1.Caption:="1"
 else
 label1.Caption:="2"
end;


 
AV ©   (2012-07-12 11:35) [8]

там немного, не так же, что

> курсор уже перешел на вторую панельку, хотя я еще нахожусь
> в середине первой


практически, работает правильно. До пиксела смотреть никто не станет :)
procedure TForm1.sb1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
var
 i: Integer;
 n: Integer;
begin
 n := 0;
 for i := 0 to sb1.Panels.Count - 1 do
 begin
   n := n + sb1.Panels[i].Width;// + sb1.BorderWidth;
   if n > x then
   begin
     sb1.Panels[i].Text :=  Format("x=%d, y=%d, N=%d", [X,Y,i]);
     Exit;
   end;
 end;
end;


 
Омлет ©   (2012-07-12 11:44) [9]

uses CommCtrl;

procedure TMainForm.StatusBar1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
 i: integer;
 r: TRect;
begin
 for i := 0 to StatusBar1.Panels.Count - 1 do
 begin
   StatusBar1.Perform(SB_GETRECT, i, integer(@r));
   if PtInRect(r, Point(x, y)) then
     Caption := IntToStr(i)
 end;
end;


 
brother ©   (2012-07-12 11:47) [10]

>   StatusBar1.Perform(SB_GETRECT, i, integer(@r));

догадывался, что подобное можно реализовать)


 
AAsdr   (2012-07-12 11:53) [11]

Спасибо всем за помощь!
У меня на самом деле не совсем классический StatusBar а от  DevExpress. У них это к сожалению не срабатывает


 
brother ©   (2012-07-12 11:58) [12]

блин, с этого и надо было начинать!


 
Омлет ©   (2012-07-12 11:59) [13]

> от  DevExpress.

Там поди есть CalcHitInfo.



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.05 c
15-1343044403
D.L.
2012-07-23 15:53
2013.03.22
как научится воспринимать английскую речь на слух?


15-1342301646
silver
2012-07-15 01:34
2013.03.22
icfpc 2012


6-1259931784
Kanaris
2009-12-04 16:03
2013.03.22
Как реализовать "ретранслятор" запросов через сокеты?


6-1265872619
Den
2010-02-11 10:16
2013.03.22
No route to host


2-1331638846
Scott Storch
2012-03-13 15:40
2013.03.22
логирование