Вот метод, который я использую для "подключения" кода к пунктам меню, динамически создаваемым во время выполнения программы. Сохраняя результат выполнения пункта меню в глобальной переменной, я могу воспользоваться им позже в нужное мне время в любом месте программы. Я надеюсь что помог вам.
unit Tunit1; interface usesSysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,Forms, Dialogs, StdCtrls, Menus; typeTForm1 = 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; varForm1: TForm1; implementation {$R *.DFM} procedure TForm1.FPopupMenuClick(Sender: TObject);beginwith (Sender as TMenuItem) doFPopupMenu.Tag := Tag; { передаем значение TMenuItem.Tag в FPopupMenu.Tag }end; procedure TForm1.Edit1Click(Sender: TObject);vartx,ty,tz: integer;FMenuItem: TMenuItem;begintx := 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 dobeginFMenuItem := TMenuItem.Create(Self);with FMenuItem dobeginTag := 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 { они действительно выбрали что-то ? }beginFPopupResult:= FPopupMenu.Tag;Edit1.Text := ' Выбор #'+IntToStr(FPopupResult);end;{ FPopupMenu.Tag может храниться в ГЛОБАЛЬНОЙ переменной и использоватьсяпозже как порядковое значение в блоках CASE OF или IF THENдля организации в коде условного перехода. }FPopupMenu.Free;FPopupMenu:= nil;end; end. |
- Dennis Passmore [000730]