Советы по Delphi

         

Обработчик динамически созданного пункта меню


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

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

unit Tunit1;
interface
uses
SysUtils, 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]



Содержание раздела