Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TrackBar, реагирующий на нажатия в своей области. [D7, WinXP]


Dismember ©   (2007-03-24 08:40:00) 

Добрый день. Как сделать так, чтобы при клике в некоторую позицию полоски трэкбара можно было отслеживать эту позицию и перемещать ползунок в нужное место? Стандартный компонент Delphi смещает ползунок на 2 позиции в нужную сторону, но хотелось бы реализации типа как в мультимедиа проигрывателях. Посмотрел компоненты LMDTools (точно так же смещается на 2 позиции :() и XiTrackBar (компонент красивый, но на клики не реагирует вообще).


GrayFace   (2007-03-26 09:23:00) [1]

Loginov Dmitry ©   (24.03.07 22:22) [9]
> Проверял, вызывает глюки. Причем в самых неожиданных местах.

Постоянно этим пользуюсь. Глюков пока не замечал. Что я делаю не так?

Удачу подшаманиваешь. :)

Dismember ©   (26.03.07 08:54) [15]
Вот так:
TTimeBar = class(TXiTrackBar)
published
Property OnMouseDown;
Property OnMouseUp;
end;


Dismember   (2007-03-26 08:54:00) [2]

Спасибо за советы, проблема благополучно решилась :) Вот мой код:

unit TimeBar;

interface

uses
XiTrackBar, Controls, Classes;

type
TTimeBar = class(TXiTrackBar)
private
FOnMouseDown: TMouseEvent;
FOnMouseUp: TMouseEvent;
protected
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y:
Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y:
Integer); override;
published
Property OnMouseDown : TMouseEvent read FOnMouseDown write
FOnMouseDown ;
Property OnMouseUp : TMouseEvent read FOnMouseUp write FOnMouseUp ;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('XiControls',[TTimeBar]);
end;

procedure TTimeBar.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
begin
if Assigned(FOnMouseDown) then
FOnMouseDown(Self,Button,Shift,X,Y);
inherited MouseDown(Button,Shift,X,Y);
end;

procedure TTimeBar.MouseUp(Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
if Assigned(FOnMouseUp) then
FOnMouseUp(Self,Button,Shift,X,Y);
inherited MouseUp(Button,Shift,X,Y);
end;

end.

Пришлось делать 2 компонент, но зато теперь все работает как надо.


Loginov Dmitry   (2007-03-25 22:40:00) [3]

> Да и событие OnMouseDown нужно всего для 1 экземпляра компонента,
> а не для всех сразу. Что подскажете?


Используй свойство Tag. Или имя. Типа:


procedure TMyTrackBar.MouseDown(Button: TMouseButton; Shift: TShiftState;
 X, Y: Integer);
begin
 inherited;
 if Self.Name = 'MyCoolTrackBar' then
 begin
   {Полезный код}
 end;
end;


RASkov   (2007-03-25 17:54:00) [4]

> Можно ли вынести события OnMouseDown и OnMouseUp в инспектор
> объектов?

Нужно "новый" компонет устанавливать в IDE

> к тому же непонятно, куда деть параметры

property OnMouseDown и OnMouseUp имеют тип TMouseEvent там эти параметры описаны


Dismember   (2007-03-25 17:36:00) [5]

Поступил так, как советовал Loginov Dmitry в посте №4, но как-то неуклюже это выглядит. Да и событие OnMouseDown нужно всего для 1 экземпляра компонента, а не для всех сразу. Что подскажете?


Dismember   (2007-03-25 17:11:00) [6]

Столкнулся с еще 1 проблемой. В списке обработчиков событий всего одно событие OnChange. Описано как
property OnChange: TNotifyEvent read FOnChange write FOnChange;
Можно ли вынести события OnMouseDown и OnMouseUp в инспектор объектов? По аналогии с OnChange пытался прописать что-то вроде
property OnChange: TNotifyEvent read FOnChange write FOnChange;

, но ничего не получилось,  к тому же непонятно, куда деть параметры Button: TMouseButton; Shift: TShiftState; X, Y: Integer
Если не трудно, напишите пожалуйста, какой код куда вставить.


Dismember   (2007-03-25 10:40:00) [7]

Всем спасибо за ответы, проблема решилась даже проще, чем я мог полагать. Оказалось, что стандартный обработчик нужного мне трекбара обрабатывает нажатия только в области ползунка. Немного подредактировал код, и все стало работать как надо :)


Loginov Dmitry   (2007-03-24 22:22:00) [8]

> Проверял, вызывает глюки. Причем в самых неожиданных местах.


Постоянно этим пользуюсь. Глюков пока не замечал. Что я делаю не так?


GrayFace   (2007-03-24 17:38:00) [9]

Если речь о моем компоненте, то используй как хочешь.

P.S. Че-то у меня часто в последнее время выходит по 2 поста подряд.


GrayFace   (2007-03-24 17:37:00) [10]

Да, только не редактируй исходники VCL - черевато несовместимостью dcu-шек и путаницей.


Dismember   (2007-03-24 17:31:00) [11]


> Не понял.

Я имел ввиду редактирование исходного кода компонента. Возможно ли это?


GrayFace   (2007-03-24 16:58:00) [12]

Loginov Dmitry ©   (24.03.07 10:51) [4]
Достаточно поступить так:

Проверял, вызывает глюки. Причем в самых неожиданных местах.

Dismember ©   (24.03.07 10:03) [3]
Спасибо большое, попробую процедуру WMLMouseDown как-нибудь  переписать для другого компонента.

Да просто посмотри, как я сделал. Хотя исключительно для себя можно и упростить - я делал корректную отработку OnMouseDown.

Dismember ©   (24.03.07 10:03) [3]
И еще один ламерский вопрос: если есть исходники обоих компонентов, обязательно создавать новый компонент с наследованием свойств или можно добавлять новые функции?

Не понял.


Loginov Dmitry   (2007-03-24 10:51:00) [13]

> обязательно создавать новый компонент с наследованием свойств
> или можно добавлять новые функции?


Достаточно поступить так:

type

 TMyTrackBar = class(TTrackBar)
 protected
   procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
     X, Y: Integer); override;
 end;

 TTrackBar = class(TMyTrackBar);

 TForm3 = class(TForm)

......................

procedure TMyTrackBar.MouseDown(Button: TMouseButton; Shift: TShiftState;
 X, Y: Integer);
begin
 inherited;
 {Полезный код}
end;


Dismember   (2007-03-24 10:03:00) [14]

Спасибо большое, попробую процедуру WMLMouseDown как-нибудь  переписать для другого компонента. И еще один ламерский вопрос: если есть исходники обоих компонентов, обязательно создавать новый компонент с наследованием свойств или можно добавлять новые функции?


GrayFace   (2007-03-24 09:31:00) [15]

http://www.grayface.nm.ru/RSPak.rar
RSTrackBar


Loginov Dmitry   (2007-03-24 09:15:00) [16]

Сделай наследника от TrackBar, лови требуемые WM_ - сообщения и обрабатывай их в соответствии с должной логикой.


Наверх

Титульная страница Поиск, карта сайта Написать письмо