![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Как объявить событие OnMouseWheel для компонента, который его не имеет?..
Мне необходимо это событие для компонента TDBGridEh (сторонняя библиотека EhLib 7 версии) и для встроенного (в среду Delphi XE7) компонента TSpeedButton. Как сделать чтобы это событие появилось для этих компонент в Object Inspector? |
#2
|
|||
|
|||
![]() Сделать свой компонент - наследник от нужного, в нем объявить это свойство, установить новый компонент. И будет тебе счастье.
Вот только вопрос появился. Ну с гридом я еще понимаю, хотя он и так должен отрабатывать скрол мышки, зачем его перегружать не совсем понятно. А вот что ты будешь со скролом делать на кнопке??? ЗЫ. Можно захачить компоненты, если тебе уж так надо сделать это событие, а по полной программе возиться неохота. В object inpector'е оно не появится, но можно будет назначить туда свой обработчик из кода. Делается так: 1. Дизайнишь форму со всеми нужными тебе компонентами. 2. До описания класса формы вставляешь создание класса с таким же именем, наследующимся от стандартного с указанием имени модуля. 3. В этом классе объявляешь все нужные тебе события. 4. В OnCreate формы присваиваешь нужные тебе обработчики. 5. Все работает в рантайме. Выглядит примерно так (имена наверняка попутал, проверь): Код:
unit MyFrm; uses ..., StdCtrls, ...; interface type TSpeedButton=class(StdCtrls.TSpeedButton) private FMyEvent : TNotifyEvent; protected procedure DoMyEvent(var Message : TMessage); message WM_MOUSEWEEL; public property OnMyEvent : TNotifyEvent read FMyEvent write FMyEvent; end; TMyForm=class(TForm) SpeedButton1 : TSpeedButton; ... procedure FormCreate(Sender : TObject); ... procedure MyEventHandlet(Stnder : TObject); ... implementation procedure TSpeedButton.DoMyEvent(var Message : TMessage); begin if Assigned(FMyEvent) Then FMyEvent(Self); end; procedure TMyForm.FormCreate(Sender : TObject); begin SpeedButton1.OnMyEvent := MyEventHandler; end; procedure TMyForm.MyEventHandler(Sender : TObject); begin ShowMessage('Got event!'); end; ... Последний раз редактировалось lmikle, 14.09.2015 в 19:18. |
#3
|
|||
|
|||
![]() Большое спасибо за ответ!! Чуть позже я напишу вам, для чего нужно событие колеса мышки, это интересная тема... А пока я пробую запустить ваш код и не получается.., а именно - компилятор делает красным строку
Код:
procedure DoMyEvent; message WM_MOUSEWHEEL; и когда я нажимаю на эту строку-сообщение об ошибке, он перекидывает меня на фрагмент текста, где в секции uses указано (среди многих других) использование модуля FileCtrl. ... И как мне всё это понимать? |
#4
|
||||
|
||||
![]() через перехват WM_MOUSEWHEEL:
Код:
type TButton = class(StdCtrls.TButton) private FMouseWheelEvent: TNotifyEvent; protected procedure WMMOUSEWHEEL(var Message: TMessage); message WM_MOUSEWHEEL; published property OnMouseWheelEvent: TNotifyEvent read FMouseWheelEvent write FMouseWheelEvent; end; TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } procedure MouseWheelEventHandler(Sender: TObject); end; ... { TButton } procedure TButton.WMMOUSEWHEEL(var Message: TMessage); begin inherited; if Assigned(FMouseWheelEvent) then FMouseWheelEvent(Self); end; { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin Button1.OnMouseWheelEvent:=MouseWheelEventHandler; end; procedure TForm1.MouseWheelEventHandler(Sender: TObject); begin Windows.Beep(1000, 250); end; только вот с TSpeedButton проблема - это не окно!!! Код:
TSpeedButton = class(Buttons.TSpeedButton) public procedure MouseWheelHandler(var Message: TMessage); override; end; ... { TSpeedButton } procedure TSpeedButton.MouseWheelHandler(var Message: TMessage); begin inherited; Windows.Beep(1000, 250); end; работает когда на кнопке мышь нажата и крутится колесо. Пишу программы за еду. __________________ |
#5
|
|||
|
|||
![]() Спасибо большое!
Присланный вами код работает. Но, есть вот какое затруднение: Ведь событие вы определили типа TNotyfyEvent; Такое событие содержит только один параметр типа Tobject. А нужное мне событие - OnMouseWheel должно быть типа TMouseWheelEvent, и содержать гораздо больше параметров, которые как раз и нужны мне для обработки... Так вот, я вставил ваш код в программу (для грида) - всё заработало - при вращении колеса мышки, раздаются звуки... Но мне то нужно как-то перевести это событие в процедуру, с большим количеством параметров! Мне недостаточно передать только Self. И когда я подставляю в Form.Create вместо MyGrid.OnMouseWheelEvent:=MouseWheelEventHandler; строку : MyGrid.OnMouseWheelEvent:=MyGridMouseWheel; - то компилятор выдаёт ошибку, что количество параметров не сходится... |
#6
|
||||
|
||||
![]() Код:
type TButton = class(StdCtrls.TButton) public property OnMouseWheel; end; TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } procedure MouseWheelEventHandler(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); end; ... procedure TForm1.FormCreate(Sender: TObject); begin Button1.OnMouseWheel:=MouseWheelEventHandler; end; procedure TForm1.MouseWheelEventHandler(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); begin Windows.Beep(1000, 250); end; Пишу программы за еду. __________________ |
#7
|
|||
|
|||
![]() Очень благодарен! Всё теперь заработало.. Скажите, а в какой книге можно прочесть про те способы объявления событий, которые здесь приведены?
Хотелось бы детально понять, как это происходит... А то я скопировал это просто, но сути так и не понял. И ещё - а можно ли также сделать в компоненте TSpeedButton - это будет работать, также как с TButton? Меня спрашивали, зачем я меняю эти события, я поясню: 1) Кнопки. Для экономии места на экране на одну кнопку можно кроме самого действия по её нажатию, прицепить какие-либо настройки этого действия. Например, если есть кнопка, выбирающая кисть для рисования, то для пользователя будет удобно выбирать ширину кисти вращением мышки над этой кнопкой, а при нажатии - будет выбрана кисть с этой шириной. Чтобы не запутаться - вращение колеса мышки сопровождается сменой изображения диаметра кисти на этой кнопке. 2) Таблица с текстом или текстовый редактор. Здесь ещё интереснее. Например, мой грид отображает закладки (на каком-то тексте). Закладки входят в группы, в виде дерева (как в интернет-браузере). И закладок много..., несколько сотен. Пользователю долго их прокручивать, потому что колесо мышки крутит (в стандартном событии) строки таблицы только по одной. Я делю поле грида (по вертикали, условно) на несколько областей, например 3. Центральное, допустим, занимает 4/6 от ширины площади грида. Левая и правая область - по 1/6 ширины. И когда пользователь вращает колесо мышки, держа указатель около середины грида, он скроллируется построчно. Когда ближе к правому краю - постранично. А когда около левого края - указатель грида "прыгает" по узлам дерева. С текстовым редактором такая же история. Листать построчно, или постранично, немного сместив указатель мышки по экрану - очень удобно. Пользователи благодарили меня за эту возможность, вот. |
Этот пользователь сказал Спасибо Anthony68 за это полезное сообщение: | ||
Gareth (05.03.2022)
|
#8
|
|||
|
|||
![]() Последний вариант кода, который работает с гридом, я точно также написал для TSpeedButton. Компилятор ошибки не выдал, но на событие OnMouseWheel компонент TSpeedButton почему то не откликается(
Что не так? Подскажите пожалуйста... |
#9
|
|||
|
|||
![]() Со SpeedButton есть маленькая проблемка. Как уже говорилось, SpeedButton - это не окно, соответвенно, оно "ловить" сообщения не может. Если все-таки очень хочется прикрутить это сообщение именно к быстрой кнопке, то надо ловить его на родительском компоненте (а то и просто у формы), по координатам мышы вычислять какой компонент находится под ней и, если это нужный компонент, выполнять соотв. действия.
|
#10
|
|||
|
|||
![]() Спасибо за ответ!
|
#11
|
|||
|
|||
![]() Всё-таки непонятно, если TSpeedButton не умеет ловить сообщения, то как же тогда эта кнопка отрабатывает стандартное событие OnMouseDown ??..
|
#12
|
||||
|
||||
![]() Цитата:
![]() Пишу программы за еду. __________________ |