При нажатии правой кнопки на компоненте TListBox вызывается PopUpMenu, но все пункты этого меню
должны быть применены к тому элементу в списке, на котором и была нажата кнопка. Этот элемент
может не быть в данный момент текущим ( то есть выделенным) и вообще, правая кнопка может быть
нажата на той части компоненты, где реальный список уже закончился. Данная задача может быть
решена следующим образом:
Обрабатывается событие TListBox.onMouseDown
procedure TMain.UserListMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
Point: TPoint;
I: Integer;
const
NoHit = -1;
begin
if Button = mbRight then
begin
// Если нажата правая кнопка мыши, выяснить, не попал ли курсор
// на элемент списка UserList
Point.X := x;
Point.Y := y;
I := UserList.ItemAtPos(Point, True);
if not (i = NoHit) then
begin
// курсор попал на элемент списка с номером i
// принудительно назначаем его текущим, т.е. отмеченным
UserList.ItemIndex := I;
TListBox(Sender).PopUpMenu.AutoPopup := True;
end
else // курсор промахнулся , нет смысла активизировать меню
TListBox(Sender).PopUpMenu.AutoPopup := False;
end;
end;
|
|