Как мне "подключить" код к пункту меню, который был создан
динамически?
Вот метод, который я использую для "подключения" кода к пунктам меню,
динамически создаваемым во время выполнения программы. Сохраняя результат
выполнения пункта меню в глобальной переменной, я могу воспользоваться им позже
в нужное мне время в любом месте программы. Я надеюсь что помог вам.
unit Tunit1;
interfaceuses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, Menus;
type
TForm1 = class(TForm)
Edit1: TEdit; { Просто "место для щелчка" и отображения результатов }procedure Edit1Click(Sender: TObject);
private{ Private declarations }
FPopupMenu: TPopupMenu; { Общий Popup для использования "кем нужно" }
FPopupResult: Longint; { Результат последнего выполненного FPopupMenu }procedure FPopupMenuClick(Sender: TObject);
public{ Public declarations }end;
var
Form1: TForm1;
implementation{$R *.DFM}procedure TForm1.FPopupMenuClick(Sender: TObject);
beginwith (Sender as TMenuItem) do
FPopupMenu.Tag := Tag; { передаем значение TMenuItem.Tag в FPopupMenu.Tag }end;
procedure TForm1.Edit1Click(Sender: TObject);
var
tx, ty, tz: integer;
FMenuItem: TMenuItem;
begin
tx := Left + (Width - ClientWidth) + (Sender as TEdit).Left;
ty := Top + (Height - ClientHeight) + (Sender as TEdit).Top;
FPopupMenu := TPopupMenu.Create(Self);
FPopupMenu.AutoPopup := false;
FPopupMenu.Tag := 0;
for tz := 1 to 5 dobegin
FMenuItem := TMenuItem.Create(Self);
with FMenuItem dobegin
Tag := tz;
OnClick := FPopupMenuClick; { все сделает один OnClick }
Caption := 'Выбор #' + IntToStr(tz);
end;
FPopupMenu.Items.Add(FMenuItem)
end;
FPopupMenu.Popup(tx, ty);
Application.Processmessages; { даем время для обработки события OnClick }if FPopupMenu.Tag <> 0 then{ они действительно выбрали что-то ? }begin
FPopupResult := FPopupMenu.Tag;
Edit1.Text := ' Выбор #' + IntToStr(FPopupResult);
end;
{ FPopupMenu.Tag может храниться в ГЛОБАЛЬНОЙ переменной и использоваться
позже как порядковое значение в блоках CASE OF или IF THEN
для организации в коде условного перехода. }
FPopupMenu.Free;
FPopupMenu := nil;
end;
end.
Пример программирования на Delphi, демонстрирующий создание динамических пунктов меню и привязку их к процедурам. Код создает объект TPopupMenu, добавляет пять объектов TMenuItem к нему и затем выводит меню в конкретном месте на экране.
Для "привязки" кода к динамически созданному пункту меню автор использует обработчик события (FPopupMenuClick), который присваивается каждому объекту TMenuItem. Этот обработчик отвечает за хранение значения тега выбранного пункта меню в глобальной переменной (FPopupResult).
Вот некоторые ключевые точки:
Объект TPopupMenu создается динамически с помощью метода Create.
Каждый объект TMenuItem также создается динамически и добавляется к popup menu с помощью метода Add.
Обработчик события (FPopupMenuClick) присваивается каждому объекту TMenuItem. Этот обработчик отвечает за хранение значения тега выбранного пункта меню.
Свойство Tag каждого объекта TMenuItem устанавливается в уникальное значение (1-5) для отличия между различными пунктами меню.
Свойство Caption каждого объекта TMenuItem устанавливается в строку, указывающую выбранную опцию.
Чтобы использовать этот код в своем собственном проекте Delphi, вам нужно создать форму с полей ввода (TEdit) и popup menu (TPopupMenu). Затем вы вызываете процедуру Edit1Click при клике на поле ввода. Эта процедура создает динамические пункты меню и выводит меню в конкретном месте.
Вот пример, как можно модифицировать этот код для своих конкретных нужд:
procedureTForm1.Edit1Click(Sender:TObject);begin// Создаем новый popup menu с динамически созданными пунктами менюFPopupMenu:=TPopupMenu.Create(Self);FPopupMenu.AutoPopup:=false;fori:=1to5dobeginFMenuItem:=TMenuItem.Create(Self);withFMenuItemdobeginTag:=i;OnClick:=FPopupMenuClick;// Присваиваем обработчик событияCaption:='Option '+IntToStr(i);end;FPopupMenu.Items.Add(FMenuItem);end;// Выводим меню в конкретном месте на экранеFPopupMenu.Popup(Edit1.Left,Edit1.Top);// Храним значение тега выбранного пункта меню в глобальной переменнойifFPopupMenu.Tag<>0thenbeginFPopupResult:=FPopupMenu.Tag;Edit1.Text:='Selected option: #'+IntToStr(FPopupResult);end;// Очищаем popup menuFPopupMenu.Free;FPopupMenu:=nil;end;
Надеюсь, это поможет! Пожалуйста, если у вас есть какие-либо дальнейшие вопросы.
Обработчик динамически созданного пункта меню позволяет «подключить» код к пункту меню, который был создан динамически во время выполнения программы, сохраняя результат в глобальной переменной для последующего использования.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.