Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.09.2015, 19:25
Anthony68 Anthony68 вне форума
Прохожий
 
Регистрация: 26.11.2011
Сообщения: 18
Репутация: 10
По умолчанию Как объявить событие OnMouseWheel для компонента, который его не имеет?

Как объявить событие OnMouseWheel для компонента, который его не имеет?..

Мне необходимо это событие для компонента TDBGridEh (сторонняя библиотека EhLib 7 версии) и для встроенного (в среду Delphi XE7) компонента TSpeedButton.

Как сделать чтобы это событие появилось для этих компонент в Object Inspector?
Ответить с цитированием
  #2  
Старый 13.09.2015, 21:12
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Сделать свой компонент - наследник от нужного, в нем объявить это свойство, установить новый компонент. И будет тебе счастье.

Вот только вопрос появился. Ну с гридом я еще понимаю, хотя он и так должен отрабатывать скрол мышки, зачем его перегружать не совсем понятно. А вот что ты будешь со скролом делать на кнопке???

ЗЫ. Можно захачить компоненты, если тебе уж так надо сделать это событие, а по полной программе возиться неохота. В 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  
Старый 14.09.2015, 11:43
Anthony68 Anthony68 вне форума
Прохожий
 
Регистрация: 26.11.2011
Сообщения: 18
Репутация: 10
По умолчанию

Большое спасибо за ответ!! Чуть позже я напишу вам, для чего нужно событие колеса мышки, это интересная тема... А пока я пробую запустить ваш код и не получается.., а именно - компилятор делает красным строку

Код:
procedure DoMyEvent; message WM_MOUSEWHEEL;
И пишет при этом в информационном окошке: Unit "Vcl.FileCtrl" is specific to a platform
и когда я нажимаю на эту строку-сообщение об ошибке, он перекидывает меня на фрагмент текста, где в секции uses указано (среди многих других) использование модуля FileCtrl.

... И как мне всё это понимать?
Ответить с цитированием
  #4  
Старый 14.09.2015, 12:10
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

через перехват 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  
Старый 14.09.2015, 18:09
Anthony68 Anthony68 вне форума
Прохожий
 
Регистрация: 26.11.2011
Сообщения: 18
Репутация: 10
По умолчанию

Спасибо большое!
Присланный вами код работает. Но, есть вот какое затруднение:

Ведь событие вы определили типа TNotyfyEvent; Такое событие содержит только один параметр типа Tobject. А нужное мне событие - OnMouseWheel должно быть типа TMouseWheelEvent, и содержать гораздо больше параметров, которые как раз и нужны мне для обработки...

Так вот, я вставил ваш код в программу (для грида) - всё заработало - при вращении колеса мышки, раздаются звуки... Но мне то нужно как-то перевести это событие в процедуру, с большим количеством параметров! Мне недостаточно передать только Self.

И когда я подставляю в Form.Create вместо
MyGrid.OnMouseWheelEvent:=MouseWheelEventHandler;

строку :
MyGrid.OnMouseWheelEvent:=MyGridMouseWheel;

- то компилятор выдаёт ошибку, что количество параметров не сходится...
Ответить с цитированием
  #6  
Старый 14.09.2015, 18:21
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
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;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:42.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025