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

Вниз

TrackBar, реагирующий на нажатия в своей области.   Найти похожие ветки 

 
Dismember ©   (2007-03-24 08:40) [0]

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


 
Loginov Dmitry ©   (2007-03-24 09:15) [1]

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


 
GrayFace ©   (2007-03-24 09:31) [2]

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


 
Dismember ©   (2007-03-24 10:03) [3]

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


 
Loginov Dmitry ©   (2007-03-24 10:51) [4]

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


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

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;


 
GrayFace ©   (2007-03-24 16:58) [5]

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

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

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

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

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

Не понял.


 
Dismember ©   (2007-03-24 17:31) [6]


> Не понял.

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


 
GrayFace ©   (2007-03-24 17:37) [7]

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


 
GrayFace ©   (2007-03-24 17:38) [8]

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

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


 
Loginov Dmitry ©   (2007-03-24 22:22) [9]

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


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


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

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


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

Столкнулся с еще 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 17:36) [12]

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


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

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

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

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

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


 
Loginov Dmitry ©   (2007-03-25 22:40) [14]

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


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


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


 
Dismember ©   (2007-03-26 08:54) [15]

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

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 компонент, но зато теперь все работает как надо.


 
GrayFace ©   (2007-03-26 09:23) [16]

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

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

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

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



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

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

Наверх




Память: 0.51 MB
Время: 0.055 c
2-1178088907
Calibr
2007-05-02 10:55
2007.05.20
unit для процедур


1-1174368333
Fin
2007-03-20 08:25
2007.05.20
Формирование отчёта в FastReport


15-1176697593
vajo
2007-04-16 08:26
2007.05.20
Руслан Чагаев побил Николая Валуева


15-1176968306
Ega23
2007-04-19 11:38
2007.05.20
Synchronize - поясните


9-1150186032
VolanD666
2006-06-13 12:07
2007.05.20
Текстурные координаты