Советы по Delphi




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


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

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

    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]




Содержание  Назад  Вперед