Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  4 625

•  TDictionary Custom Sort  6 627

•  Fast Watermark Sources  6 405

•  3D Designer  9 351

•  Sik Screen Capture  6 738

•  Patch Maker  7 124

•  Айболит (remote control)  7 131

•  ListBox Drag & Drop  5 989

•  Доска для игры Реверси  97 568

•  Графические эффекты  7 323

•  Рисование по маске  6 611

•  Перетаскивание изображений  5 483

•  Canvas Drawing  5 859

•  Рисование Луны  5 581

•  Поворот изображения  5 092

•  Рисование стержней  3 658

•  Paint on Shape  2 891

•  Генератор кроссвордов  3 789

•  Головоломка Paletto  3 042

•  Теорема Монжа об окружностях  3 855

•  Пазл Numbrix  2 536

•  Заборы и коммивояжеры  3 248

•  Игра HIP  2 215

•  Игра Go (Го)  2 148

•  Симулятор лифта  2 527

•  Программа укладки плитки  2 168

•  Генератор лабиринта  2 664

•  Проверка числового ввода  2 319

•  HEX View  2 652

•  Физический маятник  2 283

 
скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Проверка ситуации Выход За Границы Списка при нажатии правой кнопки на списке



При нажатии правой кнопки на компоненте 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;