-
Конкретно использую два KOLListView у которых зеркально похожая обработка на события в программе (т.е для рациональнее использовать общие обработчики с указанием на используемый ListView). И если если для обработки конкретных событий я могу определить какой ListView используется по получаемому параметру Sender, то для OnMessage его нет.
Есть конечно Msg.hwnd, только не ясно с чем его сравнивать (свойство ListView.handle не подходит).
-
см. FindControl(Msg.hwnd)
-
ой сори не заметил конференцию :(
-
AttachProc используй, там Sender есть. Заполняй у ListView'ов св-во Tag и различай их
-
Зачем AttachProc, если есть четкое соответствие между Msg.hwnd и ListView.handle? Я хочу только узнать какой функцией из одного получить другое.
По свойсту Tag. В том и пробема, что в обработчике:
function TForm1.ListViewTbl1Message(var Msg: tagMSG; var Rslt: Integer): Boolean;
Нету указателя на контрол, по свойствам которого я его смогу определить.
-
SetProp(Listview1.Handle, ID_SELF,DWORD(@Listview1));
...
_Self:=Pointer(GetProp(msg.hwnd,ID_SELF));
или
SetWindowLong(..,GWL_USERDATA,..)
GetWindowLong(..,GWL_USERDATA)
-
А у меня 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.
-
Мда. Уже сам нашел: if (ListViewTbl1.GetWindowHandle = Msg.hwnd) then
|