2013-07-06 22 views
0

在名爲「AddButton」,「EditButton」和「DestroyButton」的窗體上有TPopupMenu和三個按鈕,並將OnClick事件添加到所有三個按鈕。表單的PopupMenu屬性中的TPopupMenu。我在TForm1類型聲明中創建了PopupMenuItemsClick過程,以便它可以用作菜單項OnClick事件的方法調用。Popup Menu沒有出現在我的德爾福

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; 

但是,當我點擊addmenu按鈕時,PopupMenu沒有出現。任何人都可以找到什麼原因Popupmenu沒有出現在窗體加載或任何按鈕點擊。

+3

如果我們正在討論左鍵單擊,則需要從'AddButtonClick'事件方法中調用'PopupMenu1.Popup(X,Y);'方法(其中X和Y是屏幕座標)以調用菜單彈出。在你的代碼中有一些東西['like this'](http://pastebin.com/jfABbMND)。 – TLama

+0

@bummi:它已經是:「窗體的PopupMenu屬性中的TPopupMenu。」 –

+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

這個意見可以幫助解決問題(我在舊的Delphi版本中有類似的問題,我沒有XE去測試)。

  • 永遠不要創建一個組件,讓清空它.Name,八方通 給它分配一個唯一的值(我看到了很多的錯誤INTERNA代碼時讓空的,因爲他們不能爲空)。
  • 總而言之,在將 添加到其父項之前,將屬性和事件分配給組件。

看到這個建議的意見:

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; 

而且隨着菜單,記得要釋放創建的項目,他們沒有自由他們異體下回名稱將被使用。

+0

菜單項將會是菜單本身釋放,無需釋放它們。另外,您爲什麼認爲命名組件是強制性的? – kobik