Приветствую знатоков.
может быть кто-то решал такую проблему.
в listView отрисовываю все сам. в некоторых колонках стоят "checkbox" (только картинка).
задача: если уже выделены пункты и выполняется клик левой мышкой над "checkbox-ами" надо чтобы селект не снимался + выполнялось действие над выбранными строками, независимо от того куда помещен курсор (на выделенную строку или нет).
если делать по mousedown то вначале listview меняет селект пунктов, а потом вызывает событие onmousedown.
пока едиственный способ который я смог придумать - это перехват сообщений application (onMessage), но похоже что я с этим на долго зависну.
есть ли другой способ ?
спасибо за помощь.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
27-06-2006 09:44
я как раз и сделал первый вариант. только у меня он получился намного сложнее в плане пересчета координат.
второй действительно более интересный. такой способ я еще не применял.
спасибо.
function TForm1.ListViewLMouseDown(X, Y: Integer; Shift: TShiftState): boolean;
begin
// Если кликнули по checkBox, возвращаем true. Я проверяю тупо, ты сделай более правильные проверки.
result:=(X>8) and (X<16);
end;
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
if not ListView1.Focused then exit;
if Msg.message=WM_LBUTTONDOWN then begin
Handled:=ListViewLMouseDown(LoWord(Msg.lParam), HiWord(Msg.lParam), KeysToShiftState(Msg.wParam));
end;
end;
Но мне нравиться немного другой вариант, с переопределением ListView1.WindowProc
procedure TForm1.FormCreate(Sender: TObject);
begin
OldLVWndProc:=ListView1.WindowProc;
ListView1.WindowProc:=ListViewWndProc;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ListView1.WindowProc:=OldLVWndProc;
end;
procedure TForm1.ListViewWndProc(var Message: TMessage);
begin
if Message.Msg=WM_LBUTTONDOWN then begin
if ListViewLMouseDown(TWMLButtonDown(Message).XPos,
TWMLButtonDown(Message).YPos,
KeysToShiftState(TWMLButtonDown(Message).Keys)) then exit;
end;
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.