2013-07-06 2 views
0

Есть TPopupMenu и три кнопки в форме с именем «AddButton», «EditButton» и «DestroyButton» и добавлены события OnClick ко всем трем кнопкам. TPopupMenu в свойстве PopupMenu формы. Я создал процедуру PopupMenuItemsClick в объявлении типа TForm1, чтобы ее можно было использовать в качестве вызова метода для элемента события OnClick.Всплывающее меню, не отображающееся на моем Delphi

type 
    TForm1 = class(TForm) 
    AddButton: TButton; 
    EditButton: TButton; 
    DestroyButton: TButton; 
    PopupMenu1: TPopupMenu; 
    procedure AddButtonClick(Sender: TObject); 
    procedure EditButtonClick(Sender: TObject); 
    procedure DestroyButtonClick(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    procedure PopupMenuItemsClick(Sender: TObject); 

    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.AddButtonClick(Sender: TObject); 
var 
    index: Integer; 
    NewItem: TMenuItem; 
begin 
     // The owner (PopupMenu1) will clean up this menu item. 
    NewItem := TMenuItem.Create(PopupMenu1); // Create the new item. 
    index := PopupMenu1.Items.Count; 
    PopupMenu1.Items.Add(NewItem);// Add it to the pop-up menu. 
    NewItem.Caption := 'Menu Item ' + IntToStr(index); 
    NewItem.Tag := index; 
    NewItem.OnClick := 
    PopupMenuItemsClick; // Assign it an event handler. 
end; 

procedure TForm1.PopupMenuItemsClick(Sender: TObject); 
begin 
    with Sender as TMenuItem do 
    begin 
    case Tag of 
     0: ShowMessage('first item clicked'); 
     1: ShowMessage('second item clicked'); 
     2: ShowMessage('third item clicked'); 
     3: ShowMessage('fourth item clicked'); 
    end; 
    end; 
end; 

{ 
To edit or destroy an item, grab its pointer 
using the Items property. 
procedure TForm1.EditButtonClick(Sender: TObject); 
var 
    ItemToEdit: TMenuItem; 
begin 
    ItemToEdit := PopupMenu.Items[1]; 
    ItemToEdit.Caption := 'Changed Caption'; 
end; 

procedure TForm1.DestroyButtonClick(Sender: TObject); 
var 
    ItemToDelete: TMenuItem; 
begin 
    ItemToDelete := PopupMenu.Items[2]; 
    ItemToDelete.Free; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    index: Integer; 
    NewItem: TMenuItem; 
begin 
    for index := 0 to 3 do 
    begin 
      // The owner (PopupMenu1) will clean up this menu item. 
    NewItem := TMenuItem.Create(PopupMenu1); // Create the new item. 
    PopupMenu1.Items.Add(NewItem);// Add it to the pop-up menu. 
    NewItem.Caption := 'Menu Item ' + IntToStr(index); 
    NewItem.Tag := index; 
    NewItem.OnClick := 
     PopupMenuItemsClick; // Assign it an event handler. 
    end; 
end; 

Но PopupMenu не появляется, когда я нажимал кнопку addmenu. Любой может найти причину, по которой Popupmenu не появляется при загрузке формы или нажатии любой кнопки.

+3

Если мы говорим о левом щелчке, вам нужно вызвать метод PopupMenu1.Popup (X, Y); '(где X и Y - координаты экрана) из вашего метода событий AddButtonClick, чтобы вызвать для всплывающего меню. В вашем коде что-то ['like this'] (http://pastebin.com/jfABbMND). – TLama

+0

@bummi: это уже есть: «TPopupMenu в свойстве PopupMenu формы». –

+0

@RemyLebeau спасибо, не видел :-( – bummi

ответ

0

Добавьте эту строку в FormCreate или установите это свойство в Object Inspector. self.PopupMenu:=PopupMenu1;

+0

Это уже есть, как четко указано в вопросе. –

+0

Тот же код работает в xe-3, поэтому эта проблема только в xe-2. – slotomo

2

ваш код не то, что вам действительно нужно использовать этот код, и он будет работать отлично

procedure TForm1.PopupMenuItemsClick(Sender: TObject); 
    var ICount : Integer; 
begin 
    ICount := TMenuItem(Sender).MenuIndex; 
    ShowMessage('Item Number '+ IntToStr(ICount+1) + ' Selected'); 
end; 

procedure TForm1.AddClick(Sender: TObject); 
    var 
    Index: Integer; 
    NewItem: TMenuItem; 
begin 
    NewItem := TMenuItem.Create(PopupMenu); 
    Index := PopupMenu.Items.Count; 
    PopupMenu.Items.Add(NewItem); 
    NewItem.Caption := 'Menu Item ' + IntToStr(Index); 
    NewItem.Tag := Index; 
    NewItem.OnClick := PopupMenuItemsClick; 
    PopupMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); 
end; 

Я тестировал его с Delphi7, XE2 и XE3 его работы

0

This комментарии могут помочь решить проблема (я был похож на старые версии Delphi, у меня нет XE для тестирования).

  • Никогда, никогда не создать компонент, и пусть опустошить его .Name, ВСЕГДА присвоить ему уникальное значение (я вижу много неисправной кода междуна когда пусть пусто, так как они не могут быть пустыми).
  • И всегда присваивайте свойства и события компоненту перед добавлением их родителям.

Смотрите эти предложения в комментариях:

procedure TForm1.AddClick(Sender: TObject); 
    var 
    Index: Integer; 
    NewItem: TMenuItem; 
begin 
    NewItem := TMenuItem.Create(PopupMenu); 
    Index := PopupMenu.Items.Count; 

    //PopupMenu.Items.Add(NewItem); // Not the correct place, see below 
    NewItem.Name : = 'SomeText' + IntToStr(Index); // Name them, with a unique name not starting with a number (also there is no need to put a number) 

    NewItem.Caption := 'Menu Item ' + IntToStr(Index); 
    NewItem.Tag := Index; 
    NewItem.OnClick := PopupMenuItemsClick; 

    PopupMenu.Items.Add(NewItem); // After properties has been set, never before 

    PopupMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); 
    // Do not forget to free such menu item somewhere on your code, obviously not here 
end; 

И с меню, не забудьте освободить объекты, созданные, они не свободны от них selfs и имена будут использоваться в следующий раз.

+0

Элементы меню будут освобождаются самим меню. Не нужно их освобождать. Кроме того, почему вы считаете, что именование компонента является обязательным? – kobik

Смежные вопросы