Как мне "подключить" код к пункту меню, который был создан динамически?
Вот метод, который я использую для "подключения" кода к пунктам меню, динамически создаваемым во время выполнения программы. Сохраняя результат выполнения пункта меню в глобальной переменной, я могу воспользоваться им позже в нужное мне время в любом месте программы. Я надеюсь что помог вам.
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. |
- Dennis Passmore [000730]