Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.173 c
2-1177655329
Ega23
2007-04-27 10:28
2007.05.20
TInterfacedList.Delete - произойдёт ли вызов _Release


3-1171882209
vani
2007-02-19 13:50
2007.05.20
Delphi7 ADO MSSQL2k


2-1177699162
Ezorcist
2007-04-27 22:39
2007.05.20
Многопоточность в Tserversocket


15-1177202837
vasIZmax
2007-04-22 04:47
2007.05.20
Задачка


2-1177571002
sadasd
2007-04-26 11:03
2007.05.20
Динамический массив





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский