Обработчик динамически созданного пункта меню
Автор: 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.
|
|