Delphi компоненты страница Standart

Компонент Delphi PopupMenu




Уроки Delphi
  1.  Первая программа
  2.  Использование компонентов
  3.  События Delphi
  4.  Типы данных Delphi
  5.  Создание своих типов данных
  6.  Выражения и операторы
  7.  Работа с файлами в Delphi
  8.  Дополнительные формы
  9.  Подпрограммы в Delphi
  10. Исключительные ситуации
  11. Взаимодействие приложения с пользователем
  12. Указатели в Delphi
  13. Обзор компонентов
  14. Работа со строками
  15. Создание интерфейса
  16. Графика в Delphi
  17. Многопоточность в Delphi
  18. Динамическое создание
        компонентов
Поиск по сайту




 Это важно:
   Метод Application.ProcessMessages;

 Это полезно:
   Параметр Sender в обработчиках событий;










Бояться не надо



    Контекстное меню (PopupMenu), вызываемое в приложении Windows по щелчку правой кнопкой мыши, является стандартной и удобной возможностью многих программ. Delphi компонент PopupMenu предназначен для создания таких контекстных меню. Контекстное меню из-за способа своего появления называют ещё всплывающим меню.

   Delphi компонент PopupMenu почти не отличается от компонента MainMenu и также является невизуальным. Но в отличие от Главного меню, которое одно на Форме, всплывающие меню могут быть у каждого объекта, размещённого на Форме. Поэтому нужно разместить на Форме и запрограммировать столько компонентов PopupMenu, сколько контекстных меню предполагается использовать в программе. Кроме того, контекстное меню не имеет нескольких пунктов верхнего уровня, так как все его пункты располагаются в одном вертикальном столбце.

   После того как компонент PopupMenu размещён на Форме, структура меню формируется совершенно аналогично созданию Главного Меню (компонент MainMenu). Далее, для того, чтобы контекстное меню определённого объекта (например, компонента StringGrid) вызывалось в программе, необходимо свойству PopupMenu этого объекта присвоить имя соответствующего Delphi компонента PopupMenu:

Использование Delphi компонента PopupMenu

   В момент появления контекстного меню происходит событие onPopup компонента PopupMenu. В этот момент можно, исходя из анализа ситуации, внести необходимые изменения в его параметры.

   Щёлкнув по объекту правой кнопкой мыши, мы получим появление его контекстного меню, обеспеченного компонентом PopupMenu1, в точке произведённого щелчка. Но можно добиться его появления в любом нужном нам месте Формы. Достигается это использованием метода Popup компонента PopupMenu, при этом свойство Popup у соответствующего компонента (в данном случае StringGrid) нужно очистить.

   Для использования этого метода необходимо использовать событие щелчка правой кнопки мыши по объекту. И правильнее использовать именно отпускание кнопки, то есть событие onMouseUp нужного объекта. Метод Popup имеет параметры X и Y, соответствующие расстоянию точки щелчка по горизонтали и вертикали от верхнего левого угла экрана соответственно. То есть, можно добиться появления меню вообще за пределами Формы. Вот, попробуйте использовать такой код:

procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbRight then PopupMenu1.Popup(0, 0);  //появление меню в точке (0, 0)
end;

   Но и обработчик события onMouseUp тоже имеет параметры X и Y. Они соответствуют расстоянию точки щелчка по горизонтали и вертикали от верхнего левого угла уже Формы. Однако, если попытаться использовать их в методе Popup, то меню не появится в том месте, где вы ожидаете. Чтобы добиться нужного эффекта, необходимо учитывать также положение самой Формы, а также того объекта, в пределах которого должно появляться меню. Но и это не всё. Необходимо к значению X добавить высоту заголовка Формы, которая неизвестна. Все эти слагаемые усложняют код.

   Избавиться от большинства слагаемых поможет функция GetClientOrigin. Она вызывается без параметров и возвращает сдвиг клиентской области Формы относительно верхнего левого угла экрана в формате TPoint (точка, то есть запись с полями X и Y). Таким образом, остаётся учесть только положение нужного объекта. Следующий код обеспечивает появление меню именно в месте щелчка мышки по компоненту StringGrid1:

procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var P: TPoint;
begin
  P:=GetClientOrigin;
  if Button = mbRight then
    PopupMenu1.Popup(X+P.X+StringGrid1.Left, Y+P.Y+StringGrid1.Top);

end;




Обзор компонентов Delphi           В начало урока          Delphi компонент Label

Уроки Delphi начинающим



Вопросы и комментарии (11)      Решение задач в Delphi

Оставить комментарий:

Имя  

Текст комментария