如何从一个文本文件生成动态菜单?  比如文本文件的内容为:主菜单项一
*子菜单项一
*子菜单项二
*子菜单项三
**子菜单子菜单项一
**子菜单子菜单项二
**子菜单子菜单项三*子菜单项一
*子菜单项二
**子菜单子菜单项一
**子菜单子菜单项二
*子菜单项三则生成三个主菜单,其中第一个主菜单的第三个子菜单还有下级菜单。
请各位前辈不吝赐教!

解决方案 »

  1.   

    TMainMenu.create
    但代码如果也要文本的话,可能需要写调试器了
      

  2.   

    procedure TForm1.FormCreate(Sender: TObject);
    var
      nid: TNotifyIconData;
      NewItem,MnuExit,MnuLine,MnuCancel: TMenuItem;
      SubNew1,SubNew2:TMenuItem;
      ConIni:TIniFile;
      ServiceCount:Integer;
      i:integer;
      StrCaption:string;
      StrName:string;
      ServiceTmp:TServiceCon;
    begin
      nid.cbSize := sizeof(nid); // nid变量的字节数
      nid.Wnd := Handle; // 主窗口句柄
      nid.uID := 1; // 内部标识,可设为任意数
      nid.hIcon := Application.Icon.Handle; // 要加入的图标句柄,可任意指
      //nid.hIcon := Application.Icon.Handle; // 要加入的图标句柄,可任意指
      nid.szTip := '服务控制程式***大象作品'; // 提示字符串
      nid.uCallbackMessage := MY_MESSAGE; // 回调函数消息
      nid.uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE; // 指明哪些字段有?nbsp;
      if not Shell_NotifyIcon(NIM_ADD, @nid) then
      begin
      showmessage('failed');
      Application.Terminate;
      end;
                {将程序的窗口样式设为TOOL窗口,可避免在任务条上出现}
      SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
      //初始化PopUpMenu
      GetDir(0,StrAppDir);
      SerViceNameStrLst:=TstringList.Create;
      ConIni:=Tinifile.Create(StrAppDir+'\ServiceConTrol.ini');
      ServiceCount:=ConIni.ReadInteger('profile','ServiceCount',0);
      ServiceTmp:=TServiceCon.Create;
      for i:=1 to ServiceCount do
      begin
        StrCaption:=ConIni.ReadString('Service_'+IntTostr(i),'ServiceCaption','未知');
        StrName:=ConIni.ReadString('Service_'+IntTostr(i),'ServiceName','');
        NewItem:= TMenuItem.Create(self);
        SubNew1:=TMenuItem.Create(self);
        SubNew2:=TMenuItem.Create(self);    if not ServiceTmp.InitService(strName) then  //检测服务的状态
          subNew2.Enabled:=false                    //服务没有启动
        else
          subNew1.Enabled:=false;               //服务已经启动
        SubNew1.Caption:='启动';
        SubNew2.OnClick:=form1.MnuStopService;   //设定停止菜单的点击事件
        SubNew2.Caption:='停止';
        subnew1.OnClick:=form1.MnuStartService;  //设定启动菜单的点击事件
        NewItem.Caption:=StrCaption;
        PopupMenu1.Items.Add(NewItem);
        ServiceNameStrLst.Add(strName);
        PopUpMenu1.Items[i-1].Add(subNew2);
        PopUpMenu1.Items[i-1].Add(subNew1);
      end;
      MnuLine:=TMenuItem.Create(self);
      MnuLine.Caption:='-';
      PopupMenu1.Items.Add(MnuLine);
      MnuExit:=TMenuItem.Create(self);
      MnuExit.Caption:='退出';
      PopUpMenu1.Items.Add(MnuExit);
      MnuExit.OnClick:=Form1.MnuExitClick;
      MnuCancel:=TmenuItem.Create(self);
      MnuCancel.Caption:='取消';
      PopupMenu1.Items.Add(MnuCancel);
      //ShowMessage(Inttostr(Popupmenu1.Items[0].Count));
      ConIni.Free;end;
    file begain
    [profile]
    ServiceCount=4
    [Service_1]
    ServiceName=Broadcast_chi
    ServiceCaption=电子报刊
    [Service_2]
    ServiceName=Broadcast_CHI_MPEG
    ServiceCaption=流媒体
    [Service_3]
    ServiceName=Serv-U
    ServiceCaption=FTP服务器
    [Service_4]
    ServiceName=Apache
    ServiceCaption=Web服务器
      

  3.   

    就是呀,用ini来操作要好点吧~~
      

  4.   

    调试通不过,请问要 uses 哪些单元?
      

  5.   

    iniFiles已经加了,还是不行,还有呢?提示TNotifyIconData,TServiceCon 为未声明的标志符。
      

  6.   

    我已经自己搞定了,以下是源代码,需要的可以参考:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Menus, ActnList;type
      TForm1 = class(TForm)
        MainMenu1: TMainMenu;
        BtnCreateMainMenu: TButton;
        btnCreateSubMenu: TButton;
        ActionList1: TActionList;
        Action1: TAction;
        btnClearAllMenu: TButton;
        Button1: TButton;
        Button2: TButton;
        procedure BtnCreateMainMenuClick(Sender: TObject);
        procedure Action1Execute(Sender: TObject);
        procedure btnCreateSubMenuClick(Sender: TObject);
        procedure btnClearAllMenuClick(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure FormClick(Sender: TObject);
        
      private
        { Private declarations }
        i,j:integer;
        curMenuItem:TMenuItem;
      public
        { Public declarations }
        
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure xxk(content:string);
    begin
      showMessage(content);
    end;procedure TForm1.BtnCreateMainMenuClick(Sender: TObject);
    var
      s:string;
      menuItem:TMenuItem;
    begin
      btnCreateSubMenu.Enabled:=true;
      inc(i);
      s:='主菜单__'+intToStr(i);
      menuItem:=TMenuItem.Create(MainMenu1);
      menuItem.Caption:=s;
      MainMenu1.Items.Add(menuItem);
      curMenuItem:=menuItem;end;procedure TForm1.Action1Execute(Sender: TObject);
    var
      menuItem:TMenuItem;
    begin
      if Sender is TMenuItem then
      begin
      menuItem:=TMenuItem(Sender);
      showMessage(menuItem.Caption+'   name:'+menuItem.Name);
      end;
    end;procedure TForm1.btnCreateSubMenuClick(Sender: TObject);
    var
      s:string;
      menuItem:TMenuItem;
      event:TNotifyEvent;
    begin
      inc(j);
      s:=curMenuItem.Caption;
      s:=s+'_子菜单_'+intToStr(j);  menuItem:=TMenuItem.Create(curMenuItem);
      menuItem.Caption:=s;
      menuItem.OnClick:=action1.OnExecute;
      curMenuItem.Add(menuItem);end;procedure TForm1.btnClearAllMenuClick(Sender: TObject);
    begin
      mainMenu1.Items.Clear;
      btnCreateSubMenu.Enabled:=false;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      i:integer;
    begin
      i:=mainMenu1.Items.Count;
      showMessage(intToStr(i));
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      s:string;
      i,j,n,n1:integer;
    begin
      n:=mainMenu1.Items.Count;
      for i:=0 to n-1 do
      begin
        s:=s+#13+mainMenu1.Items[i].Caption;
        n1:=mainMenu1.Items[i].Count;    for j:=0 to n1-1 do
        begin
          s:=s+#13+'    '+mainMenu1.Items[i].Items[j].Caption;
        end;  end;
      showMessage(s);
    end;procedure TForm1.FormClick(Sender: TObject);
    begin
      showMessage('clicked');
    end;end.