如何动态生成一个PopMenu的内容(50分)

  • 主题发起人 主题发起人 nofault
  • 开始时间 开始时间
N

nofault

Unregistered / Unconfirmed
GUEST, unregistred user!
举个例子,我想要在PopupMenu1弹出时让它的Items增加两项,一个的Caption为aa,一个为bb,同时点击aa和bb要有相应的一些操作。
 
这是我的一段代码:
var
i: Integer;
B: Boolean;
begin
{生成窗口菜单}
for i := Pred(TPopupMenu(Sender).Items.Count) downto 6 do
TPopupMenu(Sender).Items.Free;
for i := 0 to Pred(MainFormListCount) do
begin
B := False;
if (TPopupMenu(Sender).Items.Count mod MenuBreakNum) = 0 then
begin
TPopupMenu(Sender).Items.Add(NewLine);
B := True;
end;
TPopupMenu(Sender).Items.Add([NewItem(MainFormList.Strings, 0,
ActiveForm = MainFormList.Objects, True, FpmiWNDItemClick, 0,
'pmiWNDWindow' + IntToStr(i))]);
with TPopupMenu(Sender).Items[Pred(TPopupMenu(Sender).Items.Count)] do
begin
Tag := i;
if B then
Break := mbBarBreak;
end;
end;
 
不太明白哦,如果我想要在弹出前增加两项,一个Caption为aa,一个为bb,点击aa时Showmessage('aa'),点击bb时ShowMeessage('bb'),如何实现?
 
procedure TForm1.itemclick(sender: tobject);
begin
showmessage((sender as TMenuItem).caption);
// or showmessage('click aa')
end;

procedure TForm1.Button1Click(Sender: TObject);
var
k1: TMenuItem;
begin
k1 := TMenuItem.Create(PopupMenu1);
k1.Caption := 'aa';
k1.OnClick :=itemclick; //响应定义的过程,click
pop.Items.Add(PopupMenu1);

end;
 
增加两相,
tmpi:=TMenuItem.Create(Self);
tmpi.Caption:='aa';//或者'bb'
tmpi.RadioItem:=True;
tmpi.OnClick:=MyClk;
PopupMenu1.Insert(PopupMenu1.Count-2,tmpi);//PopupMenu1.Add(tmpi);

procedure MyClk(Sender: TObject);
begin
ShowMessage(TMenuItem(Sender).Caption)
end;
 
procedure TForm1.menuitemclick(sender: tobject);
begin
if sender is TMenuItem then
showmessage('click '+(sender as TMenuItem).Caption);
end;

procedure Tform1.createmenuitem;
var AA,BB: TMenuItem;
begin
AA:= TMenuItem.Create(self);
AA.Caption:='aa';
AA.OnClick:=MenuItemClick;
Menu1.Add(aa);
BB:= TMenuItem.Create(self);
BB.Caption:='bb';
BB.OnClick:=MenuItemClick;
menu1.add(bb);
end;
 
当然你也可以这么写
procedure TForm1.menuitemclick(sender: tobject);
begin
if sender is TMenuItem then
showmessage('click '+(sender as TMenuItem).Caption);
end;

procedure TForm1.createmenuitem;
begin
Menu1.Add(NewItem('aa', 0, False, True, menuitemclick, 'mnuAA'));
Menu1.Add(NewItem('bb', 0, False, True, menuitemclick, 'mnuBB'));
end;

 
另外,我按上面的方法做了,最后是没有释放的,在MouseClick事件里加了PopMenu的Clear,不过感觉这样不是很正统的方法是的阿,呵呵。
应该如何释放?
 
在MouseDown时候判断是否为鼠标右键,是则先调用以下程序
for i:= Menu1.Count -1 Downto 0 do
Menu1.Items.Free;
然后在调用前面程序,动态生成菜单项
最后调PopupMenu1.Popup(...)弹出右键快捷菜单
(Menu1为PopupMenu1快捷菜单中的一个子菜单项, PopupMenu1.AutoPopup 应设成 False)
 
多人接受答案了。
 
后退
顶部