Delphi World - Обработчик динамически созданного пункта меню
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Обработчик динамически созданного пункта меню

Автор: Dennis Passmore

Как мне "подключить" код к пункту меню, который был создан динамически?

Вот метод, который я использую для "подключения" кода к пунктам меню, динамически создаваемым во время выполнения программы. Сохраняя результат выполнения пункта меню в глобальной переменной, я могу воспользоваться им позже в нужное мне время в любом месте программы. Я надеюсь что помог вам.


unit Tunit1;

interface

uses
  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);
begin
  with (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 do
  begin
    FMenuItem := TMenuItem.Create(Self);
    with FMenuItem do
    begin
      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 World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования