Идёт загрузка страницы...

htp://aptem.net.ru





/|\АРТЕМ.NET.RU /|\ - Портал для программистов и не только: Delphi Visual Basic BORLAND С++ PERL PHP HTML

Delphi 1

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

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

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


   
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]