我现在想动态生成菜单项,请问语句该怎么写?第一次接触这类问题,请说得详细些!

解决方案 »

  1.   

    在设计程序时,有时我们需要动态地创建菜单, 通常我们使用以下的语句 
        PopupMenu1 := TPopupMenu.Create(Self);
        Item := TMenuItem.Create(PopupMenu1);
        Item.Caption := 'First Menu';
        Item.OnClick := MenuItem1Click;
        PopupMenu1.Items.Add(Item);
        Item := TMenuItem.Create(PopupMenu1);
        Item.Caption := 'Second Menu';
        Item.OnClick := MenuItem2Click;
        PopupMenu1.Items.Add(Item);
        Item := TMenuItem.Create(PopupMenu1);
        Item.Caption := 'Third Menu';
        Item.OnClick := MenuItem3Click;
        PopupMenu1.Items.Add(Item);    Item := TMenuItem.Create(PopupMenu1);
        Item.Caption := '-';
        PopupMenu1.Items.Add(Item);
        Item := TMenuItem.Create(PopupMenu1);
        Item.Caption := 'Fourth Menu';
        Item.OnClick := MenuItem4Click;
        PopupMenu1.Items.Add(Item);
       其实我们可以使用一种更快的方法达到同样的功能, 但使用很少的代码, 那就是用NewLine和NewItem, 看看下面的例子, 是不是很简单?
        PopupMenu1 := TPopupMenu.Create(Self);
        with PopUpMenu1.Items do
          begin
            Add(NewItem('First Menu',0,False,True,MenuItem1Click,0,'MenuItem1'));
            Add(NewItem('Second Menu',0,False,True,MenuItem2Click,0,'MenuItem2'));
            Add(NewItem('Third Menu',0,False,True,MenuItem3Click,0,'MenuItem3'));
            Add(NewLine);                         // 增加一个分割棒
            Add(NewItem('Fourth Menu',0,False,True,MenuItem4Click,0,'MenuItem4')); 
      

  2.   

    var
      Item :TMenuItem;
    begin
      Item :=TMenuItem.Create(nil);
      Item.Caption :='12';
      MainMenu1.Items.Add(Item
    end;
      

  3.   

    var
      Item :TMenuItem;
    begin
      Item :=TMenuItem.Create(nil);
      Item.Caption :='12';
      MainMenu1.Items.Add(Item);
    end;
      

  4.   

    在设计程序时,有时我们需要动态地创建菜单, 通常我们使用以下的语句 
        PopupMenu1 := TPopupMenu.Create(Self);
        Item := TMenuItem.Create(PopupMenu1);
        Item.Caption := 'First Menu';
        Item.OnClick := MenuItem1Click;
        PopupMenu1.Items.Add(Item);
        Item := TMenuItem.Create(PopupMenu1);
        Item.Caption := 'Second Menu';
        Item.OnClick := MenuItem2Click;
        PopupMenu1.Items.Add(Item);
        Item := TMenuItem.Create(PopupMenu1);
        Item.Caption := 'Third Menu';
        Item.OnClick := MenuItem3Click;
        PopupMenu1.Items.Add(Item);    Item := TMenuItem.Create(PopupMenu1);
        Item.Caption := '-';
        PopupMenu1.Items.Add(Item);
        Item := TMenuItem.Create(PopupMenu1);
        Item.Caption := 'Fourth Menu';
        Item.OnClick := MenuItem4Click;
        PopupMenu1.Items.Add(Item);
       其实我们可以使用一种更快的方法达到同样的功能, 但使用很少的代码, 那就是用NewLine和NewItem, 看看下面的例子, 是不是很简单?
        PopupMenu1 := TPopupMenu.Create(Self);
        with PopUpMenu1.Items do
          begin
            Add(NewItem('First Menu',0,False,True,MenuItem1Click,0,'MenuItem1'));
            Add(NewItem('Second Menu',0,False,True,MenuItem2Click,0,'MenuItem2'));
            Add(NewItem('Third Menu',0,False,True,MenuItem3Click,0,'MenuItem3'));
            Add(NewLine);                         // 增加一个分割棒
            Add(NewItem('Fourth Menu',0,False,True,MenuItem4Click,0,'MenuItem4')); 
      

  5.   

    var
      NewItem: TMenuItem;
      I : integer;
    begin
      NewItem := TMenuItem.Create(Self);
      NewItem.Caption := '-';
     
       for  I := 0 to Screen.FormCount-1 do
      begin
        NewItem := TMenuItem.Create(Self);
        NewItem.Caption := Screen.Forms[I].Name
      

  6.   

    procedure  TFrmMain.SetupMenu;  
    var  
       MenuItem:  TMenuItem;  
       ParentMenu:  TComponent;  
       i,  MenuPosition:  Integer;  
    begin  
       for  i  :=  0  to  AddonMenu.Count  -  1  do  
       begin  
           MenuItem  :=  TMenuItem.Create(Self);    {create  an  item  on  the  fly}  
           with  MenuItem  do  
           begin  
             {1=Name,Parent,Caption,Hint,Shortcut,AppTag,BPLName,Index}  
               Name  :=  UserTitle(AddonMenu[i],  ',',  1);  
               Caption  :=  UserTitle(AddonMenu[i],  ',',  3);  
               Hint  :=  UserTitle(AddonMenu[i],  ',',  4);  
               if  UserTitle(AddonMenu[i],  ',',  5)  <>  EmptyStr  then  
                   Shortcut  :=  TextToShortCut(UserTitle(AddonMenu[i],  ',',  5));  
               Enabled  :=  True;  
               Visible  :=  True;  
               Tag  :=  i;  
    {            if  UserTitle(AddonMenu[i],  ',',  2)='pmSend'  then  
                   OnClick  :=  btnToolBarClick  
               else                                                                                          }  
                   OnClick  :=  MenuOnClick;    {assign  OnClick  event}  
               if  UserTitle(AddonMenu[i],  ',',  2)  =  EmptyStr  then  
                   ParentMenu  :=  nil  
               else  
                   ParentMenu  :=  Self.FindComponent(UserTitle(AddonMenu[i],  ',',  2));  
           end;  
           MenuPosition:=StrToIntDef(UserTitle(AddonMenu[i],  ',',  8),0);  
           if  ParentMenu  =  nil  then  
           begin  
               MenuPosition:=  mnuMain.Items.Count  -  MenuPosition;  
               if  MenuPosition<0  then  MenuPosition:=  mnuMain.Items.Count;  
               mnuMain.Items.Insert(MenuPosition  ,  MenuItem);  
           end  
           else  
           begin  
               if  ParentMenu  is  TMainMenu  then  
               begin  
                   MenuPosition:=  TMainMenu(ParentMenu).Items.Count  -  MenuPosition;  
                   if  MenuPosition<0  then  MenuPosition:=  TMainMenu(ParentMenu).Items.Count;  
                   TMainMenu(ParentMenu).Items.Insert(MenuPosition  ,  MenuItem);  
               end  
               else  if  ParentMenu  is  TPopupMenu  then  
                         begin  
                             MenuPosition:=  TPopupMenu(ParentMenu).Items.Count  -  MenuPosition;  
                             if  MenuPosition<0  then  MenuPosition:=  TPopupMenu(ParentMenu).Items.Count;  
                             TPopupMenu(ParentMenu).Items.Insert(MenuPosition  ,  MenuItem);  
                         end  
               else  
               begin  
                   MenuPosition:=  TMenuItem(ParentMenu).Count  -  MenuPosition;  
                   if  MenuPosition<0  then  MenuPosition:=  TMenuItem(ParentMenu).Count;  
                   TMenuItem(ParentMenu).Insert(MenuPosition,MenuItem);  
               end  
             end;  
       end;  
    end;  
     
    AddonMenu是一个TStringList的数量,用于存放读取的Ini文件的菜单内容。  
    Ini内容如下:  
    ;Index=Name,Parent,Caption,Hint,Shortcut,Action,ServiceID,MenuItemIndex  counting  from  the  end  
    [Tools_MENU]  
    Tools01=mniTools01,,Tools,PC  Tools,,,,2  
    Tools02=mniTools02,mniTools01,File  Handle...,,,,Tools  
    Tools03=mniTools03,mniTools01,-,  
    Tools04=mniTools04,mniTools01,Mail  &Handle...,Sent  and  Receive  Mail,,,,Tools  
    Tools05=mniTools05,mniTools02,File  &Separate...,File  Separate,,1,Tools  
    Tools06=mniTools06,mniTools02,File  &Merge...,File  Merge,,2,Tools  
    Tools07=mniTools07,mniTools01,Ma&tch  Files...,Match  File,,4,Tools  
    Tools08=mniTools08,mniTools01,Set  &Desktop...,Set  Desktop,,5,Tools  
    Tools09=mniTools09,mniTools01,-,  
    Tools10=mniTools10,mniTools01,Computed&Tax...,Computed  need  to  pay  tax,,6,Tools  
    Tools11=mniTools11,mniTools01,Remind  &Work...,Remind  your  working,,7,Tools  
    Tools12=mniTools50,Start1,Se&ndMail...,New  a  mail,,3,Tools  
    Tools14=mniTools13,mniTools04,&Send  Mail,Send  Mail,,3,Tools  
    Tools15=mniTools14,mniTools04,&Receive  Mail,Receive  mail,,9,Tools  
    Tools16=mniTools15,mniTools01,&Multiple  Chat...,Multiple  user  chat  synchronously,,,Tools  
    Tools17=mniTools16,mniTools15,Chat  &Server...,Chat  Server,,10,Tools  
    Tools18=mniTools17,mniTools15,Single  Chat...,Chat  Client,,11,Tools  
    ;Tools19=mniTools18,mniTools15,Chat  Clien&t...,Chat  Client,,12,Tools