2

フォームには TPopupMenu と、「AddButton」、「EditButton」、「DestroyButton」という名前の 3 つのボタンがあり、3 つのボタンすべてに OnClick イベントが追加されています。フォームの PopupMenu プロパティの TPopupMenu。メニュー項目の OnClick イベントのメソッド呼び出しとして使用できるように、TForm1 型宣言で PopupMenuItemsClick プロシージャを作成しました。

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 が表示されない理由は誰でも見つけることができます。

4

3 に答える 3

3

あなたのコードは本当に必要なものではなく、このコードを使用すると完全に機能します

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 で動作をテストしました

于 2013-07-07T11:40:35.590 に答える
1

FormCreate にこの行を追加するか、オブジェクト インスペクタでこのプロパティを設定します。 self.PopupMenu:=PopupMenu1;

于 2013-07-07T07:17:26.613 に答える
0

このコメントは問題の解決に役立つ場合があります (古い 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;

また、メニューでは、作成したアイテムを解放することを忘れないでください。アイテム自体は解放されず、次回は名前が使用されます。

于 2016-09-30T12:17:45.333 に答える