Конференция "KOL" » Общий OnMessage для неск. контролов. Как определить текущий?
 
  • L`Autour © (11.09.08 13:10) [0]
    Конкретно использую два KOLListView у которых зеркально похожая обработка на события в программе (т.е для рациональнее использовать общие обработчики с указанием на используемый ListView). И если если для обработки конкретных событий я могу определить какой ListView используется по получаемому параметру Sender, то для OnMessage его нет.

    Есть конечно Msg.hwnd, только не ясно с чем его сравнивать (свойство ListView.handle не подходит).
  • b z (11.09.08 14:26) [1]
    см. FindControl(Msg.hwnd)
  • b z (11.09.08 14:27) [2]
    ой сори не заметил конференцию :(
  • Compiler © (11.09.08 14:50) [3]
    AttachProc используй, там Sender есть. Заполняй у ListView'ов св-во Tag и различай их
  • L`Autour © (11.09.08 14:59) [4]
    Зачем AttachProc, если есть четкое соответствие между Msg.hwnd и ListView.handle?
    Я хочу только узнать какой функцией из одного получить другое.

    По свойсту Tag. В том и пробема, что в обработчике:

    function TForm1.ListViewTbl1Message(var Msg: tagMSG;
     var Rslt: Integer): Boolean;

    Нету указателя на контрол, по свойствам которого я его смогу определить.
  • Compiler © (11.09.08 15:21) [5]

    SetProp(Listview1.Handle, ID_SELF,DWORD(@Listview1));
    ...
    _Self:=Pointer(GetProp(msg.hwnd,ID_SELF));


    или

    SetWindowLong(..,GWL_USERDATA,..)
    GetWindowLong(..,GWL_USERDATA)

  • Дмитрий К © (11.09.08 15:26) [6]
    А у меня Msg.hwnd и ListView.Handle равны, правда без MCK.

    program Project1;

    uses
     Windows, Messages, KOL;

    var
     Form, LV1, LV2, LV3: PControl;

    function LVMessage(Dummy: Pointer; var Msg: TMsg; var Rslt: Integer): Boolean;
    var
     lv: PControl;
    begin
     Result := False;
     if Msg.hwnd = lv1.Handle then
       lv := LV1
     else
       if Msg.hwnd = lv2.Handle then
         lv := LV2
       else
         lv := LV3;
     case Msg.message of
       WM_LBUTTONDOWN:
         lv.LVItemAdd('Click!');
       WM_MOUSEWHEEL:
         lv.LVItemAdd('Wheel!');
       WM_SIZE:
         lv.LVItemAdd('Size!');
     end;
    end;

    begin
     Form := NewForm(nil, 'TestLVsMsg');
     LV1 := NewListView(Form, lvsList, [], nil, nil, nil).SetAlign(caTop);
     LV2 := NewListView(Form, lvsList, [], nil, nil, nil).SetAlign(caTop);
     LV3 := NewListView(Form, lvsIcon, [], nil, nil, nil).SetAlign(caTop);
     LV1.OnMessage := TOnMessage(MakeMethod(nil, @LVMessage));
     LV2.OnMessage := TOnMessage(MakeMethod(nil, @LVMessage));
     LV3.OnMessage := TOnMessage(MakeMethod(nil, @LVMessage));
     Run(Form);
    end.

  • L`Autour © (12.09.08 06:06) [7]
    Мда.
    Уже сам нашел:
    if (ListViewTbl1.GetWindowHandle = Msg.hwnd) then

 
Конференция "KOL" » Общий OnMessage для неск. контролов. Как определить текущий?
Есть новые Нет новых   [134432   +18][b:0][p:0.001]