Mousewheel и TDblookUpCombobox

Чешков Антон
Дата: 06.10.2006 12:14:17
что то ни как не получаеться поймать событие "поворота колесика мыши" на компоненте ((
все перепробывал, каким образом это можно сделать , наверное существует какойтообщий способ для любого компонента???
Клюк
Дата: 06.10.2006 12:32:27
Из справки TWinControl.WndProc
(правда для Builder'a но в Delphi также <можно справку посмотреть>)
This example shows how to use the WndProc method and the WindowProc property to subclass a custom control’s window procedure. This example subclasses the window procedure of a TListBox descendant to respond to a user-defined message called WM_STYLEMESSAGE. The subclassed window procedure can be turned on or off by pressing a radio button.

void __fastcall TMyListBoxDescendant::SubClassWndProc(Messages::TMessage &Message)
{
  if (Message.Msg == WM_STYLEMESSAGE)
    Style = (TListBoxStyle)Message.WParam;
  else
    WndProc(Message);
}
void __fastcall TMyListBoxDescendant::ToggleSubClass(bool On)
{
  if (On)
    WindowProc = SubClassWndProc;
  else
    WindowProc = WndProc;
}
void __fastcall TForm1::SubClassRadioGroup1Click(TObject *Sender)
{
  MyListBoxDescendant1->ToggleSubClass(SubClassRadioGroup1->ItemIndex == 0);}

А в данном случае нужно перехватить
WM_MOUSEWHEEL
fwKeys = LOWORD(wParam); // key flags
zDelta = (short) HIWORD(wParam); // wheel rotation
xPos = (short) LOWORD(lParam); // horizontal position of pointer
yPos = (short) HIWORD(lParam); // vertical position of pointer
Чешков Антон
Дата: 06.10.2006 13:32:13
что то я не погимаю ((( пишу так ...


.......

type myc =    class (TDBLookupComboboxEh)
 public
 	procedure wndproc1(var Message: TMessage);
 end;

type
  Tfm_order_correct = class(TForm)
    DBLookupComboboxEh1: myc;
   .......
end;


procedure myc.wndproc1(var Message: TMessage);
begin
       if Message.Msg = WM_MOUSEWHEEL then
        	Exit;
        
      WndProc(message);
end;

procedure Tfm_order_correct .onShow(....);
begin
        DBLookupComboboxEh1.WindowProc:=winproc1;
end;


что то не робит , я явно делаю что то не так (
Клюк
Дата: 06.10.2006 13:47:29
а зачем

type myc =    class (TDBLookupComboboxEh)
 public
 	procedure wndproc1(var Message: TMessage);
 end;
может проще так


type
  Tfm_order_correct = class(TForm)
    DBLookupComboboxEh1: myc;
 public
 	procedure wndproc1(var Message: TMessage);
   .......
end;


procedure Tfm_order_correct .wndproc1(var Message: TMessage);
begin
       if Message.Msg = WM_MOUSEWHEEL then
        	Exit;
        
      WndProc(message);
end;

procedure Tfm_order_correct .onShow(....);
begin
        DBLookupComboboxEh1.WindowProc:=winproc1;
end;
Клюк
Дата: 06.10.2006 13:48:53
Вернее
type
  Tfm_order_correct = class(TForm)
    DBLookupComboboxEh1: DBLookupComboboxEh;
 public
 	procedure wndproc1(var Message: TMessage);
   .......
end;
Чешков Антон
Дата: 06.10.2006 13:59:54
так тоже писал , у меня при открытии окна просто форма подвисла, а именно этот контрол (
Чешков Антон
Дата: 06.10.2006 14:02:01
получаеться вызываеться WndProc самой формы
Клюк
Дата: 06.10.2006 14:46:39
Можно попробовать так

type
  Tfm_order_correct = class(TForm)
    DBLookupComboboxEh1: DBLookupComboboxEh;

  procedure WMMouseWheel(var Message: TWMMouseWheel); message WM_MOUSEWHEEL;
   .......
end;

procedure Tfm_order_correct.WMMouseWheel(var Message: TWMMouseWheel);
begin
{ проверяем где крутим и если надо то реагируем}
 Message.XPos ...
 Message.YPos ...
end
Чешков Антон
Дата: 06.10.2006 14:59:10
Когда фокус в контролн, форма почему то не обрабатывает скролл , не знаю что такое (( видно не судьба................
Клюк
Дата: 06.10.2006 15:02:12
А если нужен только скролл
то в потомке TDBLookupCombobox
надо определить

    procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;

текст того что сейчас там есть:

procedure TDBLookupListBox.WMVScroll(var Message: TWMVScroll);
begin
  SearchText := '';
  if ListLink.DataSet = nil then
    Exit;
  with Message, ListLink.DataSet do
    case ScrollCode of
      SB_LINEUP: MoveBy(-FRecordIndex - 1);
      SB_LINEDOWN: MoveBy(FRecordCount - FRecordIndex);
      SB_PAGEUP: MoveBy(-FRecordIndex - FRecordCount + 1);
      SB_PAGEDOWN: MoveBy(FRecordCount - FRecordIndex + FRecordCount - 2);
      SB_THUMBPOSITION:
        begin
          case Pos of
            0: First;
            1: MoveBy(-FRecordIndex - FRecordCount + 1);
            2: Exit;
            3: MoveBy(FRecordCount - FRecordIndex + FRecordCount - 2);
            4: Last;
          end;
        end;
      SB_BOTTOM: Last;
      SB_TOP: First;
    end;
end;