![]() |
|
|
Регистрация | << Правила форума >> | 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; Пишу программы за еду. __________________ |